Refactoring + Dokumentation: api.js komprimiert (745→267 Zeilen), SseHelper extrahiert, DatabaseService in Partial Classes aufgeteilt, unbenutztes CSS entfernt, ARCHITECTURE.md/ARCHITECTURE_QUICK.md/README.md aktualisiert (neue Features: Embedding, Remote, API-Keys, 16 Tools)
This commit is contained in:
1 parent
8dc52c1337
commit
db1a7c7f64
18 files changed
+1701
-2007
No files matched your search
+171
-21
@@ -1,6 +1,6 @@
|
||||
# ARCHITECTURE.md – Gott
|
||||
|
||||
**Gott** ist eine selbst-gehostete AI-Chat-Plattform, gebaut auf **.NET 10** mit **Anthropic Claude API** als Haupt-Provider sowie **OpenAI-kompatiblen Providern** (Nvidia, Pollinations, Gemini). Sie bietet Multi-User-Support, persistente Agent-Memory, Datei-/Shell-Tools, Telegram-Integration, Cronjobs und eine Krea-Bildgenerierung – alles über ein Vanilla-JavaScript-Frontend gesteuert.
|
||||
**Gott** ist eine selbst-gehostete AI-Chat-Plattform, gebaut auf **.NET 10** mit **Anthropic Claude API** als Haupt-Provider sowie **OpenAI-kompatiblen Providern** (Nvidia, Pollinations, Gemini). Sie bietet Multi-User-Support, persistente Agent-Memory, 16 Tools (Dateien, Shell, Suche, Memory, Remote-Execution), semantische Suche via lokalen Embeddings, Telegram-Integration, Cronjobs, Remote-Verbindungen und eine Krea-Bildgenerierung – alles über ein Vanilla-JavaScript-Frontend gesteuert.
|
||||
|
||||
---
|
||||
|
||||
@@ -38,9 +38,13 @@
|
||||
24. [Avatar-System](#avatar-system)
|
||||
25. [LaTeX/Math-Rendering](#latexmath-rendering)
|
||||
26. [Windows Desktop App](#windows-desktop-app)
|
||||
27. [Deployment](#deployment)
|
||||
28. [Konfiguration](#konfiguration)
|
||||
29. [Datenbank-Migrationen](#datenbank-migrationen)
|
||||
27. [OpenClaw Import](#openclaw-import)
|
||||
28. [Remote-Verbindungen](#remote-verbindungen)
|
||||
29. [Semantische Suche (Embedding)](#semantische-suche-embedding)
|
||||
30. [API-Key-Verwaltung](#api-key-verwaltung)
|
||||
31. [Deployment](#deployment)
|
||||
32. [Konfiguration](#konfiguration)
|
||||
33. [Datenbank-Migrationen](#datenbank-migrationen)
|
||||
|
||||
---
|
||||
|
||||
@@ -56,13 +60,17 @@
|
||||
├──────┬──────┬──────┬──────┬──────┬──────┬──────┬──────┬────┤
|
||||
│ Auth │ Chat │ Hist │ Sess │Agent │ Tele │ Cron │ Krea │Adm │
|
||||
│ │ SSE │ │ │ │ gram │ jobs │ Img │ in │
|
||||
│ │ │ │ │ │ │ │ │Keys│
|
||||
├──────┴──────┴──────┴──────┴──────┴──────┴──────┴──────┴────┤
|
||||
│ Services Layer │
|
||||
│ AnthropicService · OpenAiService · ChatService · ToolService│
|
||||
│ DatabaseService · MemoryService · SkillService │
|
||||
│ TelegramService · CronjobService · KreaService │
|
||||
│ DatabaseService · MemoryService · SkillService · SseHelper │
|
||||
│ EmbeddingService · VectorSearchService │
|
||||
│ RemoteConnectionManager · TelegramService │
|
||||
│ CronjobService · KreaService │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ SQLite (data/gott.db) via Dapper │
|
||||
│ ONNX Runtime (Embeddings) │
|
||||
│ Filesystem (data/agents/, data/skills/) │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ Anthropic Claude API (claude-sonnet/opus/haiku) │
|
||||
@@ -88,6 +96,7 @@
|
||||
| **Markdown** | marked.js (Client-side Rendering) |
|
||||
| **LaTeX** | KaTeX 0.16.21 (Math-Rendering, self-hosted mit woff2-Fonts) |
|
||||
| **Editor** | CodeMirror 5 + EasyMDE |
|
||||
| **Embeddings**| Microsoft.ML.OnnxRuntime + all-MiniLM-L6-v2 (384-dim Sentence-Embeddings) |
|
||||
| **Icons** | Font Awesome |
|
||||
| **Fonts** | Inter, JetBrains Mono (self-hosted) |
|
||||
| **Desktop** | WPF + WebView2 (.NET 10, Windows-only) |
|
||||
@@ -115,18 +124,28 @@ gott/
|
||||
│ ├── SharedMessageRecord.cs # Geteilte Nachrichten (Share-Token)
|
||||
│ ├── TelegramBotRecord.cs # Telegram Bot Entität
|
||||
│ ├── ChatModels.cs # ChatMessage, ChatRequest, AttachmentInfo/Block
|
||||
│ ├── ApiKeyRecord.cs # API-Key-Verwaltung (Provider, Name, Key, IsActive)
|
||||
│ └── ChatContext.cs # Runtime-Kontext für einen Chat + ReviewContext
|
||||
│
|
||||
├── Services/ # Business-Logic
|
||||
│ ├── DatabaseService.cs # SQLite CRUD, Schema, Migrationen
|
||||
│ ├── DatabaseService.cs # SQLite Schema, Migrationen, Core (partial class)
|
||||
│ ├── DatabaseService.Sessions.cs # Sessions, Archives, Chains, Messages, Attachments
|
||||
│ ├── DatabaseService.Agents.cs # Agents, Agent Skills
|
||||
│ ├── DatabaseService.Users.cs # Users, Shared Messages
|
||||
│ ├── DatabaseService.Integrations.cs # Telegram, Cronjobs, API Keys, OpenClaw Import
|
||||
│ ├── AuthService.cs # Token-basierte Authentifizierung
|
||||
│ ├── ChatService.cs # Kontext-Aufbau, History-Builder
|
||||
│ ├── AnthropicService.cs # Claude API (Streaming + Non-Streaming)
|
||||
│ ├── OpenAiService.cs # OpenAI-kompatible Provider (Nvidia, Pollinations, Gemini)
|
||||
│ ├── ToolService.cs # Tool-Definitionen + Ausführung
|
||||
│ ├── SseHelper.cs # Shared SSE-Utilities (WriteSseEvent, TryWriteSse, FinalizeChain)
|
||||
│ ├── ToolService.cs # Tool-Definitionen + Ausführung (16 Tools)
|
||||
│ ├── SystemPromptBuilder.cs # Modularer System-Prompt aus Blöcken
|
||||
│ ├── MemoryService.cs # Agent-Gedächtnis (Dateisystem)
|
||||
│ ├── SkillService.cs # Skill-Verwaltung (Dateisystem)
|
||||
│ ├── EmbeddingService.cs # Lokales Sentence-Embedding (all-MiniLM-L6-v2, ONNX)
|
||||
│ ├── VectorSearchService.cs # Semantische Suche über Message-Embeddings + Memory-Files
|
||||
│ ├── EmbeddingBackgroundService.cs # Backfill + Live-Embedding neuer Messages (BackgroundService)
|
||||
│ ├── RemoteConnectionManager.cs # WebSocket-basierte Remote-Verbindungen (Command-Execution)
|
||||
│ ├── TelegramService.cs # Telegram Bot API Integration
|
||||
│ ├── CronjobService.cs # BackgroundService für Cron-Tasks
|
||||
│ ├── KreaService.cs # Krea Image Generation API
|
||||
@@ -149,11 +168,13 @@ gott/
|
||||
│ ├── ModelsEndpoint.cs # Provider-Modelle (nvidia, pollinations, gemini, refresh)
|
||||
│ ├── SharedEndpoint.cs # Nachrichten teilen (öffentliche Links)
|
||||
│ ├── AdminEndpoint.cs # Admin: User-CRUD, Impersonate (Admin-only)
|
||||
│ ├── ApiKeysEndpoint.cs # Admin: API-Key-CRUD, Activate/Deactivate, Check (Admin-only)
|
||||
│ ├── RemoteEndpoint.cs # Remote-Verbindungen: WebSocket, Assign/Unassign, PowerShell-Script
|
||||
│ ├── ServerSettingsEndpoint.cs # Admin: Server-Settings lesen/schreiben (Admin-only)
|
||||
│ ├── ProfileEndpoint.cs # Profil, Persona, Passwort
|
||||
│ ├── SettingsEndpoint.cs # User-Settings (JSON blob)
|
||||
│ ├── BackupEndpoint.cs # Backup als tar.gz Download
|
||||
│ └── InfoEndpoint.cs # Build-Zeitstempel
|
||||
│ └── InfoEndpoint.cs # Build-Zeitstempel + Embedding-Status
|
||||
│
|
||||
├── Middleware/
|
||||
│ └── AuthMiddleware.cs # Cookie-basierte Token-Validierung
|
||||
@@ -195,7 +216,7 @@ gott/
|
||||
│ │ ├── cards.js # Card-Builder (buildSessionCard, buildAgentCard)
|
||||
│ │ ├── msg-actions.js # Nachrichten-Aktionen (Delete, Mark, Share, Reply, Timestamp)
|
||||
│ │ ├── tool-ui.js # Tool-Boxes, Diffs, Todo-Liste, Visibility-Logik
|
||||
│ │ ├── modals.js # Modale Dialoge (System-Prompt, Command-Output, Krea-Image)
|
||||
│ │ ├── modals.js # Modale Dialoge (System-Prompt, Command-Output, Krea-Image, Remote)
|
||||
│ │ ├── stream-ui.js # Stream-Bubble, Review-Streaming
|
||||
│ │ ├── bubbles.js # Message Bubbles (User, Assistant, Error, Warning, Choice, Review)
|
||||
│ │ ├── chat.js # Chat-Logic, SSE-Streaming, Plan-Mode
|
||||
@@ -210,16 +231,17 @@ gott/
|
||||
│ │ ├── emoji.js # Emoji-Picker
|
||||
│ │ ├── emoji.userdata.js # Häufig genutzte Emojis
|
||||
│ │ ├── tooltip.js # Tooltip-System
|
||||
│ │ ├── title.js # Tab-Titel-Management
|
||||
│ │ ├── title.js # Tab-Titel-Management + Embedding-Warnung
|
||||
│ │ ├── pages/ # Seiten-Komponenten
|
||||
│ │ │ ├── chat-page.js # Haupt-Chat-Ansicht
|
||||
│ │ │ ├── dashboard.js # Dashboard / Home
|
||||
│ │ │ ├── chat-page.js # Haupt-Chat-Ansicht (inkl. Remote-Button)
|
||||
│ │ │ ├── dashboard.js # Dashboard / Home (inkl. API-Keys-Link)
|
||||
│ │ │ ├── session-page.js # Session-Einstellungen
|
||||
│ │ │ ├── agent-page.js # Agent-Editor
|
||||
│ │ │ ├── telegram-bot-page.js # Telegram-Bot-Editor
|
||||
│ │ │ ├── cronjob-page.js # Cronjob-Verwaltung
|
||||
│ │ │ ├── profile-page.js # Profil-Bearbeitung
|
||||
│ │ │ ├── admin-page.js # Admin: Benutzerverwaltung
|
||||
│ │ │ ├── api-keys-page.js # Admin: API-Key-Verwaltung + Heartbeat-Check
|
||||
│ │ │ ├── settings-page.js # App-Einstellungen
|
||||
│ │ │ ├── login-page.js # Login-Formular
|
||||
│ │ │ └── shared-page.js # Öffentliche geteilte Nachricht
|
||||
@@ -230,6 +252,7 @@ gott/
|
||||
│ │ ├── easymde.min.js # Markdown Editor
|
||||
│ │ ├── katex.min.js # KaTeX Math-Rendering Engine
|
||||
│ │ └── cm-mode-*.min.js # CodeMirror Syntax-Modes
|
||||
│ ├── remote.ps1 # PowerShell-Script für Remote-Client-Verbindung
|
||||
│ ├── fonts/ # Self-hosted Fonts (Inter, JetBrains Mono)
|
||||
│ └── lib/font-awesome/ # Font Awesome Icons
|
||||
│
|
||||
@@ -258,6 +281,8 @@ gott/
|
||||
│ ├── PROMPT.md
|
||||
│ └── output/
|
||||
├── images/ # Krea-generierte Bilder
|
||||
├── models/ # ONNX-Modelle (Embedding)
|
||||
│ └── all-MiniLM-L6-v2/ # Sentence-Embedding-Modell (model.onnx + vocab.txt)
|
||||
├── models_cache.json # Gecachte Provider-Modelle (Nvidia, Pollinations, Gemini)
|
||||
├── logs/ # Payload-Logs (optional)
|
||||
└── backup/ # Backup-Archive
|
||||
@@ -304,6 +329,9 @@ TelegramBot (1) ─── (*) Session (via telegram_bot_id)
|
||||
| `cronjobs` | Geplante Tasks (cron expression, prompt, notify_session_id, is_enabled, last_run, next_run) |
|
||||
| `shared_messages` | Geteilte Nachrichten (Share-Token, Ablaufdatum) |
|
||||
| `telegram_bots` | Telegram Bots (bot_token, webhook_secret, name, is_public) – eigenständige Entität |
|
||||
| `api_keys` | API-Keys pro Provider (key_id, provider, name, api_key, is_active) – nur ein Key pro Provider aktiv |
|
||||
| `message_embeddings` | Sentence-Embeddings für semantische Suche (message_id, vector BLOB, session_id, agent_id) |
|
||||
| `memory_file_embeddings` | Embeddings von Memory-Dateien (agent_id, file_path, chunk_index, vector BLOB) |
|
||||
|
||||
### Zentrale Records
|
||||
|
||||
@@ -364,11 +392,13 @@ Die `Program.cs` ist der zentrale Einstiegspunkt und konfiguriert:
|
||||
|
||||
Initialisierungsreihenfolge:
|
||||
```
|
||||
AuthService → DatabaseService → EnsureDefaultUser
|
||||
RemoteConnectionManager → AuthService → DatabaseService → EnsureDefaultUser
|
||||
→ ImageService, StreamingTracker, MemoryService, SkillService
|
||||
→ EmbeddingService → VectorSearchService
|
||||
→ ToolService → ChatService
|
||||
→ AnthropicService → OpenAiService (+ LoadModelsAsync) → TelegramService → KreaService
|
||||
→ CronjobService (BackgroundService)
|
||||
→ AnthropicService (Token aus DB: api_keys) → OpenAiService (+ LoadModelsAsync)
|
||||
→ TelegramService → KreaService
|
||||
→ CronjobService (BackgroundService) + EmbeddingBackgroundService (BackgroundService)
|
||||
```
|
||||
|
||||
### Services
|
||||
@@ -387,6 +417,11 @@ AuthService → DatabaseService → EnsureDefaultUser
|
||||
| `SkillService` | Singleton | Skill-Discovery und -Management aus Dateisystem |
|
||||
| `TelegramService` | Singleton | Telegram Bot API, Webhook-Handling, Nachrichten senden |
|
||||
| `CronjobService` | Background | Minütlicher Check auf fällige Cronjobs, Ausführung via Claude |
|
||||
| `SseHelper` | Static | Shared SSE-Utilities: `WriteSseEvent`, `TryWriteSse`, `FinalizeChain`, `TruncateToolResult` |
|
||||
| `EmbeddingService` | Singleton | Lokales Sentence-Embedding via all-MiniLM-L6-v2 (ONNX, 384 Dimensionen), WordPiece-Tokenisierung |
|
||||
| `VectorSearchService` | Singleton | Semantische Suche über Message-Embeddings + Memory-File-Embeddings (Cosine Similarity) |
|
||||
| `EmbeddingBackgroundService` | Background | Backfill bestehender Messages + Live-Embedding neuer Messages/Memory-Files |
|
||||
| `RemoteConnectionManager` | Singleton | WebSocket-basierte Remote-Verbindungen, Command-Execution auf verbundenen Clients |
|
||||
| `KreaService` | Singleton | Krea API für Bildgenerierung, Job-Polling, Image-Download |
|
||||
| `ImageService` | Singleton | Bild-Resize + WebP-Konvertierung (512px + 256px Thumbnail) für Avatare und Session-Bilder |
|
||||
| `StreamingTracker` | Singleton | Trackt aktive Streams + CancellationTokenSource pro Session für Stop-Button |
|
||||
@@ -414,7 +449,9 @@ Alle Endpoints folgen dem **Minimal API**-Pattern mit Extension Methods (`MapXxx
|
||||
| **Backup** | `/api/backup` | `POST` (Admin only, tar.gz Download) |
|
||||
| **Shared** | `/api/shared/`, `/api/messages/{id}/share` | Share erstellen, öffentlich abrufen, auflisten, löschen |
|
||||
| **Models** | `/api/models/` | `GET nvidia`, `GET pollinations`, `GET gemini`, `POST refresh` |
|
||||
| **Info** | `/api/info` | `GET` (Build-Zeitstempel) |
|
||||
| **API Keys** | `/api/admin/api-keys/` | CRUD + `PUT activate/deactivate`, `POST check` (Heartbeat-Check für Anthropic-Keys) (Admin-only) |
|
||||
| **Remote** | `/api/remote` | WebSocket-Endpoint für Remote-Clients, `GET connections`, `POST assign/unassign`, `GET /remote.ps1` |
|
||||
| **Info** | `/api/info` | `GET` (Build-Zeitstempel + Embedding-Verfügbarkeit) |
|
||||
| **ServerSettings** | `/api/admin/server-settings` | `GET`, `PUT` (Admin-only, liest/schreibt `appsettings.Production.json`) |
|
||||
|
||||
### Middleware
|
||||
@@ -427,6 +464,7 @@ Ausnahmen (kein Auth nötig):
|
||||
- `GET /api/auth/autologin` (Token-basierter Autologin via Link)
|
||||
- `POST /api/telegram/webhook/{botId}` (authentifiziert via Secret-Header)
|
||||
- `GET /api/shared/{token}` (öffentlicher Zugriff auf geteilte Nachrichten)
|
||||
- `/api/remote` (WebSocket-Endpoint für Remote-Clients)
|
||||
- `GET /api/images/file/*` (Krea-Bilder und Thumbnails, öffentlich)
|
||||
|
||||
**API-Key Auth** (ohne User-Kontext):
|
||||
@@ -665,7 +703,8 @@ Der Agent hat Zugriff auf folgende Tools, abhängig von Konfiguration:
|
||||
| `edit_file` | Exakten Textabschnitt in Datei ersetzen |
|
||||
| `list_files` | Verzeichnis-Listing |
|
||||
| `delete_file` | Datei oder leeres Verzeichnis löschen |
|
||||
| `execute` | Shell-Befehl ausführen (bash, 180s Timeout) |
|
||||
| `execute` | Shell-Befehl ausführen (bash, konfigurierbares Timeout) |
|
||||
| `background_execute` | Shell-Befehl als Hintergrund-Prozess starten (gibt PID zurück, wartet nicht auf Ende) |
|
||||
| `glob` | Dateien via Glob-Pattern finden |
|
||||
| `grep` | Dateien nach Regex/Text durchsuchen |
|
||||
| `todo_write` | Todo-Liste schreiben (als Datei im Workspace) |
|
||||
@@ -677,6 +716,19 @@ Der Agent hat Zugriff auf folgende Tools, abhängig von Konfiguration:
|
||||
| `memory_read` | Memory-Datei des Agents lesen |
|
||||
| `memory_write` | Memory-Datei schreiben (überschreiben/append) |
|
||||
| `memory_list` | Alle Memory-Dateien des Agents auflisten |
|
||||
| `memory_search` | Semantische Suche über vergangene Chat-Nachrichten und Memory-Dateien (benötigt Embedding-Modell) |
|
||||
|
||||
### Remote-Execution (wenn Remote-Verbindung zugeordnet)
|
||||
|
||||
| Tool | Beschreibung |
|
||||
|--------------------|-----------------------------------------------------|
|
||||
| `remote_execute` | Shell-Befehl auf einem verbundenen Remote-Client ausführen (via WebSocket) |
|
||||
|
||||
### Cross-Session Messaging (wenn konfiguriert)
|
||||
|
||||
| Tool | Beschreibung |
|
||||
|--------------------|-----------------------------------------------------|
|
||||
| `send_to_session` | Nachricht an eine andere Session senden und dort eine Agent-Antwort auslösen |
|
||||
|
||||
### Interaktive Rückfragen (wenn AllowUserChoice aktiviert)
|
||||
|
||||
@@ -692,7 +744,7 @@ Nutzt Anthropics eingebaute Web-Suche als Server-Side-Tool.
|
||||
|
||||
### Plan-Modus: Read-only Tools
|
||||
|
||||
Im Plan-Modus werden nur folgende Tools bereitgestellt: `read_file`, `list_files`, `glob`, `grep`, `execute`, `todo_write`, `memory_*`, `ask_user_choice`. Write-Tools (`write_file`, `edit_file`, `delete_file`) werden gefiltert.
|
||||
Im Plan-Modus werden nur folgende Tools bereitgestellt: `read_file`, `list_files`, `glob`, `grep`, `execute`, `todo_write`, `memory_*`, `memory_search`, `remote_execute`, `ask_user_choice`. Write-Tools (`write_file`, `edit_file`, `delete_file`) werden gefiltert.
|
||||
|
||||
### Tool-Choice (automatisch)
|
||||
|
||||
@@ -1607,6 +1659,99 @@ Alle History-Queries (initial load, before/after-Paging, Polling) sortieren nach
|
||||
|
||||
---
|
||||
|
||||
## Remote-Verbindungen
|
||||
|
||||
Remote-Clients (z.B. Windows-PCs) können sich via **WebSocket** mit dem Server verbinden. Über die Verbindung kann der AI-Agent Shell-Befehle auf dem Remote-Client ausführen.
|
||||
|
||||
### Architektur
|
||||
|
||||
```
|
||||
┌──────────────┐ WebSocket ┌───────────────┐ Tool-Call ┌───────────────┐
|
||||
│ Remote-Client│◄────────────►│ Gott Server │◄───────────►│ AI-Agent │
|
||||
│ (PowerShell) │ (bidirekt.) │ RemoteEndpoint│ │ remote_execute│
|
||||
└──────────────┘ └───────────────┘ └───────────────┘
|
||||
```
|
||||
|
||||
### Verbindungsaufbau
|
||||
|
||||
1. Remote-Client führt `irm https://server/remote | iex` aus → lädt `remote.ps1`
|
||||
2. Script baut WebSocket-Verbindung zu `/api/remote` auf
|
||||
3. Sendet `hello`-Message mit Hostname, Username, OS-Version
|
||||
4. `RemoteConnectionManager` registriert die Verbindung
|
||||
|
||||
### Session-Zuweisung
|
||||
|
||||
- Im Chat: Remote-Button → Modal zeigt aktive Verbindungen
|
||||
- Admin weist Verbindung einer Session zu (`POST /api/remote/assign`)
|
||||
- AI-Agent bekommt `remote_execute`-Tool → führt Befehle auf dem Remote-Client aus
|
||||
- Ergebnis wird synchron via WebSocket zurückgeliefert (Timeout: konfigurierbarer `ExecuteTimeout`)
|
||||
|
||||
### Protokoll (JSON über WebSocket)
|
||||
|
||||
| Richtung | Type | Payload |
|
||||
|----------|------|---------|
|
||||
| Client → Server | `hello` | `hostname`, `username`, `os` |
|
||||
| Server → Client | `execute` | `command` |
|
||||
| Client → Server | `result` | `exitCode`, `output`, `error` |
|
||||
| Client → Server | `ping` | – |
|
||||
| Server → Client | `pong` | – |
|
||||
|
||||
---
|
||||
|
||||
## Semantische Suche (Embedding)
|
||||
|
||||
Lokale Sentence-Embeddings ermöglichen semantische Suche über Chat-Nachrichten und Memory-Dateien.
|
||||
|
||||
### Technologie
|
||||
|
||||
- **Modell:** all-MiniLM-L6-v2 (ONNX Runtime, 384-dimensionale Embeddings)
|
||||
- **Tokenisierung:** WordPiece (BERT-kompatibel, eigene Implementierung)
|
||||
- **Speicherung:** SQLite-Tabellen `message_embeddings` + `memory_file_embeddings` (Vektor als BLOB)
|
||||
- **Suche:** Brute-Force Cosine Similarity (ausreichend für <100k Embeddings)
|
||||
|
||||
### Komponenten
|
||||
|
||||
| Service | Aufgabe |
|
||||
|---------|---------|
|
||||
| `EmbeddingService` | ONNX-Modell laden, Embeddings generieren (thread-safe via SemaphoreSlim) |
|
||||
| `VectorSearchService` | Schema-Management, Embedding-Storage, Similarity-Search |
|
||||
| `EmbeddingBackgroundService` | Backfill beim Start + Live-Queue für neue Messages/Memory-Files |
|
||||
|
||||
### Funktionsweise
|
||||
|
||||
1. **Backfill beim Start:** Alle bestehenden Text-Messages (user + assistant, ≥10 Zeichen) werden embedded
|
||||
2. **Memory-Backfill:** Alle `.md`-Dateien in Agent-Verzeichnissen werden in 500-Zeichen-Chunks embedded
|
||||
3. **Live-Embedding:** Neue Messages/Memory-Writes werden via Queue sofort embedded
|
||||
4. **Suche (`memory_search` Tool):** Query wird embedded, Cosine Similarity gegen alle Embeddings berechnet, Top-N Ergebnisse zurückgegeben
|
||||
|
||||
### Konfiguration
|
||||
|
||||
Das ONNX-Modell muss unter `data/models/all-MiniLM-L6-v2/` liegen (`model.onnx` + `vocab.txt`). Wenn nicht vorhanden, wird der Service deaktiviert und das Frontend zeigt eine Warnung.
|
||||
|
||||
---
|
||||
|
||||
## API-Key-Verwaltung
|
||||
|
||||
API-Keys werden in der Datenbank verwaltet (Tabelle `api_keys`) statt in der Konfigurationsdatei.
|
||||
|
||||
### Funktionsweise
|
||||
|
||||
- **Mehrere Keys** pro Provider (z.B. `anthropic`) können gespeichert werden
|
||||
- **Nur ein Key pro Provider** kann gleichzeitig aktiv sein
|
||||
- **Aktivierung** deaktiviert automatisch alle anderen Keys desselben Providers
|
||||
- **Live-Aktualisierung:** Bei Aktivierung/Deaktivierung wird der Token sofort im laufenden Service aktualisiert (kein Neustart nötig)
|
||||
- **Migration:** Bestehender `AnthropicToken` aus `appsettings.Production.json` wird beim ersten Start automatisch migriert
|
||||
|
||||
### Heartbeat-Check (nur Anthropic)
|
||||
|
||||
`POST /api/admin/api-keys/{id}/check` sendet eine minimale Anfrage an die Anthropic API und liest die Rate-Limit-Headers aus:
|
||||
- **Gültig/Ungültig** – HTTP 200 vs. 401
|
||||
- **Subscription vs. API Console** – Anhand der `unified-*` Headers
|
||||
- **Budget-Auslastung** – 5h und 7d Prozentwerte
|
||||
- **Plan-Erkennung** – `Max` (overage > 0), `Pro` (kein fallback-Header), `Pro/Max` (sonst)
|
||||
|
||||
---
|
||||
|
||||
## Deployment
|
||||
|
||||
**WICHTIG:** Das Deployment ist ein **manueller Vorgang**, der durch den Benutzer auf dem Server durchgeführt werden muss. Das System führt kein automatisches Deployment durch.
|
||||
@@ -1640,8 +1785,10 @@ Die Anwendung ist als systemd-Service konfiguriert und läuft standardmäßig au
|
||||
```json
|
||||
{
|
||||
"Port": 19000, // Server-Port (Default 19000, erfordert Neustart)
|
||||
"AnthropicToken": "", // Anthropic API Key (REQUIRED)
|
||||
"MaxIterations": 100, // Max Tool-Loop Iterationen pro Chat
|
||||
"MaxHistory": 120, // Max Messages in Chat-History
|
||||
"ReminderInterval": 30, // System-Prompt-Reminder alle N Messages
|
||||
"ExecuteTimeout": 180, // Timeout für Shell-Befehle in Sekunden
|
||||
"PayloadLogging": false, // API-Payloads loggen (Debug)
|
||||
"PayloadLoggingGzip": false, // Payload-Logs als .gz komprimieren
|
||||
"KreaToken": "", // Krea API Token (optional)
|
||||
@@ -1650,6 +1797,8 @@ Die Anwendung ist als systemd-Service konfiguriert und läuft standardmäßig au
|
||||
}
|
||||
```
|
||||
|
||||
> **Hinweis:** `AnthropicToken` wird nicht mehr über `appsettings.json` konfiguriert, sondern über die **API-Key-Verwaltung** im Admin-Bereich (DB-Tabelle `api_keys`). Bestehende Tokens werden beim ersten Start automatisch aus `appsettings.Production.json` migriert.
|
||||
|
||||
### appsettings.Production.json
|
||||
|
||||
Überschreibt Werte aus `appsettings.json` im Production-Environment. Wird **nicht** beim Publish mitkopiert (liegt nur im `Build/<OS>/publish/`-Verzeichnis). Verwaltung über die **Admin-UI** (Servereinstellungen, `#/server-settings`).
|
||||
@@ -1668,7 +1817,8 @@ Die `DatabaseService.InitializeDatabase()` handhabt Schema-Erstellung und Migrat
|
||||
1. **Tabellen-Erstellung** via `CREATE TABLE IF NOT EXISTS`
|
||||
2. **Spalten-Migration** via `TryAddColumn()` – fängt "column already exists" ab
|
||||
3. **Daten-Migration** (z.B. `auto_commit` von INTEGER zu TEXT, `use_web_search` zu `web_search_version`)
|
||||
4. **Bild-Migration** – Konvertierung bestehender PNG/JPEG-Avatare zu WebP + Generierung von Thumbnails (`avatar_small`, `image_small`)
|
||||
4. **Token-Migration** – Bestehender `AnthropicToken` aus `appsettings.Production.json` wird automatisch in `api_keys`-Tabelle migriert
|
||||
5. **Bild-Migration** – Konvertierung bestehender PNG/JPEG-Avatare zu WebP + Generierung von Thumbnails (`avatar_small`, `image_small`)
|
||||
|
||||
Dieses Pattern ermöglicht:
|
||||
- Idempotente Ausführung bei jedem App-Start
|
||||
|
||||
Reference in new issue
Block a user