[docs]defrun(self,goals:List[str])->str:user_input=("Determine which next command to use, ""and respond using the format specified above:")# Interaction Looploop_count=0whileTrue:# Discontinue if continuous limit is reachedloop_count+=1# Send message to AI, get responseassistant_reply=self.chain.run(goals=goals,messages=self.chat_history_memory.messages,memory=self.memory,user_input=user_input,)# Print Assistant thoughtsprint(assistant_reply)# noqa: T201self.chat_history_memory.add_message(HumanMessage(content=user_input))self.chat_history_memory.add_message(AIMessage(content=assistant_reply))# Get command name and argumentsaction=self.output_parser.parse(assistant_reply)tools={t.name:tfortinself.tools}ifaction.name==FINISH_NAME:returnaction.args["response"]ifaction.nameintools:tool=tools[action.name]try:observation=tool.run(action.args)exceptValidationErrorase:observation=(f"Validation Error in args: {str(e)}, args: {action.args}")exceptExceptionase:observation=(f"Error: {str(e)}, {type(e).__name__}, args: {action.args}")result=f"Command {tool.name} returned: {observation}"elifaction.name=="ERROR":result=f"Error: {action.args}. "else:result=(f"Unknown command '{action.name}'. "f"Please refer to the 'COMMANDS' list for available "f"commands and only respond in the specified JSON format.")memory_to_add=(f"Assistant Reply: {assistant_reply} "f"\nResult: {result} ")ifself.feedback_toolisnotNone:feedback=f"{self.feedback_tool.run('Input: ')}"iffeedbackin{"q","stop"}:print("EXITING")# noqa: T201return"EXITING"memory_to_add+=f"\n{feedback}"self.memory.add_documents([Document(page_content=memory_to_add)])self.chat_history_memory.add_message(SystemMessage(content=result))