import re import os from apiclient import discovery from oauth2client import client, file, tools import bardapi from transformers import pipeline, AutoModelForQuestionAnswering, AutoTokenizer from transformers import T5ForConditionalGeneration, T5Tokenizer SCOPES = "https://www.googleapis.com/auth/forms.body" DISCOVERY_DOC = "https://forms.googleapis.com/$discovery/rest?version=v1" NEW_FORM = { "info": { "title": "Quiz" } } model_name = "t5-base" model = T5ForConditionalGeneration.from_pretrained(model_name) tokenizer = T5Tokenizer.from_pretrained(model_name) def generate_quiz_questions(prompt): # Set your Bard API key as an environment variable os.environ['_BARD_API_KEY'] = "WwgqSrcbBC71HsiWpTlqnbDC9TQ3-9N1YyY6CHxOEfFp_qeCe0laziZoOT_dkTEjhJmOcw." prompt_suffix = ". Each generated question has to begin with '🔹', each choice has to begin with '🔸', and each correct answer has to begin with '✔️'." # Send API requests and get responses response = bardapi.core.Bard().get_answer(prompt + prompt_suffix) quiz = response["content"] return quiz ''' def generate_quiz_url(prompt_text, form_service): # Generate quiz questions based on the transcribed text text = generate_quiz_questions(prompt_text) # Questions, choices, and correct answers questions = re.findall(r"🔹 (.*?)\n", text) choices = re.findall(r"🔸 (.*?)\n", text) answers = re.findall(r"✔️ (.*?)\n", text) # Remove the '**' from the questions list (they are not part of the question), choices, and correct answers questions = [question.replace('**', '') for question in questions] answers = [answer.replace('**', '') for answer in answers] questions_list = [] # Fill the questions_list variable for i, question in enumerate(questions): choices_for_question = choices[i * 4:(i + 1) * 4] correct_answer = answers[i] if i < len(answers) else "" question_dict = { "question": question, "choices": choices_for_question, "correct_answer": correct_answer } questions_list.append(question_dict) # Create the initial form result = form_service.forms().create(body=NEW_FORM).execute() # Add the questions to the form question_requests = [] for index, question in enumerate(questions_list): new_question = { "createItem": { "item": { "title": question["question"], "questionItem": { "question": { "required": True, "choiceQuestion": { "type": "RADIO", "options": [ {"value": choice} for choice in question["choices"] ], "shuffle": True } } } }, "location": { "index": index } } } question_requests.append(new_question) NEW_QUESTIONS = { "requests": question_requests } question_setting = form_service.forms().batchUpdate(formId=result["formId"], body=NEW_QUESTIONS).execute() # Retrieve the updated form result get_result = form_service.forms().get(formId=result["formId"]).execute() # Get the form ID form_id = get_result["formId"] # Construct the quiz link using the form ID form_url = result["responderUri"] return form_url ''' def explain_quiz_answers(questions_list): explanations = [] for question in questions_list: context = question["question"] choices = question["choices"] correct_answer = question["correct_answer"] explanation = f"Question: {context}\n" for choice in choices: # Construct a query with each choice as a question query = f"What is the reason for choosing '{choice}' in {context}?" # Tokenize the query and context inputs = tokenizer.encode_plus(query, context, return_tensors="pt", truncation=True, padding="max_length", max_length=512) # Generate the explanation using the T5 model outputs = model.generate(input_ids=inputs["input_ids"], attention_mask=inputs["attention_mask"], max_length=256) # Decode the explanation explanation_text = tokenizer.decode(outputs[0], skip_special_tokens=True) # Add the explanation to the overall explanation explanation += f"\nChoice: {choice}\nExplanation: {explanation_text}" # Add an indicator if the choice is the correct answer if choice == correct_answer: explanation += " (Correct Answer)" explanation += "\n" explanations.append(explanation) return explanations def generate_quiz_url(prompt_text, form_service): # Generate quiz questions based on the transcribed text text = generate_quiz_questions(prompt_text) # Questions, choices, and correct answers questions = re.findall(r"🔹 (.*?)\n", text) choices = re.findall(r"🔸 (.*?)\n", text) answers = re.findall(r"✔️ (.*?)\n", text) # Remove the '**' from the questions list (they are not part of the question), choices, and correct answers questions = [question.replace('**', '') for question in questions] answers = [answer.replace('**', '') for answer in answers] questions_list = [] # Fill the questions_list variable for i, question in enumerate(questions): choices_for_question = choices[i * 4:(i + 1) * 4] correct_answer = answers[i] if i < len(answers) else "" question_dict = { "question": question, "choices": choices_for_question, "correct_answer": correct_answer } questions_list.append(question_dict) # Create the initial form result = form_service.forms().create(body=NEW_FORM).execute() # Add the questions to the form question_requests = [] for index, question in enumerate(questions_list): new_question = { "createItem": { "item": { "title": question["question"], "questionItem": { "question": { "required": True, "choiceQuestion": { "type": "RADIO", "options": [ {"value": choice} for choice in question["choices"] ], "shuffle": True } } } }, "location": { "index": index } } } question_requests.append(new_question) NEW_QUESTIONS = { "requests": question_requests } question_setting = form_service.forms().batchUpdate(formId=result["formId"], body=NEW_QUESTIONS).execute() # Retrieve the updated form result get_result = form_service.forms().get(formId=result["formId"]).execute() # Get the form ID form_id = get_result["formId"] # Construct the quiz link using the form ID form_url = result["responderUri"] # Get the explanations for the quiz explanations = explain_quiz_answers(questions_list) return form_url, explanations