class_docstr: An input filter is a module that filters the input from an environment to the agent.
class_docstr_tok: ["An","input","filter","is","a","module","that","filters","the","input","from","an","environment","to","the","agent","."]
docstr: Add an observation filter to the filters list
  :param observation_name: the name of the observation to apply to
  :param filter_name: the filter name
  :param filter: the filter to add
  :param add_as_the_first_filter: add the filter to the top of the filters stack
  :return: None
code: def add_observation_filter(
      self,
      observation_name: str,
      filter_name: str,
      filter: "ObservationFilter",
      add_as_the_first_filter: bool = False,
  ):
      """
      Add an observation filter to the filters list
      :param observation_name: the name of the observation to apply to
      :param filter_name: the filter name
      :param filter: the filter to add
      :param add_as_the_first_filter: add the filter to the top of the filters stack
      :return: None
      """
      if observation_name not in self._observation_filters.keys():
          self._observation_filters[observation_name] = OrderedDict()
      self._observation_filters[observation_name][filter_name] = filter
      if add_as_the_first_filter:
          self._observation_filters[observation_name].move_to_end(
              filter_name, last=False
          )
  
imports: import copy
  import os
  from collections import OrderedDict
  from copy import deepcopy
  from typing import Dict, Union, List
  from rl_coach.core_types import EnvResponse, ActionInfo, Transition
  from rl_coach.spaces import ActionSpace, RewardSpace, ObservationSpace
  from rl_coach.utils import force_list
label_desc: Use image node_id 14 for calling the InputFilter obj's underlying member method code with example usage: obj.add_observation_filter(observation_name, filter_name, filter, add_as_the_first_filter) without return types