|
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 = [] |
|
|
|
|
|
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 |
|
|
|
|
|
answers_log.append({ |
|
"selected": selected_answer, |
|
"isCorrect": any(answer['answer'] == selected_answer and answer['isCorrect'] for answer in |
|
questions_data[current_question_index]['answers']) |
|
}) |
|
|
|
|
|
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: |
|
|
|
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() |
|
|