API-Referenz¶
Diese Seite dokumentiert ausgewählte REST-API-Endpunkte des LLARS-Backends.
Die vollständige Liste findest du in app/routes/ sowie app/routes/registry.py.
Base URL
Alle Endpunkte sind relativ zur Base URL: http://localhost:55080/api
Authentifizierung¶
Alle API-Endpunkte (außer /auth/*) erfordern einen gültigen JWT-Token im Authorization-Header:
Token erhalten¶
Wird über Authentik OAuth2/OIDC Flow gehandhabt. Siehe Authentik Setup.
Chatbot API¶
Chatbots¶
Liste aller Chatbots¶
Response:
{
"success": true,
"chatbots": [
{
"id": 1,
"name": "Support Bot",
"description": "Kundensupport Assistent",
"is_published": true,
"owner_id": 1,
"created_at": "2025-12-01T10:00:00Z"
}
]
}
Chatbot erstellen¶
POST /api/chatbots
Content-Type: application/json
{
"name": "Neuer Bot",
"description": "Beschreibung",
"llm_model_id": 1,
"system_prompt": "Du bist ein hilfreicher Assistent."
}
Response: 201 Created
Chatbot Details¶
Chatbot aktualisieren¶
PATCH /api/chatbots/{id}
Content-Type: application/json
{
"name": "Aktualisierter Name",
"description": "Neue Beschreibung"
}
Chatbot löschen¶
Chat-Nachrichten¶
Nachricht senden¶
POST /api/chatbots/{id}/chat
Content-Type: application/json
{
"message": "Hallo, wie kann ich dir helfen?",
"session_id": "unique-session-id",
"conversation_id": null,
"include_sources": true
}
Response (Streaming):
data: {"delta": "Hallo"}
data: {"delta": "! Ich"}
data: {"delta": " kann"}
data: {"done": true, "sources": [...], "conversation_id": 1}
Konversation abrufen¶
Response:
{
"success": true,
"conversation": {
"id": 1,
"title": "Erste Unterhaltung",
"messages": [
{"role": "user", "content": "Hallo"},
{"role": "assistant", "content": "Hallo! Wie kann ich helfen?"}
]
}
}
RAG API¶
Collections¶
Alle Collections¶
Query-Parameter:
- include_stats (bool): Chunk-Statistiken einschließen
Collection erstellen¶
POST /api/rag/collections
Content-Type: application/json
{
"name": "Wissensbasis",
"description": "Dokumente für Kundensupport"
}
Collection Details¶
Collection löschen¶
Dokumente¶
Dokument hochladen¶
Response:
{
"success": true,
"document": {
"id": 1,
"filename": "handbuch.pdf",
"status": "pending",
"mime_type": "application/pdf"
}
}
Dokument-Status¶
Response:
{
"success": true,
"document": {
"id": 1,
"filename": "handbuch.pdf",
"status": "indexed",
"chunk_count": 45,
"processed_at": "2025-12-01T10:05:00Z"
}
}
Dokument löschen¶
Suche¶
Semantische Suche¶
POST /api/rag/search
Content-Type: application/json
{
"query": "Wie setze ich mein Passwort zurück?",
"collection_ids": [1, 2],
"top_k": 5,
"include_content": true
}
Response:
{
"success": true,
"results": [
{
"document_id": 1,
"chunk_index": 12,
"content": "Um Ihr Passwort zurückzusetzen...",
"score": 0.89,
"metadata": {
"filename": "handbuch.pdf",
"page_number": 5
}
}
]
}
Judge API¶
Sessions¶
Alle Sessions¶
Session erstellen¶
POST /api/judge/sessions
Content-Type: application/json
{
"name": "GPT-4 vs Claude Vergleich",
"pillar_ids": [1, 2, 3],
"sampling_strategy": "random",
"sample_size": 50
}
Session starten¶
Session pausieren¶
Session-Statistiken¶
Pillars (Bewertungskriterien)¶
Alle Pillars¶
Response:
{
"success": true,
"pillars": [
{
"id": 1,
"name": "Relevanz",
"description": "Wie relevant ist die Antwort für die Frage?",
"weight": 1.0
}
]
}
Admin API¶
System-Einstellungen¶
Alle Einstellungen¶
Permission: admin:settings:view
Einstellung aktualisieren¶
Permission: admin:settings:edit
Analytics¶
Analytics-Einstellungen¶
Benutzer¶
Alle Benutzer¶
Query-Parameter:
- page (int): Seitennummer
- per_page (int): Einträge pro Seite
- search (string): Suchbegriff
Benutzer-Permissions¶
User API¶
Profil¶
Eigenes Profil¶
Profil aktualisieren¶
PATCH /api/users/me/settings
Content-Type: application/json
{
"collab_color": "#b0ca97",
"avatar_seed": "random-seed"
}
Avatar hochladen¶
Error Responses¶
Standard-Fehlerformat¶
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"details": {}
}
}
HTTP-Status-Codes¶
| Code | Bedeutung |
|---|---|
| 200 | OK |
| 201 | Created |
| 400 | Bad Request (Validierungsfehler) |
| 401 | Unauthorized (Kein Token) |
| 403 | Forbidden (Keine Berechtigung) |
| 404 | Not Found |
| 409 | Conflict |
| 500 | Internal Server Error |
Rate Limiting¶
Rate Limiting ist via flask-limiter implementiert.
| Modus | Standard-Limit |
|---|---|
| Development | 1000 Requests/Stunde |
| Production | 500 Requests/Stunde |
Endpunkt-spezifische Limits können in app/main.py konfiguriert werden. Bei Überschreitung wird HTTP 429 (Too Many Requests) zurückgegeben.
WebSocket-Endpunkte¶
Für Echtzeit-Updates siehe WebSocket API.