airust 0.1.7

Trainable, modular AI engine in Rust with compile-time knowledge
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
# AIRust — Startup Guide

## Quick Start

```bash
# 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 -- stop
```

Server: `http://localhost:7070`
Console WebSocket: `ws://localhost:7071`

---

## 1. Web Dashboard starten

```bash
airust                      # Port 7070 (Default), nur Dashboard
airust --port 8080          # Custom Port
airust -d                   # Im Hintergrund starten
airust --landingpage        # Landing Page + Dashboard
airust stop                 # Stoppen
```

Browser: `http://localhost:7070`

### Was passiert beim Start?

1. **Datenbank** wird geoeffnet (`airust.db`) — wird automatisch erstellt falls nicht vorhanden
2. **4 Agenten** werden erstellt: TF-IDF, Exact, Fuzzy, Context
3. **Knowledge Base** wird geladen (eingebettete + DB-Trainingsdaten)
4. **Alle Agenten** werden mit den KB-Daten trainiert
5. **Web-Server** startet auf Port 7070
6. **Console WebSocket** startet auf Port 7071
7. **Default-Agent** ist TF-IDF (kann im Dashboard geaendert werden)

### Datenfluss

```
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
```

---

## 2. Chat — Fragen stellen

### Schritt fuer Schritt

1. Dashboard oeffnen: `http://localhost:7070`
2. Tab **Chat** ist beim Start aktiv
3. Klicke **+** (oben links) um einen neuen Chat zu erstellen
4. Tippe eine Frage ins Eingabefeld unten
5. Druecke **Enter** oder klicke **Send**
6. Die Antwort erscheint mit einem **Confidence-Score** (0-100%)

### Was passiert im Hintergrund?

1. Deine Frage wird an `/api/query` gesendet
2. Alle **aktiven Agenten** werden parallel befragt
3. Jeder Agent berechnet eine Antwort + Confidence
4. Die Antwort mit der **hoechsten Confidence** gewinnt
5. Falls der Context-Agent aktiv ist, wird die Frage+Antwort im Kontext gespeichert
6. Frage und Antwort werden in der **SQLite-DB** gespeichert (Chat-History)

### Chat-Verwaltung

- **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

### Confidence verstehen

| 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 |

---

## 3. Agenten auswaehlen

### Wo?

In **Settings** (Zahnrad-Icon in der Sidebar):

### Die 4 Agenten im Detail

| 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 |

### Multi-Agent Modus

**So funktioniert es:**

1. Oeffne **Settings** in der Sidebar
2. Setze **Haekchen bei mehreren Agenten** (Checkboxen, nicht Radio-Buttons)
3. Mindestens ein Agent muss aktiv bleiben
4. Die Statusbar unten zeigt alle aktiven Agenten an: `(Smart Search + Close Enough)`

**Was passiert bei einer Query?**

1. Frage geht an **alle aktiven Agenten** gleichzeitig
2. Jeder Agent berechnet unabhaengig eine Antwort + Confidence
3. Der Agent mit der **hoechsten Confidence gewinnt**
4. 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 |

---

## 4. Knowledge Base trainieren

Die Knowledge Base (KB) ist das **Wissen** des Agenten. Ohne Trainingsdaten kann er nichts beantworten.

### 4.1 Manuell Beispiele hinzufuegen

**Schritt fuer Schritt:**

1. Gehe zu Tab **Knowledge** in der Sidebar
2. Waehle Sub-Tab **All**
3. Klicke **"Add Example"**
4. 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), oder `json` (strukturiert)
   - **Weight**: Gewichtung 0.0-10.0 (Standard: 1.0, hoeher = bevorzugt)
5. Klicke **Save**
6. 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)

### 4.2 JSON importieren

**Format:**

