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:
1 parent
8b1794d11e
commit
730c14aa23
3 files changed
+62
-27
No files matched your search
+45
-17
@@ -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
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in new issue
Block a user