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