436 lines
8.2 KiB
Markdown
436 lines
8.2 KiB
Markdown
|
|
---
|
||
|
|
doc_type: technical_reference
|
||
|
|
audience: developer, integrator
|
||
|
|
scope: api, endpoints, integration
|
||
|
|
status: active
|
||
|
|
version: 2.9.1
|
||
|
|
context: "Vollständige API-Referenz für alle Mindnet-Endpunkte. Basis für Integration und Entwicklung."
|
||
|
|
---
|
||
|
|
|
||
|
|
# API Reference
|
||
|
|
|
||
|
|
Diese Dokumentation beschreibt alle verfügbaren API-Endpunkte von Mindnet. Die API basiert auf FastAPI und nutzt automatische OpenAPI-Dokumentation (verfügbar unter `/docs`).
|
||
|
|
|
||
|
|
## Basis-URL
|
||
|
|
|
||
|
|
```
|
||
|
|
http://localhost:8001 # Production
|
||
|
|
http://localhost:8002 # Development
|
||
|
|
```
|
||
|
|
|
||
|
|
## Health Check
|
||
|
|
|
||
|
|
### `GET /healthz`
|
||
|
|
|
||
|
|
Prüft den Status der API und der Verbindung zu Qdrant.
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"status": "ok",
|
||
|
|
"qdrant": "http://localhost:6333",
|
||
|
|
"prefix": "mindnet"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Query Endpoints
|
||
|
|
|
||
|
|
### `POST /query`
|
||
|
|
|
||
|
|
Führt eine hybride oder semantische Suche im Wissensgraph durch.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"query": "Was ist Mindnet?",
|
||
|
|
"mode": "hybrid", // "hybrid" oder "semantic"
|
||
|
|
"top_k": 10,
|
||
|
|
"expand_depth": 1,
|
||
|
|
"explain": true
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"query_id": "uuid-v4",
|
||
|
|
"hits": [
|
||
|
|
{
|
||
|
|
"chunk_id": "uuid",
|
||
|
|
"note_id": "uuid",
|
||
|
|
"text": "Auszug...",
|
||
|
|
"score": 0.85,
|
||
|
|
"explanation": {
|
||
|
|
"reasons": [...]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"stats": {
|
||
|
|
"total_hits": 10,
|
||
|
|
"query_time_ms": 45
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Hinweis:** Das Feedback-Logging erfolgt asynchron im Hintergrund (Background Tasks).
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Chat Endpoints
|
||
|
|
|
||
|
|
### `POST /chat/`
|
||
|
|
|
||
|
|
Hauptendpunkt für RAG-Chat und Interview-Modus. Unterstützt Streaming.
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"message": "Was ist Mindnet?",
|
||
|
|
"history": [], // Optional: Chat-Verlauf
|
||
|
|
"stream": true // Optional: SSE-Streaming
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response (Non-Streaming):**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"intent": "FACT",
|
||
|
|
"response": "Mindnet ist ein persönliches KI-Gedächtnis...",
|
||
|
|
"sources": [...],
|
||
|
|
"query_id": "uuid"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response (Streaming):**
|
||
|
|
Server-Sent Events (SSE) mit Chunks der Antwort.
|
||
|
|
|
||
|
|
**Intent-Typen:**
|
||
|
|
- `FACT`: Wissensabfrage
|
||
|
|
- `DECISION`: Entscheidungsfrage
|
||
|
|
- `EMPATHY`: Emotionale Anfrage
|
||
|
|
- `INTERVIEW`: Wissen erfassen
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Graph Endpoints
|
||
|
|
|
||
|
|
### `GET /graph/{note_id}`
|
||
|
|
|
||
|
|
Lädt den Subgraphen um eine Note herum.
|
||
|
|
|
||
|
|
**Query Parameters:**
|
||
|
|
- `depth` (int, default: 1): Tiefe der Graph-Expansion
|
||
|
|
- `edge_types` (List[str], optional): Filter für Kanten-Typen
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"center_note_id": "uuid",
|
||
|
|
"nodes": [
|
||
|
|
{
|
||
|
|
"id": "uuid",
|
||
|
|
"type": "project",
|
||
|
|
"title": "Projekt Alpha",
|
||
|
|
"tags": ["ki"],
|
||
|
|
"in_degree": 5,
|
||
|
|
"out_degree": 3
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"edges": [
|
||
|
|
{
|
||
|
|
"id": "uuid->uuid:depends_on",
|
||
|
|
"kind": "depends_on",
|
||
|
|
"source": "uuid",
|
||
|
|
"target": "uuid",
|
||
|
|
"weight": 1.4,
|
||
|
|
"direction": "out"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"stats": {
|
||
|
|
"node_count": 10,
|
||
|
|
"edge_count": 15
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Ingest Endpoints
|
||
|
|
|
||
|
|
### `POST /ingest/analyze`
|
||
|
|
|
||
|
|
Analysiert einen Text-Draft und liefert Link-Vorschläge (Intelligence-Feature).
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"text": "Markdown-Text...",
|
||
|
|
"type": "concept" // Optional: Notiz-Typ
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"suggestions": [
|
||
|
|
{
|
||
|
|
"text": "Mindnet",
|
||
|
|
"type": "exact_match",
|
||
|
|
"note_id": "uuid",
|
||
|
|
"confidence": 0.95
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"text": "KI-Gedächtnis",
|
||
|
|
"type": "semantic",
|
||
|
|
"note_id": "uuid",
|
||
|
|
"confidence": 0.82
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### `POST /ingest/save`
|
||
|
|
|
||
|
|
Speichert eine Notiz und startet die Ingestion im Hintergrund (WP-14: Background Tasks).
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"markdown_content": "---\nid: ...\n---\n# Titel\n...",
|
||
|
|
"filename": "meine-notiz.md", // Optional
|
||
|
|
"folder": "00_Inbox" // Optional, default: "00_Inbox"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"status": "queued",
|
||
|
|
"file_path": "00_Inbox/meine-notiz.md",
|
||
|
|
"note_id": "pending",
|
||
|
|
"message": "Speicherung & Hybrid-KI-Analyse (WP-20) im Hintergrund gestartet.",
|
||
|
|
"stats": {
|
||
|
|
"chunks": -1, // -1 = Async Processing
|
||
|
|
"edges": -1
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Wichtig:**
|
||
|
|
- Die Datei wird sofort auf der Festplatte gespeichert
|
||
|
|
- Die Ingestion (Chunking, Embedding, Smart Edges) läuft asynchron im Hintergrund
|
||
|
|
- Dies verhindert Timeouts bei großen Dateien oder langsamen LLM-Calls
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Feedback Endpoints
|
||
|
|
|
||
|
|
### `POST /feedback`
|
||
|
|
|
||
|
|
Nimmt explizites User-Feedback entgegen (WP-04c).
|
||
|
|
|
||
|
|
**Request Body:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"query_id": "uuid",
|
||
|
|
"rating": 5, // 1-5 Sterne
|
||
|
|
"feedback_type": "global", // "global" oder "granular"
|
||
|
|
"chunk_id": "uuid" // Optional für granular feedback
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"status": "recorded",
|
||
|
|
"query_id": "uuid"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Tools Endpoints
|
||
|
|
|
||
|
|
### `GET /tools/ollama`
|
||
|
|
|
||
|
|
Liefert JSON-Schemas für die Integration als Tools in externe Agenten (Ollama, OpenAI, etc.).
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"tools": [
|
||
|
|
{
|
||
|
|
"type": "function",
|
||
|
|
"function": {
|
||
|
|
"name": "mindnet_query",
|
||
|
|
"description": "Hybrid-Retrieval über mindnet (Semantik + Edges).",
|
||
|
|
"parameters": {
|
||
|
|
"type": "object",
|
||
|
|
"properties": {
|
||
|
|
"query": {
|
||
|
|
"type": "string",
|
||
|
|
"description": "Freitext-Query"
|
||
|
|
},
|
||
|
|
"top_k": {
|
||
|
|
"type": "integer",
|
||
|
|
"default": 10,
|
||
|
|
"minimum": 1,
|
||
|
|
"maximum": 50
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"type": "function",
|
||
|
|
"function": {
|
||
|
|
"name": "mindnet_subgraph",
|
||
|
|
"description": "Gibt die Nachbarschaft (Edges) einer Note/Seed-ID zurück.",
|
||
|
|
"parameters": {
|
||
|
|
"type": "object",
|
||
|
|
"properties": {
|
||
|
|
"note_id": {
|
||
|
|
"type": "string"
|
||
|
|
},
|
||
|
|
"depth": {
|
||
|
|
"type": "integer",
|
||
|
|
"default": 1,
|
||
|
|
"minimum": 0,
|
||
|
|
"maximum": 3
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"required": ["note_id"]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Verwendung:** Diese Schemas können direkt in Ollama-Function-Calling oder OpenAI-Tools integriert werden.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Admin Endpoints
|
||
|
|
|
||
|
|
### `GET /admin/stats`
|
||
|
|
|
||
|
|
Liefert Statistiken über die Qdrant-Collections und die aktuelle Konfiguration.
|
||
|
|
|
||
|
|
**Response:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"collections": {
|
||
|
|
"notes": {
|
||
|
|
"name": "mindnet_notes",
|
||
|
|
"count": 150
|
||
|
|
},
|
||
|
|
"chunks": {
|
||
|
|
"name": "mindnet_chunks",
|
||
|
|
"count": 1250
|
||
|
|
},
|
||
|
|
"edges": {
|
||
|
|
"name": "mindnet_edges",
|
||
|
|
"count": 3200
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"config": {
|
||
|
|
"qdrant": "http://localhost:6333",
|
||
|
|
"prefix": "mindnet",
|
||
|
|
"vector_size": 768,
|
||
|
|
"distance": "Cosine",
|
||
|
|
"retriever": {
|
||
|
|
"w_sem": 0.70,
|
||
|
|
"w_edge": 0.25,
|
||
|
|
"w_cent": 0.05,
|
||
|
|
"top_k": 10,
|
||
|
|
"expand_depth": 1
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Hinweis:** Dieser Endpunkt ist optional und kann deaktiviert sein, wenn der `admin`-Router nicht geladen wird.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Fehlerbehandlung
|
||
|
|
|
||
|
|
Alle Endpunkte verwenden standardisierte HTTP-Status-Codes:
|
||
|
|
|
||
|
|
- `200 OK`: Erfolgreiche Anfrage
|
||
|
|
- `201 Created`: Ressource erfolgreich erstellt
|
||
|
|
- `400 Bad Request`: Ungültige Anfrage (z.B. fehlende Parameter)
|
||
|
|
- `500 Internal Server Error`: Server-Fehler
|
||
|
|
|
||
|
|
**Fehler-Response-Format:**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"detail": "Fehlerbeschreibung"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Rate Limiting & Timeouts
|
||
|
|
|
||
|
|
- **Chat-Endpunkte:** Keine Retries (max_retries=0) für schnelle Fallback-Kaskade
|
||
|
|
- **Ingest-Endpunkte:** Background Tasks verhindern Timeouts
|
||
|
|
- **Query-Endpunkte:** Standard-Timeout konfigurierbar via `MINDNET_API_TIMEOUT`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## OpenAPI Dokumentation
|
||
|
|
|
||
|
|
Die vollständige interaktive API-Dokumentation ist verfügbar unter:
|
||
|
|
- Swagger UI: `http://localhost:8001/docs`
|
||
|
|
- ReDoc: `http://localhost:8001/redoc`
|
||
|
|
- OpenAPI JSON: `http://localhost:8001/openapi.json`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Integration Beispiele
|
||
|
|
|
||
|
|
### Python (requests)
|
||
|
|
|
||
|
|
```python
|
||
|
|
import requests
|
||
|
|
|
||
|
|
# Query
|
||
|
|
response = requests.post(
|
||
|
|
"http://localhost:8001/query",
|
||
|
|
json={"query": "Was ist Mindnet?", "top_k": 5}
|
||
|
|
)
|
||
|
|
print(response.json())
|
||
|
|
|
||
|
|
# Chat
|
||
|
|
response = requests.post(
|
||
|
|
"http://localhost:8001/chat/",
|
||
|
|
json={"message": "Erkläre mir Mindnet"}
|
||
|
|
)
|
||
|
|
print(response.json())
|
||
|
|
```
|
||
|
|
|
||
|
|
### cURL
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Health Check
|
||
|
|
curl http://localhost:8001/healthz
|
||
|
|
|
||
|
|
# Query
|
||
|
|
curl -X POST http://localhost:8001/query \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{"query": "Was ist Mindnet?", "top_k": 5}'
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Weitere Informationen
|
||
|
|
|
||
|
|
- **Chat-Backend Details:** Siehe [Chat Backend Dokumentation](03_tech_chat_backend.md)
|
||
|
|
- **Ingestion-Pipeline:** Siehe [Ingestion Pipeline](03_tech_ingestion_pipeline.md)
|
||
|
|
- **Retrieval & Scoring:** Siehe [Retrieval & Scoring](03_tech_retrieval_scoring.md)
|
||
|
|
|