class_docstr: Abstract teacher that wraps around another teacher.
  
  This teacher allows for manipulating the fields returned by the inner teacher, in
  the abstract self._edit_action() method that is called during self.act(). The inner
  teacher must subclass FixedDialogTeacher in order to make use of that teacher's
  .get_orig_action() and .process_action() methods.
code: def __init__(self, opt: Opt, shared=None):
      if "," in opt["task"]:
          raise ValueError(
              "AbstractWrapperTeacher cannot be used with multiple tasks!"
          )
      self.id = opt["task"]
      self.opt = opt
      if shared:
          self.task = create_agent_from_shared(shared["task"])
      else:
          opt_singletask = copy.deepcopy(opt)
          opt_singletask["task"] = opt["wrapper_task"]
          self.task = create_task_agent_from_taskname(opt_singletask)[0]
      assert isinstance(self.task, FixedDialogTeacher)
  
imports: from typing import Optional
  from parlai.core.params import ParlaiParser
  import copy
  from abc import ABC
  from parlai.core.agents import create_agent_from_shared
  from parlai.core.message import Message
  from parlai.core.opt import Opt
  from parlai.core.teachers import create_task_agent_from_taskname, FixedDialogTeacher, Teacher
  from parlai.utils.misc import warn_once
label_desc: Use image node_id 2 to create a new AbstractWrapperTeacher object from inherited base classes: Teacher, ABC with example: obj = AbstractWrapperTeacher(opt, shared)