import streamlit as st from typing import Dict, Any, List, Union import logging logger = logging.getLogger(__name__) def display_chat_message(message: Dict[str, Any], idx: int): with st.chat_message(message["role"]): # Hauptinhalt content = message["content"] st.markdown(content) if message["role"] == "assistant": # Button Container Styling st.markdown(""" """, unsafe_allow_html=True) cols = st.columns([0.94, 0.02, 0.02, 0.02]) with cols[1]: if st.button("📋", key=f'copy_{idx}', use_container_width=True): st.session_state.to_copy = message["content"] st.markdown('
', unsafe_allow_html=True) with cols[2]: if st.button("👎", key=f'thumb_down_{idx}', use_container_width=True): st.markdown('', unsafe_allow_html=True) with cols[3]: if st.button("👍", key=f'thumb_up_{idx}', use_container_width=True): st.markdown('', unsafe_allow_html=True) # Zeige Metadaten direkt nach der Nachricht an if "metadata" in message: display_metadata(message["metadata"]) def display_typical_questions(questions: List[str]): """Zeigt typische Fragen als einheitlich gestylte Buttons an""" cols = st.columns(len(questions)) for idx, question in enumerate(questions): with cols[idx]: if st.button( question, key=f'question_{idx}', help="Klicken Sie um diese Frage zu stellen", use_container_width=True, type="secondary" ): st.session_state.user_prompt = question def display_metadata(metadata: Union[Dict[str, Any], str]): """Zeigt Metadaten sicher an""" try: if isinstance(metadata, str): st.warning(f"Unerwartetes Metadaten-Format: {metadata}") return if not isinstance(metadata, dict): st.warning(f"Ungültiges Metadaten-Format: {type(metadata)}") return with st.expander("🔍 Details", expanded=False): # Intent und Konfidenz col1, col2 = st.columns(2) with col1: intent_info = metadata.get('intent', {}) if isinstance(intent_info, dict): st.markdown(f"**Intent:** {intent_info.get('intent', 'unknown')}") if metadata.get('subintents'): st.markdown("**Sub-Intents:**") for subintent in metadata['subintents']: st.markdown(f"- {subintent}") with col2: if isinstance(intent_info, dict): confidence = intent_info.get('confidence', 0.0) st.markdown(f"**Konfidenz:** {confidence:.2f}") # Weitere Metadaten-Anzeige... if metadata.get('quality_metrics'): metrics = metadata['quality_metrics'].get('metrics', {}) if metrics: st.markdown("### Qualitätsmetriken") metric_data = { 'Metrik': ['Datenkonsistenz', 'Antwortrelevanz'], 'Score': [ f"{metrics.get('data_consistency', {}).get('score', 0.0):.2f}", f"{metrics.get('query_relevance', {}).get('score', 0.0):.2f}" ], 'Status': [ "✅" if metrics.get('data_consistency', {}).get('passes', False) else "❌", "✅" if metrics.get('query_relevance', {}).get('passes', False) else "❌" ] } st.table(metric_data) except Exception as e: logger.error(f"Fehler bei Metadaten-Anzeige: {str(e)}") st.warning("Metadaten konnten nicht angezeigt werden") def add_scroll_button(): """Fügt einen Scroll-nach-unten Button hinzu""" scroll_button_style = """ """ st.components.v1.html(scroll_button_style, height=0) def add_font_size_control(): """Fügt eine Schriftgrößen-Kontrolle hinzu""" st.sidebar.markdown("### Textgröße") font_size = st.sidebar.slider("Wählen Sie die Textgröße", 12, 24, 16) st.markdown( f""" """, unsafe_allow_html=True )