Zum Inhalt springen
Dokumentation Kapitel 3

Technische Spezifikation

Stack, Architektur, Schnittstellen, Betrieb

Tech-Stack #

Die Auswahl ist bewusst klein und langweilig. Jede zusätzliche Technologie ist eine Sache mehr, die ein Nachfolger können muss.

BereichWahlAnmerkung
FrontendSvelteKit 5 (Runes Mode)adapter-static, vorgerendert. Reaktivität über $state, $derived, $effect
CSSTailwindCSS v4CSS-first konfiguriert: keine tailwind.config.js, kein @apply. Theme über @theme in app.css
UI-KomponentenDaisyUI 5btn, card, badge, input, modal, tabs, collapse; zwei eigene Themes (hub-light, hub-dark)
BackendFastAPI (Python 3.12+)Pydantic v2 für Schemata, SQLAlchemy 2.x als ORM, asyncpg als Treiber
DatenbankPostgreSQL 18 + pgvectorZielbild; die Entwicklungs-Compose läuft auf postgres:16-alpine
AuthJWT, selbst gebaut (Phase 1)Auth0 Free ist für Phase 2 vorgesehen
AuslieferungDocker Composenginx vor dem statischen Frontend, Uvicorn vor FastAPI
Verbindliche Festlegungen (Single Source of Truth)
PfadInhalt
frontend/src/routes/(marketing)/Öffentliche Seiten — Landing, Login, Rechtliches, diese Dokumentation
frontend/src/routes/(app)/Angemeldeter Bereich — Büro, Agenten, Konfigurationsstudio, Einstellungen
frontend/src/lib/Komponenten, Zustandsmodule (*.svelte.ts), Kataloge, Hilfsfunktionen
backend/app/routers/FastAPI-Router — ein Modul je Themenbereich
backend/app/models/SQLAlchemy-Modelle
backend/app/data/Fachkataloge: Rollen, Fähigkeiten, Werkzeuge, Vorlagen, Systemvorgabe
backend/app/dienste/Fachdienste: Bildgenerator, Stilerkennung, OpenRouter, C2PA, Stufe
docs/architektur/Architekturentscheidungen
Ordnerstruktur

Aufbau des Systems #

Systemarchitektur von agentenwerkOSDer Browser spricht ausschließlich mit nginx. nginx liefert die vorgerenderten Dateien des SvelteKit-Frontends aus und reicht alle Aufrufe unter Schrägstrich api an FastAPI weiter. FastAPI spricht mit PostgreSQL sowie mit den externen Diensten OpenRouter für Sprachmodelle und FAL.ai für Bildgenerierung. Externe Dienste erreicht ausschließlich das Backend.Docker Compose · crewmesh.techBrowserKunde im DACH-RaumnginxPort 80SvelteKit 5 (statisch)adapter-static · vorgerendertTailwind v4 · DaisyUI 5FastAPI · UvicornPydantic v2 · SQLAlchemy 2hält alle SchlüsselPostgreSQLasyncpg · pgvectorMandantentrennungOpenRouterSprachmodelleFAL.aiBildgenerierungalles übrige/api/
Systemüberblick Der Browser spricht nur mit nginx. Alles unter /api/ geht an FastAPI, alles andere ist eine vorgerenderte Datei. Externe Dienste erreicht ausschließlich das Backend — deshalb liegt dort auch jeder Schlüssel.

Die Trennung ist strikt: Das Frontend wird als statische Dateien ausgeliefert (adapter-static, fallback: 200.html). Es gibt keinen Node-Prozess in der Produktion. Der Fallback trägt die Routen, die später mandantenspezifisch werden und deshalb nicht vorgerendert werden können.

