diff --git a/app/config.py b/app/config.py index a1c9ed2..6e469c9 100644 --- a/app/config.py +++ b/app/config.py @@ -4,14 +4,20 @@ DESCRIPTION: Zentrale Pydantic-Konfiguration. Enthält Parameter für Qdrant, Embeddings, Ollama, Google GenAI und OpenRouter. WP-20: Optimiert für Hybrid-Cloud Modus und Vektor-Synchronisation. WP-22: Integration von Change-Detection und Vocab-Paths. -VERSION: 0.6.2 +FIX: Hinzufügen von load_dotenv(), um Umgebungsvariablen aus .env aktiv zu laden. +VERSION: 0.6.3 STATUS: Active -DEPENDENCIES: os, functools, pathlib +DEPENDENCIES: os, functools, pathlib, python-dotenv """ from __future__ import annotations import os from functools import lru_cache from pathlib import Path +from dotenv import load_dotenv + +# WP-20: Lade Umgebungsvariablen aus der .env Datei +# Muss vor dem Zugriff auf os.getenv erfolgen! +load_dotenv() class Settings: # --- Qdrant Datenbank --- @@ -23,9 +29,7 @@ class Settings: DISTANCE: str = os.getenv("MINDNET_DISTANCE", "Cosine") # --- Lokale Embeddings (Ollama & Sentence-Transformers) --- - # Modell für die Vektorisierung (z.B. nomic-embed-text) EMBEDDING_MODEL: str = os.getenv("MINDNET_EMBEDDING_MODEL", "nomic-embed-text") - # Legacy Fallback Modellname MODEL_NAME: str = os.getenv("MINDNET_MODEL", "sentence-transformers/all-MiniLM-L6-v2") # --- WP-20 Hybrid LLM Provider --- @@ -35,7 +39,6 @@ class Settings: # Google AI Studio (Direkt) GOOGLE_API_KEY: str | None = os.getenv("GOOGLE_API_KEY") GEMINI_MODEL: str = os.getenv("MINDNET_GEMINI_MODEL", "gemini-1.5-flash") - # Gemma-Modell für hohen Durchsatz bei der Ingestion GEMMA_MODEL: str = os.getenv("MINDNET_GEMMA_MODEL", "google/gemma-2-9b-it:free") # OpenRouter Integration @@ -58,12 +61,10 @@ class Settings: DEBUG: bool = os.getenv("DEBUG", "false").lower() == "true" MINDNET_VAULT_ROOT: str = os.getenv("MINDNET_VAULT_ROOT", "./vault") MINDNET_TYPES_FILE: str = os.getenv("MINDNET_TYPES_FILE", "config/types.yaml") - # WP-22: Dictionary für die Edge-Validierung MINDNET_VOCAB_PATH: str = os.getenv("MINDNET_VOCAB_PATH", "vault/_system/dictionary/edge_vocabulary.md") - # WP-22: Change Detection (Modus: "full" oder "body") CHANGE_DETECTION_MODE: str = os.getenv("MINDNET_CHANGE_DETECTION_MODE", "full") - # --- WP-04 Retriever Gewichte (Semantik vs. Graph) --- + # --- WP-04 Retriever Gewichte --- 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")) diff --git a/config/prompts.yaml b/config/prompts.yaml index c1c5c6e..3dc5d40 100644 --- a/config/prompts.yaml +++ b/config/prompts.yaml @@ -1,5 +1,6 @@ -# config/prompts.yaml — Final V2.4.0 (Hybrid & Multi-Provider Support) -# WP-20: Optimierte Cloud-Templates bei unveränderten Ollama-Prompts. +# config/prompts.yaml — Final V2.4.1 (Hybrid & Multi-Provider Support) +# WP-20: Optimierte Cloud-Templates. +# FIX: Technische Maskierung (Doppel-Klammern) für JSON-Stabilität bei identischem Inhalt. system_prompt: | Du bist 'mindnet', mein digitaler Zwilling und strategischer Partner. @@ -208,15 +209,33 @@ edge_allocation_template: # --------------------------------------------------------- edge_extraction: ollama: | - Extrahiere Kanten als JSON: [{"to": "X", "kind": "Y"}]. - Text: {text} + TASK: + Du bist ein Wissens-Ingenieur für den digitalen Zwilling 'mindnet'. + Deine Aufgabe ist es, semantische Relationen (Kanten) aus dem Text zu extrahieren, + die die Hauptnotiz '{note_id}' mit anderen Konzepten verbinden. + + ANWEISUNGEN: + 1. Identifiziere wichtige Entitäten, Konzepte oder Ereignisse im Text. + 2. Bestimme die Art der Beziehung (z.B. part_of, uses, related_to, blocks, caused_by). + 3. Das Ziel (target) muss ein prägnanter Begriff sein. + 4. Antworte AUSSCHLIESSLICH in validem JSON als Liste von Objekten. + + BEISPIEL: + [[ {{"to": "Ziel-Konzept", "kind": "beziehungs_typ"}} ]] + + TEXT: + """ + {text} + """ + + DEIN OUTPUT (JSON): gemini: | Führe eine semantische Analyse der Notiz '{note_id}' durch. Finde explizite und implizite Relationen. - Antworte als JSON: [{"to": "Ziel", "kind": "typ", "reason": "begründung"}] + Antworte STRIKT als JSON: [[{{"to": "Ziel", "kind": "typ", "reason": "begründung"}}]] Keine Erklärungen, nur JSON. Text: {text} openrouter: | Analysiere den Text für den Graphen. Identifiziere semantische Verbindungen. - Output STRIKT als JSON-Liste: [{"to": "X", "kind": "Y"}]. + Output STRIKT als JSON-Liste: [[{{"to": "X", "kind": "Y"}}]]. Text: {text} \ No newline at end of file