|
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) |
|
) |
|
|