code: def _get_program_relpath(
      self, source_type: str, metadata: Dict[str, Any]
  ) -> Optional[str]:
      if self._is_notebook_run:
          _logger.info("run is notebook based run")
          program = metadata.get("program")
  
          if not program:
              wandb.termwarn(
                  "Notebook 'program' path not found in metadata. See https://docs.wandb.ai/guides/launch/create-job"
              )
  
          return program
  
      if (
          source_type == "artifact"
          or self._settings.job_source == "artifact"
      ):
          # if the job is set to be an artifact, use relpath guaranteed
          # to be correct. 'codePath' uses the root path when in git repo
          # fallback to codePath if strictly local relpath not present
          return metadata.get("codePathLocal") or metadata.get(
              "codePath"
          )
  
      return metadata.get("codePath")
  
imports: import json
  import logging
  import os
  import re
  import sys
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
  import wandb
  from wandb.sdk.artifacts.artifact import Artifact
  from wandb.sdk.data_types._dtypes import TypeRegistry
  from wandb.sdk.lib.filenames import DIFF_FNAME, METADATA_FNAME, REQUIREMENTS_FNAME
  from wandb.util import make_artifact_name_safe
  from .settings_static import SettingsStatic
label_desc: Use image node_id 16 for calling the JobBuilder obj's underlying member method code with example usage: obj._get_program_relpath(source_type, metadata) and returns: metadata, program, unknown