code: def __init__(
      self, opt, agent, bots, context_info: Optional[dict] = None
  ):
      # num_turns turns for a single side, and really it appears to be
      # (num_turns + 1) * 2 total b/c of the "Hi!" and first bot utterance
  
      # TODO: this logic is very close to that of BaseModelChatWorld.__init__(). Can
      #  any of this be deduplicated?
  
      super(BaseModelChatWorld, self).__init__(opt, agent)
  
      num_turns = opt["num_turns"]
      max_resp_time = opt["max_resp_time"]
  
      self.opt = opt
      self.bots = bots
  
      self.task_turn_idx = 0
      self.num_turns = num_turns
  
      self.dialog = []
      self.tag = f"conversation_id {agent.mephisto_agent.db_id}"
      self.task_type = "sandbox" if opt["is_sandbox"] else "live"
      self.chat_done = False
      self.check_acceptability = opt["check_acceptability"]
      self.acceptability_checker = AcceptabilityChecker()
      self.block_qualification = opt["block_qualification"]
  
      self.final_chat_data = None
      # TODO: remove this attribute once chat data is only stored in the Mephisto
      #  TaskRun for this HIT (see .get_custom_task_data() docstring for more
      #  information)
  
      # below are timeout protocols
      self.max_resp_time = max_resp_time  # in secs
      logging.info(
          f"Creating {self.__class__.__name__} for tag {self.tag} with {num_turns} turns."
      )
  
      if context_info is not None:
          self.context_info = context_info
          self.personas = [
              self.context_info["persona_1_strings"],
              self.context_info["persona_2_strings"],
          ]
      else:
          self.context_info = {}
          self.personas = None
  
imports: import random
  import parlai.utils.logging
  from typing import Any, Dict, Optional
  from parlai.core.agents import create_agent_from_shared
  from parlai.core.message import Message
  from parlai.core.worlds import validate
  from parlai.crowdsourcing.tasks.model_chat.constants import ONBOARD_SUCCESS
  from parlai.crowdsourcing.tasks.model_chat.utils import Compatibility
  from parlai.crowdsourcing.tasks.model_chat.worlds import BaseModelChatWorld, ModelChatWorld, ModelChatOnboardWorld
  from parlai.crowdsourcing.utils.acceptability import AcceptabilityChecker
  from parlai.crowdsourcing.utils.mturk import get_mturk_id_from_mephisto_wrapper
  from parlai.crowdsourcing.tasks.pairwise_per_turn_eval.bot_agent import PerTurnEvalTurkLikeAgent
label_desc: Use image node_id 1 to create a new PerTurnEvalWorld object from inherited base classes: ModelChatWorld with example: obj = PerTurnEvalWorld(opt, agent, bots, context_info)