CallyticsDemo / src /text /prompt.py
bunyaminergen's picture
Initial
1b97239
# Standard library imports
import os
from typing import Annotated, Dict, Any
# Related third-party imports
import yaml
class PromptManager:
"""
A class to manage prompts loaded from a YAML configuration file.
This class provides methods to load prompts from a YAML file and retrieve
them with optional formatting.
Parameters
----------
config_path : str, optional
Path to the YAML configuration file. If not provided, the default
path is set to `../../config/prompts.yaml` relative to the script's
directory.
Attributes
----------
config_path : str
Path to the YAML configuration file.
prompts : dict
Dictionary of prompts loaded from the YAML file.
"""
def __init__(self, config_path: Annotated[str, "Path to the YAML configuration file"] = None):
"""
Initializes the PromptManager with a specified or default configuration path.
Parameters
----------
config_path : str, optional
Path to the YAML configuration file. Defaults to None.
"""
self.config_path = config_path or os.path.join(
os.path.dirname(os.path.abspath(__file__)), "../../config/prompts.yaml"
)
self.prompts = self._load_prompts()
def _load_prompts(self) -> Annotated[Dict[str, Any], "Loaded prompts from YAML file"]:
"""
Load prompts from the YAML file.
This method reads the YAML file specified by `self.config_path` and parses its contents.
Returns
-------
dict
Dictionary containing the prompts.
Raises
------
FileNotFoundError
If the specified YAML file does not exist.
Examples
--------
>>> manager = PromptManager("config/prompts.yaml")
>>> prompts = manager._load_prompts()
"""
if not os.path.exists(self.config_path):
raise FileNotFoundError(f"YAML file not found: {self.config_path}")
with open(self.config_path) as file:
loaded_prompts = yaml.safe_load(file)
if not isinstance(loaded_prompts, dict):
raise TypeError(f"Expected dictionary from YAML, got {type(loaded_prompts).__name__}.")
return loaded_prompts
def get_prompt(
self,
prompt_name: Annotated[str, "Name of the prompt to retrieve"],
**kwargs: Annotated[dict, "Keyword arguments for formatting the prompt"]
) -> Annotated[Any, "Formatted prompt (str or dict)"]:
"""
Retrieve and format a prompt by its name.
This method fetches the prompt template identified by `prompt_name` from the loaded prompts
and formats any placeholders within the prompt using the provided keyword arguments.
Parameters
----------
prompt_name : str
Name of the prompt to retrieve.
**kwargs : Any
Keyword arguments to format the prompt strings.
Raises
------
ValueError
If the specified prompt name does not exist in the loaded prompts.
Returns
-------
dict
Dictionary containing the formatted prompt with all placeholders replaced by provided values.
"""
if not isinstance(self.prompts, dict):
raise TypeError(f"Internal error: self.prompts is not a dictionary but {type(self.prompts).__name__}.")
if prompt_name not in self.prompts:
raise ValueError(f"Prompt '{prompt_name}' not found.")
prompt = self.prompts[prompt_name]
if isinstance(prompt, dict):
formatted_prompt = {}
for key, value in prompt.items():
if isinstance(value, str):
formatted_prompt[key] = value.format(**kwargs)
else:
formatted_prompt[key] = value
return formatted_prompt
if isinstance(prompt, str):
return prompt.format(**kwargs)
raise TypeError(f"Unexpected prompt type: {type(prompt).__name__}")
if __name__ == "__main__":
try:
prompt_manager = PromptManager()
formatted_prompt_ = prompt_manager.get_prompt(
"greeting",
name="Ahmet",
day="Pazartesi"
)
print("Formatted Prompt:", formatted_prompt_)
except Exception as e:
print(f"Error: {e}")