WP10 #6
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user