class_docstr: Base world for running TOD model-model chats. Includes the following agents:
  
  * User utt agent
  * API call agent
      * Currently assumed to be same as system utt agent in script code, though used as if separate in this world for clarity
  * API responder agent
  * System utt agent
  * API schema groundinger agent (given to api call + response agent)
  * Goal groundinger agent (given to user)
  
  As is standard for ParlAI, these agents may be models or may be standalone classes that extend the "Agent" class. The models for these *are* expected to have their utterances in a standard format.
  
  We do expect these agents to be passed in with a set order (see above), since some assumptions of regular ParlAI Worlds (ex. task = agent[0], model = agent[1]) are broken here since there is no "task agent" and one agent can be two "roles" (ex. system agent also making API calls)
code: def episode_done(self):
      if self.turns >= self.max_turns or all(self.end_episode):
          return True
      for i in range(self.batchsize):
          for j in [
              USER_UTT_IDX,
              API_CALL_IDX,
              API_RESP_IDX,
              SYSTEM_UTT_IDX,
          ]:
              if (
                  self.batch_acts[i][j] is not None
                  and tod.STANDARD_DONE
                  in self.batch_acts[i][j].get("text", "")
              ) or (
                  hasattr(self.batch_agents[i][j], "episode_done")
                  and self.batch_agents[i][j].episode_done()
              ):
                  self.end_episode[i] = True
      return all(self.end_episode)
  
imports: from parlai.core.metrics import Metric, LegacyMetric
  from parlai.core.message import Message
  from parlai.core.opt import Opt
  from parlai.core.worlds import World
  from parlai.agents.local_human.local_human import LocalHumanAgent
  from parlai.utils.misc import display_messages
  import parlai.core.tod.tod_core
  import parlai.core.tod.world_metrics
  import sys
  import copy
label_desc: Use image node_id 9 for calling the TodWorld obj's underlying member method code with example usage: obj.episode_done() and returns: all, True