code: def end_node_context_name_from_subpipeline_id(
      subpipeline_id: str,
  ) -> str:
      """Builds the end_node context name of a composable pipeline."""
      end_node_id = pipeline_end_node_id_from_pipeline_id(
          subpipeline_id
      )
      return node_context_name(subpipeline_id, end_node_id)
  
imports: from typing import cast, List, Optional, Sequence, Tuple, Type, Union, Dict, Any, Set
  from tfx import types
  from tfx.dsl.compiler import constants
  from tfx.dsl.components.base import base_node
  from tfx.dsl.components.common import importer
  from tfx.dsl.components.common import resolver
  from tfx.dsl.context_managers import dsl_context_registry
  from tfx.dsl.placeholder import placeholder
  from tfx.orchestration import data_types_utils
  from tfx.orchestration import pipeline
  from tfx.proto.orchestration import pipeline_pb2
  from tfx.types import channel
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 16 for calling a global function with example usage: end_node_context_name_from_subpipeline_id(subpipeline_id) and returns: node_context_name