class_docstr: Holds functionality to be run before and after a `GraphNode`.
class_docstr_tok: ["Holds","functionality","to","be","run","before","and","after","a","`","GraphNode","`","."]
docstr: Runs after the `GraphNode` as executed.
  
  Args:
      node_name: The name of the node that has run.
      execution_context: The execution context of the current graph run.
      config: The node's config.
      output: The output of the node.
      input_hook_data: Data returned from `on_before_node`.
code: def on_after_node(
      self,
      node_name: Text,
      execution_context: ExecutionContext,
      config: Dict[Text, Any],
      output: Any,
      input_hook_data: Dict,
  ) -> None:
      """Runs after the `GraphNode` as executed.
  
      Args:
          node_name: The name of the node that has run.
          execution_context: The execution context of the current graph run.
          config: The node's config.
          output: The output of the node.
          input_hook_data: Data returned from `on_before_node`.
      """
      ...
  
imports: from __future__ import annotations
  import dataclasses
  from abc import ABC, abstractmethod
  from dataclasses import dataclass, field
  import logging
  from typing import Any, Callable, Dict, List, Optional, Text, Type, Tuple, Union
  from rasa.engine.exceptions import GraphComponentException, GraphRunError, GraphSchemaException
  import rasa.shared.utils.common
  import rasa.utils.common
  from rasa.engine.storage.resource import Resource
  from rasa.engine.storage.storage import ModelStorage
  from rasa.shared.exceptions import InvalidConfigException, RasaException
  from rasa.shared.data import TrainingType
label_desc: Use image node_id 2 for calling the GraphNodeHook obj's underlying member method code with example usage: obj.on_after_node(node_name, execution_context, config, output, input_hook_data) without return types