class_docstr: Will act like a Turker but actually contains a bot agent.
code: def act(self, timeout=None):
      _ = timeout  # The model doesn't care about the timeout
      if self.semaphore:
          with self.semaphore:
              act_out = self.model_agent.act()
      else:
          act_out = self.model_agent.act()
      act_out = Message(act_out).json_safe_payload()
  
      if "dict_lower" in self.opt and not self.opt["dict_lower"]:
          # model is cased so we don't want to normalize the reply like below
          final_message_text = act_out["text"]
      else:
          final_message_text = normalize_reply(act_out["text"])
  
      act_out["text"] = final_message_text
      assert ("episode_done" not in act_out) or (
          not act_out["episode_done"]
      )
      self.turn_idx += 1
      return {**act_out, "episode_done": False}
  
file_path: ParlAI/parlai/crowdsourcing/tasks/model_chat/bot_agent.py
imports: import copy
  from typing import Dict
  from omegaconf import DictConfig
  import parlai.utils.logging
  from parlai.core.agents import create_agent
  from parlai.core.message import Message
  from parlai.core.params import ParlaiParser
  from parlai.crowdsourcing.tasks.model_chat.constants import AGENT_1
  from parlai.utils.strings import normalize_reply
label_desc: Use image node_id 2 for calling the TurkLikeAgent obj's underlying member method code with example usage: obj.act(timeout) and returns: dict