import json import openai import os from dotenv import load_dotenv 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"], }, } }] def calculate_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']))