Gui Anpassung.
This commit is contained in:
parent
9bb6566419
commit
38abde8516
|
|
@ -20,7 +20,7 @@ API_TIMEOUT = float(timeout_setting) if timeout_setting else 300.0
|
||||||
# --- PAGE SETUP ---
|
# --- PAGE SETUP ---
|
||||||
st.set_page_config(page_title="mindnet v2.3.1", page_icon="🧠", layout="wide")
|
st.set_page_config(page_title="mindnet v2.3.1", page_icon="🧠", layout="wide")
|
||||||
|
|
||||||
# --- CSS STYLING (VISUAL POLISH) ---
|
# --- CSS STYLING ---
|
||||||
st.markdown("""
|
st.markdown("""
|
||||||
<style>
|
<style>
|
||||||
/* Hauptcontainer enger machen für Lesbarkeit */
|
/* 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 ---
|
# --- HELPER FUNCTIONS ---
|
||||||
|
|
||||||
def load_history_from_logs(limit=10):
|
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 = []
|
queries = []
|
||||||
if HISTORY_FILE.exists():
|
if HISTORY_FILE.exists():
|
||||||
try:
|
try:
|
||||||
with open(HISTORY_FILE, "r", encoding="utf-8") as f:
|
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()
|
lines = f.readlines()
|
||||||
for line in reversed(lines):
|
for line in reversed(lines):
|
||||||
try:
|
try:
|
||||||
|
|
@ -110,7 +109,6 @@ def render_sidebar():
|
||||||
st.caption("Noch keine Einträge.")
|
st.caption("Noch keine Einträge.")
|
||||||
for q in history:
|
for q in history:
|
||||||
if st.button(f"🔎 {q[:30]}...", key=f"hist_{q}", help=q, use_container_width=True):
|
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.session_state.messages.append({"role": "user", "content": q})
|
||||||
st.rerun()
|
st.rerun()
|
||||||
|
|
||||||
|
|
@ -121,13 +119,13 @@ def render_chat_interface(top_k, explain):
|
||||||
for msg in st.session_state.messages:
|
for msg in st.session_state.messages:
|
||||||
with st.chat_message(msg["role"]):
|
with st.chat_message(msg["role"]):
|
||||||
if msg["role"] == "assistant":
|
if msg["role"] == "assistant":
|
||||||
# Intent Badge
|
# Intent Badge MIT SOURCE (Fix für Debugging)
|
||||||
if "intent" in msg:
|
if "intent" in msg:
|
||||||
icon = {"EMPATHY": "❤️", "DECISION": "⚖️", "CODING": "💻", "FACT": "📚"}.get(msg["intent"], "🧠")
|
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")
|
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(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"])
|
st.markdown(msg["content"])
|
||||||
|
|
||||||
# Sources
|
# Sources
|
||||||
|
|
@ -140,14 +138,14 @@ def render_chat_interface(top_k, explain):
|
||||||
if hit.get('explanation'):
|
if hit.get('explanation'):
|
||||||
st.caption(f"Grund: {hit['explanation']['reasons'][0]['message']}")
|
st.caption(f"Grund: {hit['explanation']['reasons'][0]['message']}")
|
||||||
|
|
||||||
# Granular Feedback
|
# Granular Feedback (Faces)
|
||||||
def _cb(qid=msg["query_id"], nid=hit['node_id']):
|
def _cb(qid=msg["query_id"], nid=hit['node_id']):
|
||||||
val = st.session_state.get(f"fb_src_{qid}_{nid}")
|
val = st.session_state.get(f"fb_src_{qid}_{nid}")
|
||||||
if val is not None: submit_feedback(qid, nid, val+1, "Faces UI")
|
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)
|
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"]
|
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))
|
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"])
|
st.markdown(msg["content"])
|
||||||
|
|
||||||
# Input Logic
|
# 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"
|
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..."):
|
if prompt := st.chat_input("Frage Mindnet..."):
|
||||||
st.session_state.messages.append({"role": "user", "content": prompt})
|
st.session_state.messages.append({"role": "user", "content": prompt})
|
||||||
st.rerun()
|
st.rerun()
|
||||||
|
|
||||||
# Wenn die letzte Nachricht vom User ist (egal ob via Input oder History Button), generiere Antwort
|
|
||||||
if last_msg_is_user:
|
if last_msg_is_user:
|
||||||
last_prompt = st.session_state.messages[-1]["content"]
|
last_prompt = st.session_state.messages[-1]["content"]
|
||||||
with st.chat_message("assistant"):
|
with st.chat_message("assistant"):
|
||||||
|
|
@ -174,13 +167,12 @@ def render_chat_interface(top_k, explain):
|
||||||
|
|
||||||
if "error" in resp:
|
if "error" in resp:
|
||||||
st.error(resp["error"])
|
st.error(resp["error"])
|
||||||
# Entferne die User Nachricht, damit man es nochmal probieren kann? Optional.
|
|
||||||
else:
|
else:
|
||||||
# Speichern und Rerun für sauberes Rendering
|
|
||||||
msg_data = {
|
msg_data = {
|
||||||
"role": "assistant",
|
"role": "assistant",
|
||||||
"content": resp.get("answer"),
|
"content": resp.get("answer"),
|
||||||
"intent": resp.get("intent", "FACT"),
|
"intent": resp.get("intent", "FACT"),
|
||||||
|
"intent_source": resp.get("intent_source", "Unknown"), # Wichtig für Anzeige
|
||||||
"sources": resp.get("sources", []),
|
"sources": resp.get("sources", []),
|
||||||
"query_id": resp.get("query_id")
|
"query_id": resp.get("query_id")
|
||||||
}
|
}
|
||||||
|
|
@ -203,8 +195,6 @@ def render_creation_interface():
|
||||||
|
|
||||||
submitted = st.form_submit_button("💾 Speichern & Indizieren")
|
submitted = st.form_submit_button("💾 Speichern & Indizieren")
|
||||||
if submitted:
|
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.success(f"Mockup: Notiz '{title}' ({n_type}) wäre jetzt gespeichert worden!")
|
||||||
st.balloons()
|
st.balloons()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user