LLM device mapping, live pipeline status, apply & hide UI, Ninja↔TANSS write-back sync & full-service validation #3

Merged
shuber merged 120 commits from litellm into main 2026-09-03 12:28:13 +00:00
Member

Übersicht

Dieses PR ergänzt das Pipeline-Tool um LLM-basiertes Device-Mapping für Ninja-Geräte ohne TANSS-ID, eine UI, um die vorgeschlagenen Mappings direkt anzuwenden oder Geräte zu verbergen, einen Live-Status (Progressbar + Timer) während der Pipeline-Ausführung, Write-back-Synchronisation (gelöste Mappings und Gerätedaten werden jetzt aktiv in beide Systeme zurückgeschrieben: Ninja-Custom-Fields, TANSS-Geräte) – sowie eine Full-Service-Vertragsvalidierung in Phase 2 (Headquarter-Auflösung und Policy-Check für Full-Service-Kunden).

Stand: 46 Dateien, +3528/−683 (git diff main...litellm)

Änderungen

LLM-Mapping (neu)

  • src/llm/connection.py: Neues LiteLLM-Modul, das für nicht-mappede Ninja-Geräte passende TANSS-Geräte vorschlägt (Confidence 0.0–1.0 + Begründung), inkl. striktem JSON-Antwortformat
  • Robustheit: LLM-Ausfall, leerer Content oder ungültiges JSON brechen die Pipeline nicht mehr ab – sie läuft ohne Vorschläge weiter (mit Statusmeldung pro LLM-Step); Truncation-Erkennung bei LLM_MAX_TOKENS
  • src/phases/phase1_mapping.py: LLM-Mapping als Fallback in Phase 1; filtert Peripherie-Geräte und bereits referenzierte TANSS-Geräte
  • Caching der LLM-Ergebnisse (Cache-Key llm_device_mapping)
  • src/config.py + .env.example: neue LLM-Konfiguration (LLM_MODEL, LLM_API_KEY, LLM_API_BASE, LLM_MAX_TOKENS)

Write-back & Synchronisation (Phase 1 & 3)

  • Phase 1: Bei per Namens-Match gelösten Mappings wird die TANSS-ID jetzt in das Ninja-Custom-Field tanssid geschrieben – neues Issue TANSS_ID_ADDED
  • Phase 3 schreibt jetzt statt nur TODOs zu loggen:
    • teamviewerid von TANSS → Ninja, wenn Ninja keinen Wert hat
    • Bei TeamViewer-ID-Mismatch gewinnt der Ninja-Wert und wird in TANSS geschrieben (früheres TEAMVIEWER_ID_MISMATCH-Issue entfällt)
    • Gerätedaten Ninja → TANSS: manufacturerId, osId, cpuTypeId, cpuFrequency – nur in leere TANSS-Felder, bestehende Werte werden nie überschrieben
  • src/tanss/devices.py: neuer patchTanssDevice (unterscheidet PC- und Peripherie-Endpunkt) sowie gecachte Lookup-Tabellen für Hersteller/OS/CPU-Typen (Name → ID)
  • Neues Phase-3-Issue TANSS_DEVICE_UPDATED für in TANSS geänderte Geräte

TANSS-Datenbank (neu)

  • src/tanss/db.py: direkter MySQL-Zugriff auf die TANSS-Datenbank (SQLAlchemy) – Wartungsverträge werden jetzt aus vertrag/vertrag_zuweisungen gelesen (getContractsForCompany in src/tanss/contracts.py)
  • src/tanss/login.py (Cookie-Login ins Ticketsystem) entfernt – Verträge kommen jetzt aus der DB
  • src/config.py + .env.example: neue TANSS_DB_*-Konfiguration

