MWBadra/Context-Aware-Conversational-Agent
0
1import logging2from typing import List, Optional3import os4 5from langchain.agents import AgentExecutor, create_react_agent6from langchain.prompts import PromptTemplate7from langchain.tools import BaseTool8from langchain_groq import ChatGroq9 10logger = logging.getLogger(__name__)11 12class ContextAwareAgentManager:13 def __init__(self, llm: ChatGroq, tools: List[BaseTool]):14 self.llm = llm15 self.tools = tools16 self.agent_executor: Optional[AgentExecutor] = None17 18 def _load_custom_prompt(self) -> str:19 base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))20 prompt_path = os.path.join(base_dir, "prompts", "agent_prompt.txt")21 with open(prompt_path, "r", encoding="utf-8") as file:22 return file.read()23 24 def _handle_parsing_error(self, error: Exception) -> str:25 """Prevent the agent from crashing if the model makes a formatting error."""26 logger.warning(f"Parsing error caught: {error}")27 return "Observation: Invalid format. Please use Thought/Action/Action Input format."28 29 def build_agent(self) -> AgentExecutor:30 try:31 prompt_text = self._load_custom_prompt()32 33 tool_descriptions = "\n".join([f"{t.name}: {t.description}" for t in self.tools])34 tool_names = ", ".join([t.name for t in self.tools])35 36 prompt = PromptTemplate(37 template=prompt_text,38 input_variables=["input", "agent_scratchpad", "chat_history"],39 partial_variables={40 "tools": tool_descriptions,41 "tool_names": tool_names42 }43 )44 45 agent = create_react_agent(46 llm=self.llm,47 tools=self.tools,48 prompt=prompt49 )50 51 self.agent_executor = AgentExecutor(52 agent=agent,53 tools=self.tools,54 verbose=True,55 handle_parsing_errors=self._handle_parsing_error,56 max_iterations=15, 57 early_stopping_method="force"58 )59 60 logger.info("Agent built successfully.")61 return self.agent_executor62 except Exception as e:63 logger.critical(f"Failed to build agent: {e}")64 raise