diff --git a/app.py b/app.py index a67a0fa..51d4048 100644 --- a/app.py +++ b/app.py @@ -314,6 +314,11 @@ def grade_writing_task_1(): 'Additionally, provide a detailed commentary highlighting both strengths and ' 'weaknesses in the response. ' '\n Question: "' + question + '" \n Answer: "' + answer + '"') + }, + { + "role": "user", + "content": ('Refer to the parts of the letter as: "Greeting Opener", "bullet 1", "bullet 2", ' + '"bullet 3", "closer (restate the purpose of the letter)", "closing greeting"') } ] token_count = count_total_tokens(messages) @@ -713,7 +718,8 @@ def get_speaking_task_1_question(): "first_topic": "topic 1", "second_topic": "topic 2", "questions": [ - "Introductory question, should start with a greeting and introduce a question about the first topic, starting the topic with 'Let's talk about x' and then the question.", + "Introductory question about the first topic, starting the topic with 'Let's talk about x' and then the " + "question.", "Follow up question about the first topic", "Follow up question about the first topic", "Question about second topic", @@ -731,21 +737,25 @@ def get_speaking_task_1_question(): { "role": "user", "content": ( - 'Craft 5 simple questions of easy difficulty for IELTS Speaking Part 1 ' + 'Craft 5 simple and single questions of easy difficulty for IELTS Speaking Part 1 ' 'that encourages candidates to delve deeply into ' 'personal experiences, preferences, or insights on the topic ' - 'of "' + first_topic + '" and the topic of "' + second_topic + '". Instruct the candidate ' - 'to offer not only detailed ' - 'descriptions but also provide ' - 'nuanced explanations, examples, ' - 'or anecdotes to enrich their response. ' - 'Make sure that the generated question ' - 'does not contain forbidden subjects in ' + 'of "' + first_topic + '" and the topic of "' + second_topic + '". ' + 'Make sure that the generated ' + 'question' + 'does not contain forbidden ' + 'subjects in' 'muslim countries.') }, { "role": "user", - "content": 'The questions should lead to the usage of 4 verb tenses (present perfect, present, past and future).' + "content": 'The questions should lead to the usage of 4 verb tenses (present perfect, present, ' + 'past and future).' + }, + { + "role": "user", + "content": 'They must be 1 single question each and not be double-barreled questions.' + } ] token_count = count_total_tokens(messages) @@ -785,7 +795,8 @@ def grade_speaking_task_2(): "task_response": { "Fluency and Coherence": { "grade": 0.0, - "comment": "extensive comment about fluency and coherence, use examples to justify the grade awarded." + "comment": "extensive comment about fluency and coherence, use examples to justify the grade " + "awarded." }, "Lexical Resource": { "grade": 0.0, @@ -793,11 +804,13 @@ def grade_speaking_task_2(): }, "Grammatical Range and Accuracy": { "grade": 0.0, - "comment": "extensive comment about grammatical range and accuracy, use examples to justify the grade awarded." + "comment": "extensive comment about grammatical range and accuracy, use examples to justify the " + "grade awarded." }, "Pronunciation": { "grade": 0.0, - "comment": "extensive comment about pronunciation on the transcribed answer, use examples to justify the grade awarded." + "comment": "extensive comment about pronunciation on the transcribed answer, use examples to " + "justify the grade awarded." } } } @@ -974,11 +987,16 @@ def get_speaking_task_3_question(): { "role": "user", "content": ( - 'Formulate a set of 5 questions of hard difficulty for IELTS Speaking Part 3 that encourage candidates to engage in a ' + 'Formulate a set of 5 single questions of hard difficulty for IELTS Speaking Part 3 that encourage candidates to engage in a ' 'meaningful discussion on the topic of "' + topic + '". Provide inquiries, ensuring ' 'they explore various aspects, perspectives, and implications related to the topic.' 'Make sure that the generated question does not contain forbidden subjects in muslim countries.') + }, + { + "role": "user", + "content": 'They must be 1 single question each and not be double-barreled questions.' + } ] token_count = count_total_tokens(messages) @@ -1203,7 +1221,7 @@ def save_speaking(): def generate_video_1(): try: data = request.get_json() - sp3_questions = [] + sp1_questions = [] avatar = data.get("avatar", random.choice(list(AvatarEnum)).value) request_id = str(uuid.uuid4()) @@ -1211,8 +1229,24 @@ def generate_video_1(): "Use this id to track the logs: " + str(request_id) + " - Request data: " + str( request.get_json())) + id_to_name = { + "5912afa7c77c47d3883af3d874047aaf": "MATTHEW", + "9e58d96a383e4568a7f1e49df549e0e4": "VERA", + "d2cdd9c0379a4d06ae2afb6e5039bd0c": "EDWARD", + "045cb5dcd00042b3a1e4f3bc1c12176b": "TANYA", + "1ae1e5396cc444bfad332155fdb7a934": "KAYLA", + "0ee6aa7cc1084063a630ae514fccaa31": "JEROME", + "5772cff935844516ad7eeff21f839e43": "TYLER", + + } + + standard_questions = [ + "Hello my name is " + id_to_name.get(avatar) + ", what is yours?", + "Do you work or do you study?" + ] + questions = standard_questions + data["questions"] logging.info("POST - generate_video_1 - " + str(request_id) + " - Creating videos for speaking part 1.") - for question in data["questions"]: + for question in questions: logging.info("POST - generate_video_1 - " + str(request_id) + " - Creating video for question: " + question) result = create_video(question, avatar) logging.info("POST - generate_video_1 - " + str(request_id) + " - Video created: " + result) @@ -1231,13 +1265,13 @@ def generate_video_1(): "video_path": firebase_file_path, "video_url": url } - sp3_questions.append(video) + sp1_questions.append(video) else: logging.error("POST - generate_video_1 - " + str( request_id) + " - Failed to create video for part 1 question: " + question) response = { - "prompts": sp3_questions, + "prompts": sp1_questions, "first_title": data["first_topic"], "second_title": data["second_topic"], "type": "interactiveSpeaking", @@ -1607,6 +1641,39 @@ def get_custom_level(): return response +@app.route('/grade_short_answers', methods=['POST']) +@jwt_required() +def grade_short_answers(): + data = request.get_json() + + json_format = { + "exercises": [ + { + "id": 1, + "correct": True, + "correct_answer": " correct answer if wrong" + } + ] + } + + try: + messages = [ + { + "role": "system", + "content": ( + 'You are a helpful assistant designed to output JSON on this format: ' + str(json_format)) + }, + { + "role": "user", + "content": 'Grade these answers according to the text content and write a correct answer if they are wrong. Text, questions and answers:\n ' + str(data) + + } + ] + token_count = count_total_tokens(messages) + response = make_openai_call(GPT_4_O, messages, token_count, GEN_FIELDS, GEN_QUESTION_TEMPERATURE) + return response + except Exception as e: + return str(e) @app.route('/fetch_tips', methods=['POST']) @jwt_required()