diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9bc5a58 --- /dev/null +++ b/.env.example @@ -0,0 +1,620 @@ +############################################################################### +# GLPI AI AGENT +# +# Hinweise: +# - Boolesche Werte: true | false +# - Zeitangaben: z. B. 30s, 5m, 2h, 72h +# - Prozent-/Scorewerte werden als 0.0 bis 1.0 angegeben: +# 0.70 = 70 % +# - Komma-separierte Listen ohne Leerzeichen schreiben. +# +# WICHTIG: +# DRY_RUN=true verhindert Änderungen an GLPI. +# Für die Einführungs-/Testphase unbedingt aktiviert lassen. +############################################################################### + + +############################################################################### +# 01. ALLGEMEINER BETRIEB +############################################################################### + +# true: +# Agent analysiert Tickets, schreibt aber keine Änderungen nach GLPI. +# false: +# freigegebene Kategorieänderungen und Antworten werden tatsächlich geschrieben. +DRY_RUN=true + +# Logging-Level. +# Mögliche Werte: +# debug | info | warn | error +LOG_LEVEL=info + +# HTTP-Listener für WebUI, API, /healthz und /readyz. +HTTP_ADDR=:7080 + +# Persistente Laufzeitdaten: +# - Audit-Logs +# - Knowledge-Index +# - Web-KB +# - Lernbeispiele +# - GLPI-KB-Cache +DATA_DIR=./data + + +############################################################################### +# 02. WEBINTERFACE / AUTHENTIFIZIERUNG +############################################################################### + +# Dashboard/API-Benutzer. +WEB_USERNAME=admin + +# Unbedingt ein langes zufälliges Passwort verwenden. +WEB_PASSWORD= + +# false = Authentifizierung erforderlich. +# true = WebUI ohne Login erreichbar. +# +# In Produktion dringend false lassen. +# KNOWLEDGE_WEB_EDIT_ENABLED=true ist zusammen mit anonymem Zugriff nicht +# empfehlenswert bzw. wird je nach Agent-Version abgelehnt. +WEB_ALLOW_ANONYMOUS=false + +# Kennzeichnung automatisch ausgewählter KI-Inhalte. +# true = TrustedNet-KI-Badge wird jeder automatischen Antwort vorangestellt. +AI_CONTENT_LABEL_ENABLED=true + + +############################################################################### +# 03. OPTIONALER GLPI-WEBHOOK +############################################################################### + +# Optionales Shared Secret für eingehende GLPI-Webhooks. +# +# Der Absender muss denselben Wert z. B. als: +# X-Webhook-Secret +# übertragen. +# +# Leer lassen, wenn kein Webhook verwendet wird. +WEBHOOK_SECRET= + + +############################################################################### +# 04. GLPI 11 / HIGH-LEVEL API / OAUTH2 +############################################################################### + +GLPI_URL=https://glpi.example.com + +# Aktuell verwendete High-Level-API-Version. +GLPI_API_VERSION=v2.3 + +# OAuth2-Zugangsdaten des Service Accounts. +GLPI_CLIENT_ID= +GLPI_CLIENT_SECRET= +GLPI_USERNAME=ai +GLPI_PASSWORD= + +# Numerische GLPI-Benutzer-ID des Agent-Service-Accounts. +# +# Wichtig für die Erkennung: +# "Ist dieses Followup vom Agenten selbst oder von einem Menschen?" +GLPI_AGENT_USER_ID=999 + +# true erlaubt unverschlüsseltes HTTP. +# Nur für lokale Entwicklungs-/Testsysteme verwenden. +GLPI_ALLOW_INSECURE_HTTP=false + +# Nur Tickets mit diesen GLPI-Status-IDs werden verarbeitet. +# +# Beispiel: +# 1 = nur "Neu" +# 1,2 = mehrere erlaubte Status +# +# Fail-closed: lieber zunächst nur Status 1 erlauben. +GLPI_ALLOWED_STATUS_IDS=1 + +# Wie oft GLPI auf neue/geänderte Tickets geprüft wird. +GLPI_POLL_INTERVAL=30s + +# Maximal geladene Tickets pro Poll. +GLPI_POLL_LIMIT=50 + +# Optionaler serverseitiger GLPI-Filter. +# Die Agent-Policy prüft GLPI_ALLOWED_STATUS_IDS trotzdem nochmals selbst. +# +# Filter-Syntax gegen /api.php/doc der eigenen GLPI-Instanz prüfen. +GLPI_TICKET_FILTER=status.id==1 + +# HTTP-Timeout für GLPI-API-Aufrufe. +GLPI_TIMEOUT=20s + + +############################################################################### +# 05. OLLAMA / LLM +############################################################################### + +# Innerhalb Docker Compose typischerweise: +# http://ollama:11434 +# +# Bei nativem Betrieb: +# http://localhost:11434 +OLLAMA_URL=http://ollama:11434 + +# Chat-/Entscheidungsmodell. +OLLAMA_MODEL=qwen3:8b + +# Embedding-Modell für Knowledge-Retrieval. +OLLAMA_EMBEDDING_MODEL=embeddinggemma + +# Retrieval-Profil: +# auto = erkennt z. B. embeddinggemma und verwendet passende Query-/Doc-Prompts +# plain = keine modellspezifischen Retrieval-Prompts +# +# Empfohlen: +KNOWLEDGE_EMBEDDING_PROFILE=auto + +# Maximale Dauer eines einzelnen Ollama-Requests. +OLLAMA_TIMEOUT=10m + +# Maximale Anzahl generierter Tokens für strukturierte Entscheidungen. +OLLAMA_NUM_PREDICT=768 + +# Anzahl Wiederholungen bei ungültigem/unvollständigem JSON. +OLLAMA_JSON_RETRIES=1 + +# Modell nach Nutzung im Speicher halten. +OLLAMA_KEEP_ALIVE=10m + +# Thinking bei unterstützten Modellen deaktivieren. +# Für die strukturierte Ticketklassifikation normalerweise sinnvoll. +OLLAMA_THINK=false + +# Maximale parallele Requests an Ollama. +# +# Bei einer GPU/einem Ollama-Slot zunächst 1 verwenden. +OLLAMA_MAX_CONCURRENT=1 + + +############################################################################### +# 06. KNOWLEDGE BASE / RAG - GRUNDKONFIGURATION +############################################################################### + +# Verzeichnis für statische / Git-verwaltete Knowledge-JSONs. +KNOWLEDGE_DIR=./knowledge + +# false deaktiviert das komplette RAG/Embedding-System. +RAG_ENABLED=true + +# Verhalten bei externen/String-Kategorien aus gemeinsam genutzten KB-Dateien. +# +# Mögliche Werte: +# +# unscoped +# KB wird trotzdem geladen. +# Fremdkategorien dienen weiterhin als Retrieval-Tags. +# Nicht zuordenbare GLPI-Kategorien werden nicht erzwungen. +# +# skip +# KB mit nicht zuordenbaren Kategorien komplett überspringen. +# +# strict +# unbekannte Kategorie erzeugt einen Start-/Scanfehler. +# +# Für gemeinsam genutzte Datenbestände empfohlen: +KNOWLEDGE_CATEGORY_MODE=unscoped + +# Optionales Mapping externer Kategorien auf GLPI-ITIL-Kategorie-IDs. +# +# Beispiel: +# { +# "Active Directory": 2, +# "Outlook": 12, +# "E-Mail": 12, +# "Security": [20,21] +# } +KNOWLEDGE_CATEGORY_MAP_FILE=/app/data/knowledge-category-map.json + +# Dateien anhand von Glob-Mustern ignorieren. +# +# Beispiele: +# KNOWLEDGE_IGNORE_GLOBS=KB-SEC-ATTCK-*.json +# KNOWLEDGE_IGNORE_GLOBS=legacy-*.json,external-only-*.json +# +# Leer = nichts explizit ignorieren. +KNOWLEDGE_IGNORE_GLOBS= + + +############################################################################### +# 07. PERSISTENTER / INKREMENTELLER KNOWLEDGE-INDEX +############################################################################### + +# Mögliche Werte: +# +# incremental +# vorhandenen persistenten Index sofort laden und Änderungen im Hintergrund +# nachziehen. Für Produktion empfohlen. +# +# rebuild +# Index vollständig neu aufbauen. +# +# readonly +# nur vorhandenen Snapshot benutzen, keine Quelldateien aktualisieren. +# +KNOWLEDGE_INDEX_MODE=incremental + +# Anzahl Embedding-Inputs pro Batch. +KNOWLEDGE_EMBED_BATCH_SIZE=64 + +# Intervall für Hintergrundprüfung auf neue/geänderte/gelöschte Knowledge-Dateien. +# +# 0 = kein automatischer Rescan. +KNOWLEDGE_INDEX_SCAN_INTERVAL=5m + + +############################################################################### +# 08. KNOWLEDGE-RETRIEVAL / KANDIDATENAUSWAHL +############################################################################### + +# Minimale Retrieval-Relevanz, damit eine KB überhaupt als plausibler Kandidat +# betrachtet werden kann. +# +# KEINE Wahrscheinlichkeit. +KNOWLEDGE_RETRIEVAL_FLOOR=0.30 + +# Maximaler Abstand zum besten Treffer. +# +# Beispiel: +# bester Treffer = 0.82 +# MAX_GAP = 0.20 +# dynamischer Cutoff = 0.62 +# +# Nur KBs >= 0.62 werden in diesem Beispiel an die KI weitergegeben. +KNOWLEDGE_CANDIDATE_MAX_GAP=0.20 + +# Maximale Anzahl KB-Kandidaten, die Ollama erhält. +# +# Das ist nur die Obergrenze. +# Durch Floor und Max-Gap können es deutlich weniger sein. +KNOWLEDGE_TOP_K=6 + +# Anzahl Kandidaten, die für Dashboard/Audit gespeichert werden. +# Kann größer als KNOWLEDGE_TOP_K sein. +KNOWLEDGE_AUDIT_TOP_K=10 + + +############################################################################### +# 09. HYBRID-RETRIEVAL / RANKING +############################################################################### + +# Gewichtung des Kandidaten-Rankings. +# +# Summe sollte sinnvollerweise 1.0 ergeben. +# Fehlende Metadaten werden nicht negativ gewertet; vorhandene Komponenten +# werden intern entsprechend berücksichtigt. + +# Embedding-/Chunk-Semantik +KNOWLEDGE_WEIGHT_SEMANTIC=0.45 + +# Ähnlichkeit Ticket-Betreff <-> KB-Titel +KNOWLEDGE_WEIGHT_TITLE=0.20 + +# Lexikalische Übereinstimmungen / typische Helpdesk-Begriffe +KNOWLEDGE_WEIGHT_LEXICAL=0.20 + +# Explizite KB-Keywords +KNOWLEDGE_WEIGHT_KEYWORDS=0.075 + +# GLPI-Kategorie / bestätigte Lernsignale +KNOWLEDGE_WEIGHT_CATEGORY=0.075 + + +############################################################################### +# 10. FINALE KNOWLEDGE-EVIDENZ FÜR AUTO-REPLY +############################################################################### + +# Mindestwert der finalen Evidenz für eine automatische Antwort. +# +# WICHTIG: +# Das ist NICHT mehr nur der rohe Retrieval-Score. +# +# Finale Evidenz berücksichtigt: +# - Retrieval +# - KI-Auswahl / KI-Confidence +# - Kategorieübereinstimmung +# +KNOWLEDGE_MIN_SCORE=0.70 + +# Gewicht des Retrieval-Scores in der finalen Evidenz. +KNOWLEDGE_EVIDENCE_WEIGHT_RETRIEVAL=0.45 + +# Gewicht der KI-Auswahl / Reply-Confidence. +KNOWLEDGE_EVIDENCE_WEIGHT_AI=0.35 + +# Gewicht der Kategorieübereinstimmung. +KNOWLEDGE_EVIDENCE_WEIGHT_CATEGORY=0.20 + + +############################################################################### +# 11. KNOWLEDGE-CHUNKING +############################################################################### + +# Anzahl Wörter pro KB-Chunk. +KNOWLEDGE_CHUNK_WORDS=160 + +# Überlappung zwischen benachbarten Chunks. +KNOWLEDGE_CHUNK_OVERLAP_WORDS=30 + +# Maximale Anzahl Chunks pro Knowledge-Dokument. +KNOWLEDGE_MAX_CHUNKS_PER_DOC=24 + +# Maximale Anzahl Chunks eines langen Tickets. +KNOWLEDGE_MAX_QUERY_CHUNKS=64 + +# Begrenzung der Kategorien im Ollama-Prompt. +# Verhindert übergroße Prompts bei sehr großen GLPI-Kategorieäumen. +CATEGORY_PROMPT_LIMIT=80 + + +############################################################################### +# 12. KNOWLEDGE-QUELLEN / TRUST POLICY +############################################################################### + +# Nur diese Source-Labels dürfen überhaupt durchsucht werden. +# +# Beispiel: +# internal-kb,glpi-kb,vendor-docs +KNOWLEDGE_ALLOWED_SOURCES=internal-kb,glpi-kb + +# Nur diese Quellen dürfen automatische Antworten auslösen. +# +# Muss Teilmenge von KNOWLEDGE_ALLOWED_SOURCES sein. +# +# "none" = Auto-Reply aus Knowledge-Quellen komplett deaktivieren. +KNOWLEDGE_AUTO_REPLY_SOURCES=internal-kb,glpi-kb + +# Webbasierte CRUD-Verwaltung eigener Knowledge-Artikel. +# +# Web-Artikel liegen unter: +# DATA_DIR/knowledge-managed/ +# +# KNOWLEDGE_DIR bleibt read-only / Git-verwaltet. +KNOWLEDGE_WEB_EDIT_ENABLED=true + + +############################################################################### +# 13. GLPI KNOWLEDGE BASE - READ-ONLY CONNECTOR +############################################################################### + +# GLPI Knowledge Base synchronisieren. +GLPI_KB_ENABLED=true + +# auto: +# KnowbaseItem-Route wird aus /api.php/doc.json ermittelt. +# +# Alternativ kann ein expliziter API-Pfad angegeben werden. +GLPI_KB_PATH=auto + +# Optionaler serverseitiger Filter. +# Leer = alle für den Service-Account sichtbaren KB-Artikel. +GLPI_KB_FILTER= + +# Maximale Anzahl synchronisierter GLPI-KB-Artikel. +GLPI_KB_LIMIT=500 + +# Synchronisationsintervall. +GLPI_KB_SYNC_INTERVAL=10m + +# Source-Label synchronisierter GLPI-KBs. +# Muss in KNOWLEDGE_ALLOWED_SOURCES stehen. +GLPI_KB_SOURCE=glpi-kb + +# true: +# freigegebene GLPI-KB-Artikel können Auto-Replies auslösen. +# +# false: +# GLPI-KB wird nur für Recherche, RAG und Klassifizierung verwendet. +GLPI_KB_AUTO_REPLY=true + +# Whitelist der GLPI-KNOWLEDGE-BASE-Kategorie-IDs. +# +# WICHTIG: +# Das sind NICHT die GLPI-ITIL-/Ticketkategorie-IDs. +# +# Mehrere Werte: +# 1,4,7 +GLPI_KB_AUTO_REPLY_CATEGORY_IDS=1 + + +############################################################################### +# 14. HUMAN-IN-THE-LOOP / LERNEN +############################################################################### + +# Menschlich bestätigte/korrigierte Kategorieentscheidungen als Lernbeispiele +# verwenden. +# +# Die KI lernt NICHT automatisch aus ihren eigenen Entscheidungen. +LEARNING_ENABLED=true + +# Maximale Anzahl gespeicherter Lernbeispiele. +LEARNING_MAX_EXAMPLES=500 + +# Maximale Anzahl Beispiele je Kategorie, die in einen KI-Prompt übernommen werden. +LEARNING_EXAMPLES_PER_CATEGORY=5 + + +############################################################################### +# 15. KOMMUNIKATION MIT ENDNUTZERN +############################################################################### + +# Auto-Reply-KBs müssen zu Sprache und Kommunikationsstil passen. +COMMUNICATION_LANGUAGE=de-DE +COMMUNICATION_STYLE=formal + +# Wird vor den freigegebenen KB-Inhalt gesetzt. +COMMUNICATION_SALUTATION=Guten Tag, + +# Abschluss der Antwort. +COMMUNICATION_CLOSING=Mit freundlichen Grüßen +COMMUNICATION_SIGNATURE=IT-Service + + +############################################################################### +# 16. EXTERNER BETRIEBSKONTEXT +############################################################################### + +# Globaler Schalter für: +# - Changes +# - Major Incidents +# - Benutzer/Geräte +# - Uptime Kuma +CONTEXT_ENABLED=true + +# Gemeinsames Timeout für Kontextabfragen. +CONTEXT_TIMEOUT=12s + +# Minimale deterministische Relevanz zwischen Ticket und Incident/Outage. +CONTEXT_RELEVANCE_MIN_SCORE=0.20 + +# Wenn eine aktivierte Kontextquelle fehlschlägt: +# true = Auto-Reply sicherheitshalber blockieren. +CONTEXT_BLOCK_AUTO_REPLY_ON_ERRORS=true + +# Bei relevantem Major Incident / zentraler Störung: +# true = individuelle Standard-Auto-Replies blockieren. +CONTEXT_BLOCK_AUTO_REPLY_ON_INCIDENT=true + + +############################################################################### +# 17. GLPI CHANGE CALENDAR +############################################################################### + +CHANGE_CALENDAR_ENABLED=true + +# High-Level-API-Route. +# Wird gegen /api.php/doc.json geprüft. +GLPI_CHANGE_PATH=/Assistance/Change + +# Optionaler GLPI-Filter. +GLPI_CHANGE_FILTER= + +# Maximal geladene Changes. +GLPI_CHANGE_LIMIT=100 + +# Vergangener Zeitraum, der für Tickets berücksichtigt wird. +CHANGE_LOOKBACK=72h + +# Zukünftiger Zeitraum. +CHANGE_LOOKAHEAD=24h + + +############################################################################### +# 18. MAJOR INCIDENTS +############################################################################### + +# false = Funktion vollständig deaktiviert. +MAJOR_INCIDENTS_ENABLED=false + +# Muss bei aktiviertem Major-Incident-Modus bewusst gesetzt werden. +# +# Beispiel hängt von der eigenen GLPI-Struktur ab. +# Gegen /api.php/doc bzw. die GLPI-Filtersemantik prüfen. +GLPI_MAJOR_INCIDENT_FILTER= + +GLPI_MAJOR_INCIDENT_LIMIT=20 + + +############################################################################### +# 19. BENUTZER -> GERÄT / ASSET-KONTEXT +############################################################################### + +# Zusätzlich zu direkt am Ticket verknüpften Assets die dem Requester +# zugeordneten Geräte suchen. +USER_DEVICE_CONTEXT_ENABLED=true + +# Eine oder mehrere Asset-Routen. +# Mehrere Werte ggf. komma-separiert, sofern vom Agent unterstützt. +GLPI_USER_DEVICE_PATHS=/Assets/Computer + +# {{user_id}} wird durch die jeweilige GLPI-Requester-ID ersetzt. +# +# Nicht durch eine feste Benutzer-ID ersetzen. +GLPI_USER_DEVICE_FILTER_TEMPLATE=user.id=={{user_id}} + +GLPI_USER_DEVICE_LIMIT=20 + + +############################################################################### +# 20. UPTIME KUMA +############################################################################### + +# false = keine Uptime-Kuma-Abfragen. +UPTIME_KUMA_ENABLED=false + +UPTIME_KUMA_URL=https://uptime.example.com + +# Mögliche Modi: +# +# metrics +# Authentifizierter Prometheus-/metrics-Endpunkt. +# Für interne Systeme empfohlen. +# +# status_page +# Veröffentlichte Uptime-Kuma-Statusseiten. +# +UPTIME_KUMA_MODE=metrics + +# Nur für metrics erforderlich. +# Bei deaktiviertem Uptime Kuma am besten leer lassen. +UPTIME_KUMA_API_KEY= + +# Nur für status_page erforderlich. +# Mehrere Slugs komma-separiert: +# it-services,network,applications +UPTIME_KUMA_STATUS_PAGES=it-services + +UPTIME_KUMA_TIMEOUT=10s + +# Maximal an den Agenten übergebene aktuelle Probleme. +UPTIME_KUMA_MAX_ISSUES=20 + +# Maintenance-Zustände ebenfalls als Kontext berücksichtigen. +UPTIME_KUMA_INCLUDE_MAINTENANCE=true + + +############################################################################### +# 21. POLICY-GATES +############################################################################### + +# Automatische Kategorisierung grundsätzlich zulassen. +AUTO_CATEGORY=true + +# Automatische Endnutzerantworten grundsätzlich zulassen. +# +# DRY_RUN=true verhindert trotzdem das Schreiben. +AUTO_REPLY=true + +# Minimale KI-Confidence für Kategorieempfehlungen. +CATEGORY_CONFIDENCE=0.70 + +# Minimale KI-Confidence für Lösungsvorschläge. +# +# Zusätzlich gelten u. a.: +# - Knowledge-Evidenz +# - Source Policy +# - Auto-Reply-Freigabe der KB +# - kein vorhandenes Followup +# - Kontext-/Incident-Regeln +REPLY_CONFIDENCE=0.70 + + +############################################################################### +# 22. WORKER / QUEUE +############################################################################### + +# Maximale Anzahl wartender Ticketjobs. +QUEUE_SIZE=256 + +# Parallele Ticket-Worker. +# +# Darf größer als OLLAMA_MAX_CONCURRENT sein: +# Ollama wird separat durch seine eigene Parallelitätsgrenze geschützt. +WORKERS=2 \ No newline at end of file