# Autonomous Research ## Ziel Autonomous Research entkoppelt die Webrecherche von einem einzelnen AI-THINK-Artikelversuch. Das Brain kann nun selbstständig Wissenslücken erkennen, persistente Rechercheaufgaben planen, sie mit niedriger Priorität über den vorhandenen Ollama-Pool abarbeiten und akzeptierte externe Evidenz sofort lernen und verknüpfen. Produktive Knowledgebase-Dateien werden weiterhin niemals automatisch verändert. Ein belastbarer neuer oder überarbeiteter Artikel landet ausschließlich im AI-Staging. ## Warum eine eigene asynchrone Queue vor Ollama Die Aufgaben werden nicht blind direkt in eine einzelne Ollama-Instanz geschoben. Davor liegt eine persistente SQLite-Queue: ```text Graph-Scanner / API / Agent-Event ↓ research_tasks in graph.db ↓ Leerlauf-, Tagesbudget- und Prioritätsprüfung ↓ Lease für genau einen Worker ↓ vorhandener Ollama-Pool mit Healthcheck, least-inflight und Failover ↓ SearXNG, Volltextprüfung, Evidenzlernen und Artikelsynthese ``` Das ist sinnvoller als eine unkontrollierte Ollama-Queue: - Benutzeranfragen und normales AI-THINK behalten Vorrang. - Aufgaben überleben Prozess- und Host-Neustarts. - Doppelte Themen werden über einen stabilen Dedupe-Key und einen Cooldown verhindert. - Eine Worker-Lease verhindert doppelte Verarbeitung. - Fehlgeschlagene Aufgaben werden mit Backoff erneut eingeplant und nach `max_attempts` beendet. - Der Ollama-Pool entscheidet erst unmittelbar vor einem Modellaufruf, welcher gesunde Node Kapazität besitzt. - Autonome Aufrufe tragen einen Low-Priority-Kontext. Wartet eine normale Agent-, Query- oder AI-THINK-Anfrage, darf der Hintergrundworker beim nächsten Pool-Acquire nicht vorbeiziehen. Bereits laufende Modellgenerierungen werden nicht hart abgebrochen. Auf einem einzelnen Ollama-Node kann eine neu eintreffende interaktive Anfrage daher noch den aktuell laufenden autonomen Modellaufruf abwarten; zwischen allen weiteren Modellaufrufen erhält sie Vorrang. In einem Multi-Node-Pool kann sie parallel einen freien Node erhalten. Der autonome Worker selbst arbeitet absichtlich sequenziell. SearXNG-Abfragen und Seitenabrufe können innerhalb einer Aufgabe mehrere Quellen verarbeiten, aber nur eine autonome Wissensaufgabe darf gleichzeitig die Synthese- und Graphpipeline verändern. ## Eigenantrieb Ein periodischer Scanner bewertet produktive Wissens-Nodes innerhalb des exakten Thinking-Source-Filters. Signale sind unter anderem: - akzeptierte `contradicts`-Beziehungen; - keine gelernte externe Evidenz; - hohes Alter des Wissens; - hohe Zentralität im Graphen; - schwache Verknüpfung eines ansonsten produktiven Wissenspunkts. Die besten Kandidaten werden von Qwen in konkrete Opportunities umgewandelt. Der Planner muss dabei aus dem vorhandenen Quellenkontext ableiten: - ob externe Recherche wirklich Mehrwert verspricht; - ein enges Thema; - eine Begründung; - eine Priorität von 0 bis 1; - konkrete Forschungsfragen; - präzise deutsche und englische SearXNG-Queries; - ausschließlich tatsächlich vorhandene Seed-Node-IDs. Eine Opportunity unterhalb der im WebUI eingestellten Mindestpriorität wird nicht eingereiht. ## Nutzungsgesteuerte Trigger Eine normale Wissensanfrage erzeugt optional eine Aufgabe, wenn keine Treffer vorhanden sind oder die Antwort explizite Unsicherheiten enthält. Das Verhalten wird durch folgende Einstellung gesteuert: ```env BRAIN_AUTONOMOUS_RESEARCH_QUERY_TRIGGERS=true ``` Zusätzlich erzeugen diese externen Eventtypen automatisch eine Research-Aufgabe: ```text knowledge.answer_insufficient knowledge.search.empty agent.answer.uncertain ``` Beispiel: ```bash curl -X POST http://localhost:8090/api/events \ -H 'Content-Type: application/json' \ -d '{ "type": "knowledge.answer_insufficient", "source": "glpi-ai-agent", "query": "Wie wird ein verschlüsselter ZFS-Datensatz auf einem Ersatzsystem wiederhergestellt?", "message": "Die vorhandenen Treffer enthalten keine Key-Import- und Validierungsschritte.", "hits": [], "metadata": {"priority": 0.95} }' ``` ## Direkte API-Trigger ### Aufgabe einreihen ```http POST /api/research/tasks ``` ```json { "topic": "ZFS-Schlüsselwiederherstellung", "question": "Wie werden verschlüsselte ZFS-Datasets auf einem Ersatzsystem importiert, entsperrt und validiert?", "seed_node_ids": ["optional-existing-node-id"], "priority": 0.95, "requested_by": "glpi-ai-agent", "reason": "knowledge.answer_insufficient" } ``` Die Antwort ist `202 Accepted`, wenn eine neue Aufgabe erstellt wurde. Liegt dasselbe Thema innerhalb des Cooldowns bereits vor, wird die bestehende Aufgabe mit `200 OK` zurückgegeben. ### Queue anzeigen ```http GET /api/research/tasks?limit=100 ``` ### Aufgabe abbrechen ```http POST /api/research/tasks/{id}/cancel ``` Nur `queued`, `deferred` und `reserved` können abgebrochen werden. Eine bereits laufende Synthese wird nicht hart unterbrochen. ### Graph sofort analysieren ```http POST /api/research/autonomous/scan ``` ### Wartende Queue sofort wecken ```http POST /api/research/autonomous/run ``` „Queue starten“ umgeht weder Leerlauf-, Thinking-, SearXNG-, Tagesbudget- noch Ollama-Kapazitätsregeln. Es verkürzt nur die Wartezeit bis zur nächsten Prüfung. ## Verarbeitung einer Aufgabe 1. Vorhandene Seed-Nodes werden gegen den exakten Thinking-Source-Filter geprüft. 2. Fehlen Seeds, sucht EmbeddingGemma passende produktive Wissens-Nodes zum Thema. 3. Qwen vervollständigt bei Bedarf Forschungsfragen und deutsche/englische Queries. 4. Die bestehende iterative Research-Pipeline führt SearXNG-Suchen aus. 5. Treffer passieren Snippet-, Domain-, Relevanz- und Quellenqualitäts-Gates. 6. Die besten Seiten werden SSRF-geschützt geladen, bereinigt und erneut bewertet. 7. Nur akzeptierte Volltextbelege werden als Research-Evidence gelernt und mit Seed-Nodes verbunden. 8. Die vorhandene Knowledge-Synthesis entscheidet, ob Evidenz allein genügt oder ein neuer beziehungsweise aktualisierter KB-Entwurf echten Mehrwert bietet. 9. Resultat, Evidenzanzahl, Artikelpfad und Versuchshistorie werden in SQLite gespeichert. Mögliche Outcomes: ```text evidence_only article_created no_useful_evidence failed ``` ## Queue-Zustände ```text queued wartet auf Priorität, Budget und Leerlauf reserved Worker-Lease wurde vergeben running SearXNG/Ollama/Synthese läuft deferred temporärer Fehler; erneuter Versuch nach Backoff completed Aufgabe ist abgeschlossen failed maximale Versuche erreicht cancelled manuell verworfen ``` Beim Start setzt das Brain abgelaufene `reserved`- oder `running`-Leases automatisch auf `deferred` zurück. ## Konfiguration ```env BRAIN_AUTONOMOUS_RESEARCH_ENABLED=false BRAIN_AUTONOMOUS_RESEARCH_IDLE_ONLY=true BRAIN_AUTONOMOUS_RESEARCH_INTERVAL=30m BRAIN_AUTONOMOUS_RESEARCH_TASKS_PER_CYCLE=1 BRAIN_AUTONOMOUS_RESEARCH_MAX_TASKS_PER_DAY=12 BRAIN_AUTONOMOUS_RESEARCH_MAX_QUERIES_PER_TASK=6 BRAIN_AUTONOMOUS_RESEARCH_MAX_PAGES_PER_TASK=8 BRAIN_AUTONOMOUS_RESEARCH_MAX_ROUNDS=3 BRAIN_AUTONOMOUS_RESEARCH_MIN_PRIORITY=0.65 BRAIN_AUTONOMOUS_RESEARCH_COOLDOWN=168h BRAIN_AUTONOMOUS_RESEARCH_LEASE=45m BRAIN_AUTONOMOUS_RESEARCH_MAX_ATTEMPTS=3 BRAIN_AUTONOMOUS_RESEARCH_QUERY_TRIGGERS=true BRAIN_AUTONOMOUS_RESEARCH_OPPORTUNITY_LIMIT=8 ``` Zusätzlich erforderlich: ```env SEARXNG_URL=http://searxng:8080 ``` `BRAIN_RESEARCH_ENABLED` darf für normale Relation-/Artikelrecherche weiterhin separat gesetzt werden. Autonomous Research kann im WebUI aktiviert werden, sobald `SEARXNG_URL` beim Prozessstart vorhanden war. ## WebUI Unter **FILTER → Autonomous Research** stehen zur Verfügung: - Eigenständige Wissensanreicherung an/aus; - nur im Leerlauf; - Mindestpriorität; - maximale Aufgaben pro Tag; - neue Aufgaben pro Graphscan; - manuelle Rechercheaufgabe; - Graphanalyse starten; - Queue wecken; - persistente Queue mit Status, Priorität, Versuchen, Evidenzzahl und Abbruchmöglichkeit. Der linke Activity-Feed zeigt Opportunity-Scans, Einreihung, Start, Abschluss und Fehler. Die darunterliegende SearXNG- und Volltextanimation bleibt unverändert sichtbar. ## Source-Filter Der autonome Graphscanner und die Seed-Auswahl verwenden den exakten Thinking-Source-Filter. Externe Volltextbelege besitzen als `source` ihre Domain. Soll autonome Recherche neue Domains uneingeschränkt lernen dürfen, muss **Thinking → Alle** aktiv sein. Eine eng begrenzte Thinking-Source-Liste verwirft Webbelege, deren Domain nicht exakt ausgewählt ist. ## Sicherheitsgrenzen - Fremde Webseiten sind ausschließlich untrusted evidence. - Inhalte dürfen keine Modell- oder Systemanweisungen überschreiben. - lokale/private Adressen und Redirects werden standardmäßig blockiert; - Seiten-, Zeichen-, Zeit- und Ergebnislimits gelten weiterhin; - produktive KB-Dateien und GLPI werden nicht beschrieben; - automatisch erzeugte Artikel bleiben im Staging und benötigen manuelle Freigabe. ## Sichere Wiederverwendung autonomer Recherche Autonome Research-Tasks verwenden denselben Intent Guard wie die Artikelsynthese. Ein semantisch ähnlicher Cache-Treffer wird nur übernommen, wenn Hauptintention/Fokus/Entities kompatibel sind und die vorhandenen Volltexte bei einer erneuten Bewertung die aktuelle Task-Frage ausreichend abdecken. Andernfalls startet der Task eine neue offene Recherche.