import json from datetime import datetime from pathlib import Path import streamlit as st class FeedbackManager: def __init__(self, feedback_dir="./feedback"): self.feedback_dir = Path(feedback_dir) self.feedback_dir.mkdir(exist_ok=True) if "feedback_submitted" not in st.session_state: st.session_state.feedback_submitted = set() def save_feedback(self, feedback_type: str, user_input: str, assistant_response: str, message_id: str): if message_id in st.session_state.feedback_submitted: st.toast("Feedback já enviado para está mensagem.", icon="ℹ️") return False feedback_file = self.feedback_dir / f"feedback_{feedback_type}.json" try: data = [] if feedback_file.exists(): with open(feedback_file, 'r', encoding='utf-8') as f: data = json.load(f) feedback_entry = { "message_id": message_id, "timestamp": datetime.now().isoformat(), "feedback_type": feedback_type, "user_input": user_input, "assistant_response": assistant_response, } data.append(feedback_entry) with open(feedback_file, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2) st.session_state.feedback_submitted.add(message_id) emoji = "👍" if feedback_type == "positive" else "👎" st.toast(f"Obrigado por seu Feedback! {emoji}", icon="✅") return True except Exception as e: st.error(f"Error ao salvar feedback: {str(e)}") return False def handle_feedback_click(self, feedback_type: str, message_id: str, user_input: str, assistant_response: str): self.save_feedback( feedback_type=feedback_type, user_input=user_input, assistant_response=assistant_response, message_id=message_id ) def render_feedback_buttons(self, message_id: str, user_input: str, assistant_response: str): col1, col2 = st.columns(2, gap="small") with col1: st.button( "👍 Gostei", key=f"positive_{message_id}", on_click=self.handle_feedback_click, args=("positive", message_id, user_input, assistant_response) ) with col2: st.button( "👎 Não Gostei", key=f"negative_{message_id}", on_click=self.handle_feedback_click, args=("negative", message_id, user_input, assistant_response) )