class_docstr: This is the multi-agent version of ExternalEnv.
class_docstr_tok: ["This","is","the","multi-agent","version","of","ExternalEnv","."]
docstr: Override this to implement the multi-agent run loop.
  
  Your loop should continuously:
      1. Call self.start_episode(episode_id)
      2. Call self.get_action(episode_id, obs_dict)
              -or-
              self.log_action(episode_id, obs_dict, action_dict)
      3. Call self.log_returns(episode_id, reward_dict)
      4. Call self.end_episode(episode_id, obs_dict)
      5. Wait if nothing to do.
  
  Multiple episodes may be started at the same time.
docstr_tok: ["Override","this","to","implement","the","multi-agent","run","loop",".","Your","loop","should","continuously",":","1",".","Call","self.start_episode","(","episode_id",")","2",".","Call","self.get_action","(","episode_id",",","obs_dict",")","-or-","self.log_action","(","episode_id",",","obs_dict",",","action_dict",")","3",".","Call","self.log_returns","(","episode_id",",","reward_dict",")","4",".","Call","self.end_episode","(","episode_id",",","obs_dict",")","5",".","Wait","if","nothing","to","do",".","Multiple","episodes","may","be","started","at","the","same","time","."]
code: def run(self):
      """Override this to implement the multi-agent run loop.
  
      Your loop should continuously:
          1. Call self.start_episode(episode_id)
          2. Call self.get_action(episode_id, obs_dict)
                  -or-
                  self.log_action(episode_id, obs_dict, action_dict)
          3. Call self.log_returns(episode_id, reward_dict)
          4. Call self.end_episode(episode_id, obs_dict)
          5. Wait if nothing to do.
  
      Multiple episodes may be started at the same time.
      """
      raise NotImplementedError
  
file_path: ray/python/ray/rllib/env/external_multi_agent_env.py
imports: import uuid
  import gymnasium
  from typing import Optional
  from ray.rllib.utils.annotations import override, PublicAPI
  from ray.rllib.env.external_env import ExternalEnv, _ExternalEnvEpisode
  from ray.rllib.utils.typing import MultiAgentDict
label_desc: Use image node_id 2 for calling the ExternalMultiAgentEnv obj's underlying member method code with example usage: obj.run() without return types