""" FILE: app/frontend/ui_config.py DESCRIPTION: Zentrale Konfiguration für das Frontend. Definiert API-Endpoints, Timeouts und Graph-Styles (Farben). VERSION: 2.6.0 STATUS: Active DEPENDENCIES: os, hashlib, dotenv, pathlib LAST_ANALYSIS: 2025-12-15 """ import os import hashlib from dotenv import load_dotenv from pathlib import Path load_dotenv() # --- API & PORTS --- API_BASE_URL = os.getenv("MINDNET_API_URL", "http://localhost:8002") CHAT_ENDPOINT = f"{API_BASE_URL}/chat" FEEDBACK_ENDPOINT = f"{API_BASE_URL}/feedback" INGEST_ANALYZE_ENDPOINT = f"{API_BASE_URL}/ingest/analyze" INGEST_SAVE_ENDPOINT = f"{API_BASE_URL}/ingest/save" # --- QDRANT --- QDRANT_URL = os.getenv("QDRANT_URL", "http://localhost:6333") QDRANT_KEY = os.getenv("QDRANT_API_KEY", None) if QDRANT_KEY == "": QDRANT_KEY = None COLLECTION_PREFIX = os.getenv("COLLECTION_PREFIX", "mindnet") # --- FILES & TIMEOUTS --- HISTORY_FILE = Path("data/logs/search_history.jsonl") timeout_setting = os.getenv("MINDNET_API_TIMEOUT") or os.getenv("MINDNET_LLM_TIMEOUT") API_TIMEOUT = float(timeout_setting) if timeout_setting else 300.0 # --- STYLING CONSTANTS --- # Basierend auf types.yaml GRAPH_COLORS = { # Kerntypen "experience": "#feca57", # Gelb/Orange "project": "#ff9f43", # Dunkleres Orange "decision": "#5f27cd", # Lila # Persönlichkeit "value": "#00d2d3", # Cyan "principle": "#0abde3", # Dunkles Cyan "belief": "#48dbfb", # Helles Blau "profile": "#1dd1a1", # Grün # Strategie & Risiko "goal": "#ff9ff3", # Pink "risk": "#ff6b6b", # Rot # Basis "concept": "#54a0ff", # Blau "task": "#8395a7", # Grau-Blau "journal": "#c8d6e5", # Hellgrau "source": "#576574", # Dunkelgrau "glossary": "#222f3e", # Sehr dunkel "default": "#8395a7" # Fallback } # System-Kanten, die wir NICHT im Graphen sehen wollen, um Rauschen zu reduzieren SYSTEM_EDGES = ["prev", "next", "belongs_to"] def get_edge_color(kind: str) -> str: """Generiert eine deterministische Farbe basierend auf dem Edge-Typ.""" if not kind: return "#bdc3c7" # Einige feste Farben für wichtige semantische Typen fixed_colors = { "depends_on": "#ff6b6b", # Rot (Blocker/Abhängigkeit) "blocks": "#ee5253", # Dunkelrot "caused_by": "#ff9ff3", # Pink "related_to": "#c8d6e5", # Hellgrau (Hintergrund) "references": "#bdc3c7", # Grau "derived_from": "#1dd1a1" # Grün } if kind in fixed_colors: return fixed_colors[kind] # Fallback: Hash-basierte Farbe für dynamische Typen # Wir nutzen einen Pastell-Generator, damit es nicht zu grell wird hash_obj = hashlib.md5(kind.encode()) hue = int(hash_obj.hexdigest(), 16) % 360 return f"hsl({hue}, 60%, 50%)"