from flask import Flask, request from flask_jwt_extended import JWTManager, jwt_required from functools import reduce from helper.token_counter import count_tokens from helper.openai_interface import make_openai_call import os from dotenv import load_dotenv load_dotenv() app = Flask(__name__) app.config['JWT_SECRET_KEY'] = os.getenv("JWT_SECRET_KEY") jwt = JWTManager(app) GRADING_TEMPERATURE = 0.1 GEN_QUESTION_TEMPERATURE = 0.7 WRITING_TASK_2_POST_FIELDS = ['overall', 'comment', 'task_response'] WRITING_TASK_2_GET_FIELDS = ['question'] @app.route('/writing_task2', methods=['POST']) @jwt_required() def grade_writing_task(): data = request.get_json() # Assuming the request data is in JSON format question = data.get('question') answer = data.get('answer') messages = [ { "role": "system", "content": "You are a IELTS examiner.", }, { "role": "system", "content": f"The question you have to grade is of type Writing Task 2 and is the following: {question}", }, { "role": "user", "content": "It is mandatory for you to provide your response with the overall grade and breakdown grades, " "in the following json format: {'comment': 'comment about answer quality', 'overall': 7.0, 'task_response': {'Task Achievement': 8.0, " "'Coherence and Cohesion': 6.5, 'Lexical Resource': 7.5, 'Grammatical Range and Accuracy': " "6.0}}", }, { "role": "user", "content": "Example output: { 'comment': 'Overall, the response is good but there are some areas that need " "improvement.\n\nIn terms of Task Achievement, the writer has addressed all parts of the question " "and has provided a clear opinion on the topic. However, some of the points made are not fully " "developed or supported with examples.\n\nIn terms of Coherence and Cohesion, there is a clear " "structure to the response with an introduction, body paragraphs and conclusion. However, there " "are some issues with cohesion as some sentences do not flow smoothly from one to another.\n\nIn " "terms of Lexical Resource, there is a good range of vocabulary used throughout the response and " "some less common words have been used effectively.\n\nIn terms of Grammatical Range and Accuracy, " "there are some errors in grammar and sentence structure which affect clarity in places.\n\nOverall, " "this response would score a band 6.5.', 'overall': 6.5, 'task_response': " "{ 'Coherence and Cohesion': 6.5, 'Grammatical Range and Accuracy': 6.0, 'Lexical Resource': 7.0, " "'Task Achievement': 7.0}}", }, { "role": "user", "content": f"Evaluate this answer according to ielts grading system: {answer}", }, ] token_count = reduce(lambda count, item: count + count_tokens(item)['n_tokens'], map(lambda x: x["content"], filter(lambda x: "content" in x, messages)), 0) response = make_openai_call(messages, token_count, WRITING_TASK_2_POST_FIELDS, GRADING_TEMPERATURE) return response @app.route('/writing_task2', methods=['GET']) @jwt_required() def get_writing_task_question(): messages = [ { "role": "system", "content": "You are a IELTS program that generates questions for the exams.", }, { "role": "system", "content": "The question you have to generate is of type Writing Task 2 and is the following.", }, { "role": "user", "content": "It is mandatory for you to provide your response with the question " "in the following json format: {'question': 'question'}", }, { "role": "user", "content": "Example output: { 'question': 'We are becoming increasingly dependent on computers. " "They are used in businesses, hospitals, crime detection and even to fly planes. What things will " "they be used for in the future? Is this dependence on computers a good thing or should we he more " "auspicious of their benefits?'}", }, { "role": "user", "content": "Generate a question for IELTS exam Writing Task 2.", }, ] token_count = reduce(lambda count, item: count + count_tokens(item)['n_tokens'], map(lambda x: x["content"], filter(lambda x: "content" in x, messages)), 0) response = make_openai_call(messages, token_count, WRITING_TASK_2_GET_FIELDS, GEN_QUESTION_TEMPERATURE) return response if __name__ == '__main__': app.run()