Spaces:
Runtime error
Runtime error
updating feedback section
Browse filesadded more feedback parameters.
made functions for all the work with feedback.
app.py
CHANGED
|
@@ -30,11 +30,15 @@ import uuid
|
|
| 30 |
import time
|
| 31 |
import asyncio
|
| 32 |
import aiohttp
|
|
|
|
|
|
|
|
|
|
| 33 |
# '-----------------'
|
| 34 |
import smtplib
|
| 35 |
from email.mime.multipart import MIMEMultipart
|
| 36 |
from email.mime.text import MIMEText
|
| 37 |
from email.mime.base import MIMEBase
|
|
|
|
| 38 |
from email import encoders
|
| 39 |
# '------------------'
|
| 40 |
print("***************************************************************")
|
|
@@ -81,6 +85,7 @@ def get_state(session_id):
|
|
| 81 |
def set_state(session_id, key, value):
|
| 82 |
st.session_state.session_states[session_id][key] = value
|
| 83 |
|
|
|
|
| 84 |
@st.cache_resource
|
| 85 |
def load_model(modelname):
|
| 86 |
model_name = modelname
|
|
@@ -114,6 +119,8 @@ nlp, s2v = load_nlp_models()
|
|
| 114 |
similarity_model, spell = load_qa_models()
|
| 115 |
context_model = similarity_model
|
| 116 |
model, tokenizer = load_model(modelname)
|
|
|
|
|
|
|
| 117 |
# Info Section
|
| 118 |
def display_info():
|
| 119 |
st.sidebar.title("Information")
|
|
@@ -154,7 +161,7 @@ def get_pdf_text(pdf_file):
|
|
| 154 |
text += page.get_text()
|
| 155 |
return text
|
| 156 |
|
| 157 |
-
def
|
| 158 |
feedback_file = 'question_feedback.json'
|
| 159 |
if os.path.exists(feedback_file):
|
| 160 |
with open(feedback_file, 'r') as f:
|
|
@@ -175,34 +182,117 @@ def save_feedback(question, answer, rating, options, context):
|
|
| 175 |
json.dump(feedback_data, f)
|
| 176 |
|
| 177 |
return feedback_file
|
|
|
|
| 178 |
# -----------------------------------------------------------------------------------------
|
| 179 |
-
def send_email_with_attachment(email_subject, email_body, recipient_emails, sender_email, sender_password,
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 204 |
# ----------------------------------------------------------------------------------
|
| 205 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 206 |
# Function to clean text
|
| 207 |
def clean_text(text):
|
| 208 |
text = re.sub(r"[^\x00-\x7F]", " ", text)
|
|
@@ -517,6 +607,8 @@ def main():
|
|
| 517 |
st.title(":blue[Question Generator System]")
|
| 518 |
session_id = get_session_id()
|
| 519 |
state = initialize_state(session_id)
|
|
|
|
|
|
|
| 520 |
|
| 521 |
with st.sidebar:
|
| 522 |
show_info = st.toggle('Show Info',True)
|
|
@@ -609,20 +701,13 @@ def main():
|
|
| 609 |
|
| 610 |
# q['context'] = st.text_area(f"Edit Context {i+1}:", value=q['context'], key=f"context_{i}")
|
| 611 |
if enable_feedback_mode:
|
| 612 |
-
|
| 613 |
-
|
| 614 |
-
|
| 615 |
-
|
| 616 |
-
|
| 617 |
-
|
| 618 |
-
|
| 619 |
-
email_subject='feedback from QGen',
|
| 620 |
-
email_body='Please find the attached feedback JSON file.',
|
| 621 |
-
recipient_emails=['apjc01unique@gmail.com', 'channingfisher7@gmail.com'],
|
| 622 |
-
sender_email='apjc01unique@gmail.com',
|
| 623 |
-
sender_password=pswd,
|
| 624 |
-
attachment_path=feedback_file)
|
| 625 |
-
st.write("Feedback sent to admin")
|
| 626 |
st.write("---")
|
| 627 |
|
| 628 |
|
|
@@ -648,33 +733,19 @@ def main():
|
|
| 648 |
|
| 649 |
# View Feedback Statistics
|
| 650 |
with st.expander("View Feedback Statistics"):
|
| 651 |
-
|
| 652 |
-
if
|
| 653 |
-
|
| 654 |
-
|
| 655 |
-
|
| 656 |
-
|
| 657 |
-
|
| 658 |
-
|
| 659 |
-
|
| 660 |
-
|
| 661 |
-
|
| 662 |
-
|
| 663 |
-
|
| 664 |
-
rating_counts = {i: ratings.count(i) for i in range(1, 6)}
|
| 665 |
-
st.bar_chart(rating_counts)
|
| 666 |
-
|
| 667 |
-
# Show some highly rated questions
|
| 668 |
-
st.subheader("Highly Rated Questions")
|
| 669 |
-
sorted_feedback = sorted(feedback_data, key=lambda x: x['rating'], reverse=True)
|
| 670 |
-
top_questions = sorted_feedback[:5]
|
| 671 |
-
for feedback in top_questions:
|
| 672 |
-
st.write(f"Question: {feedback['question']}")
|
| 673 |
-
st.write(f"Answer: {feedback['answer']}")
|
| 674 |
-
st.write(f"Rating: {feedback['rating']}")
|
| 675 |
-
st.write("---")
|
| 676 |
-
else:
|
| 677 |
-
st.write("No feedback data available yet.")
|
| 678 |
print("********************************************************************************")
|
| 679 |
|
| 680 |
if __name__ == '__main__':
|
|
|
|
| 30 |
import time
|
| 31 |
import asyncio
|
| 32 |
import aiohttp
|
| 33 |
+
from datetime import datetime
|
| 34 |
+
import base64
|
| 35 |
+
from io import BytesIO
|
| 36 |
# '-----------------'
|
| 37 |
import smtplib
|
| 38 |
from email.mime.multipart import MIMEMultipart
|
| 39 |
from email.mime.text import MIMEText
|
| 40 |
from email.mime.base import MIMEBase
|
| 41 |
+
from email.mime.application import MIMEApplication
|
| 42 |
from email import encoders
|
| 43 |
# '------------------'
|
| 44 |
print("***************************************************************")
|
|
|
|
| 85 |
def set_state(session_id, key, value):
|
| 86 |
st.session_state.session_states[session_id][key] = value
|
| 87 |
|
| 88 |
+
|
| 89 |
@st.cache_resource
|
| 90 |
def load_model(modelname):
|
| 91 |
model_name = modelname
|
|
|
|
| 119 |
similarity_model, spell = load_qa_models()
|
| 120 |
context_model = similarity_model
|
| 121 |
model, tokenizer = load_model(modelname)
|
| 122 |
+
|
| 123 |
+
|
| 124 |
# Info Section
|
| 125 |
def display_info():
|
| 126 |
st.sidebar.title("Information")
|
|
|
|
| 161 |
text += page.get_text()
|
| 162 |
return text
|
| 163 |
|
| 164 |
+
def save_feedback_og(question, answer, rating, options, context):
|
| 165 |
feedback_file = 'question_feedback.json'
|
| 166 |
if os.path.exists(feedback_file):
|
| 167 |
with open(feedback_file, 'r') as f:
|
|
|
|
| 182 |
json.dump(feedback_data, f)
|
| 183 |
|
| 184 |
return feedback_file
|
| 185 |
+
|
| 186 |
# -----------------------------------------------------------------------------------------
|
| 187 |
+
def send_email_with_attachment(email_subject, email_body, recipient_emails, sender_email, sender_password, attachment):
|
| 188 |
+
smtp_server = "smtp.gmail.com" # Replace with your SMTP server
|
| 189 |
+
smtp_port = 587 # Replace with your SMTP port
|
| 190 |
+
|
| 191 |
+
# Create the email message
|
| 192 |
+
message = MIMEMultipart()
|
| 193 |
+
message['From'] = sender_email
|
| 194 |
+
message['To'] = ", ".join(recipient_emails)
|
| 195 |
+
message['Subject'] = email_subject
|
| 196 |
+
message.attach(MIMEText(email_body, 'plain'))
|
| 197 |
+
|
| 198 |
+
# Attach the feedback data if available
|
| 199 |
+
if attachment:
|
| 200 |
+
attachment_part = MIMEApplication(attachment.getvalue(), Name="feedback_data.json")
|
| 201 |
+
attachment_part['Content-Disposition'] = f'attachment; filename="feedback_data.json"'
|
| 202 |
+
message.attach(attachment_part)
|
| 203 |
+
|
| 204 |
+
# Send the email
|
| 205 |
+
try:
|
| 206 |
+
with smtplib.SMTP(smtp_server, smtp_port) as server:
|
| 207 |
+
server.starttls()
|
| 208 |
+
print(sender_email)
|
| 209 |
+
print(sender_password)
|
| 210 |
+
server.login(sender_email, sender_password)
|
| 211 |
+
text = message.as_string()
|
| 212 |
+
server.sendmail(sender_email, recipient_emails, text)
|
| 213 |
+
return True
|
| 214 |
+
except Exception as e:
|
| 215 |
+
st.error(f"Failed to send email: {str(e)}")
|
| 216 |
+
return False
|
| 217 |
# ----------------------------------------------------------------------------------
|
| 218 |
|
| 219 |
+
def collect_feedback(i,question, answer, context, options):
|
| 220 |
+
st.write("Please provide feedback for this question:")
|
| 221 |
+
edited_question = st.text_input("Enter improved question",value=question,key=f'fdx1{i}')
|
| 222 |
+
clarity = st.slider("Clarity", 1, 5, 3, help="1 = Very unclear, 5 = Very clear",key=f'fdx2{i}')
|
| 223 |
+
difficulty = st.slider("Difficulty", 1, 5, 3, help="1 = Very easy, 5 = Very difficult",key=f'fdx3{i}')
|
| 224 |
+
relevance = st.slider("Relevance", 1, 5, 3, help="1 = Not relevant, 5 = Highly relevant",key=f'fdx4{i}')
|
| 225 |
+
option_quality = st.slider("Quality of Options", 1, 5, 3, help="1 = Poor options, 5 = Excellent options",key=f'fdx5{i}')
|
| 226 |
+
overall_rating = st.slider("Overall Rating", 1, 5, 3, help="1 = Poor, 5 = Excellent",key=f'fdx6{i}')
|
| 227 |
+
comments = st.text_input("Additional Comments", "",key=f'fdx7{i}')
|
| 228 |
+
|
| 229 |
+
if st.button("Submit Feedback",key=f'fdx8{i}'):
|
| 230 |
+
feedback = {
|
| 231 |
+
"question": question,
|
| 232 |
+
'edited_question':edited_question,
|
| 233 |
+
"answer": answer,
|
| 234 |
+
"options": options,
|
| 235 |
+
"clarity": clarity,
|
| 236 |
+
"difficulty": difficulty,
|
| 237 |
+
"relevance": relevance,
|
| 238 |
+
"option_quality": option_quality,
|
| 239 |
+
"overall_rating": overall_rating,
|
| 240 |
+
"comments": comments
|
| 241 |
+
}
|
| 242 |
+
save_feedback(feedback)
|
| 243 |
+
st.success("Thank you for your feedback!")
|
| 244 |
+
|
| 245 |
+
def save_feedback(feedback):
|
| 246 |
+
st.session_state.feedback_data.append(feedback)
|
| 247 |
+
|
| 248 |
+
def analyze_feedback():
|
| 249 |
+
if not st.session_state.feedback_data:
|
| 250 |
+
st.warning("No feedback data available yet.")
|
| 251 |
+
return
|
| 252 |
+
|
| 253 |
+
df = pd.DataFrame(st.session_state.feedback_data)
|
| 254 |
+
|
| 255 |
+
st.write("Feedback Analysis")
|
| 256 |
+
st.write(f"Total feedback collected: {len(df)}")
|
| 257 |
+
|
| 258 |
+
metrics = ['clarity', 'difficulty', 'relevance', 'option_quality', 'overall_rating']
|
| 259 |
+
|
| 260 |
+
for metric in metrics:
|
| 261 |
+
fig, ax = plt.subplots()
|
| 262 |
+
df[metric].value_counts().sort_index().plot(kind='bar', ax=ax)
|
| 263 |
+
plt.title(f"Distribution of {metric.capitalize()} Ratings")
|
| 264 |
+
plt.xlabel("Rating")
|
| 265 |
+
plt.ylabel("Count")
|
| 266 |
+
st.pyplot(fig)
|
| 267 |
+
|
| 268 |
+
st.write("Average Ratings:")
|
| 269 |
+
st.write(df[metrics].mean())
|
| 270 |
+
|
| 271 |
+
# Word cloud of comments
|
| 272 |
+
comments = " ".join(df['comments'])
|
| 273 |
+
if len(comments) > 1:
|
| 274 |
+
wordcloud = WordCloud(width=800, height=400, background_color='white').generate(comments)
|
| 275 |
+
fig, ax = plt.subplots()
|
| 276 |
+
plt.imshow(wordcloud, interpolation='bilinear')
|
| 277 |
+
plt.axis("off")
|
| 278 |
+
st.pyplot(fig)
|
| 279 |
+
|
| 280 |
+
|
| 281 |
+
def export_feedback_data():
|
| 282 |
+
if not st.session_state.feedback_data:
|
| 283 |
+
st.warning("No feedback data available.")
|
| 284 |
+
return None
|
| 285 |
+
|
| 286 |
+
# Convert feedback data to JSON
|
| 287 |
+
json_data = json.dumps(st.session_state.feedback_data, indent=2)
|
| 288 |
+
|
| 289 |
+
# Create a BytesIO object
|
| 290 |
+
buffer = BytesIO()
|
| 291 |
+
buffer.write(json_data.encode())
|
| 292 |
+
buffer.seek(0)
|
| 293 |
+
|
| 294 |
+
return buffer
|
| 295 |
+
|
| 296 |
# Function to clean text
|
| 297 |
def clean_text(text):
|
| 298 |
text = re.sub(r"[^\x00-\x7F]", " ", text)
|
|
|
|
| 607 |
st.title(":blue[Question Generator System]")
|
| 608 |
session_id = get_session_id()
|
| 609 |
state = initialize_state(session_id)
|
| 610 |
+
if 'feedback_data' not in st.session_state:
|
| 611 |
+
st.session_state.feedback_data = []
|
| 612 |
|
| 613 |
with st.sidebar:
|
| 614 |
show_info = st.toggle('Show Info',True)
|
|
|
|
| 701 |
|
| 702 |
# q['context'] = st.text_area(f"Edit Context {i+1}:", value=q['context'], key=f"context_{i}")
|
| 703 |
if enable_feedback_mode:
|
| 704 |
+
collect_feedback(
|
| 705 |
+
i,
|
| 706 |
+
question = q['question'],
|
| 707 |
+
answer = q['answer'],
|
| 708 |
+
context = q['context'],
|
| 709 |
+
options = q['options'],
|
| 710 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 711 |
st.write("---")
|
| 712 |
|
| 713 |
|
|
|
|
| 733 |
|
| 734 |
# View Feedback Statistics
|
| 735 |
with st.expander("View Feedback Statistics"):
|
| 736 |
+
analyze_feedback()
|
| 737 |
+
if st.button("Export Feedback"):
|
| 738 |
+
feedback_data = export_feedback_data()
|
| 739 |
+
pswd = st.secrets['EMAIL_PASSWORD']
|
| 740 |
+
send_email_with_attachment(
|
| 741 |
+
email_subject='feedback from QGen',
|
| 742 |
+
email_body='Please find the attached feedback JSON file.',
|
| 743 |
+
recipient_emails=['apjc01unique@gmail.com', 'channingfisher7@gmail.com'],
|
| 744 |
+
sender_email='apjc01unique@gmail.com',
|
| 745 |
+
sender_password=pswd,
|
| 746 |
+
attachment=feedback_data
|
| 747 |
+
)
|
| 748 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 749 |
print("********************************************************************************")
|
| 750 |
|
| 751 |
if __name__ == '__main__':
|