code: from __future__ import annotations
  
  from typing import List, Optional
  
  from pydantic import ValidationError
  
  from langchain.chains.llm import LLMChain
  from langchain.chat_models.base import BaseChatModel
  from langchain.experimental.autonomous_agents.autogpt.output_parser import (
      AutoGPTOutputParser,
      BaseAutoGPTOutputParser,
  )
  from langchain.experimental.autonomous_agents.autogpt.prompt import AutoGPTPrompt
  from langchain.experimental.autonomous_agents.autogpt.prompt_generator import (
      FINISH_NAME,
  )
  from langchain.schema import (
      AIMessage,
      BaseMessage,
      Document,
      HumanMessage,
      SystemMessage,
  )
  from langchain.tools.base import BaseTool
  from langchain.tools.human.tool import HumanInputRun
  from langchain.vectorstores.base import VectorStoreRetriever
  
  
  class AutoGPT:
      """Agent class for interacting with Auto-GPT."""
  
      def __init__(
          self,
          ai_name: str,
          memory: VectorStoreRetriever,
          chain: LLMChain,
          output_parser: BaseAutoGPTOutputParser,
          tools: List[BaseTool],
          feedback_tool: Optional[HumanInputRun] = None,
      ):
          self.ai_name = ai_name
          self.memory = memory
          self.full_message_history: List[BaseMessage] = []
          self.next_action_count = 0
          self.chain = chain
          self.output_parser = output_parser
          self.tools = tools
          self.feedback_tool = feedback_tool
  
      @classmethod
      def from_llm_and_tools(
          cls,
          ai_name: str,
          ai_role: str,
          memory: VectorStoreRetriever,
          tools: List[BaseTool],
          llm: BaseChatModel,
          human_in_the_loop: bool = False,
          output_parser: Optional[BaseAutoGPTOutputParser] = None,
      ) -> AutoGPT:
          prompt = AutoGPTPrompt(
              ai_name=ai_name,
              ai_role=ai_role,
              tools=tools,
              input_variables=["memory", "messages", "goals", "user_input"],
              token_counter=llm.get_num_tokens,
          )
          human_feedback_tool = HumanInputRun() if human_in_the_loop else None
          chain = LLMChain(llm=llm, prompt=prompt)
          return cls(
              ai_name,
              memory,
              chain,
              output_parser or AutoGPTOutputParser(),
              tools,
              feedback_tool=human_feedback_tool,
          )
  
      def run(self, goals: List[str]) -> str:
          user_input = (
              "Determine which next command to use, "
              "and respond using the format specified above:"
          )
          # Interaction Loop
          loop_count = 0
          while True:
              # Discontinue if continuous limit is reached
              loop_count += 1
  
              # Send message to AI, get response
              assistant_reply = self.chain.run(
                  goals=goals,
                  messages=self.full_message_history,
                  memory=self.memory,
                  user_input=user_input,
              )
  
              # Print Assistant thoughts
              print(assistant_reply)
              self.full_message_history.append(HumanMessage(content=user_input))
              self.full_message_history.append(AIMessage(content=assistant_reply))
  
              # Get command name and arguments
              action = self.output_parser.parse(assistant_reply)
              tools = {t.name: t for t in self.tools}
              if action.name == FINISH_NAME:
                  return action.args["response"]
              if action.name in tools:
                  tool = tools[action.name]
                  try:
                      observation = tool.run(action.args)
                  except ValidationError as e:
                      observation = (
                          f"Validation Error in args: {str(e)}, args: {action.args}"
                      )
                  except Exception as e:
                      observation = (
                          f"Error: {str(e)}, {type(e).__name__}, args: {action.args}"
                      )
                  result = f"Command {tool.name} returned: {observation}"
              elif action.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} "
              )
              if self.feedback_tool is not None:
                  feedback = f"\n{self.feedback_tool.run('Input: ')}"
                  if feedback in {"q", "stop"}:
                      print("EXITING")
                      return "EXITING"
                  memory_to_add += feedback
  
              self.memory.add_documents([Document(page_content=memory_to_add)])
              self.full_message_history.append(SystemMessage(content=result))
  
apis: langchain.chains.llm.LLMChain langchain.tools.human.tool.HumanInputRun langchain.schema.AIMessage langchain.schema.HumanMessage langchain.experimental.autonomous_agents.autogpt.prompt.AutoGPTPrompt langchain.schema.Document langchain.experimental.autonomous_agents.autogpt.output_parser.AutoGPTOutputParser langchain.schema.SystemMessage
extract_api: [((1753, 1918), 'langchain.experimental.autonomous_agents.autogpt.prompt.AutoGPTPrompt', 'AutoGPTPrompt', ([], {'ai_name': 'ai_name', 'ai_role': 'ai_role', 'tools': 'tools', 'input_variables': "['memory', 'messages', 'goals', 'user_input']", 'token_counter': 'llm.get_num_tokens'}), "(ai_name=ai_name, ai_role=ai_role, tools=tools,\n    input_variables=['memory', 'messages', 'goals', 'user_input'],\n    token_counter=llm.get_num_tokens)\n", (1766, 1918), False, 'from langchain.experimental.autonomous_agents.autogpt.prompt import AutoGPTPrompt\n'), ((2075, 2107), 'langchain.chains.llm.LLMChain', 'LLMChain', ([], {'llm': 'llm', 'prompt': 'prompt'}), '(llm=llm, prompt=prompt)\n', (2083, 2107), False, 'from langchain.chains.llm import LLMChain\n'), ((2012, 2027), 'langchain.tools.human.tool.HumanInputRun', 'HumanInputRun', ([], {}), '()\n', (2025, 2027), False, 'from langchain.tools.human.tool import HumanInputRun\n'), ((2217, 2238), 'langchain.experimental.autonomous_agents.autogpt.output_parser.AutoGPTOutputParser', 'AutoGPTOutputParser', ([], {}), '()\n', (2236, 2238), False, 'from langchain.experimental.autonomous_agents.autogpt.output_parser import AutoGPTOutputParser, BaseAutoGPTOutputParser\n'), ((3045, 3077), 'langchain.schema.HumanMessage', 'HumanMessage', ([], {'content': 'user_input'}), '(content=user_input)\n', (3057, 3077), False, 'from langchain.schema import AIMessage, BaseMessage, Document, HumanMessage, SystemMessage\n'), ((3124, 3158), 'langchain.schema.AIMessage', 'AIMessage', ([], {'content': 'assistant_reply'}), '(content=assistant_reply)\n', (3133, 3158), False, 'from langchain.schema import AIMessage, BaseMessage, Document, HumanMessage, SystemMessage\n'), ((4895, 4924), 'langchain.schema.SystemMessage', 'SystemMessage', ([], {'content': 'result'}), '(content=result)\n', (4908, 4924), False, 'from langchain.schema import AIMessage, BaseMessage, Document, HumanMessage, SystemMessage\n'), ((4811, 4847), 'langchain.schema.Document', 'Document', ([], {'page_content': 'memory_to_add'}), '(page_content=memory_to_add)\n', (4819, 4847), False, 'from langchain.schema import AIMessage, BaseMessage, Document, HumanMessage, SystemMessage\n')]