Full-Service-Vertragsvalidierung (Phase 2, neu)

  • src/tanss/companies.py: neuer getHeadQuarter – folgt der linkedCompanyId-Kette rekursiv bis zur Muttergesellschaft
  • src/tanss/contracts.py: neuer hasActiveFullServiceContract – prüft, ob das Headquarter einen aktiven „Full-Service Jahrespauschale"-Vertrag hat
  • Phase 2 validiert Geräte von Full-Service-Firmen jetzt über die Ninja-Policy statt über Geräte-Verträge:
    • unbekannte Policy → neues Issue UNKNOWN_NINJA_POLICY_FOR_FULL_SERVICE_CONTRACT
    • Endpoint-Protection-Policy → neues Issue INCORRECT_NINJA_POLICY_FOR_FULL_SERVICE_CONTRACT
    • ansonsten nur Online-Status-Check (Breach/90-Tage-Logik)
    • Ausnahme (hartkodiert): CuraVivum GmbH (Headquarter-ID 2284)
  • Refactoring: Online-Status-Check in validate_device_online_status extrahiert; getContractsByStatus nimmt jetzt eine Vertragsliste statt einer Device-ID; getTanssCompanies überspringt Company-ID 0

Live-Status & Pipeline

  • src/api/pipeline.py: Thread-safe _StatusHub mit Versionsnummern – Status-Updates werden jetzt an alle WebSocket-Clients gesendet (vorher wurden Messages über Clients verteilt); Clients, die während der Ausführung verbinden, erhalten einen Snapshot (running, elapsed, letzter Stand je Step, Fehler)
  • Elapsed-Zeit-Timer auf jeder Statusmeldung
  • Feinere Fetch-Steps (fetch:ninja_devices … fetch:tanss_contracts) und Zählungen in den Phase-Meldungen (z. B. „Phase 1: Mapping 123 Ninja devices to TANSS…")
  • src/pipeline.py: setFreshMode(True) wieder aktiviert (vorher nur TODO)
  • src/cache.py: neue cached_count() – liest Cachingröße ohne Fetch zu triggern (sicher während eines Fresh-Runs)

UI (static/app.js, static/style.css, static/index.html)

  • Progressbar mit 11 Steps (Fetch-Schritte → Phase 1 → LLM Request → Phase 2/3 → Completed), Prozentanzeige und aktuellem Step
  • Timer für die Laufzeit der Pipeline
  • Snapshot-/Version-Handling für Tabs, die während der Ausführung geöffnet werden
  • „✓ Apply Mapping"-Button bei LLM-Vorschlägen → ruft den neuen PATCH-Endpunkt auf und lädt danach neu
  • „🔒 Hide"-Button für Geräte (auch bei mehrfach referenzierten TANSS-Geräten)
  • Neue Sektion für mehrfach referenzierte TANSS-Geräte
  • Device-Tags mit Links auf Ninja-Device/-Org, TANSS-Device/-Company und Ticketsystem
  • ⚠ Company-ID-Mismatch-Warnung, wenn die Ninja-Company-ID nicht zur TANSS-companyId passt
  • Aufgeklappte Cards bleiben nach einem Data-Refresh geöffnet (Zustand wird über Re-Renders hinweg erhalten)
  • Light-/Dark-Mode (☀️/🌙-Toggle), per localStorage persistiert und vor dem ersten Paint gesetzt (kein Flash)
  • Favicon hinzugefügt

API

  • Neuer Endpunkt PATCH /api/v1/ninja/device/{device_id} zum Setzen von tanssid/teamviewerid (src/api/devices.py, patchDeviceCustomFields in src/ninja/devices.py)
  • /api/v1/states/invalid: neue metadata-Sektion mit Entity-Zählungen (Ninja/TANSS devices, Orgs, Policies, Companies, Contracts)
  • src/api/metadata.py entfernt (Metadaten jetzt Teil des States-Endpunkts); OpenAPI-Metadaten (Titel/Beschreibung/Version) und Router-Tags (app, ninja)

Validierung & States

  • Neue Phase-1-Issues: TANSS_DEVICE_REFERENCED_MULTIPLE_TIMES (TANSS-Gerät wird von mehreren Ninja-Geräten referenziert) und TANSS_ID_ADDED
  • Neue Phase-2-Issues: WITHOUT_COMPANY (TANSS-Gerät ohne Company, companyId == 0), UNKNOWN_NINJA_POLICY_FOR_FULL_SERVICE_CONTRACT und INCORRECT_NINJA_POLICY_FOR_FULL_SERVICE_CONTRACT (s. o.); Phase 2 entsprechend refaktoriert
  • Neue Phase-3-Issue: TANSS_DEVICE_UPDATED
  • States beinhalten jetzt llm_suggestions und ninja_devices (states.py, models.py)

Sicherheit

  • Hardgecodte Credentials (Ninja OAuth2, TANSS Wrapper/Login) aus den Default-Werten in src/config.py entfernt – Werte kommen jetzt ausschließlich aus .env

Ops & Sonstiges

  • Dockerfile, .dockerignore, aktualisierte compose.yaml, uv.lock
  • Neuer CI-Workflow .forgejo/workflows/container.yaml (Container-Build & Publish nach Merge nach main)
  • Bruno-Collections: Hidden Devices (create/get/delete), Patch Device Custom Fields, Update PC / Update Periphery
  • Entscheidungsbaum aktualisiert (eintscheidungsbaum.drawio)
  • TODO.txt mit Projekt-Notes/TODOs
## Übersicht Dieses PR ergänzt das Pipeline-Tool um **LLM-basiertes Device-Mapping** für Ninja-Geräte ohne TANSS-ID, eine UI, um die vorgeschlagenen Mappings direkt anzuwenden oder Geräte zu verbergen, einen **Live-Status** (Progressbar + Timer) während der Pipeline-Ausführung, **Write-back-Synchronisation** (gelöste Mappings und Gerätedaten werden jetzt aktiv in beide Systeme zurückgeschrieben: Ninja-Custom-Fields, TANSS-Geräte) – sowie eine **Full-Service-Vertragsvalidierung** in Phase 2 (Headquarter-Auflösung und Policy-Check für Full-Service-Kunden). Stand: 46 Dateien, +3528/−683 (`git diff main...litellm`) ## Änderungen ### LLM-Mapping (neu) - `src/llm/connection.py`: Neues LiteLLM-Modul, das für nicht-mappede Ninja-Geräte passende TANSS-Geräte vorschlägt (Confidence 0.0–1.0 + Begründung), inkl. striktem JSON-Antwortformat - Robustheit: LLM-Ausfall, leerer Content oder ungültiges JSON brechen die Pipeline nicht mehr ab – sie läuft ohne Vorschläge weiter (mit Statusmeldung pro LLM-Step); Truncation-Erkennung bei `LLM_MAX_TOKENS` - `src/phases/phase1_mapping.py`: LLM-Mapping als Fallback in Phase 1; filtert Peripherie-Geräte und bereits referenzierte TANSS-Geräte - Caching der LLM-Ergebnisse (Cache-Key `llm_device_mapping`) - `src/config.py` + `.env.example`: neue LLM-Konfiguration (`LLM_MODEL`, `LLM_API_KEY`, `LLM_API_BASE`, `LLM_MAX_TOKENS`) ### Write-back & Synchronisation (Phase 1 & 3) - Phase 1: Bei per Namens-Match gelösten Mappings wird die TANSS-ID jetzt in das Ninja-Custom-Field `tanssid` geschrieben – neues Issue `TANSS_ID_ADDED` - Phase 3 schreibt jetzt statt nur TODOs zu loggen: - `teamviewerid` von TANSS → Ninja, wenn Ninja keinen Wert hat - Bei TeamViewer-ID-Mismatch gewinnt der Ninja-Wert und wird in TANSS geschrieben (früheres `TEAMVIEWER_ID_MISMATCH`-Issue entfällt) - Gerätedaten Ninja → TANSS: `manufacturerId`, `osId`, `cpuTypeId`, `cpuFrequency` – nur in leere TANSS-Felder, bestehende Werte werden nie überschrieben - `src/tanss/devices.py`: neuer `patchTanssDevice` (unterscheidet PC- und Peripherie-Endpunkt) sowie gecachte Lookup-Tabellen für Hersteller/OS/CPU-Typen (Name → ID) - Neues Phase-3-Issue `TANSS_DEVICE_UPDATED` für in TANSS geänderte Geräte ### TANSS-Datenbank (neu) - `src/tanss/db.py`: direkter MySQL-Zugriff auf die TANSS-Datenbank (SQLAlchemy) – Wartungsverträge werden jetzt aus `vertrag`/`vertrag_zuweisungen` gelesen (`getContractsForCompany` in `src/tanss/contracts.py`) - `src/tanss/login.py` (Cookie-Login ins Ticketsystem) entfernt – Verträge kommen jetzt aus der DB - `src/config.py` + `.env.example`: neue `TANSS_DB_*`-Konfiguration ### Full-Service-Vertragsvalidierung (Phase 2, neu) - `src/tanss/companies.py`: neuer `getHeadQuarter` – folgt der `linkedCompanyId`-Kette rekursiv bis zur Muttergesellschaft - `src/tanss/contracts.py`: neuer `hasActiveFullServiceContract` – prüft, ob das Headquarter einen aktiven „Full-Service Jahrespauschale"-Vertrag hat - Phase 2 validiert Geräte von Full-Service-Firmen jetzt über die Ninja-Policy statt über Geräte-Verträge: - unbekannte Policy → neues Issue `UNKNOWN_NINJA_POLICY_FOR_FULL_SERVICE_CONTRACT` - Endpoint-Protection-Policy → neues Issue `INCORRECT_NINJA_POLICY_FOR_FULL_SERVICE_CONTRACT` - ansonsten nur Online-Status-Check (Breach/90-Tage-Logik) - Ausnahme (hartkodiert): CuraVivum GmbH (Headquarter-ID 2284) - Refactoring: Online-Status-Check in `validate_device_online_status` extrahiert; `getContractsByStatus` nimmt jetzt eine Vertragsliste statt einer Device-ID; `getTanssCompanies` überspringt Company-ID 0 ### Live-Status & Pipeline - `src/api/pipeline.py`: Thread-safe `_StatusHub` mit Versionsnummern – Status-Updates werden jetzt an **alle** WebSocket-Clients gesendet (vorher wurden Messages über Clients verteilt); Clients, die während der Ausführung verbinden, erhalten einen Snapshot (running, elapsed, letzter Stand je Step, Fehler) - Elapsed-Zeit-Timer auf jeder Statusmeldung - Feinere Fetch-Steps (`fetch:ninja_devices` … `fetch:tanss_contracts`) und Zählungen in den Phase-Meldungen (z. B. „Phase 1: Mapping 123 Ninja devices to TANSS…") - `src/pipeline.py`: `setFreshMode(True)` wieder aktiviert (vorher nur TODO) - `src/cache.py`: neue `cached_count()` – liest Cachingröße ohne Fetch zu triggern (sicher während eines Fresh-Runs) ### UI (`static/app.js`, `static/style.css`, `static/index.html`) - **Progressbar** mit 11 Steps (Fetch-Schritte → Phase 1 → LLM Request → Phase 2/3 → Completed), Prozentanzeige und aktuellem Step - **Timer** für die Laufzeit der Pipeline - Snapshot-/Version-Handling für Tabs, die während der Ausführung geöffnet werden - „✓ Apply Mapping"-Button bei LLM-Vorschlägen → ruft den neuen PATCH-Endpunkt auf und lädt danach neu - „🔒 Hide"-Button für Geräte (auch bei mehrfach referenzierten TANSS-Geräten) - Neue Sektion für mehrfach referenzierte TANSS-Geräte - Device-Tags mit Links auf Ninja-Device/-Org, TANSS-Device/-Company und Ticketsystem - ⚠ Company-ID-Mismatch-Warnung, wenn die Ninja-Company-ID nicht zur TANSS-`companyId` passt - Aufgeklappte Cards bleiben nach einem Data-Refresh geöffnet (Zustand wird über Re-Renders hinweg erhalten) - Light-/Dark-Mode (☀️/🌙-Toggle), per `localStorage` persistiert und vor dem ersten Paint gesetzt (kein Flash) - Favicon hinzugefügt ### API - Neuer Endpunkt `PATCH /api/v1/ninja/device/{device_id}` zum Setzen von `tanssid`/`teamviewerid` (`src/api/devices.py`, `patchDeviceCustomFields` in `src/ninja/devices.py`) - `/api/v1/states/invalid`: neue `metadata`-Sektion mit Entity-Zählungen (Ninja/TANSS devices, Orgs, Policies, Companies, Contracts) - `src/api/metadata.py` entfernt (Metadaten jetzt Teil des States-Endpunkts); OpenAPI-Metadaten (Titel/Beschreibung/Version) und Router-Tags (`app`, `ninja`) ### Validierung & States - Neue Phase-1-Issues: `TANSS_DEVICE_REFERENCED_MULTIPLE_TIMES` (TANSS-Gerät wird von mehreren Ninja-Geräten referenziert) und `TANSS_ID_ADDED` - Neue Phase-2-Issues: `WITHOUT_COMPANY` (TANSS-Gerät ohne Company, `companyId == 0`), `UNKNOWN_NINJA_POLICY_FOR_FULL_SERVICE_CONTRACT` und `INCORRECT_NINJA_POLICY_FOR_FULL_SERVICE_CONTRACT` (s. o.); Phase 2 entsprechend refaktoriert - Neue Phase-3-Issue: `TANSS_DEVICE_UPDATED` - States beinhalten jetzt `llm_suggestions` und `ninja_devices` (`states.py`, `models.py`) ### Sicherheit - Hardgecodte Credentials (Ninja OAuth2, TANSS Wrapper/Login) aus den Default-Werten in `src/config.py` entfernt – Werte kommen jetzt ausschließlich aus `.env` ### Ops & Sonstiges - `Dockerfile`, `.dockerignore`, aktualisierte `compose.yaml`, `uv.lock` - Neuer CI-Workflow `.forgejo/workflows/container.yaml` (Container-Build & Publish nach Merge nach `main`) - Bruno-Collections: Hidden Devices (create/get/delete), Patch Device Custom Fields, Update PC / Update Periphery - Entscheidungsbaum aktualisiert (`eintscheidungsbaum.drawio`) - `TODO.txt` mit Projekt-Notes/TODOs
forgejo-actions changed title from WIP: wip to LLM-based device mapping (Ninja→TANSS) with apply & hide UI 2026-08-24 08:53:44 +00:00
forgejo-actions changed title from LLM-based device mapping (Ninja→TANSS) with apply & hide UI to LLM device mapping (Ninja→TANSS), apply & hide UI & live pipeline status 2026-08-24 11:41:34 +00:00
forgejo-actions changed title from LLM device mapping (Ninja→TANSS), apply & hide UI & live pipeline status to LLM device mapping, live pipeline status, apply & hide UI, and Ninja↔TANSS write-back sync 2026-08-27 06:08:57 +00:00
forgejo-actions changed title from LLM device mapping, live pipeline status, apply & hide UI, and Ninja↔TANSS write-back sync to LLM device mapping, live pipeline status, apply & hide UI, Ninja↔TANSS write-back sync & full-service validation 2026-08-27 06:39:37 +00:00
Co-authored-by: opencode <opencode@noreply.localhost>
todo
Some checks failed
Build and publish container / build-and-push (pull_request) Failing after 6s
b47d295437
shuber merged commit 0e0bcbe19e into main 2026-09-03 12:28:13 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
GENERAL/syncninja!3
No description provided.