frontend/nginx.conf — die gesamte Weiterleitung
nginx
server {
    listen 80;
    root /usr/share/nginx/html;
    index index.html;

    location / {
        try_files $uri $uri/ /200.html;
    }

    location /api/ {
        proxy_pass http://hub-backend:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
Datenfluss einer Agenten-AufgabeEine Aufgabe geht vom Nutzer an das Backend. Dort wird der System-Prompt aus Rolle, Auftreten, Schutzblöcken und Ergänzung zusammengesetzt. Der Aufruf geht über OpenRouter an das Sprachmodell, das Werkzeuge nutzen kann. Das Ergebnis wird gekennzeichnet, im Audit-Log vermerkt, der Token-Verbrauch fortgeschrieben und die Antwort dem Nutzer angezeigt.AufgabeNutzer oderZeitplanSystem-Promptzusammensetzennur serverseitigOpenRouterwerkzeugfähiges ModellSprachmodelldenkt, ruft WerkzeugeSchleifeWerkzeugeE-Mail · CRM · PDF · Web-SucheErgebnisToken fortschreibenKI-KennzeichnungArt. 50 AI Act · eine Stellenicht abschaltbarAusgabe & Audit-Log
Datenfluss einer Agenten-Aufgabe Von der Aufgabe bis zum gekennzeichneten Ergebnis. Der System-Prompt wird an genau einer Stelle gebaut, und die Kennzeichnung wird an genau einer Stelle gesetzt.

Datenmodell #

ModellZweckBemerkenswerte Felder
TenantDer Mandant — zugleich die Datengrenzetarifstufe, credits_verbraucht
UserAnmeldung und Profilemail, password_hash, tenant_id
AgentEin Omni auf einem Arbeitsplatztype_key, avatar, status, level, xp, desk_x/desk_y, room, model_override, credit_budget, config (JSONB)
TeamGruppe von Agentenfarbe, beschreibung, team_tools
EntityGegenstände und Möbel im Grundrissbauart, Position
TaskAuftrag an einen AgentenZustand, Ergebnis, Token-Verbrauch
ActivityAudit-Log jeder Agenten-AktionZeitpunkt, Agent, Art
Die Kernmodelle

Aus demselben Grund wird auch die Stufe nicht abgeleitet gespeichert: Sie ergibt sich aus den verbrauchten Token, und die Formel steht an genau einer Stelle. Agent.level ist eine Bequemlichkeitsspalte für Sortierungen, keine Wahrheit.

Schnittstellen #

Alle Endpunkte liegen unter dem Präfix /api. Authentifiziert wird mit einem JWT im Authorization-Header. Listen antworten seitenweise (Page[…]) und sind immer mandantengefiltert — die Filterung geschieht serverseitig und ist kein Parameter, den der Aufrufer weglassen könnte.

Anmelden und Agenten lesen
bash
# 1) Anmelden — liefert einen JWT
curl -X POST https://os.agentenwerk.ai/api/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"email": "demo@agentenwerk.ai", "password": "..."}'

# {"access_token": "eyJhbGciOi...", "token_type": "bearer"}

# 2) Eigene Agenten auflisten
curl https://os.agentenwerk.ai/api/agents \
  -H "Authorization: Bearer $TOKEN"
Methode & PfadZweck
GET /api/healthLebendigkeit — antwortet ohne Datenbank
GET /api/health/readyBereitschaft — prüft Postgres mit SELECT 1
POST /api/auth/registerKonto anlegen
POST /api/auth/loginAnmelden, JWT erhalten
GET /api/auth/meAngemeldetes Profil
GET /api/tenantEigenen Mandanten lesen (Tarif, Verbrauch)
GET /api/agentsAgenten auflisten (seitenweise, mandantengefiltert)
GET /api/agents/skillsFähigkeitenkatalog — 31 Fähigkeiten in 6 Kategorien
GET /api/agents/toolsWerkzeugkatalog samt Verbindungsstatus je Mandant
GET /api/agents/rollenRollen-Katalog und Ausprägungen
GET /api/agents/templatesDie fünf Starter-Vorlagen
GET /api/agents/llm-modelsWerkzeugfähige Sprachmodelle aus dem OpenRouter-Katalog
GET /api/agents/avatar-modelleBildmodelle je Stilkategorie (FAL.ai)
GET/PUT /api/agents/{id}/persoenlichkeitRolle, Auftreten, Ergänzung
GET/PATCH /api/agents/{id}/faehigkeitenFähigkeiten und Werkzeuge
GET /api/agents/{id}/synergienPassende Gespanne im eigenen Büro
GET/PATCH /api/agents/{id}/modellModellwahl und Kostenrahmen
POST /api/agents/{id}/avatar/generateAvatar erzeugen (mehrere Vorschläge)
POST /api/agents/{id}/avatar/generate/streamDasselbe als Ereignisstrom — Vorschläge treffen einzeln ein
POST /api/agents/{id}/avatar/selectVorschlag übernehmen
POST /api/agents/{id}/testProbelauf gegen das gewählte Modell
POST /api/agents/einstellenAgenten anlegen und auf einen Arbeitsplatz setzen
POST /api/setup/blueprint/kmu-bueroDie Blaupause anlegen — 5 Teams, 20 Agenten
GET /api/avatare/{datei}/nachweisC2PA-Herkunftsnachweis eines erzeugten Bildes
Wichtige Endpunkte

LLM- und Bild-Integration #

agentenwerkOS bindet keine Modellanbieter einzeln an. Sprachmodelle laufen über OpenRouter, Bildmodelle über FAL.ai. Beide sind Vermittler, und das ist der Punkt: Ein fest verdrahteter Anbieter ist eine Wette darauf, dass sein bestes Modell in zwölf Monaten noch das beste ist.

DienstRolleAuswahl
OpenRouterSprachmodelle für alle AgentenTagesaktueller Katalog, gefiltert auf werkzeugfähige Modelle. Rollen bringen einen Vorschlag mit (überwiegend Claude Sonnet 4.5 und Haiku 4.5), der gegen die Liste geprüft wird
FAL.aiBildgenerierung für AvatareKatalog wird abgerufen und um für Porträts unbrauchbare Einträge bereinigt; je Stilkategorie eine Modell-Union plus Reserveliste
Externe Dienste

Der Modellvorschlag einer Rolle ist ein Vorschlag und keine Festlegung. Ist das vorgeschlagene Modell nicht mehr verfügbar, wählt die Oberfläche das nächstbeste und sagt es. Eine fest verdrahtete Modell-ID, die nach vier Monaten ins Leere zeigt, wäre der wahrscheinlichste stille Ausfall des ganzen Systems.

  • Kostenschätzung vor der Aufgabe. Das Register „Modell" zeigt den Preis je 1 000 Token für das gewählte Modell.
  • Budget je Agent. credit_budget begrenzt, was ein einzelner Agent verbrauchen darf.
  • Rückfall bei Ausfall. Antwortet die Stilerkennung nicht, greift die Schlüsselwortsuche, danach der Standardstil — der Vorgang bricht nie ab.
  • Offenlegung. Der Einsatz von FAL.ai ist in Impressum und Datenschutzerklärung benannt.

Deployment #

Der Betrieb läuft über Docker Compose auf crewmesh.tech. Drei Dienste, feste Containernamen — die Namen sind nicht kosmetisch: nginx.conf leitet /api/ an den Host hub-backend weiter, und ohne die festen Namen endet jeder API-Aufruf in einem 502.

DienstContainerPortInhalt
frontendhub-frontend3000:80nginx mit den vorgerenderten Dateien
backendhub-backend8000:8000FastAPI unter Uvicorn
dbhub-db5432:5432PostgreSQL mit Volume pgdata und pg_isready-Healthcheck
Die drei Dienste
Lokal starten
bash
# Alles zusammen — Datenbank, Backend, Frontend
cd docker && docker compose up --build

# Frontend:  http://localhost:3000
# API-Doku:  http://localhost:8000/api/docs

# Nur das Frontend, mit Hot Reload:
cd frontend && npm install && npm run dev   # http://localhost:3000

# Bauen und prüfen, was ausgeliefert würde:
npm run build && npm run preview

Sicherheit & Compliance im Code #

ZusageUmsetzung
Kein API-Schlüssel im BrowserAlle Anbieterschlüssel liegen in der Backend-Konfiguration; das Frontend kennt nur /api/…
System-Prompt nicht änderbarZusammenbau ausschließlich serverseitig; Agent hat kein Feld dafür; Ergänzung auf 2 000 Zeichen begrenzt
KI-Kennzeichnung nicht abschaltbarEine einzige Komponente ohne Eigenschaft zum Ausblenden; Systemhinweis im Layout statt auf den Einzelseiten
Erzeugte Bilder maschinenlesbar markiertSigniertes C2PA-Manifest im Bild; Nachweis über einen eigenen Endpunkt abrufbar
MandantentrennungJede Abfrage ist auf den Mandanten der Sitzung gefiltert; Row Level Security auf Datenbankebene
Missbrauch meldenFester Prompt-Block plus Audit-Log-Eintrag je Agenten-Aktion
Katalogverweise stimmenFähigkeiten, Werkzeuge und Synergien werden beim Import geprüft — ein Tippfehler bricht den Start, nicht die Oberfläche
Zusage und Ort ihrer Durchsetzung

Der Textfilter, der typische Modell-Sprachmuster entfernt, ist ausdrücklich kein Ersatz für die Kennzeichnung — im Gegenteil: Er macht KI-Text menschlicher und die Kennzeichnung damit wichtiger, nicht unwichtiger.

os.agentenwerk.ai ist ein KI-gestütztes System. Sie interagieren mit KI-Agenten, nicht mit Menschen. Erzeugte Inhalte werden gekennzeichnet, erzeugte Bilder zusätzlich maschinenlesbar nach dem C2PA-Standard (EU AI Act Art. 50). Mehr dazu