import datetime from pydantic import BaseModel from typing import Dict from schema import FunctionCall from utils import ( get_fewshot_examples ) import yaml import json import os class PromptSchema(BaseModel): Role: str Objective: str Tools: str Examples: str Schema: str Instructions: str class PromptManager: def __init__(self): self.script_dir = os.path.dirname(os.path.abspath(__file__)) def format_yaml_prompt(self, prompt_schema: PromptSchema, variables: Dict) -> str: formatted_prompt = "" for field, value in prompt_schema.dict().items(): if field == "Examples" and variables.get("examples") is None: continue formatted_value = value.format(**variables) if field == "Instructions": formatted_prompt += f"{formatted_value}" else: formatted_value = formatted_value.replace("\n", " ") formatted_prompt += f"{formatted_value}" return formatted_prompt def read_yaml_file(self, file_path: str) -> PromptSchema: with open(file_path, 'r') as file: yaml_content = yaml.safe_load(file) prompt_schema = PromptSchema( Role=yaml_content.get('Role', ''), Objective=yaml_content.get('Objective', ''), Tools=yaml_content.get('Tools', ''), Examples=yaml_content.get('Examples', ''), Schema=yaml_content.get('Schema', ''), Instructions=yaml_content.get('Instructions', ''), ) return prompt_schema def generate_prompt(self, user_prompt, tools, num_fewshot=None): prompt_path = os.path.join(self.script_dir, 'prompt_assets', 'sys_prompt.yml') prompt_schema = self.read_yaml_file(prompt_path) if num_fewshot is not None: examples = get_fewshot_examples(num_fewshot) else: examples = None schema_json = json.loads(FunctionCall.schema_json()) variables = { "date": datetime.date.today(), "tools": tools, "examples": examples, "schema": schema_json } sys_prompt = self.format_yaml_prompt(prompt_schema, variables) prompt = [ {'content': sys_prompt, 'role': 'system'} ] prompt.extend(user_prompt) return prompt