```json
[
  {
    "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:**

1. Tab **Knowledge** > Sub-Tab **Import**
2. Option A: **JSON einfuegen** — JSON-Array in das Textfeld pasten, "Import" klicken
3. Option B: **Datei hochladen** — JSON-Datei per Drag & Drop oder Klick hochladen
4. Erfolgsmeldung zeigt Anzahl importierter Beispiele
5. Alle Agenten werden automatisch neu trainiert

### 4.3 PDF hochladen

**Was passiert:**

1. PDF wird hochgeladen und der Text extrahiert
2. Text wird in **Chunks** zerlegt (max. 1000 Zeichen, min. 50)
3. Chunks ueberlappen sich um 200 Zeichen (damit Kontext nicht verloren geht)
4. Jeder Chunk wird als Frage-Antwort-Paar gespeichert
5. Agenten werden neu trainiert

**Schritt fuer Schritt:**

1. Tab **Knowledge** > Sub-Tab **Import** > PDF-Bereich
2. PDF per **Drag & Drop** oder Klick hochladen
3. Warten bis "X examples added" erscheint
4. Fertig — die PDF-Inhalte sind jetzt durchsuchbar

**Limitierungen:**
- Nur textbasierte PDFs (keine gescannten Bilder/OCR)
- Tabellen und komplexe Layouts werden als Fliesstext extrahiert

### 4.4 Tatoeba-Import (Uebersetzungspaare)

Fuer zweisprachige Saetze von [manythings.org/anki/](http://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:**

1. TSV-Datei von manythings.org herunterladen
2. Tab **Knowledge** > Sub-Tab **Import** > Tatoeba-Bereich
3. TSV-Datei hochladen
4. Jede Zeile wird als Quellsprache→Zielsprache Paar gespeichert
5. Agenten werden neu trainiert

### 4.5 Knowledge Base speichern und laden

**Speichern:**
1. Tab **Knowledge** > Unten: Pfad eingeben (z.B. `./knowledge/meine_kb.json`)
2. **Save** klicken
3. KB wird als JSON-Datei auf dem Server gespeichert

**Laden:**
1. Tab **Knowledge** > Unten: Pfad zur JSON-Datei eingeben
2. **Load** klicken
3. Bestehende KB wird **ersetzt** (nicht gemergt!)
4. Agenten werden neu trainiert

### 4.6 Woher kommen die Daten?

```
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
```

---

## 5. Kategorien verwalten

Kategorien helfen, Trainingsdaten thematisch zu organisieren.

### Schritt fuer Schritt

1. Tab **Knowledge** > Sub-Tab **Categories**
2. **Neue Kategorie erstellen:**
   - Name eingeben (z.B. "Technik", "Smalltalk", "Support")
   - Farbe waehlen (Farbkreis)
   - "Create" klicken
3. **Trainingsdaten zuordnen:**
   - Beim Erstellen eines Beispiels die Kategorie auswaehlen
4. **Nach Kategorie filtern:**
   - Auf eine Kategorie klicken, um nur deren Eintraege zu sehen
5. **Kategorie loeschen:**
   - Delete-Button an der Kategorie
   - Trainingsdaten bleiben erhalten (Kategorie wird auf "Keine" gesetzt)

---

## 6. Bot Ecosystem — Automatisch Daten sammeln

Bots koennen **automatisch Webseiten crawlen** und daraus Trainingsdaten generieren.

### 6.1 Web Crawler erstellen

**Schritt fuer Schritt:**

1. Tab **Tools** > Sub-Tab **Bots**
2. Klicke **"New Bot"**
3. Konfiguriere:
   - **Name**: z.B. "Wikipedia Crawler"
   - **URL**: Die zu crawlende Webseite
   - **Modus**:
     - `single` — Nur diese eine Seite
     - `follow` — Links auf der Seite folgen (rekursiv)
   - **Max Depth**: Wie viele Link-Ebenen tief (Standard: 2)
   - **Rate Limit**: Pause zwischen Requests in ms (Standard: 1000)
4. Klicke **"Create"**
5. Klicke **"Start"** am Bot

### Was passiert beim Crawlen?

1. Bot laedt die URL herunter
2. HTML wird geparst, Text extrahiert
3. Content-Hash wird berechnet (SHA-256) zur Deduplizierung
4. Rohdaten werden als `raw_data` in der DB gespeichert (Status: `pending`)
5. Bei `follow`-Modus: Links auf der Seite werden gesammelt und ebenfalls gecrawlt
6. Bot-Run wird mit Statistik gespeichert (Items found, Items added)

### 6.2 Daten pruefen und genehmigen

**Schritt fuer Schritt:**

1. Tab **Tools** > Sub-Tab **Review**
2. **Pending-Daten ansehen**: Liste aller ungeprueften Eintraege
3. Fuer jeden Eintrag:
   - **Approve** — Daten sind gut, genehmigen
   - **Reject** — Daten sind schlecht, ablehnen
4. Oder: **"Approve All"** fuer alle auf einmal
5. Genehmigte Daten ansehen: Toggle "Show Approved"
6. **"Add to Knowledge"** klicken — genehmigte Daten werden in die KB uebernommen
7. Alle Agenten werden automatisch neu trainiert

### Workflow-Uebersicht

```
Bot crawlt Webseite
       |
       v
  raw_data (pending)
       |
  [Review: Approve/Reject]
       |
       v
  approved_data
       |
  [Add to Knowledge]
       |
       v
  KnowledgeBase + Agenten neu trainiert
