From 286ff0e61e0bd92e07e72d907ca043751f0a117a Mon Sep 17 00:00:00 2001 From: OwusuBlessing Date: Tue, 10 Sep 2024 01:00:08 +0100 Subject: [PATCH] added managers apis --- data/raw/document.pdf | Bin 99539 -> 99539 bytes src/api/routes/sops.py | 157 +++++++++++++----- src/models/response_schemas.py | 43 +++++ src/prompts/sops.py | 80 +++++++-- ...ument_parser.py => sop_document_parser.py} | 127 ++++++++++++-- src/services/sop_generator.py | 145 +--------------- test.py | 32 +++- 7 files changed, 371 insertions(+), 213 deletions(-) rename src/services/{document_parser.py => sop_document_parser.py} (56%) diff --git a/data/raw/document.pdf b/data/raw/document.pdf index 8cd88fcba5dbc4249dd4567124cc1b0f98635a76..657981ff0b10bac61b162f8d23255af076f16735 100644 GIT binary patch delta 98 zcmccI$#%JuZNp9>4nqS210!Pti{^tu+YbscG8Q_zI6J$V8e5t;8ko2mIT;xkni;y8 ZnYg*Sxfqx`Tez9o*$_}Mow4g+%|V-qt2!{&oR+YbscG8Q_Tm>amd7+YEz7`T}l8JSoZ7#bNG Zn>v{pSs0j`8km^b*$_}Mow SOPsResponse: - """ - Extracts SOPs categorized into 'must,' 'shall,' and 'will' based on executive vision and goals. - - :param data: A dictionary containing vision and goals. - :return: SOPsResponse containing the SOPs for executives - """ - try: - - vision = data.get("vision", "No vision provided") - goals = data.get("goals", "No goals provided") - - prompt = get_sop_executive_from_vision_goals(executives) - - user_content = f''' - Vision: {vision} - Goals: {goals} - ''' - - response = self.client.beta.chat.completions.parse( - model=self.model, - messages=[ - { - "role": "system", - "content": f'''{prompt}''' - }, - { - "role": "user", - "content": user_content, - } - ], - response_format=Categories, - max_tokens=2048, - temperature=0.1 - ) - - extracted_text = json.loads(response.choices[0].message.content) - return extracted_text - - except Exception as e: - print(f"Error occurred: {str(e)}") - return False - - - def generate_sops_for_department_managers(self, docs): - try: - # First, extract departments and managers - sop_doc = DocumentParser() - departments_and_roles = sop_doc.extract_departments_and_managers(docs) - - if not departments_and_roles or not departments_and_roles.get('departments'): - return False - - departments_with_sops = [] - - for department in departments_and_roles['departments']: - managers_with_sops = [] - for role in department['managerial_roles']: - prompt = get_sop_for_department_managers() - response = self.client.beta.chat.completions.parse( - model=self.model, - messages=[ - {"role": "system", "content": prompt}, - {"role": "user", "content": f"Generate SOPs for {role['title']} in {department['name']} department."} - ], - response_format=ManagerSOPs, - max_tokens=1024, - temperature=0.1 - ) - manager_sops = json.loads(response.choices[0].message.content) - managers_with_sops.append(ManagerWithSOPs(title=role['title'], sops=manager_sops)) - - departments_with_sops.append(DepartmentManagerSOPs( - name=department['name'], - managers=managers_with_sops - )) - - return ExecutiveManagerSOPsResponse(departments=departments_with_sops) - - except Exception as e: - print(f"Error in generate_sops_for_department_managers: {str(e)}") - return False - - - def generate_sops_from_questionnaire(self, questionnaire_data: dict, executives: List[str], managers: List[str], departments: List[str]): - try: - prompt = get_sop_executive_from_questionnaire() - - # Prepare the questionnaire data for the prompt - user_content = json.dumps(questionnaire_data, indent=2) - - response = self.client.beta.chat.completions.parse( - model=self.model, - messages=[ - {"role": "system", "content": prompt}, - {"role": "user", "content": f"Generate SOPs based on this questionnaire:\n{user_content}\n\nExecutives to consider: {', '.join(executives)}\nManagers to consider: {', '.join(managers)}\nDepartments to consider: {', '.join(departments)}"} - ], - response_format={"type": "json_object"}, - max_tokens=4096, - temperature=0.1 - ) - - sops_data = json.loads(response.choices[0].message.content) - - # Process executive SOPs - executive_sops = {} - for executive in executives: - if executive in sops_data['executives']: - executive_sops[executive] = Categories(**sops_data['executives'][executive]) - else: - executive_sops[executive] = Categories() - - # Process department manager SOPs - departments_with_sops = [] - for dept_name in departments: - dept_data = next((d for d in sops_data['departments'] if d['name'].lower() == dept_name.lower()), None) - if dept_data: - managers_with_sops = [ - ManagerWithSOPs( - title=manager, - sops=ManagerSOPs(**dept_data['managers']) - ) - for manager in managers - - ] - if managers_with_sops: - departments_with_sops.append(DepartmentManagerSOPs( - name=dept_name, - managers=managers_with_sops - )) - - return { - "executive_sops": executive_sops, - "department_sops": ExecutiveManagerSOPsResponse(departments=departments_with_sops) - } - - except Exception as e: - print(f"Error in generate_sops_from_questionnaire: {str(e)}") - return False - - - + diff --git a/test.py b/test.py index bb19d4d..ba79129 100644 --- a/test.py +++ b/test.py @@ -9,6 +9,34 @@ docs = load_document(file_path) if __name__ == "__main__": SOP = DocumentParser() so = SopGeneratorExecutive() - info = SOP.extract_departments_and_managers_workers(docs) - print(info) + referencs_roles = ["AR Director "] + workers_list = [ + { + + "position": "AR dIRECTOR ", + "role": "Developer", + "department": "IT" + }, + { + "name": "Jane Smith", + "position": "Project Manager", + "role": "Manager", + "department": "IT" + } +] + + departments_and_roles = SOP.extract_sops_for_workers_by_department(docs,workers_list) + # Prepare extracted roles (only managers) + '''extracted_managers = [] + for department in departments_and_roles['departments']: + extracted_managers.extend([ + { + 'name': manager['name'], + 'position': manager.get('position', 'Unknown Position'), + 'role': manager.get('role', 'Unknown Role') # PRP or SRP classification + } + for manager in department['managers'] + ])''' + + print(departments_and_roles)