WP10 #6

Merged
Lars merged 9 commits from WP10 into main 2025-12-10 10:29:10 +01:00
Showing only changes of commit 38abde8516 - Show all commits

View File

@ -20,7 +20,7 @@ API_TIMEOUT = float(timeout_setting) if timeout_setting else 300.0
# --- PAGE SETUP ---
st.set_page_config(page_title="mindnet v2.3.1", page_icon="🧠", layout="wide")
# --- CSS STYLING (VISUAL POLISH) ---
# --- CSS STYLING ---
st.markdown("""
<style>
/* Hauptcontainer enger machen für Lesbarkeit */
@ -51,12 +51,11 @@ if "draft_note" not in st.session_state: st.session_state.draft_note = {"title":
# --- HELPER FUNCTIONS ---
def load_history_from_logs(limit=10):
"""Liest die letzten N Queries aus dem Logfile (WP-04c Data Flywheel)."""
"""Liest die letzten N Queries aus dem Logfile."""
queries = []
if HISTORY_FILE.exists():
try:
with open(HISTORY_FILE, "r", encoding="utf-8") as f:
# Datei rückwärts oder komplett lesen (bei großen Logs besser `tail`)
lines = f.readlines()
for line in reversed(lines):
try:
@ -110,7 +109,6 @@ def render_sidebar():
st.caption("Noch keine Einträge.")
for q in history:
if st.button(f"🔎 {q[:30]}...", key=f"hist_{q}", help=q, use_container_width=True):
# Trick: Query in Input 'injecten' geht schwer, wir feuern direkt ab
st.session_state.messages.append({"role": "user", "content": q})
st.rerun()
@ -121,13 +119,13 @@ def render_chat_interface(top_k, explain):
for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
if msg["role"] == "assistant":
# Intent Badge
# Intent Badge MIT SOURCE (Fix für Debugging)
if "intent" in msg:
icon = {"EMPATHY": "❤️", "DECISION": "⚖️", "CODING": "💻", "FACT": "📚"}.get(msg["intent"], "🧠")
# st.markdown(f'<div class="intent-badge">{icon} Intent: {msg["intent"]}</div>', unsafe_allow_html=True)
# NEU (mit Source):
source_info = msg.get("intent_source", "Unknown")
# Hier wird die Quelle wieder angezeigt:
st.markdown(f'<div class="intent-badge">{icon} Intent: {msg["intent"]} <span style="opacity:0.6; font-size: 0.9em; margin-left:5px;">via {source_info}</span></div>', unsafe_allow_html=True)
st.markdown(msg["content"])
# Sources
@ -140,14 +138,14 @@ def render_chat_interface(top_k, explain):
if hit.get('explanation'):
st.caption(f"Grund: {hit['explanation']['reasons'][0]['message']}")
# Granular Feedback
# Granular Feedback (Faces)
def _cb(qid=msg["query_id"], nid=hit['node_id']):
val = st.session_state.get(f"fb_src_{qid}_{nid}")
if val is not None: submit_feedback(qid, nid, val+1, "Faces UI")
st.feedback("faces", key=f"fb_src_{msg['query_id']}_{hit['node_id']}", on_change=_cb)
# Global Feedback
# Global Feedback (Stars)
qid = msg["query_id"]
st.feedback("stars", key=f"fb_glob_{qid}", on_change=lambda: submit_feedback(qid, "generated_answer", st.session_state[f"fb_glob_{qid}"]+1))
@ -155,17 +153,12 @@ def render_chat_interface(top_k, explain):
st.markdown(msg["content"])
# Input Logic
# Prüfen ob wir aus der History kommen (letzte Nachricht User und noch keine Antwort?)
last_msg_is_user = len(st.session_state.messages) > 0 and st.session_state.messages[-1]["role"] == "user"
# Da st.rerun() die ganze App neu lädt, müssen wir prüfen, ob wir auf eine Antwort warten
# Aber Streamlit Flow ist: Input -> Rerun -> Code läuft -> Render.
# Wir brauchen einen Trigger.
if prompt := st.chat_input("Frage Mindnet..."):
st.session_state.messages.append({"role": "user", "content": prompt})
st.rerun()
# Wenn die letzte Nachricht vom User ist (egal ob via Input oder History Button), generiere Antwort
if last_msg_is_user:
last_prompt = st.session_state.messages[-1]["content"]
with st.chat_message("assistant"):
@ -174,13 +167,12 @@ def render_chat_interface(top_k, explain):
if "error" in resp:
st.error(resp["error"])
# Entferne die User Nachricht, damit man es nochmal probieren kann? Optional.
else:
# Speichern und Rerun für sauberes Rendering
msg_data = {
"role": "assistant",
"content": resp.get("answer"),
"intent": resp.get("intent", "FACT"),
"intent_source": resp.get("intent_source", "Unknown"), # Wichtig für Anzeige
"sources": resp.get("sources", []),
"query_id": resp.get("query_id")
}
@ -203,8 +195,6 @@ def render_creation_interface():
submitted = st.form_submit_button("💾 Speichern & Indizieren")
if submitted:
# TODO: Hier müsste der POST Request an eine /ingest API gehen
# Da diese API in v2.3.1 noch fehlt, simulieren wir es.
st.success(f"Mockup: Notiz '{title}' ({n_type}) wäre jetzt gespeichert worden!")
st.balloons()