import json import os from typing import ClassVar, Dict, Optional from langchain.prompts import PromptTemplate from pydantic import BaseModel, Field, PrivateAttr, ValidationError, model_validator class Prompts(BaseModel): """Manages and generates prompts for a generic agent with support for different languages.""" _prompts: Optional[Dict[str, str]] = PrivateAttr() language: Optional[str] = Field( default="en", description="Language of the prompts.", ) @model_validator(mode="after") def load_prompts(self) -> "Prompts": """Load prompts from a JSON file based on the specified language.""" try: dir_path = os.path.dirname(os.path.realpath(__file__)) prompts_path = os.path.join(dir_path, f"prompts/{self.language}.json") with open(prompts_path, "r") as f: self._prompts = json.load(f)["slices"] except FileNotFoundError: raise ValidationError( f"Prompt file for language '{self.language}' not found." ) except json.JSONDecodeError: raise ValidationError(f"Error decoding JSON from the prompts file.") return self SCRATCHPAD_SLICE: ClassVar[str] = "\n{agent_scratchpad}" def task_execution_with_memory(self) -> str: """Generate a prompt for task execution with memory components.""" return self._build_prompt(["role_playing", "tools", "memory", "task"]) def task_execution_without_tools(self) -> str: """Generate a prompt for task execution without tools components.""" return self._build_prompt(["role_playing", "task"]) def task_execution(self) -> str: """Generate a standard prompt for task execution.""" return self._build_prompt(["role_playing", "tools", "task"]) def _build_prompt(self, components: [str]) -> str: """Constructs a prompt string from specified components.""" prompt_parts = [ self._prompts[component] for component in components if component in self._prompts ] prompt_parts.append(self.SCRATCHPAD_SLICE) return PromptTemplate.from_template("".join(prompt_parts))