```

---

## 7. VectorDB — Aehnlichkeitssuche

Die VectorDB speichert Texte als TF-IDF-Vektoren und ermoeglicht Aehnlichkeitssuche per Cosine-Similarity.

### Schritt fuer Schritt

1. Tab **Tools** > Sub-Tab **VectorDB**
2. **Collection erstellen:**
   - Name eingeben (z.B. "Produktbeschreibungen")
   - Optional: Beschreibung hinzufuegen
   - "Create" klicken
3. **Eintrag hinzufuegen:**
   - Collection auswaehlen
   - Text eingeben (z.B. eine Produktbeschreibung)
   - Optional: Metadaten als JSON (z.B. `{"category": "electronics"}`)
   - "Add" klicken — Embedding wird automatisch berechnet
4. **Suchen:**
   - Query eingeben (z.B. "kabelloses Headset")
   - Top-K Ergebnisse einstellen (Standard: 5)
   - "Search" klicken
   - Ergebnisse werden nach Aehnlichkeit sortiert mit Score

### Wie funktioniert es intern?

1. Beim Hinzufuegen: Text wird in TF-IDF-Vektor umgewandelt (basierend auf allen Eintraegen der Collection)
2. Bei der Suche: Query wird ebenfalls vektorisiert
3. Cosine-Similarity wird zwischen Query-Vektor und allen Entry-Vektoren berechnet
4. Top-K aehnlichste Eintraege werden zurueckgegeben

---

## 8. File Manager

Eingebauter Dateibrowser mit Editor.

### Funktionen

1. Tab **Tools** > Sub-Tab **Files**
2. **Navigieren**: Ordnerstruktur durchklicken
3. **Datei lesen**: Klick auf eine Datei oeffnet sie im Editor (rechte Seite)
4. **Datei bearbeiten**: Im Editor aendern, dann **"Save"** klicken
5. **Neue Datei**: "New File" — Name eingeben, Inhalt schreiben, speichern
6. **Neuer Ordner**: "New Folder" — Name eingeben
7. **Umbenennen**: Rechtsklick-Aktion auf Datei/Ordner
8. **Kopieren**: Quell- und Zielpfad angeben
9. **Loeschen**: Delete-Button (Ordner werden rekursiv geloescht!)
10. **SQLite inspizieren**: `.db`-Dateien anklicken zeigt Tabellen und Inhalte

### SQLite Browser

Wenn du eine `.db`-Datei oeffnest:
1. Liste aller Tabellen wird angezeigt
2. Klick auf eine Tabelle zeigt Spalten + Zeilen
3. Pagination fuer grosse Tabellen
4. INSERT/UPDATE/DELETE SQL ausfuehren (kein SELECT/DROP erlaubt)

---

## 9. Console — Live Terminal

Die Console ist **unten im Dashboard** angedockt.

### Bedienung

1. **Oeffnen/Schliessen**: Klick auf den Console-Header oder den `_` Button
2. **Server-Logs**: Erscheinen automatisch in Echtzeit (Info, Warn, Error)
3. **Befehl eingeben**: Im Eingabefeld tippen und Enter druecken

### Eingebaute Befehle

| 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 |

### Shell-Befehle

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

### Technische Details

- 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

---

## 10. Settings — Anpassen

### Theme

1. Oeffne **Settings** in der Sidebar (Zahnrad-Icon)
2. **Dark** (Default) oder **Light** waehlen
3. Pro Theme separat konfigurierbar:
   - **Akzentfarbe**: Farbwaehler — bestimmt Buttons, Links, Highlights
   - **Hintergrundfarbe**: Manuell oder **Auto aus Akzent** (Komplementaerfarbe)
   - **Textfarbe**: Manuell oder **Auto aus Hintergrund** (Komplementaerfarbe)

### Sprache

- **English** / **Deutsch** / **Turkce**
- Dropdown in den Settings
- Alle UI-Elemente, Buttons, Labels werden sofort uebersetzt
- Ueber 200 uebersetzte Keys

### Textgroesse

- Slider von **11px** (Default) bis **20px**
- Aendert Chat-Nachrichten, KB-Eintraege, und allgemeine UI-Schrift

### Smart Settings ueber Chat

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.

---

## 11. CLI Modus (ohne Web)

Fuer Nutzung ohne Browser, direkt im Terminal.

### Direkte Abfrage

```bash
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"
```

### Interaktiver Modus

```bash
airust cli
```

1. Agent-Typ auswaehlen (1-4)
2. Fragen stellen im Loop
3. `exit` zum Beenden

### Knowledge Base verwalten

```bash
airust cli knowledge
```

1. Neue KB erstellen — Frage/Antwort-Paare eingeben, als JSON speichern
2. Bestehende KB laden — Pfad angeben, testen oder erweitern

### CLI Tools

```bash
# 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`.

