- Chat: POST /api/chat/stop Endpoint + Stop-Mechanismus (zwei Ebenen) dokumentiert - StreamingTracker: CancellationTokenSource pro Session beschrieben - Auth: GET /api/auth/autologin, GET /api/images/file/* ohne Auth - Admin: POST login-link Endpoint + Login-Link-Sektion - Krea: Thumb-Endpoint, Status-Endpoint, öffentliches Bild-Serving - Frontend: buildAgentCard(), buildSessionCard() UI-Helpers + Picker-Modals - ui.js in Verzeichnisstruktur ergänzt
10 KiB
ARCHITECTURE_QUICK.md – Schnellreferenz
Kurzfassung der ARCHITECTURE.md für schnelles Nachschlagen beim Entwickeln.
Tech-Stack
.NET 10 Minimal API · SQLite + Dapper · Anthropic Claude API (SSE Streaming) · Vanilla JS SPA · KaTeX (Math) · Kestrel auf Port 19000
Verzeichnisstruktur (nur Schlüssel-Dateien)
gott/
├── Program.cs # Startup, DI, Middleware, Routing
├── appsettings.json # Tokens, API-Keys, Limits
├── Models/ # Records (reine Daten)
├── Services/ # Business-Logic (alle Singletons + WorkspaceHelper)
├── Endpoints/ # HTTP API (Minimal API MapXxx-Pattern)
├── Middleware/ # AuthMiddleware
├── Templates/ # Vorlagen für neue Agents (IDENTITY, SOUL, USER)
├── wwwroot/ # ⚠️ HIER Frontend editieren!
│ ├── js/app.js # App-Init
│ ├── js/router.js # Hash-basiertes SPA-Routing
│ ├── js/api.js # fetch()-Wrapper
│ ├── js/chat.js # SSE-Stream, Markdown-Rendering
│ ├── js/ui.js # UI-Helpers, buildAgentCard(), buildSessionCard()
│ ├── js/pages/ # Seiten-Komponenten
│ └── css/ # Styles (theme.css = CSS Variables)
├── WindowsApp/ # WPF + WebView2 Desktop Client
└── publish/ # ⛔ NICHT editieren!
└── data/
├── gott.db # SQLite DB
├── agents/{id}/ # Memory-Dateien pro Agent
├── skills/{slug}/ # Skill-Dateien
└── images/ # Krea-generierte Bilder
Datenmodell (Kurzform)
User 1──* Agent 1──* Session 1──* Chain 1──* Message 1──* Attachment
Agent *──* Skill (via agent_skills)
Session 1──* Cronjob
Session 1──* Archive
User 1──* SharedMessage ──1 Message
| Tabelle | Zweck |
|---|---|
users |
Login, Persona, Settings (JSON), DefaultPath |
tokens |
Auth-Tokens → User |
agents |
AI-Agenten (Model, Tools, Config, AvatarScale) |
sessions |
Chat-Sessions (Workspace, Context, Telegram, AvatarScale, AllowedChatIds) |
chains |
Ein Request-Response-Zyklus (Tokens, Timing, Iterations) |
messages |
Einzelne Nachrichten (text / tool_use / tool_result / error) |
attachments |
Base64-Anhänge (Bilder, Dokumente) |
archives |
Archivierte Chain-Gruppen |
cronjobs |
Geplante Tasks (Cron-Expression + Prompt) |
agent_skills |
N:M Agent ↔ Skill |
shared_messages |
Geteilte Nachrichten (öffentliche Links via Share-Token) |
telegram_links |
Telegram Chat-ID ↔ Session |
API-Endpunkte (Übersicht)
| Gruppe | Route | Wichtigstes |
|---|---|---|
| Auth | /api/auth/ |
POST login, POST logout, GET me, GET autologin |
| Chat | /api/chat |
POST → SSE Stream, POST stop |
| History | /api/history |
GET history, poll, archive, marks, delete |
| Sessions | /api/sessions/ |
CRUD + system-prompt, exec, git-status |
| Agents | /api/agents/ |
CRUD |
| Admin | /api/admin/ |
User CRUD, impersonate, login-link (Admin-only) |
| Workspace | /api/workspace/ |
tree, file read/write, mkdir, rmdir, browse, agent-files |
| Telegram | /api/telegram/ |
webhook (unauth), config, registration |
| Cronjobs | /api/cronjobs/ |
CRUD + toggle, manual run |
| Krea | /api/images/ |
generate, list, file-serve, thumb, status (file/* ohne Auth) |
| Skills | /api/skills |
list, agent-mapping, output-files |
| Profile | /api/profile |
GET, PUT, password |
| Settings | /api/settings |
GET, PUT (JSON blob) |
| Backup | /api/backup |
POST → tar.gz download (Admin) |
| Shared | /api/shared/, /api/messages/{id}/share |
Share erstellen, öffentlich abrufen, löschen |
| Info | /api/info |
GET → Build-Zeitstempel |
Services (alle Singletons)
| Service | Was es tut |
|---|---|
| DatabaseService | Alles DB: Schema, Migrationen, CRUD |
| AuthService | Token-Auth, Passwort-Hashing (SHA256) |
| ChatService | Chat-Kontext aufbauen, History aus DB laden |
| AnthropicService | Claude API: SSE Streaming + Non-Streaming |
| ToolService | Tool-Definitionen + Ausführung (12 Tools) |
| WorkspaceHelper | Workspace-Pfad-Auflösung (relativ → absolut), Path-Traversal-Schutz (static) |
| SystemPromptBuilder | System-Prompt aus modularen Blöcken zusammenbauen (static) |
| MemoryService | Agent-Gedächtnis auf Dateisystem |
| SkillService | Skill-Discovery aus Dateisystem |
| TelegramService | Telegram Bot API |
| CronjobService | BackgroundService, minütlicher Cron-Check |
| KreaService | Krea API Bildgenerierung + Job-Polling |
| ImageService | Bild-Resize (ImageSharp, max 512px) |
| StreamingTracker | Tracking aktiver Streams + CancellationTokenSource pro Session für Stop |
Chat-Pipeline (Flow)
User-Input → POST /api/chat (SSE)
→ ChatService.BuildContext()
→ History aus DB laden (letzte N Chains)
→ SystemPromptBuilder: 12 Blöcke zusammensetzen
→ Tool-Definitionen vom ToolService holen
→ AnthropicService.StreamChat()
→ Claude API Call (SSE)
→ Token-für-Token an Client streamen
→ Bei tool_use → ToolService.Execute() → Ergebnis zurück → neuer API Call
→ Loop bis end_turn oder max_iterations (100)
→ Stop-Button: POST /api/chat/stop → StreamingTracker.Cancel()
→ CancellationToken durchgereicht bis ToolService → Prozess-Kill
→ client_disconnected
→ Chain + Messages in DB speichern
History-Optimierung: Ältere Chains nur Text-Messages (keine Tool-Calls). Letzte Chain vollständig. Tool-Results auf 20.000 Zeichen gekürzt. Attachments nur für letzte User-Message.
Rendering: Markdown via marked.js + LaTeX via KaTeX ($$...$$ Block, $...$ Inline). Timestamps im Format dd.MM.yyyy HH:mm:ss on hover.
Tool-System (12 Tools)
| Tool | Funktion |
|---|---|
read_file |
Datei lesen |
write_file |
Datei erstellen/überschreiben |
edit_file |
Exakten Textabschnitt ersetzen |
list_files |
Verzeichnisinhalt auflisten |
delete_file |
Datei/leeres Verzeichnis löschen |
execute |
Shell-Befehl ausführen (bash, 180s Timeout) |
glob |
Dateien per Glob-Pattern finden |
grep |
Dateien per Regex/Text durchsuchen |
todo_write |
Aufgabenliste schreiben (wird im Prompt angezeigt) |
memory_read |
Memory-Datei lesen |
memory_write |
Memory-Datei schreiben/appenden |
memory_list |
Memory-Dateien auflisten |
Sicherheit: Alle Pfade werden auf das Workspace-Verzeichnis beschränkt (.. wird blockiert). Tools sind pro Agent konfigurierbar (Feld tools als komma-separierte Liste).
Tool-Choice: Standard auto. Wird zu none bei /no-tools. Einzelne Tools forcierbar via /tool:toolname.
System-Prompt (12 Blöcke, in Reihenfolge)
- Identity –
IDENTITY.mddes Agents - Soul –
SOUL.mddes Agents - User –
USER.md(globale User-Infos) + Persona - Rules – Verhaltensregeln (Tool-Nutzung, Workspace)
- Context – Session-Kontext (custom system prompt)
- Marked Messages – Als wichtig markierte Nachrichten
- Memory – Aktueller MEMORY.md-Inhalt
- Skills – Zugeordnete Skill-Prompts
- Todos – Aktuelle Todo-Liste
- Tools – Tool-Beschreibungen und -Regeln
- Workspace – Pfad-Info, Dateibaum des Workspace
- Date – Aktuelles Datum/Uhrzeit
Frontend-Routing
| Hash-Route | Page-Datei | Beschreibung |
|---|---|---|
#/ |
dashboard.js |
Session-Übersicht |
#/chat/{id} |
chat-page.js |
Chat |
#/session/{id} |
session-page.js |
Session-Settings |
#/agent/{id} |
agent-page.js |
Agent-Editor |
#/cronjobs |
cronjob-page.js |
Cronjobs |
#/profile |
profile-page.js |
Profil |
#/settings |
settings-page.js |
Einstellungen |
#/admin |
admin-page.js |
Benutzerverwaltung (Admin) |
#/login |
login-page.js |
Login |
#/shared/{token} |
shared-page.js |
Geteilte Nachricht (öffentlich, kein Auth) |
Auth-Flow
POST /api/auth/login→ Token generiert, alsgott_tokenHttpOnly Cookie gesetzt- Jeder
/api/-Request →AuthMiddlewareprüft Cookie → setztUserId+IsAdmin - Ausnahmen: Login, Autologin, Telegram-Webhook,
GET /api/shared/{token},GET /api/images/file/*brauchen kein Auth - Krea API-Key:
/api/images/-Routen akzeptierenX-Api-Key-Header (Config:KreaApiKey) für Automation ohne User-Kontext - Impersonate: Admin kann via
POST /api/admin/users/{id}/impersonateals anderer User einloggen - Login-Link: Admin generiert via
POST /api/admin/users/{id}/login-linkeinen Autologin-Link (Token-basiert,GET /api/auth/autologin?token=xxx) - DefaultPath: Pro User ein Basis-Ordner (nur vom Admin setzbar), Session-Workspaces sind relativ dazu
Konfiguration (appsettings.json)
{
"AnthropicToken": "", // Anthropic API Key (REQUIRED)
"MaxIterations": 100, // Max Tool-Loop Iterationen pro Chat
"PayloadLogging": false, // API-Payloads loggen (Debug)
"PayloadLoggingGzip": false, // Payload-Logs als .gz komprimieren
"KreaToken": "", // Krea API Token (optional)
"KreaApiKey": "" // API-Key für Krea-Endpoints ohne User-Auth (optional)
}
Deployment
./deploy.sh # dotnet publish → systemctl restart gott
Läuft als systemd-Service, Kestrel auf Port 19000, typisch hinter Nginx/Caddy Reverse Proxy.
Wichtige Regeln beim Entwickeln
- ⚠️ Quelldateien in
wwwroot/editieren, NICHT inpublish/wwwroot/ - ⛔
publish/data/gott.dbniemals manuell modifizieren/löschen - ⛔
publish/generell nicht anfassen - 🔧 .NET 10 ohne Nullable, ohne Implicit Usings
- 📦 DB-Migrationen sind idempotent (IF NOT EXISTS Pattern in
DatabaseService)