# Build
cargo build --release --features web
# Start (Foreground, Dashboard only)
cargo run --features web
# With landing page
cargo run --features web -- --landingpage
# Start (Background)
cargo run --features web -- -d
# Stop
cargo run --features web -- stopServer: http://localhost:7070
Console WebSocket: ws://localhost:7071
airust # Port 7070 (Default), nur Dashboard
airust --port 8080 # Custom Port
airust -d # Im Hintergrund starten
airust --landingpage # Landing Page + Dashboard
airust stop # StoppenBrowser: http://localhost:7070
- Datenbank wird geoeffnet (
airust.db) — wird automatisch erstellt falls nicht vorhanden - 4 Agenten werden erstellt: TF-IDF, Exact, Fuzzy, Context
- Knowledge Base wird geladen (eingebettete + DB-Trainingsdaten)
- Alle Agenten werden mit den KB-Daten trainiert
- Web-Server startet auf Port 7070
- Console WebSocket startet auf Port 7071
- Default-Agent ist TF-IDF (kann im Dashboard geaendert werden)
knowledge/train.json (Compile-Zeit, initial leer)
+
SQLite training_data (Runtime-Daten)
|
v
KnowledgeBase (merged)
|
v
Alle 4 Agenten trainiert
|
v
Query → aktive Agenten → beste Antwort
- Dashboard oeffnen:
http://localhost:7070 - Tab Chat ist beim Start aktiv
- Klicke + (oben links) um einen neuen Chat zu erstellen
- Tippe eine Frage ins Eingabefeld unten
- Druecke Enter oder klicke Send
- Die Antwort erscheint mit einem Confidence-Score (0-100%)
- Deine Frage wird an
/api/querygesendet - Alle aktiven Agenten werden parallel befragt
- Jeder Agent berechnet eine Antwort + Confidence
- Die Antwort mit der hoechsten Confidence gewinnt
- Falls der Context-Agent aktiv ist, wird die Frage+Antwort im Kontext gespeichert
- Frage und Antwort werden in der SQLite-DB gespeichert (Chat-History)
- Archivieren: Chat-Eintrag nach links swipen oder Archive-Button klicken
- Loeschen: X-Button am Chat-Eintrag
- Archiv anzeigen/verbergen: Toggle-Button in der Chat-Liste
- Automatischer Titel: Wird aus den ersten 50 Zeichen der ersten Nachricht generiert
| Bereich | Bedeutung |
|---|---|
| 80-100% | Sehr sichere Antwort, gute Uebereinstimmung |
| 50-80% | Teilweise passend, moeglicherweise ungenaue Antwort |
| 0-50% | Niedrige Sicherheit, Agent hat keine gute Uebereinstimmung gefunden |
In Settings (Zahnrad-Icon in der Sidebar):
| Agent | Typ | Wie er funktioniert | Wann verwenden? |
|---|---|---|---|
| Smart Search | TF-IDF/BM25 | Zerlegt Frage in Woerter, berechnet Gewichtung nach Haeufigkeit und Seltenheit, rankt nach BM25-Score | Standard-Agent. Beste Wahl fuer natuerliche Sprache |
| Word-for-Word | Exact Match | Vergleicht die Eingabe exakt (case-insensitive) mit allen Trainingsfragen | Wenn exakte Kommandos oder Keywords erwartet werden |
| Close Enough | Fuzzy/Levenshtein | Berechnet Levenshtein-Distanz zu jeder Trainingsfrage, toleriert Tippfehler | Wenn User oft Tippfehler machen |
| Remembers Chat | Context + TF-IDF | Haengt vorherige Fragen+Antworten an die aktuelle Frage, nutzt TF-IDF darunter | Fuer Gespraeche mit Bezug auf vorherige Nachrichten |
So funktioniert es:
- Oeffne Settings in der Sidebar
- Setze Haekchen bei mehreren Agenten (Checkboxen, nicht Radio-Buttons)
- Mindestens ein Agent muss aktiv bleiben
- Die Statusbar unten zeigt alle aktiven Agenten an:
(Smart Search + Close Enough)
Was passiert bei einer Query?
- Frage geht an alle aktiven Agenten gleichzeitig
- Jeder Agent berechnet unabhaengig eine Antwort + Confidence
- Der Agent mit der hoechsten Confidence gewinnt
- Die Antwort zeigt, welcher Agent gewonnen hat
Empfohlene Kombinationen:
| Kombination | Anwendungsfall |
|---|---|
| TF-IDF allein | Standard, schnell, gut genug |
| TF-IDF + Fuzzy | Semantik + Tippfehler-Toleranz |
| TF-IDF + Exact | Semantik + exakte Treffer bevorzugen |
| Alle 4 | Maximale Abdeckung, immer die beste Antwort |
| Context allein | Mehrteilige Gespraeche mit Gedaechtnis |
Die Knowledge Base (KB) ist das Wissen des Agenten. Ohne Trainingsdaten kann er nichts beantworten.
Schritt fuer Schritt:
- Gehe zu Tab Knowledge in der Sidebar
- Waehle Sub-Tab All
- Klicke "Add Example"
- Fuell die Felder aus:
- Input: Die Frage (z.B. "Was ist Rust?")
- Output: Die Antwort (z.B. "Eine Systemprogrammiersprache von Mozilla")
- Format:
text(Standard),markdown(formatiert), oderjson(strukturiert) - Weight: Gewichtung 0.0-10.0 (Standard: 1.0, hoeher = bevorzugt)
- Klicke Save
- Alle Agenten werden automatisch neu trainiert
Wie Gewichtung funktioniert:
- Weight
1.0= normale Prioritaet - Weight
2.0= doppelt so wichtig, wird bei aehnlichen Treffern bevorzugt - Weight
0.0= wird ignoriert (deaktiviert ohne zu loeschen)
Format:
[
{
"input": "Was ist Rust?",
"output": "Eine Systemprogrammiersprache",
"format": "text",
"weight": 1.0
},
{
"input": "Wer hat Rust erfunden?",
"output": "Graydon Hoare bei Mozilla",
"format": "text",
"weight": 1.0
}
]Schritt fuer Schritt:
- Tab Knowledge > Sub-Tab Import
- Option A: JSON einfuegen — JSON-Array in das Textfeld pasten, "Import" klicken
- Option B: Datei hochladen — JSON-Datei per Drag & Drop oder Klick hochladen
- Erfolgsmeldung zeigt Anzahl importierter Beispiele
- Alle Agenten werden automatisch neu trainiert
Was passiert:
- PDF wird hochgeladen und der Text extrahiert
- Text wird in Chunks zerlegt (max. 1000 Zeichen, min. 50)
- Chunks ueberlappen sich um 200 Zeichen (damit Kontext nicht verloren geht)
- Jeder Chunk wird als Frage-Antwort-Paar gespeichert
- Agenten werden neu trainiert
Schritt fuer Schritt:
- Tab Knowledge > Sub-Tab Import > PDF-Bereich
- PDF per Drag & Drop oder Klick hochladen
- Warten bis "X examples added" erscheint
- Fertig — die PDF-Inhalte sind jetzt durchsuchbar
Limitierungen:
- Nur textbasierte PDFs (keine gescannten Bilder/OCR)
- Tabellen und komplexe Layouts werden als Fliesstext extrahiert
Fuer zweisprachige Saetze von manythings.org/anki/:
Format (TSV):
Hello Hallo CC-BY 2.0
How are you? Wie geht es dir? CC-BY 2.0
Schritt fuer Schritt:
- TSV-Datei von manythings.org herunterladen
- Tab Knowledge > Sub-Tab Import > Tatoeba-Bereich
- TSV-Datei hochladen
- Jede Zeile wird als Quellsprache→Zielsprache Paar gespeichert
- Agenten werden neu trainiert
Speichern:
- Tab Knowledge > Unten: Pfad eingeben (z.B.
./knowledge/meine_kb.json) - Save klicken
- KB wird als JSON-Datei auf dem Server gespeichert
Laden:
- Tab Knowledge > Unten: Pfad zur JSON-Datei eingeben
- Load klicken
- Bestehende KB wird ersetzt (nicht gemergt!)
- Agenten werden neu trainiert
Datenquellen:
1. knowledge/train.json ← Compile-Zeit (initial leer [])
2. SQLite training_data ← Manuell / Import / PDF / Tatoeba
3. SQLite approved_data ← Von Bots gesammelt + genehmigt
Beim Start:
train.json + DB training_data → merged KnowledgeBase → trainiert alle Agenten
Zur Laufzeit:
Neues Beispiel → KB + DB → alle Agenten sofort neu trainiert
Kategorien helfen, Trainingsdaten thematisch zu organisieren.
- Tab Knowledge > Sub-Tab Categories
- Neue Kategorie erstellen:
- Name eingeben (z.B. "Technik", "Smalltalk", "Support")
- Farbe waehlen (Farbkreis)
- "Create" klicken
- Trainingsdaten zuordnen:
- Beim Erstellen eines Beispiels die Kategorie auswaehlen
- Nach Kategorie filtern:
- Auf eine Kategorie klicken, um nur deren Eintraege zu sehen
- Kategorie loeschen:
- Delete-Button an der Kategorie
- Trainingsdaten bleiben erhalten (Kategorie wird auf "Keine" gesetzt)
Bots koennen automatisch Webseiten crawlen und daraus Trainingsdaten generieren.
Schritt fuer Schritt:
- Tab Tools > Sub-Tab Bots
- Klicke "New Bot"
- Konfiguriere:
- Name: z.B. "Wikipedia Crawler"
- URL: Die zu crawlende Webseite
- Modus:
single— Nur diese eine Seitefollow— Links auf der Seite folgen (rekursiv)
- Max Depth: Wie viele Link-Ebenen tief (Standard: 2)
- Rate Limit: Pause zwischen Requests in ms (Standard: 1000)
- Klicke "Create"
- Klicke "Start" am Bot
- Bot laedt die URL herunter
- HTML wird geparst, Text extrahiert
- Content-Hash wird berechnet (SHA-256) zur Deduplizierung
- Rohdaten werden als
raw_datain der DB gespeichert (Status:pending) - Bei
follow-Modus: Links auf der Seite werden gesammelt und ebenfalls gecrawlt - Bot-Run wird mit Statistik gespeichert (Items found, Items added)
Schritt fuer Schritt:
- Tab Tools > Sub-Tab Review
- Pending-Daten ansehen: Liste aller ungeprueften Eintraege
- Fuer jeden Eintrag:
- Approve — Daten sind gut, genehmigen
- Reject — Daten sind schlecht, ablehnen
- Oder: "Approve All" fuer alle auf einmal
- Genehmigte Daten ansehen: Toggle "Show Approved"
- "Add to Knowledge" klicken — genehmigte Daten werden in die KB uebernommen
- Alle Agenten werden automatisch neu trainiert
Bot crawlt Webseite
|
v
raw_data (pending)
|
[Review: Approve/Reject]
|
v
approved_data
|
[Add to Knowledge]
|
v
KnowledgeBase + Agenten neu trainiert
Die VectorDB speichert Texte als TF-IDF-Vektoren und ermoeglicht Aehnlichkeitssuche per Cosine-Similarity.
- Tab Tools > Sub-Tab VectorDB
- Collection erstellen:
- Name eingeben (z.B. "Produktbeschreibungen")
- Optional: Beschreibung hinzufuegen
- "Create" klicken
- Eintrag hinzufuegen:
- Collection auswaehlen
- Text eingeben (z.B. eine Produktbeschreibung)
- Optional: Metadaten als JSON (z.B.
{"category": "electronics"}) - "Add" klicken — Embedding wird automatisch berechnet
- Suchen:
- Query eingeben (z.B. "kabelloses Headset")
- Top-K Ergebnisse einstellen (Standard: 5)
- "Search" klicken
- Ergebnisse werden nach Aehnlichkeit sortiert mit Score
- Beim Hinzufuegen: Text wird in TF-IDF-Vektor umgewandelt (basierend auf allen Eintraegen der Collection)
- Bei der Suche: Query wird ebenfalls vektorisiert
- Cosine-Similarity wird zwischen Query-Vektor und allen Entry-Vektoren berechnet
- Top-K aehnlichste Eintraege werden zurueckgegeben
Eingebauter Dateibrowser mit Editor.
- Tab Tools > Sub-Tab Files
- Navigieren: Ordnerstruktur durchklicken
- Datei lesen: Klick auf eine Datei oeffnet sie im Editor (rechte Seite)
- Datei bearbeiten: Im Editor aendern, dann "Save" klicken
- Neue Datei: "New File" — Name eingeben, Inhalt schreiben, speichern
- Neuer Ordner: "New Folder" — Name eingeben
- Umbenennen: Rechtsklick-Aktion auf Datei/Ordner
- Kopieren: Quell- und Zielpfad angeben
- Loeschen: Delete-Button (Ordner werden rekursiv geloescht!)
- SQLite inspizieren:
.db-Dateien anklicken zeigt Tabellen und Inhalte
Wenn du eine .db-Datei oeffnest:
- Liste aller Tabellen wird angezeigt
- Klick auf eine Tabelle zeigt Spalten + Zeilen
- Pagination fuer grosse Tabellen
- INSERT/UPDATE/DELETE SQL ausfuehren (kein SELECT/DROP erlaubt)
Die Console ist unten im Dashboard angedockt.
- Oeffnen/Schliessen: Klick auf den Console-Header oder den
_Button - Server-Logs: Erscheinen automatisch in Echtzeit (Info, Warn, Error)
- Befehl eingeben: Im Eingabefeld tippen und Enter druecken
| Befehl | Wirkung |
|---|---|
status |
Zeigt aktuellen Agent, Anzahl KB-Eintraege, Version |
restart |
Stoppt und startet den Server neu |
stop |
Stoppt den Server (Dashboard bleibt offen) |
start |
Startet den Server nach Stop wieder |
exit |
Faehrt alles herunter und beendet den Prozess |
clear |
Loescht die Console-Ausgabe |
Alles was kein eingebauter Befehl ist, wird als Shell-Kommando ausgefuehrt:
ls -la → Dateien auflisten
git status → Git-Status anzeigen
cat /etc/hostname → Datei anzeigen
echo "Hello" → Textausgabe
- Ausgabe erscheint in Echtzeit (stdout in weiss, stderr in orange)
- Laeuft asynchron — blockiert das Dashboard nicht
- WebSocket-Verbindung auf Port 7071
- Mehrere Browser-Tabs erhalten alle den gleichen Log-Stream
- History: Letzte 500 Log-Eintraege werden gespeichert
- Beim Verbinden: Komplette History wird zugesendet
- Oeffne Settings in der Sidebar (Zahnrad-Icon)
- Dark (Default) oder Light waehlen
- Pro Theme separat konfigurierbar:
- Akzentfarbe: Farbwaehler — bestimmt Buttons, Links, Highlights
- Hintergrundfarbe: Manuell oder Auto aus Akzent (Komplementaerfarbe)
- Textfarbe: Manuell oder Auto aus Hintergrund (Komplementaerfarbe)
- English / Deutsch / Turkce
- Dropdown in den Settings
- Alle UI-Elemente, Buttons, Labels werden sofort uebersetzt
- Ueber 200 uebersetzte Keys
- Slider von 11px (Default) bis 20px
- Aendert Chat-Nachrichten, KB-Eintraege, und allgemeine UI-Schrift
Statt in die Settings zu gehen, einfach im Chat schreiben:
| Eingabe | Wirkung |
|---|---|
| "Mach die Seite dunkel" | Wechselt zu Dark Mode |
| "Make it light" | Wechselt zu Light Mode |
| "Farbe gruen" | Setzt Akzentfarbe auf Gruen |
| "Background blau" | Setzt Hintergrundfarbe auf Blau |
| "Sprache Deutsch" | Wechselt UI-Sprache zu Deutsch |
| "Switch to English" | Wechselt UI-Sprache zu Englisch |
Funktioniert auf Deutsch, Englisch und Tuerkisch.
Fuer Nutzung ohne Browser, direkt im Terminal.
airust cli query tfidf "Was ist Rust?"
airust cli query fuzzy "Was ist roost?"
airust cli query simple "Was ist Rust?"
airust cli query context "Erzaehl mir von Rust"airust cli- Agent-Typ auswaehlen (1-4)
- Fragen stellen im Loop
exitzum Beenden
airust cli knowledge- Neue KB erstellen — Frage/Antwort-Paare eingeben, als JSON speichern
- Bestehende KB laden — Pfad angeben, testen oder erweitern
# PDF zu Knowledge Base konvertieren
cargo run --bin pdf2kb -- input.pdf output.json
# Mehrere Knowledge Bases zusammenfuehren
cargo run --bin merge_kb -- ./knowledge/merge_kb durchsucht den angegebenen Ordner nach allen .json-Dateien, laedt jede als KB, merged sie zusammen, und speichert als knowledge/train.json.
# Bauen
docker build -t airust .
# Starten
docker run -p 7070:7070 airust
# Mit Landing Page
docker run -p 7070:7070 airust --landingpage
# Mit persistenter Datenbank
docker run -p 7070:7070 -v $(pwd)/airust.db:/app/airust.db airust
# Custom Port
docker run -p 8080:8080 airust --port 8080- Rust-Binary (Release-Build, optimiert)
- Eingebettete Knowledge Base
- SQLite wird zur Laufzeit erstellt
- Keine externen Abhaengigkeiten
Alle Funktionen sind auch per API steuerbar. Hier die wichtigsten Beispiele:
curl http://localhost:7070/api/statusAntwort:
{
"agent": "tfidf",
"active_agents": ["tfidf"],
"examples": 42,
"version": "0.1.7"
}curl -X POST http://localhost:7070/api/query \
-H "Content-Type: application/json" \
-d '{"input": "Was ist Rust?", "add_context": false}'Antwort:
{
"response": "Eine Systemprogrammiersprache",
"confidence": 0.87,
"agent": "tfidf",
"agents_used": ["tfidf"]
}# Einzelner Agent
curl -X POST http://localhost:7070/api/agent/switch \
-H "Content-Type: application/json" \
-d '{"agent_type": "tfidf"}'
# Multi-Agent
curl -X POST http://localhost:7070/api/agent/switch \
-H "Content-Type: application/json" \
-d '{"agent_types": ["tfidf", "fuzzy", "exact"]}'curl -X POST http://localhost:7070/api/knowledge/add \
-H "Content-Type: application/json" \
-d '{"input": "Frage", "output": "Antwort", "weight": 1.0}'curl -X POST http://localhost:7070/api/pdf/upload \
-F "file=@dokument.pdf"curl http://localhost:7070/api/training/export > backup.jsoncurl -X POST http://localhost:7070/api/training/import \
-H "Content-Type: application/json" \
-d @training_data.json| Gruppe | Pfad | Beschreibung |
|---|---|---|
| Query | POST /api/query |
Agent-Abfragen mit Confidence |
| Status | GET /api/status |
Server-Status und aktive Agenten |
| Agent | POST /api/agent/switch |
Agent(en) wechseln |
| Knowledge | /api/knowledge/* |
KB anzeigen, hinzufuegen, loeschen, speichern, laden |
| Training | /api/training/* |
Trainingsdaten + Kategorien CRUD |
| Import | POST /api/upload/json, /api/import/tatoeba |
Bulk-Import |
POST /api/pdf/upload |
PDF-Upload und Extraktion | |
| Chats | /api/chats/* |
Chat-History verwalten |
| Bots | /api/bots/* |
Bot CRUD + Start/Stop |
| Review | /api/data/* |
Daten pruefen + genehmigen |
| Vectors | /api/vectors/* |
VectorDB Collections + Suche |
| Files | /api/files/* |
Dateisystem-Operationen |
| DB | /api/files/db/* |
SQLite-Browser |
| Settings | /api/settings |
Einstellungen lesen/schreiben |
| Translations | GET /api/translations/:lang |
UI-Uebersetzungen |
┌─────────────────────────────────────────┐
│ Web Dashboard │
│ Chat | Knowledge | Tools | Settings │
├─────────────────────────────────────────┤
│ REST API (50+ Endpoints) │
├──────────┬──────────┬──────┬────────────┤
│ TF-IDF │ Exact │Fuzzy │ Context │
│ Agent │ Match │Match │ Agent │
│ (BM25) │ Agent │Agent │ (TF-IDF+) │
├──────────┴──────────┴──────┴────────────┤
│ Knowledge Base │
│ Embedded JSON + SQLite Training Data │
├─────────────────────────────────────────┤
│ SQLite (airust.db) │
│ Chats, Settings, Bots, Vectors, ... │
├─────────────────────────────────────────┤
│ Console (WebSocket :7071) │
│ Logs, Shell, Server-Steuerung │
└─────────────────────────────────────────┘
- 100% Lokal — Keine Cloud, keine externen APIs, keine Telemetrie
- 156 Tests bestanden (Unit + Integration)
- MIT Lizenz — frei nutzbar
- Rust 1.85+ — schnell, sicher, kompiliert
- Zero Dependencies zur Laufzeit (alles im Binary)