---

## 12. Docker

### Bauen und Starten

```bash
# 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
```

### Was ist im Container?

- Rust-Binary (Release-Build, optimiert)
- Eingebettete Knowledge Base
- SQLite wird zur Laufzeit erstellt
- Keine externen Abhaengigkeiten

---

## 13. REST API — Programmzugriff

Alle Funktionen sind auch per API steuerbar. Hier die wichtigsten Beispiele:

### Status abfragen

```bash
curl http://localhost:7070/api/status
```

Antwort:
```json
{
  "agent": "tfidf",
  "active_agents": ["tfidf"],
  "examples": 42,
  "version": "0.1.7"
}
```

### Query senden

```bash
curl -X POST http://localhost:7070/api/query \
  -H "Content-Type: application/json" \
  -d '{"input": "Was ist Rust?", "add_context": false}'
```

Antwort:
```json
{
  "response": "Eine Systemprogrammiersprache",
  "confidence": 0.87,
  "agent": "tfidf",
  "agents_used": ["tfidf"]
}
```

### Agent wechseln

```bash
# 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"]}'
```

### Wissen hinzufuegen

```bash
curl -X POST http://localhost:7070/api/knowledge/add \
  -H "Content-Type: application/json" \
  -d '{"input": "Frage", "output": "Antwort", "weight": 1.0}'
```

### PDF hochladen

```bash
curl -X POST http://localhost:7070/api/pdf/upload \
  -F "file=@dokument.pdf"
```

### Trainingsdaten exportieren

```bash
curl http://localhost:7070/api/training/export > backup.json
```

### Trainingsdaten importieren

```bash
curl -X POST http://localhost:7070/api/training/import \
  -H "Content-Type: application/json" \
  -d @training_data.json
```

### Alle Endpoint-Gruppen

| 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 |
| PDF | `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 |

---

## Architektur

```
┌─────────────────────────────────────────┐
│            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          │
└─────────────────────────────────────────┘
```

### Kerneigenschaften

- **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)