class_docstr: An environment that hosts multiple independent agents.
  
  Agents are identified by (string) agent ids. Note that these "agents" here
  are not to be confused with RLlib Algorithms, which are also sometimes
  referred to as "agents" or "RL agents".
  
  The preferred format for action- and observation space is a mapping from agent
  ids to their individual spaces. If that is not provided, the respective methods'
  observation_space_contains(), action_space_contains(),
  action_space_sample() and observation_space_sample() have to be overwritten.
class_docstr_tok: ["An","environment","that","hosts","multiple","independent","agents",".","Agents","are","identified","by","(","string",")","agent","ids",".","Note","that","these","``","agents","''","here","are","not","to","be","confused","with","RLlib","Algorithms",",","which","are","also","sometimes","referred","to","as","``","agents","''","or","``","RL","agents","''",".","The","preferred","format","for","action-","and","observation","space","is","a","mapping","from","agent","ids","to","their","individual","spaces",".","If","that","is","not","provided",",","the","respective","methods'","observation_space_contains","(",")",",","action_space_contains","(",")",",","action_space_sample","(",")","and","observation_space_sample","(",")","have","to","be","overwritten","."]
docstr: Returns observations from ready agents.
  
  The returns are dicts mapping from agent_id strings to values. The
  number of agents in the env can vary over time.
  
  Returns:
      Tuple containing 1) new observations for
      each ready agent, 2) reward values for each ready agent. If
      the episode is just started, the value will be None.
      3) Terminated values for each ready agent. The special key
      "__all__" (required) is used to indicate env termination.
      4) Truncated values for each ready agent.
      5) Info values for each agent id (may be empty dicts).
  
  .. testcode::
      :skipif: True
  
      env = ...
      obs, rewards, terminateds, truncateds, infos = env.step(action_dict={
          "car_0": 1, "car_1": 0, "traffic_light_1": 2,
      })
      print(rewards)
  
      print(terminateds)
  
      print(infos)
  
  .. testoutput::
  
      {
          "car_0": 3,
          "car_1": -1,
          "traffic_light_1": 0,
      }
      {
          "car_0": False,    # car_0 is still running
          "car_1": True,     # car_1 is terminated
          "__all__": False,  # the env is not terminated
      }
      {
          "car_0": {},  # info for car_0
          "car_1": {},  # info for car_1
      }
docstr_tok: ["Returns","observations","from","ready","agents",".","The","returns","are","dicts","mapping","from","agent_id","strings","to","values",".","The","number","of","agents","in","the","env","can","vary","over","time",".","Returns",":","Tuple","containing","1",")","new","observations","for","each","ready","agent",",","2",")","reward","values","for","each","ready","agent",".","If","the","episode","is","just","started",",","the","value","will","be","None",".","3",")","Terminated","values","for","each","ready","agent",".","The","special","key","``","__all__","''","(","required",")","is","used","to","indicate","env","termination",".","4",")","Truncated","values","for","each","ready","agent",".","5",")","Info","values","for","each","agent","id","(","may","be","empty","dicts",")",".","..","testcode",":",":",":","skipif",":","True","env","=","...","obs",",","rewards",",","terminateds",",","truncateds",",","infos","=","env.step","(","action_dict=","{","``","car_0","''",":","1",",","``","car_1","''",":","0",",","``","traffic_light_1","''",":","2",",","}",")","print","(","rewards",")","print","(","terminateds",")","print","(","infos",")","..","testoutput",":",":","{","``","car_0","''",":","3",",","``","car_1","''",":","-1",",","``","traffic_light_1","''",":","0",",","}","{","``","car_0","''",":","False",",","#","car_0","is","still","running","``","car_1","''",":","True",",","#","car_1","is","terminated","``","__all__","''",":","False",",","#","the","env","is","not","terminated","}","{","``","car_0","''",":","{","}",",","#","info","for","car_0","``","car_1","''",":","{","}",",","#","info","for","car_1","}"]
code: def step(
      self, action_dict: MultiAgentDict
  ) -> Tuple[
      MultiAgentDict,
      MultiAgentDict,
      MultiAgentDict,
      MultiAgentDict,
      MultiAgentDict,
  ]:
      """Returns observations from ready agents.
  
      The returns are dicts mapping from agent_id strings to values. The
      number of agents in the env can vary over time.
  
      Returns:
          Tuple containing 1) new observations for
          each ready agent, 2) reward values for each ready agent. If
          the episode is just started, the value will be None.
          3) Terminated values for each ready agent. The special key
          "__all__" (required) is used to indicate env termination.
          4) Truncated values for each ready agent.
          5) Info values for each agent id (may be empty dicts).
  
      .. testcode::
          :skipif: True
  
          env = ...
          obs, rewards, terminateds, truncateds, infos = env.step(action_dict={
              "car_0": 1, "car_1": 0, "traffic_light_1": 2,
          })
          print(rewards)
  
          print(terminateds)
  
          print(infos)
  
      .. testoutput::
  
          {
              "car_0": 3,
              "car_1": -1,
              "traffic_light_1": 0,
          }
          {
              "car_0": False,    # car_0 is still running
              "car_1": True,     # car_1 is terminated
              "__all__": False,  # the env is not terminated
          }
          {
              "car_0": {},  # info for car_0
              "car_1": {},  # info for car_1
          }
  
      """
      raise NotImplementedError
  
imports: import gymnasium
  import logging
  from typing import Callable, Dict, List, Tuple, Optional, Union, Set, Type
  from ray.rllib.env.base_env import BaseEnv
  from ray.rllib.env.env_context import EnvContext
  from ray.rllib.utils.annotations import ExperimentalAPI, override, PublicAPI, DeveloperAPI
  from ray.rllib.utils.typing import AgentID, EnvCreator, EnvID, EnvType, MultiAgentDict, MultiEnvDict
  from ray.util import log_once
label_desc: Use image node_id 3 for calling the MultiAgentEnv obj's underlying member method code with example usage: obj.step(action_dict) without return types