code: def _extract_input_and_output_from_action(
      self, action: Action
  ) -> Tuple[UID]:
      input_uids = set()
  
      if action.remote_self is not None:
          input_uids.add(action.remote_self.id)
  
      for arg in action.args:
          input_uids.add(arg.id)
  
      for _, kwarg in action.kwargs.items():
          input_uids.add(kwarg.id)
  
      output_uid = action.result_id.id
  
      return input_uids, output_uid
  
imports: from typing import List
  from typing import Tuple
  from typing import Union
  from pydantic.error_wrappers import ValidationError
  from ...node.credentials import SyftVerifyKey
  from ...serde.serializable import serializable
  from ...store.document_store import PartitionKey
  from ...store.document_store import QueryKeys
  from ...types.uid import UID
  from ..code.user_code import UserVerifyKeyPartitionKey
  from ..context import AuthedServiceContext
  from ..response import SyftError
  from ..response import SyftSuccess
  from ..service import AbstractService
  from ..service import service_method
  from .action_graph import ActionGraphStore
  from .action_graph import ExecutionStatus
  from .action_graph import NodeActionData
  from .action_graph import NodeActionDataUpdate
  from .action_graph import NodeType
  from .action_object import Action
  from .action_object import ActionObject
label_desc: Use image node_id 4 for calling the ActionGraphService obj's underlying member method code with example usage: obj._extract_input_and_output_from_action(action) and returns: input_uids,  output_uid