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:
Meleki committed 2026-03-12 13:29:19 +01:00
1 parent 8dc52c1337
commit db1a7c7f64
18 files changed
+1701 -2007

No files matched your search

+171 -21
View File
@@ -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