14 KiB
| doc_type | audience | scope | status | version | context |
|---|---|---|---|---|---|
| developer_guide | developer | workflow, testing, architecture, modules | active | 2.6 | Umfassender Guide für Entwickler: Architektur, Modul-Interna (Deep Dive), Setup, Git-Workflow und Erweiterungs-Anleitungen. |
Mindnet Developer Guide & Workflow
Quellen: developer_guide.md, dev_workflow.md, Architecture_Audit_v2.6
Dieser Guide ist die zentrale technische Referenz für Mindnet v2.6. Er vereint das technische Verständnis der Module mit dem operativen Workflow zwischen Windows (Dev) und Linux (Runtime).
1. Einführung & Systemüberblick
Was ist Mindnet?
Mindnet ist ein Hybrides Knowledge Management System, das klassische Notizen (Markdown) mit KI-gestützter Analyse verbindet. Es kombiniert RAG (Retrieval Augmented Generation) mit einer Graphen-Datenbank (Qdrant), um Wissen nicht nur semantisch zu finden, sondern auch strukturell zu vernetzen.
Kern-Philosophie
- Filesystem First: Die Wahrheit liegt immer auf der Festplatte (Markdown-Dateien). Die Datenbank ist ein abgeleiteter Index.
- Hybrid Retrieval: Relevanz entsteht aus Textähnlichkeit (Semantik) + Graphen-Verbindungen (Edges) + Wichtigkeit (Centrality).
- Active Intelligence: Das System wartet nicht nur auf Anfragen, sondern schlägt beim Schreiben proaktiv Verbindungen vor ("Matrix Logic").
- Local Privacy: Alle KI-Berechnungen (Ollama) laufen lokal. Keine Cloud-Abhängigkeit für Inference.
2. Architektur
2.1 High-Level Übersicht
Das System folgt einer strikten Trennung zwischen Frontend (Streamlit) und Backend (FastAPI), wobei bestimmte Performance-Pfade (Graph-Visualisierung) optimiert wurden.
graph TD
User((User))
subgraph "Frontend Layer (Streamlit)"
UI[ui.py Router]
ViewChat[Chat View]
ViewGraph[Graph View]
ViewEditor[Editor View]
Logic[Callbacks & State]
end
subgraph "Backend Layer (FastAPI)"
API[main.py]
RouterChat[Chat / RAG]
RouterIngest[Ingest / Write]
CoreRet[Retriever Engine]
CoreIngest[Ingestion Pipeline]
end
subgraph "Infrastructure & Services"
LLM[Ollama (Phi3/Nomic)]
DB[(Qdrant Vector DB)]
FS[File System (.md)]
end
User <--> UI
UI --> API : REST (Chat, Save, Feedback)
UI -.-> DB : Direct Read (Graph Viz Performance)
API --> LLM : Embeddings & Completion
API --> DB : Read/Write
API --> FS : Read/Write (Source of Truth)
2.2 Datenfluss-Muster
- Ingestion (Write):
Markdown->Parser->Chunker->SemanticAnalyzer (LLM)->Embedder->Qdrant (Points) - Retrieval (Read):
Query->Embedding->Hybrid Search (Vector + Graph)->Re-Ranking->LLM Context - Visualisierung (Graph):
UI->GraphService->Qdrant (Edges Collection)->Cytoscape
3. Physische Architektur
Mindnet läuft in einer verteilten Umgebung (Post-WP15 Setup).
- Windows 11 (VS Code): Entwicklungsumgebung. Nie direkt auf
mainarbeiten! - Beelink (Runtime): Der Server hostet zwei Instanzen via Systemd:
- PROD: API (Port 8001) + UI (Port 8501). Home:
~/mindnet. - DEV: API (Port 8002) + UI (Port 8502). Home:
~/mindnet_dev.
- PROD: API (Port 8001) + UI (Port 8501). Home:
- Gitea (Raspberry Pi): Versionskontrolle ("Safe"). Speichert den Code.
4. Projektstruktur & Modul-Referenz (Deep Dive)
Das System ist modular aufgebaut. Hier ist die detaillierte Analyse aller Komponenten.
4.1 Verzeichnisbaum
mindnet/
├── app/
│ ├── core/ # Business Logic & Algorithms
│ ├── routers/ # API Interface (FastAPI)
│ ├── services/ # External Integrations (LLM, DB)
│ ├── models/ # Pydantic DTOs
│ └── frontend/ # UI Logic (Streamlit)
├── config/ # Configuration Files (YAML)
├── scripts/ # CLI Tools (Ops & Maintenance)
└── vault/ # Local Content Storage
4.2 Frontend Architecture (app/frontend/)
Das Frontend ist eine Streamlit-App, die sich wie eine Single-Page-Application (SPA) verhält.
| Modul | Status | Verantwortung |
|---|---|---|
ui.py |
🟢 Core | Main Router. Initialisiert Session-State und entscheidet anhand der Sidebar-Auswahl, welche View gerendert wird. |
ui_config.py |
🟢 Config | Constants. Zentraler Ort für Farben (GRAPH_COLORS), API-URLs und Timeouts. Änderungen am Look & Feel passieren hier. |
ui_chat.py |
🟢 View | Chat UI. Rendert Nachrichtenverlauf, Intent-Badges, Quellen-Expanders und Feedback-Buttons. |
ui_editor.py |
🟢 View | Editor UI. Markdown-Editor mit Live-Vorschau. Integriert "Intelligence" (KI-Link-Vorschläge). |
ui_graph_cytoscape.py |
🟢 View | Modern Graph. Interaktiver Graph basierend auf Cytoscape.js (COSE Layout). |
ui_graph.py |
🟡 Legacy | Graph UI (Fallback). Alte Implementierung mittels streamlit-agraph. |
ui_callbacks.py |
🟢 Logic | State Controller. Handhabt komplexe State-Übergänge (z.B. Graph -> Editor). |
ui_utils.py |
🟢 Logic | Helper. Enthält den Healing Parser (parse_markdown_draft), der defektes JSON/YAML von LLMs repariert. |
ui_api.py |
🟢 Data | API Client. Wrapper für Backend REST-Calls. |
ui_graph_service.py |
🟢 Data | Performance Hack. Greift direkt auf Qdrant zu (bypass API), um Graphen schnell zu laden. |
Frontend Design Patterns (Wichtig!)
-
Active Inspector Pattern (
ui_graph_cytoscape.py) Um Re-Renders im Graphen zu vermeiden, nutzen wir CSS-Klassen. Wird ein Knoten angeklickt, ändert sich nur die CSS-Klasse (.inspected), aber die Physik-Simulation startet nicht neu. Das sorgt für ein stabiles UI-Gefühl. -
Resurrection Pattern (
ui_editor.py) Streamlit neigt dazu, Eingaben bei Re-Runs zu "vergessen". Der Editor synchronisiert seinen Inhalt aggressiv in densession_state.- Logik:
if widget_key not in session_state: restore_from_data_key(). - Ergebnis: Texteingaben überleben Tab-Wechsel.
- Logik:
-
Filesystem First (
ui_callbacks.py) Wenn man im Graphen auf "Bearbeiten" klickt:- Versucht das System, die echte Datei von der Festplatte zu lesen.
- Nur wenn das fehlschlägt, wird der Text aus den Datenbank-Chunks rekonstruiert ("Stitching"). Dies verhindert, dass veraltete Datenbank-Stände die echten Dateien überschreiben.
4.3 Backend Architecture (app/)
Das Backend stellt die Logik via REST-API bereit.
| Modul | Typ | Verantwortung |
|---|---|---|
| Core Engine | ||
core/ingestion.py |
Engine | Pipeline Controller. Koordiniert den 13-Schritte-Import, Parsing, Hash-Check und DB-Upserts. |
core/retriever.py |
Engine | Search Engine. Berechnet Hybrid-Score: (Semantic * W) + (Edge Bonus * 0.25) + (Centrality * 0.05). |
core/chunker.py |
Engine | Segmentation. Zerlegt Text intelligent. Orchestriert SemanticAnalyzer für Smart Edges. |
core/derive_edges.py |
Engine | Link Extractor. Findet Wikilinks, Callouts und Typed Relations im Text. |
core/qdrant_points.py |
Mapper | Object Mapper. Wandelt Payloads in Qdrant PointStructs um. |
core/graph_adapter.py |
Algo | Graph Logic. Baut In-Memory Graphen für Re-Ranking und Pfad-Analysen. |
| Router (API) | ||
routers/chat.py |
Router | Hybrid Router. Entscheidet: RAG-Antwort vs. Interview-Modus. |
routers/ingest.py |
Router | Write API. Nimmt Markdown entgegen, steuert Ingestion und Discovery-Analyse. |
routers/query.py |
Router | Search API. Klassischer Hybrid-Retriever Endpunkt. |
routers/graph.py |
Router | Viz API. Liefert Knoten/Kanten für Frontend. |
| Services | ||
services/llm_service.py |
Service | Traffic Control. Async Client für Ollama. Nutzt Semaphore, um Hintergrund-Jobs (Import) zu drosseln. |
services/discovery.py |
Service | Intelligence. "Matrix Logic" für Link-Vorschläge (WP-11). |
services/semantic_analyzer.py |
Service | Filter. KI-Validierung von Kanten im Hintergrund. |
services/feedback_service.py |
Service | Logging. Schreibt Interaktions-Logs (JSONL). |
4.4 Scripts & Tooling (Die Admin-Toolbox)
Der Ordner scripts/ enthält verifizierte Werkzeuge für den Betrieb.
| Skript | Status | Zweck | Wichtiges Argument |
|---|---|---|---|
import_markdown.py |
🟢 Prod | Master-Sync. Der zentrale Importer. | --apply, --purge-before-upsert |
reset_qdrant.py |
⚠️ Ops | Wipe. Löscht Collections für Rebuilds. | --mode wipe, --yes |
export_markdown.py |
🟢 Backup | Backup. Exportiert DB-Inhalt zurück zu MD. | -- |
health_check_mindnet.py |
🟢 Ops | Monitoring. Prüft ob API/DB laufen. | (Exit Code 0/1) |
payload_dryrun.py |
🟢 Test | Audit. Simuliert Import (Schema Check). | -- |
edges_full_check.py |
🟢 Test | Integrity. Prüft Graph-Logik. | -- |
resolve_unresolved.py |
🟡 Maint | Repair. Versucht, kaputte Links zu heilen. | -- |
5. Maintenance & "Kill List"
Folgende Dateien wurden im Audit v2.6 als veraltet, redundant oder "Zombie-Code" identifiziert und sollten entfernt werden.
| Datei | Diagnose | Empfohlene Aktion |
|---|---|---|
app/embed_server.py |
Zombie. Alter Standalone-Server. | 🗑️ Löschen |
app/embeddings.py |
Zombie. Veraltete lokale Lib. | 🗑️ Löschen |
app/core/edges.py |
Redundant. Ersetzt durch derive_edges.py. |
🗑️ Löschen |
app/core/ranking.py |
Redundant. Logik in retriever.py integriert. |
🗑️ Löschen |
app/core/type_registry.py |
Redundant. Logik in ingestion.py integriert. |
🗑️ Löschen |
app/core/env_vars.py |
Veraltet. Ersetzt durch config.py. |
🗑️ Löschen |
app/routers/qdrant_router.py |
Deprecated. Keine Logik, nur CRUD. | 📂 Verschieben nach scripts/archive/ |
6. Lokales Setup (Development)
Voraussetzungen: Python 3.10+, Docker, Ollama.
Installation:
# 1. Repo & Venv
git clone <repo> mindnet
cd mindnet
python3 -m venv .venv
source .venv/bin/activate
# 2. Dependencies
pip install -r requirements.txt
# 3. Ollama (Nomic ist Pflicht!)
ollama pull phi3:mini
ollama pull nomic-embed-text
Konfiguration (.env):
QDRANT_URL="http://localhost:6333"
MINDNET_OLLAMA_URL="http://localhost:11434"
MINDNET_LLM_MODEL="phi3:mini"
MINDNET_EMBEDDING_MODEL="nomic-embed-text"
COLLECTION_PREFIX="mindnet_dev"
VECTOR_DIM=768
MINDNET_LLM_BACKGROUND_LIMIT=2
MINDNET_API_URL="http://localhost:8002"
7. Der Entwicklungs-Zyklus (Workflow)
Phase 1: Windows (Code)
- Basis aktualisieren:
git checkout main && git pull. - Branch erstellen:
git checkout -b feature/mein-feature. - Coden & Committen.
- Push:
git push origin feature/mein-feature.
Phase 2: Beelink (Test / Dev)
Hier prüfst du, ob dein Code auf Linux läuft.
- Einloggen:
ssh user@beelink. - Ordner:
cd ~/mindnet_dev. - Code holen:
git fetch && git checkout feature/mein-feature && git pull. - Dependencies:
pip install -r requirements.txt. - Restart:
sudo systemctl restart mindnet-dev. - Validierung (Smoke Tests):
- Last-Test: Starte
python3 -m scripts.import_markdown ...im Terminal und chatte gleichzeitig im UI (Port 8502). - API Check:
curl -X POST "http://localhost:8002/ingest/analyze" ...
- Last-Test: Starte
Phase 3: Release & Deployment (Prod)
Wenn alles getestet ist:
- Gitea: Pull Request erstellen und mergen.
- Deploy auf Prod (Beelink):
cd ~/mindnet git pull origin main # Sicherstellen, dass Prod-Dependencies aktuell sind source .venv/bin/activate pip install -r requirements.txt ollama pull nomic-embed-text # Falls neue Modelle nötig sind # Restart sudo systemctl restart mindnet-prod sudo systemctl restart mindnet-ui-prod - Cleanup: Branch löschen (lokal und remote).
8. Erweiterungs-Guide: "Teach-the-AI"
Mindnet lernt nicht durch Training (Fine-Tuning), sondern durch Konfiguration und Vernetzung.
Workflow A: Neuen Typ implementieren (z. B. type: risk)
- Physik (
config/types.yaml):risk: chunk_profile: sliding_short retriever_weight: 0.90 # Sehr wichtig edge_defaults: ["blocks"] # Automatische Kante detection_keywords: ["gefahr", "risiko"] - Strategie (
config/decision_engine.yaml):
Ergebnis: Wenn der IntentDECISION: inject_types: ["value", "risk"] # <--- "risk" hinzufügenDECISIONerkannt wird, sucht das System nun auch aktiv nach Risiken.
Workflow B: Graph-Farben ändern
- Öffne
app/frontend/ui_config.py. - Bearbeite das Dictionary
GRAPH_COLORS.
GRAPH_COLORS = {
"project": "#FF4B4B",
"risk": "#8B0000" # Neu
}
9. Tests & Debugging
Unit Tests (Pytest):
pytest tests/test_retriever_basic.py
pytest tests/test_chunking.py
Pipeline Tests (Integration):
# JSON-Schema prüfen
python3 -m scripts.payload_dryrun --vault ./test_vault
# Graph-Integrität prüfen
python3 -m scripts.edges_full_check
E2E Smoke Tests:
# Decision Engine
python tests/test_wp06_decision.py -p 8002 -e DECISION -q "Soll ich X tun?"
# Feedback
python tests/test_feedback_smoke.py --url http://localhost:8002/query
10. Troubleshooting & One-Liners
DB komplett zurücksetzen (Vorsicht!):
# --yes überspringt die Bestätigung
python3 -m scripts.reset_qdrant --mode wipe --prefix "mindnet_dev" --yes
Einen einzelnen File inspizieren (Parser-Sicht):
python3 tests/inspect_one_note.py --file ./vault/MeinFile.md
Live-Logs sehen:
journalctl -u mindnet-dev -f
journalctl -u mindnet-ui-dev -f
"UnicodeDecodeError in .env":
- Ursache: Umlaute oder Sonderzeichen in der
.env. - Lösung: Datei bereinigen (nur ASCII) und sicherstellen, dass UTF-8 ohne BOM genutzt wird.
"Read timed out" im Frontend:
- Ursache: Smart Edges brauchen länger als 60s.
- Lösung:
MINDNET_API_TIMEOUT=300.0in.env.