# Private LLM -- Architektur ## Überblick Eigenständiger Service für die Verarbeitung sensitiver Daten mit lokalen AI-Modellen (Ollama). Läuft auf einem dedizierten GPU-Server (Infomaniak Swiss Cloud) und wird vom Gateway als Provider-Plugin (`aicorePluginPrivateLlm.py`) angesprochen. Kein Datenabfluss an externe Cloud-APIs. ## Technologie-Stack | Layer | Technologie | |-------|------------| | Framework | FastAPI (Python) | | AI Runtime | Ollama (lokale Vision/Text-Modelle) | | PDF-Support | PyMuPDF (fitz) | | Hosting | Infomaniak Swiss Cloud (GPU) | | Deployment | GitHub Actions → `main` Branch | ## Modelle | Externer Name | Internes Ollama-Modell | Typ | |--------------|----------------------|-----| | `poweron-text-general` | `qwen2.5:7b` | Text | | `poweron-vision-general` | `qwen2.5vl:7b` | Vision | | `poweron-vision-deep` | `granite3.2-vision` | Vision | ## API-Routen | Modul | Zweck | |-------|-------| | `routeApi.py` | Analyse-API: Bild-/PDF-Analyse mit Prompt, Modellauswahl | | `routeOpenAi.py` | OpenAI-kompatibles Chat-Completion-API (für Cursor-Integration) | | `routeWeb.py` | Web-UI für manuelle Tests | ## Integration mit Gateway Der Gateway nutzt das Private LLM über `aicorePluginPrivateLlm.py` als Provider für: - **Neutralisierung:** Text-Analyse mit `poweron-text-general` - **Sensitive Datenverarbeitung:** Vision-Analyse von Dokumenten (Rechnungen, Belege, Handschrift) - **Keine Billing-Kosten** für mandanteninterne LLM-Calls (eigene Infrastruktur) ## Sicherheit - API-Key-Authentifizierung (`X-API-Key` Header) - Separater Cursor-API-Key für OpenAI-kompatible Endpoints (Bearer Token) - Rate-Limiting per API-Key (Token Bucket, konfigurierbar) - Konfiguration über `config.ini` + Environment-Variablen (Secrets nie im Code) ## Schlüssel-Dateien | Datei | Rolle | |-------|-------| | `app.py` | FastAPI-Einstieg, Router-Mount | | `config.py` | Konfiguration, Model-Mapping, Auth, Rate-Limiting, Request/Response-Modelle | | `routeApi.py` | Analyse-Endpunkte (Bild, PDF) | | `routeOpenAi.py` | OpenAI-kompatibles Chat-API | | `routeWeb.py` | Test-UI | ## Regeln / Invarianten - Alle Daten werden **lokal** verarbeitet -- kein Weiterleiten an externe APIs - Model-Mapping ist die einzige Stelle für Namensauflösung (`MODEL_MAPPING` in `config.py`) - API-Keys werden aus `config.ini` oder Environment gelesen, nie hardcoded - PDF-Verarbeitung rendert Seiten als Bilder für Vision-Modelle (max 5 Seiten)