TestGen / app.py
vladyslav
Saving test results and feedback in MongoDB. utils refactoring
f86ba47
raw
history blame
6.06 kB
import json
import os
import gradio as gr
from dotenv import load_dotenv
from utils import save_results
load_dotenv()
MODELS = {
"GPT-4o": "gpt-4o",
"Gemini 1.5 Pro": "gemini-1.5-pro",
"Claude 3.5 Sonnet": "claude-3-5-sonnet-20241022",
}
MODELS_PATH = {
"GPT-4o": "gpt_4o",
"Gemini 1.5 Pro": "gemini_1_5_pro",
"Claude 3.5 Sonnet": "claude_3_5_sonnet",
}
BOOKS = {
"Іван Нечуйлевицький - Кайдашева Сім'я": "nechuy-levytskyy-ivan-semenovych-kaydasheva-simia.json",
}
if os.getenv("ENV_TYPE") == "dev":
MODELS["Test"] = "test"
MODELS_PATH["Test"] = "test"
BOOKS["Test"] = "test.json"
questions_data = []
current_question_index = 0
answers_log = [] # Log for saving answers
def load_questions(model, book):
global questions_data, current_question_index
current_question_index = 0
answers_log.clear()
if not model or not book:
return "Будь ласка, оберіть модель і книгу.", []
model_path = MODELS_PATH[model]
book_filename = BOOKS[book]
file_path = os.path.join("questions", model_path, book_filename)
if not os.path.exists(file_path):
return f"Файл за шляхом {file_path} не знайдено.", []
with open(file_path, "r", encoding="utf-8") as file:
questions_data = json.load(file)
if questions_data:
first_question = questions_data[current_question_index]
question_text = f"# Питання:\n## {first_question['question']}"
answers = [answer['answer'] for answer in first_question['answers']]
return question_text, answers
else:
return "У файлі немає питань.", []
def get_next_question(selected_answer):
global current_question_index, answers_log
# Writing answer in log
answers_log.append({
"selected": selected_answer,
"isCorrect": any(answer['answer'] == selected_answer and answer['isCorrect'] for answer in
questions_data[current_question_index]['answers'])
})
# Move to the next question
current_question_index += 1
if current_question_index < len(questions_data):
next_question = questions_data[current_question_index]
question_text = f"# Питання:\n## {next_question['question']}"
answers = [answer['answer'] for answer in next_question['answers']]
return question_text, gr.update(choices=answers, interactive=True), gr.update(visible=True), gr.update(
visible=False), gr.update(visible=False), gr.update(visible=False)
else:
# All questions are completed — ask for feedback
question_text = "Дякуємо за участь у тесті! Залиште, будь ласка, свій відгук і оцініть тест."
return question_text, gr.update(visible=False), gr.update(visible=False), gr.update(visible=True), gr.update(
visible=True), gr.update(visible=True)
def summarize_results(student_name, class_name, model, book, feedback, rating):
global questions_data, answers_log
questions = []
for question, answer in zip(questions_data, answers_log):
questions.append({
"question": question,
"answer": answer
})
save_results(student_name, class_name, model, book, questions, feedback, rating)
correct_answers_count = sum(1 for answer in answers_log if answer['isCorrect'])
total_questions = len(questions_data)
summary = f"# Усі питання пройдено.\n\n## Ви відповіли правильно на {correct_answers_count} з {total_questions} питань.\n\n### Ваш відгук: {feedback}\n### Ваша оцінка: {rating}/5"
return summary, gr.update(visible=False, value=""), gr.update(visible=False, value=0), gr.update(visible=False)
with gr.Blocks() as demo:
with gr.Column():
gr.Markdown("# Оберіть модель та книгу, щоб завантажити питання")
student_name_input = gr.Textbox(label="Ваше ім'я")
class_name_input = gr.Textbox(label="Ваш клас")
model_radio = gr.Radio(list(MODELS.keys()), label="Оберіть модель")
book_radio = gr.Radio(list(BOOKS.keys()), label="Оберіть книгу")
load_button = gr.Button("Завантажити питання")
question_output = gr.Markdown(label="Питання")
answer_radio = gr.Radio([], label="Варіанти відповіді", interactive=True)
next_button = gr.Button("Наступне питання", visible=False)
feedback_input = gr.Textbox(label="Ваш відгук про тест", visible=False)
rating_slider = gr.Slider(1, 5, step=1, label="Оцініть тест", visible=False)
submit_feedback_button = gr.Button("Завершити тест", visible=False)
def update_question(model, book):
question, answers = load_questions(model, book)
return question, gr.update(choices=answers, interactive=True, visible=True), gr.update(
visible=True), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False)
load_button.click(
update_question,
inputs=[model_radio, book_radio],
outputs=[question_output, answer_radio, next_button, feedback_input, rating_slider, submit_feedback_button]
)
next_button.click(
get_next_question,
inputs=[answer_radio],
outputs=[question_output, answer_radio, next_button, feedback_input, rating_slider, submit_feedback_button]
)
submit_feedback_button.click(
summarize_results,
inputs=[student_name_input, class_name_input, model_radio, book_radio, feedback_input, rating_slider],
outputs=[question_output, feedback_input, rating_slider, submit_feedback_button]
)
if __name__ == "__main__":
demo.launch()