feat: Langzeit-Erinnerungen (#3b) und WebSocket-Streaming-Chat (#4, erster Increment)
#3b Langzeit-Erinnerungen: - Store: memories-Tabelle + add/get/delete_memory (pro Nutzer) - API: GET/POST/DELETE /api/me/memories - chat.py injiziert Nutzer-Erinnerungen als System-Kontext ins LLM (sessionunabhaengig) - ?debug zeigt memories_len #4 Echtzeit (erster Increment): - WS /ws/chat: dauerhafter Kanal, Event-Folge ack -> semantic -> audio (binaer) -> done - Auth (Token-Query), Session-Gedaechtnis und Erinnerungen wie bei POST /api/chat - Fehler als error-Event (422/403/502) - Tests: 38 gruen (Erinnerungs-CRUD/Injektion, WebSocket-Streaming/Auth) - Doku aktualisiert (README, BEDIENUNGSANLEITUNG, Architektur) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
16a964032e
commit
531b57e08d
12 changed files with 389 additions and 9 deletions
|
|
@ -81,6 +81,32 @@ def test_user_prefs_applied_to_route(monkeypatch):
|
|||
assert resp.headers["X-Output-Endpoint"] == "loopback"
|
||||
|
||||
|
||||
def test_memories_crud(monkeypatch):
|
||||
_enable_auth(monkeypatch)
|
||||
auth = {"Authorization": f"Bearer {_create_user('Mem')}"}
|
||||
|
||||
assert client.get("/api/me/memories", headers=auth).json() == []
|
||||
|
||||
created = client.post("/api/me/memories", headers=auth, json={"content": "mag Tee"})
|
||||
assert created.status_code == 200
|
||||
mid = created.json()["id"]
|
||||
|
||||
listed = client.get("/api/me/memories", headers=auth).json()
|
||||
assert len(listed) == 1 and listed[0]["content"] == "mag Tee"
|
||||
|
||||
assert client.delete(f"/api/me/memories/{mid}", headers=auth).status_code == 200
|
||||
assert client.get("/api/me/memories", headers=auth).json() == []
|
||||
assert client.delete("/api/me/memories/9999", headers=auth).status_code == 404
|
||||
|
||||
|
||||
def test_memories_are_per_user(monkeypatch):
|
||||
_enable_auth(monkeypatch)
|
||||
auth_a = {"Authorization": f"Bearer {_create_user('A')}"}
|
||||
auth_b = {"Authorization": f"Bearer {_create_user('B')}"}
|
||||
client.post("/api/me/memories", headers=auth_a, json={"content": "geheim A"})
|
||||
assert client.get("/api/me/memories", headers=auth_b).json() == []
|
||||
|
||||
|
||||
def test_admin_unconfigured_returns_503(monkeypatch):
|
||||
# Auth an, aber kein Admin-Key gesetzt.
|
||||
monkeypatch.setattr(settings, "auth_enabled", True)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue