docs: Dokumentation aktualisiert – API-Key-Scanner, passive Usage, Chat-Badge, Key-Check

ARCHITECTURE.md:
- Neue Services: KeyScannerService, AnthropicKeyChecker
- scanned_keys Tabelle, api_keys erweitert (status, plan, usage, source_url)
- API-Key-Verwaltung komplett überarbeitet: Key-Check mit korrekten Headers,
  passive Usage-Aktualisierung, GitHub-Scanner, Chat Usage-Badge
- Scanner-Endpunkte dokumentiert (scan, scanned, adopt, recheck)
- Tool-Anzahl 16 → 17

ARCHITECTURE_QUICK.md:
- Gleiche Struktur-Updates (Services, Tabellen, Endpunkte, Tool-Anzahl)
- Chat-Page: Usage-Badge-Overlay + Key-Switch-Modal
- Passive Usage-Aktualisierung nach jedem API-Request

README.md:
- Tool-Anzahl 16 → 17
- API-Key-Verwaltung mit Scanner, passive Usage, Chat-Badge
This commit is contained in:
Meleki committed 2026-03-12 22:37:33 +01:00
1 parent 8b1794d11e
commit 730c14aa23
3 files changed
+62 -27

No files matched your search

+45 -17
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, 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.
**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, 17 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.
---
@@ -124,7 +124,8 @@ 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)
│ ├── ApiKeyRecord.cs # API-Key-Verwaltung (Provider, Name, Key, IsActive, Status, Plan, Usage, SourceUrl)
│ ├── ScannedKeyRecord.cs # Gescannte GitHub-Keys (SourceUrl, Status, Plan, Usage, AdoptedApiKeyId)
│ └── ChatContext.cs # Runtime-Kontext für einen Chat + ReviewContext
│
├── Services/ # Business-Logic
@@ -138,7 +139,7 @@ gott/
│ ├── AnthropicService.cs # Claude API (Streaming + Non-Streaming)
│ ├── OpenAiService.cs # OpenAI-kompatible Provider (Nvidia, Pollinations, Gemini)
│ ├── SseHelper.cs # Shared SSE-Utilities (WriteSseEvent, TryWriteSse, FinalizeChain)
│ ├── ToolService.cs # Tool-Definitionen + Ausführung (16 Tools)
│ ├── ToolService.cs # Tool-Definitionen + Ausführung (17 Tools)
│ ├── SystemPromptBuilder.cs # Modularer System-Prompt aus Blöcken
│ ├── MemoryService.cs # Agent-Gedächtnis (Dateisystem)
│ ├── SkillService.cs # Skill-Verwaltung (Dateisystem)
@@ -151,7 +152,9 @@ gott/
│ ├── KreaService.cs # Krea Image Generation API
│ ├── ImageService.cs # Bild-Resize + WebP-Konvertierung (512px + 256px Thumbnail)
│ ├── StreamingTracker.cs # Tracking aktiver Streams + CancellationTokenSource für Stop
│ └── WorkspaceHelper.cs # Workspace-Pfad-Auflösung (relativ → absolut)
│ ├── WorkspaceHelper.cs # Workspace-Pfad-Auflösung (relativ → absolut)
│ ├── KeyScannerService.cs # GitHub Code-Search nach geleakten API-Keys
│ └── AnthropicKeyChecker.cs # Anthropic Key-Validierung + Usage-Header-Auswertung
│
├── Endpoints/ # HTTP API (Minimal API)
│ ├── AuthEndpoint.cs # Login, Logout, Me
@@ -168,7 +171,7 @@ 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)
│ ├── ApiKeysEndpoint.cs # Admin: API-Key-CRUD, Activate/Deactivate, Check, Scan, Adopt (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
@@ -233,7 +236,7 @@ gott/
│ │ ├── tooltip.js # Tooltip-System
│ │ ├── title.js # Tab-Titel-Management + Embedding-Warnung
│ │ ├── pages/ # Seiten-Komponenten
│ │ │ ├── chat-page.js # Haupt-Chat-Ansicht (inkl. Remote-Button)
│ │ │ ├── chat-page.js # Haupt-Chat-Ansicht (inkl. Remote-Button, Usage-Badge-Overlay, Key-Switch-Modal)
│ │ │ ├── dashboard.js # Dashboard / Home (inkl. API-Keys-Link)
│ │ │ ├── session-page.js # Session-Einstellungen
│ │ │ ├── agent-page.js # Agent-Editor
@@ -241,7 +244,7 @@ gott/
│ │ │ ├── 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
│ │ │ ├── api-keys-page.js # Admin: API-Key-Verwaltung + Check + GitHub-Scanner
│ │ │ ├── settings-page.js # App-Einstellungen
│ │ │ ├── login-page.js # Login-Formular
│ │ │ └── shared-page.js # Öffentliche geteilte Nachricht
@@ -329,7 +332,8 @@ 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 |
| `api_keys` | API-Keys pro Provider (key_id, provider, name, api_key, is_active, status, plan, usage_7d, usage_5h, source_url, checked_at) – nur ein Key pro Provider aktiv |
| `scanned_keys` | Gescannte GitHub-Keys (scanned_key_id, api_key, source_url, status, plan, usage_7d, usage_5h, adopted_api_key_id, deleted) |
| `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) |
@@ -408,7 +412,7 @@ RemoteConnectionManager → AuthService → DatabaseService → EnsureDefaultUse
| `DatabaseService` | Singleton | SQLite CRUD, Schema-Init, Migrationen, alle DB-Operationen |
| `AuthService` | Singleton | Token-Erzeugung/-Validierung, Passwort-Hashing (SHA256) |
| `ChatService` | Singleton | Chat-Kontext aufbauen, History aus DB rekonstruieren |
| `AnthropicService` | Singleton | Claude API Kommunikation (Streaming SSE + Non-Streaming) |
| `AnthropicService` | Singleton | Claude API Kommunikation (Streaming SSE + Non-Streaming), passive Usage-Aktualisierung nach jedem Request |
| `OpenAiService` | Singleton | OpenAI-kompatible Provider (Nvidia, Pollinations, Gemini) mit Tool-Calling, Streaming, Modell-Caching |
| `ToolService` | Singleton | Tool-Definitionen bereitstellen, Tool-Aufrufe ausführen |
| `WorkspaceHelper` | Static | Workspace-Pfad-Auflösung (relativ → absolut), Path-Traversal-Schutz |
@@ -425,6 +429,8 @@ RemoteConnectionManager → AuthService → DatabaseService → EnsureDefaultUse
| `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 |
| `KeyScannerService` | Singleton | GitHub Code-Search nach geleakten API-Keys (13 Sprachen, 24 Pfad-Extensions), Background-Scan |
| `AnthropicKeyChecker` | Static | Anthropic Key-Validierung via API-Request, Usage-Header-Auswertung (Plan, 7d/5h Usage) |
### Endpoints (API)
@@ -449,7 +455,7 @@ 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` |
| **API Keys** | `/api/admin/api-keys/` | CRUD + `PUT activate/deactivate`, `POST check` (Heartbeat-Check für Anthropic-Keys) (Admin-only) |
| **API Keys** | `/api/admin/api-keys/` | CRUD + `PUT activate/deactivate`, `POST check`, `POST scan`, `GET scan/status`, `GET scanned`, `POST scanned/{id}/adopt`, `POST scanned/{id}/recheck`, `DELETE scanned/{id}` (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`) |
@@ -1732,7 +1738,7 @@ Das ONNX-Modell muss unter `data/models/all-MiniLM-L6-v2/` liegen (`model.onnx`
## API-Key-Verwaltung
API-Keys werden in der Datenbank verwaltet (Tabelle `api_keys`) statt in der Konfigurationsdatei.
API-Keys werden in der Datenbank verwaltet (Tabellen `api_keys` + `scanned_keys`) statt in der Konfigurationsdatei.
### Funktionsweise
@@ -1741,14 +1747,36 @@ API-Keys werden in der Datenbank verwaltet (Tabelle `api_keys`) statt in der Kon
- **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
- **Source-URL:** Bei adoptierten Scan-Keys wird die GitHub-URL gespeichert
### Heartbeat-Check (nur Anthropic)
### Key-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)
`POST /api/admin/api-keys/{id}/check` sendet eine minimale Anfrage an die Anthropic API (`claude-sonnet-4-20250514`, `max_tokens=1`) mit denselben Headers wie der echte Chat-Client (`Authorization: Bearer`, `anthropic-beta`, `User-Agent`, `x-app`, `anthropic-dangerous-direct-browser-access`) und liest die Response-Headers aus:
- **Status:** `valid`, `invalid`, `rate_limited`, `quota_exceeded`, `error`
- **Plan-Erkennung:** `Max` (overage > 0), `Pro` (kein fallback-Header), `Pro/Max` (sonst), `API Console` (keine unified-Headers)
- **Budget-Auslastung:** 5h und 7d Prozentwerte aus `unified-*` Headers
### Passive Usage-Aktualisierung
Nach **jedem** API-Request an Anthropic (Streaming, Sub-Agent, NonStreaming) werden die Response-Headers automatisch ausgelesen und Plan/Usage des aktiven API-Keys in der DB aktualisiert (`AnthropicKeyChecker.ExtractMetaFromHeaders()`). Kein separater Check-Request nötig – die Daten sind immer aktuell.
### GitHub-Scanner (`KeyScannerService`)
Durchsucht GitHub Code-Search nach geleakten Anthropic API-Keys:
- **13 Sprachen** (Python, JavaScript, TypeScript, Shell, Markdown, JSON, YAML, TOML, Go, Rust, Ruby, Java, PHP)
- **24 Pfad-Extensions** (.env, .cfg, .ini, .conf, .txt, .log, .md, .json, .yaml, .yml, .toml, .py, .js, .ts, .sh, .bash, .go, .rs, .rb, .java, .php, .config, .properties, .xml)
- **Ablauf:** `POST /api/admin/api-keys/scan` → GitHub-Suche → neue Keys in `scanned_keys` speichern → jeden Key mit `AnthropicKeyChecker` prüfen → Status + Plan + Usage aktualisieren
- **Adopt:** `POST /api/admin/api-keys/scanned/{id}/adopt` → Key in `api_keys` übernehmen, Name = `user/repo`, Source-URL = vollständige GitHub-URL
- **Live-Updates:** Scan-Ergebnisse werden nach jeder Iteration in der DB gespeichert (nicht erst am Ende)
### Chat Usage-Badge (Frontend)
- **Overlay** oben zentriert im Chat (nur für Admins) mit visuellen Usage-Balken (Sitzung + Woche)
- **Farbstufen:** Grün (<70%), Orange (70-89%), Rot (≥90%)
- **Auto-Hide:** Ausgeblendet beim Hochscrollen (wenn Auto-Scroll deaktiviert)
- **Auto-Refresh:** Badge aktualisiert sich bei neuen Nachrichten (via `pollHistory`)
- **Key-Switch-Modal:** Klick auf Badge öffnet Modal mit allen API-Keys, Zeile klickbar zum Wechseln
- **Manueller Check:** 🔄-Button neben Badge prüft Key und aktualisiert
---