From 74ac5a2ce5e58ca6c7b78eb5839548dd9e1a1620 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 15 Mar 2026 12:16:36 +0700 Subject: [PATCH] Hausmeister: topic-aware session_summary --- homelab-ai-bot/context.py | 6 ++--- homelab-ai-bot/llm.py | 17 +++++++++----- homelab-ai-bot/memory_client.py | 40 +++++++++++++++++++++++++++------ 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/homelab-ai-bot/context.py b/homelab-ai-bot/context.py index 5361abff..a2259f32 100644 --- a/homelab-ai-bot/context.py +++ b/homelab-ai-bot/context.py @@ -323,9 +323,9 @@ def _tool_session_search(query): return "\n".join(lines) -def _tool_session_summary(session_id): +def _tool_session_summary(session_id, topic=None): import memory_client - return memory_client.get_session_summary(session_id, limit=20) + return memory_client.get_session_summary(session_id, limit=20, topic=topic or None) def get_tool_handlers(session_id: str = None) -> dict: @@ -354,5 +354,5 @@ def get_tool_handlers(session_id: str = None) -> dict: "memory_read": lambda scope="": _tool_memory_read(scope), "memory_suggest": lambda scope, kind, content: _tool_memory_suggest(scope, kind, content), "session_search": lambda query: _tool_session_search(query), - "session_summary": lambda: _tool_session_summary(session_id) if session_id else "Keine Session aktiv.", + "session_summary": lambda topic="": _tool_session_summary(session_id, topic=topic) if session_id else "Keine Session aktiv.", } diff --git a/homelab-ai-bot/llm.py b/homelab-ai-bot/llm.py index 81b0c317..8aaa22c6 100644 --- a/homelab-ai-bot/llm.py +++ b/homelab-ai-bot/llm.py @@ -35,9 +35,10 @@ Nach dem Aufruf sagst du kurz: "Notiert." — kein langes Erklaeren. NICHT speichern: Passwoerter, Tokens, Smalltalk, Hoeflichkeiten, reine Fragen. SESSION-RUECKBLICK: -- "Was haben wir besprochen?" → session_summary aufrufen (liefert alle Themen der aktuellen Session) -- "Erinnerst du dich an X?" mit konkretem Stichwort → session_search -- Antworte mit 2-5 knappen Kernthemen, nicht mit einem einzelnen Fakt. +- "Was haben wir besprochen?" → session_summary OHNE topic +- "Was haben wir ueber X besprochen?" → session_summary MIT topic="X" +- Bei thematischer Filterung: Zuerst die passenden Punkte, dann kurz erwaehnen was sonst noch Thema war. +- session_search nur fuer Stichwort-Suche in ALTEN Sessions (nicht aktuelle). TOOLS: Nutze Tools fuer Live-Daten. Wenn alles OK: kurz sagen. Bei Problemen: erklaeren + Loesung.""" @@ -311,8 +312,14 @@ TOOLS = [ "type": "function", "function": { "name": "session_summary", - "description": "Zusammenfassung aller Themen der aktuellen Session. Nutze dieses Tool bei Fragen wie 'Was haben wir besprochen?', 'Worüber haben wir geredet?', 'Was war heute Thema?'. Liefert alle Frage-Antwort-Paare kompakt.", - "parameters": {"type": "object", "properties": {}, "required": []}, + "description": "Zusammenfassung der aktuellen Session. Ohne topic = alle Themen. Mit topic = nur thematisch passende Punkte. Nutze topic wenn die Frage ein klares Thema enthaelt (z.B. 'Container', 'Jarvis', 'Backup').", + "parameters": { + "type": "object", + "properties": { + "topic": {"type": "string", "description": "Themenbegriff zum Filtern (z.B. 'Container', 'Backup'). Leer lassen fuer allgemeine Zusammenfassung."}, + }, + "required": [], + }, }, }, ] diff --git a/homelab-ai-bot/memory_client.py b/homelab-ai-bot/memory_client.py index c1caa385..d842b275 100644 --- a/homelab-ai-bot/memory_client.py +++ b/homelab-ai-bot/memory_client.py @@ -123,8 +123,8 @@ def get_session_messages(session_id: str, limit: int = 10) -> list[dict]: return [] -def get_session_summary(session_id: str, limit: int = 20) -> str: - """Kompakte Zusammenfassung der aktuellen Session als Themen-Liste.""" +def get_session_summary(session_id: str, limit: int = 20, topic: str = None) -> str: + """Kompakte Zusammenfassung der aktuellen Session, optional nach Thema gefiltert.""" if not session_id: return "Keine aktive Session." messages = get_session_messages(session_id, limit=limit) @@ -139,9 +139,9 @@ def get_session_summary(session_id: str, limit: int = 20) -> str: if not content: continue if role == "user": - current_q = content[:120] + current_q = content[:200] elif role == "assistant" and current_q: - exchanges.append((current_q, content[:120])) + exchanges.append((current_q, content[:200])) current_q = None if current_q: exchanges.append((current_q, None)) @@ -149,10 +149,36 @@ def get_session_summary(session_id: str, limit: int = 20) -> str: if not exchanges: return "Keine Themen in dieser Session." - lines = [f"Session ({len(exchanges)} Themen):"] + if topic: + topic_lower = topic.lower() + matching = [] + other_topics = [] + for q, a in exchanges: + combined = (q + " " + (a or "")).lower() + if topic_lower in combined: + matching.append((q, a)) + else: + other_topics.append(q[:80]) + + lines = [] + if matching: + lines.append("Zum Thema '" + topic + "' (" + str(len(matching)) + " Punkte):") + for i, (q, a) in enumerate(matching, 1): + line = str(i) + ". Frage: " + q + if a: + line += "\n Antwort: " + a + lines.append(line) + else: + lines.append("Zum Thema '" + topic + "' wurde nichts direkt besprochen.") + + if other_topics: + lines.append("\nSonstige Themen: " + ", ".join(other_topics)) + return "\n".join(lines) + + lines = ["Session (" + str(len(exchanges)) + " Themen):"] for i, (q, a) in enumerate(exchanges, 1): - line = f"{i}. Frage: {q}" + line = str(i) + ". Frage: " + q if a: - line += f"\n Antwort: {a}" + line += "\n Antwort: " + a lines.append(line) return "\n".join(lines)