diff --git a/module_grading_playground.py b/module_grading_playground.py new file mode 100644 index 0000000..4f7c031 --- /dev/null +++ b/module_grading_playground.py @@ -0,0 +1,94 @@ +import json + +import openai +import os +from dotenv import load_dotenv +from functools import reduce + +load_dotenv() +openai.api_key = os.getenv("OPENAI_API_KEY") + +chat_config = {'max_tokens': 1000, 'temperature': 0.2} +section_keys = ['reading', 'listening', 'writing', 'speaking', 'level'] +grade_top_limit = 9 + +tools = [{ + "type": "function", + "function": { + "name": "save_evaluation_and_suggestions", + "description": "Saves the evaluation and suggestions requested by input.", + "parameters": { + "type": "object", + "properties": { + "evaluation": { + "type": "string", + "description": "A comment on the IELTS section grade obtained in the specific section and what it could mean without suggestions.", + }, + "suggestions": { + "type": "string", + "description": "A small paragraph text with suggestions on how to possibly get a better grade than the one obtained.", + }, + }, + "required": ["evaluation", "suggestions"], + }, + } +}] + + +# Input Format +# {'sections': Array of {'code': key, 'name': name, 'grade': grade}} +# Output +# {'sections': Array of {'code': key, 'name': name, 'grade': grade, 'evaluation': evaluation, 'suggestions': suggestions}} + +def grading_summary(body): + extracted_sections = extract_existing_sections_from_body(body, section_keys) + + ret = [] + + for section in extracted_sections: + openai_response_dict = calculate_section_grade_summary(section) + ret = ret + [{'code': section['code'], 'name': section['name'], 'grade': section['grade'], + 'evaluation': openai_response_dict['evaluation'], + 'suggestions': openai_response_dict['suggestions']}] + + return {'sections': ret} + + +def calculate_section_grade_summary(section): + res = openai.ChatCompletion.create( + model="gpt-3.5-turbo", + max_tokens=chat_config['max_tokens'], + temperature=chat_config['temperature'], + tools=tools, + messages=[ + { + "role": "user", + "content": "You are a IELTS test section grade evaluator. You will receive a IELTS test section name and the grade obtained in the section. You should offer a comment on this grade with also suggestions on how to possibly get a better grade.", + }, + { + "role": "user", + "content": "Section: " + str(section['name']) + " Grade: " + str(section['grade']), + }, + {"role": "user", "content": "Speak in third person."}, + {"role": "user", "content": "Please save the evaluation and suggestions generated."} + ]) + + return parse_openai_response(res) + + +def parse_openai_response(response): + if 'choices' in response and len(response['choices']) > 0 and 'message' in response['choices'][ + 0] and 'tool_calls' in response['choices'][0]['message'] and isinstance( + response['choices'][0]['message']['tool_calls'], list) and len( + response['choices'][0]['message']['tool_calls']) > 0 and \ + response['choices'][0]['message']['tool_calls'][0]['function']['arguments']: + return json.loads(response['choices'][0]['message']['tool_calls'][0]['function']['arguments']) + else: + return {'evaluation': "", 'suggestions': ""} + + +def extract_existing_sections_from_body(my_dict, keys_to_extract): + if 'sections' in my_dict and isinstance(my_dict['sections'], list) and len(my_dict['sections']) > 0: + return list(filter( + lambda item: 'code' in item and item['code'] in keys_to_extract and 'grade' in item and 'name' in item, + my_dict['sections']))