DAMHelper / prompts /prompts_manager.py
enricorampazzo's picture
now saving personal, location and contractor details in the browser local storage correctly πŸ˜…
cb7ff7d
raw
history blame
3.61 kB
import datetime
from enum import Enum
from pathlib import Path
from local_storage.entities import DetailsType, SavedDetails
from utils.date_utils import get_today_date_as_dd_mm_yyyy
class Questions(Enum):
FULL_NAME = 0
WORK_TO_DO = 1
COMMUNITY = 2
BUILDING = 3
UNIT_APT_NUMBER = 4
OWNER_OR_TENANT = 5
START_DATE = 6
END_DATE = 7
CONTACT_NUMBER = 8
COMPANY_NAME = 9
COMPANY_EMAIL = 10
COMPANY_NUMBER = 11
YOUR_EMAIL = 12
class PromptsManager:
def __init__(self, work_categories: dict[str, str] = None):
self.work_categories = work_categories
base_path = Path(__file__).parent
with open(Path(base_path, "system_prompt.txt")) as sysprompt_file:
self.system_prompt: str = sysprompt_file.read()
with open(Path(base_path, "questions.txt")) as questions_file:
self.questions: list[str] = questions_file.readlines()
with open(Path(base_path, "verification_prompt2.txt")) as verification_prompt_file:
verification_prompt = verification_prompt_file.read()
todays_date = get_today_date_as_dd_mm_yyyy()
verification_prompt = verification_prompt.replace("{today}", todays_date)
self.verification_prompt: str = verification_prompt
self.verification_prompt_questions = self.verification_prompt.split("\n")
def verify_user_input_prompt(self, user_prompt, exclude_questions_group: list[SavedDetails] = None) -> str:
prompt = f"""
Using only this information \n {user_prompt} \n answer the following questions, for each question that you cannot answer just answer 'null'.
Put each answer in a new line, keep the answer brief
and maintain the order in which the questions are asked. Do not add any preamble:
"""
skip_questions = [self.get_questions(d) for d in exclude_questions_group]
questions = [q for idx, q in enumerate(self.verification_prompt_questions) if idx not in skip_questions]
return prompt + "\n".join(questions)
def get_work_category(self, work_description: str) -> str:
return (
f"The work to do is {work_description}: choose the most accurate categories among the following:"
f"{', '.join(self.work_categories.values())}\n"
f"Only return the categories, separated by a semicolon")
@staticmethod
def questions_to_field_labels():
return {
Questions.FULL_NAME: "Full name", Questions.WORK_TO_DO: "Work to do", Questions.COMMUNITY: "Community",
Questions.BUILDING:"Building name", Questions.UNIT_APT_NUMBER: "Unit/apartment number",
Questions.OWNER_OR_TENANT: "Owner/Tenant", Questions.START_DATE: "Start date",
Questions.END_DATE: "End date", Questions.CONTACT_NUMBER: "Your contact number",
Questions.COMPANY_NAME: "Contractor company name", Questions.COMPANY_EMAIL: "Contracting company email",
Questions.COMPANY_NUMBER: "Contracting company contact number", Questions.YOUR_EMAIL: "Your email"
}
def get_questions(self, type_:DetailsType):
if type_ == DetailsType.PERSONAL_DETAILS:
return [Questions.FULL_NAME, Questions.CONTACT_NUMBER, Questions.YOUR_EMAIL]
if type_ == DetailsType.CONTRACTOR_DETAILS:
return [Questions.COMPANY_NAME, Questions.COMPANY_NUMBER, Questions.COMPANY_EMAIL]
if type_ == DetailsType.LOCATION_DETAILS:
return [Questions.OWNER_OR_TENANT, Questions.COMMUNITY, Questions.BUILDING, Questions.UNIT_APT_NUMBER]