Spaces:
Sleeping
Sleeping
File size: 4,338 Bytes
0fadcb9 e382003 0fadcb9 d005419 aa2cc5f 7648566 0fadcb9 d005419 0fadcb9 d005419 cb7ff7d d005419 c1c7334 cb7ff7d c1c7334 cb7ff7d d005419 54af9e3 aa2cc5f 54af9e3 88f9105 54af9e3 d005419 c1c7334 88f9105 c1c7334 88f9105 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
from pathlib import Path
from enums.enums import Questions
from local_storage.entities import PersonalDetails, ContractorDetails, LocationDetails
from utils.date_utils import get_today_date_as_dd_mm_yyyy
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[int] = 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(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 compose_email(self, answers: dict[Questions, str]):
prompt = f"""
Compose a formal email directed at Dubai Community Management asking for a minor work permit.
It should include the following details:
My name is {answers[Questions.FULL_NAME]} and I am the {answers[Questions.OWNER_OR_TENANT]} of unit
{answers[Questions.UNIT_APT_NUMBER]} located in {answers[Questions.BUILDING]}, {answers[Questions.COMMUNITY]};
The work involves {answers[Questions.WORK_TO_DO]}, and will be carried out by {answers[Questions.COMPANY_NAME]}
from {answers[Questions.START_DATE]} to {answers[Questions.END_DATE]};
The work permit request form is attached.
Please return only the email body, without any preamble
"""
return prompt
@staticmethod
def _get_questions(details: list[int]):
to_skip: list[int] = []
for d in details:
if isinstance(d, PersonalDetails):
to_skip.extend([Questions.FULL_NAME.value, Questions.CONTACT_NUMBER.value, Questions.YOUR_EMAIL.value])
if isinstance(d, ContractorDetails):
to_skip.extend([Questions.COMPANY_NAME.value, Questions.COMPANY_NUMBER.value, Questions.COMPANY_EMAIL.value])
if isinstance(d, LocationDetails):
to_skip.extend([Questions.OWNER_OR_TENANT.value, Questions.COMMUNITY.value, Questions.BUILDING.value, Questions.UNIT_APT_NUMBER.value])
return to_skip
|