diff --git a/helper/exercises.py b/helper/exercises.py index c379417..59db409 100644 --- a/helper/exercises.py +++ b/helper/exercises.py @@ -1153,3 +1153,241 @@ def gen_multiple_choice_blank_space_utas(quantity: int, start_id: int, all_exams "questions": fix_exercise_ids(question, start_id)["questions"], "type": "multipleChoice", } + + +def gen_multiple_choice_underlined_utas(quantity: int, start_id: int): + json_format = { + "questions": [ + { + "id": "9", + "options": [ + { + "id": "A", + "text": "a" + }, + { + "id": "B", + "text": "b" + }, + { + "id": "C", + "text": "c" + }, + { + "id": "D", + "text": "d" + } + ], + "prompt": "prompt", + "solution": "A", + "variant": "text" + } + ] + } + + gen_multiple_choice_for_text = 'Generate ' + str(quantity) + (' multiple choice questions of 4 options for an english ' + 'level exam, some easy questions, some intermediate ' + 'questions and some advanced questions.Ensure that ' + 'the questions cover a range of topics such as verb ' + 'tense, subject-verb agreement, pronoun usage, ' + 'sentence structure, and punctuation. Make sure ' + 'every question only has 1 correct answer.') + + messages = [ + { + "role": "system", + "content": 'You are a helpful assistant designed to output JSON on this format: ' + str(json_format) + }, + { + "role": "user", + "content": gen_multiple_choice_for_text + }, + { + "role": "user", + "content": ( + 'The type of multiple choice is the prompt has wrong words or group of words and the options are to ' + 'find the wrong word or group of words that are underlined in the prompt. \nExample:\n' + 'Prompt: "I complain about my boss all the time, but my colleagues thinks the boss is nice."\n' + 'Options:\na: "complain"\nb: "all the time"\nc: "thinks"\nd: "is"') + } + ] + + token_count = count_total_tokens(messages) + question = make_openai_call(GPT_4_O, messages, token_count, + ["questions"], + GEN_QUESTION_TEMPERATURE) + + if len(question["questions"]) != quantity: + return gen_multiple_choice_level(quantity, start_id) + else: + return { + "id": str(uuid.uuid4()), + "prompt": "Select the appropriate option.", + "questions": fix_exercise_ids(question, start_id)["questions"], + "type": "multipleChoice", + } + +def gen_blank_space_text_utas(quantity: int, start_id: int, size: int, topic=random.choice(mti_topics)): + json_format = { + "question": { + "words": [ + { + "id": "1", + "text": "a" + }, + { + "id": "2", + "text": "b" + }, + { + "id": "3", + "text": "c" + }, + { + "id": "4", + "text": "d" + } + ], + "text": "text" + } + } + gen_text = 'Generate a text of at least ' + str(size) + ' words about the topic ' + topic + '.' + + messages = [ + { + "role": "system", + "content": 'You are a helpful assistant designed to output JSON on this format: ' + str(json_format) + }, + { + "role": "user", + "content": gen_text + }, + { + "role": "user", + "content": ( + 'From the generated text choose ' + str(quantity) + ' words (cannot be sequential words) to replace ' + 'once with {{id}} where id starts on ' + str(start_id) + ' and is ' + 'incremented for each word. The ids must be ordered throughout the text and the words must be ' + 'replaced only once. Put the removed words and respective ids on the words array of the json in the correct order.') + } + ] + + token_count = count_total_tokens(messages) + question = make_openai_call(GPT_4_O, messages, token_count, + ["question"], + GEN_QUESTION_TEMPERATURE) + + return { + "id": str(uuid.uuid4()), + "prompt": "Select the appropriate option.", + "questions": question["question"], + "type": "blankSpace" + } + +def gen_reading_passage_utas(start_id, sa_quantity: int, mc_quantity: int, topic=random.choice(mti_topics)): + + passage = generate_reading_passage(QuestionType.READING_PASSAGE_1, topic) + exercises = gen_reading_exercises_utas(passage["text"], start_id, sa_quantity, mc_quantity) + if contains_empty_dict(exercises): + return gen_reading_passage_utas(start_id, sa_quantity, mc_quantity, topic) + return { + "exercises": exercises, + "text": { + "content": passage["text"], + "title": passage["title"] + } + } + +def gen_reading_exercises_utas(passage: str, start_id: int, sa_quantity: int, mc_quantity: int): + exercises = [] + + sa_questions = gen_short_answer_utas(passage, start_id, sa_quantity) + exercises.append(sa_questions) + mc_questions = gen_text_multiple_choice_utas(passage, start_id+sa_quantity, mc_quantity) + exercises.append(mc_questions) + + return exercises + +def gen_short_answer_utas(text: str, start_id: int, sa_quantity: int): + json_format = {"questions": [{"id": 1, "question": "question", "possible_answers": ["answer_1", "answer_2"]}]} + + messages = [ + { + "role": "system", + "content": 'You are a helpful assistant designed to output JSON on this format: ' + str(json_format) + }, + { + "role": "user", + "content": ( + 'Generate ' + str(sa_quantity) + ' short answer questions, and the possible answers, must have ' + 'maximum 3 words per answer, about this text:\n"' + text + '"') + }, + { + "role": "user", + "content": 'The id starts at ' + str(start_id) + '.' + } + ] + + token_count = count_total_tokens(messages) + return make_openai_call(GPT_4_O, messages, token_count, + ["questions"], + GEN_QUESTION_TEMPERATURE) +def gen_text_multiple_choice_utas(text: str, start_id: int, mc_quantity: int): + json_format = { + "questions": [ + { + "id": "9", + "options": [ + { + "id": "A", + "text": "a" + }, + { + "id": "B", + "text": "b" + }, + { + "id": "C", + "text": "c" + }, + { + "id": "D", + "text": "d" + } + ], + "prompt": "prompt", + "solution": "A", + "variant": "text" + } + ] + } + + messages = [ + { + "role": "system", + "content": 'You are a helpful assistant designed to output JSON on this format: ' + str(json_format) + }, + { + "role": "user", + "content": 'Generate ' + str(mc_quantity) + ' multiple choice questions of 4 options for this text:\n' + text + }, + { + "role": "user", + "content": 'Make sure every question only has 1 correct answer.' + } + ] + + token_count = count_total_tokens(messages) + question = make_openai_call(GPT_4_O, messages, token_count, + ["questions"], + GEN_QUESTION_TEMPERATURE) + + if len(question["questions"]) != mc_quantity: + return gen_multiple_choice_level(mc_quantity, start_id) + else: + return { + "id": str(uuid.uuid4()), + "prompt": "Select the appropriate option.", + "questions": fix_exercise_ids(question, start_id)["questions"], + "type": "multipleChoice", + } \ No newline at end of file