code: def replace(
      obj, run_id, user_namespace, tags_to_add=None, tags_to_remove=None
  ):
      _set_current(obj)
      # While run.replace_tag() can accept 0 additions or 0 removals, we want to encourage
      # the *obvious* way to achieve their goals. E.g. if they are only adding tags, use "tag add"
      # over more obscure "tag replace --add ... --add ..."
      if not tags_to_add and not tags_to_remove:
          raise CommandException(
              "Specify at least one tag to add (--add) and one tag to remove (--remove)"
          )
      if not tags_to_remove:
          raise CommandException(
              "Specify at least one tag to remove; else please use *tag add*."
          )
      if not tags_to_add:
          raise CommandException(
              "Specify at least one tag to add, else please use *tag remove*."
          )
      user_namespace = (
          resolve_identity()
          if user_namespace is None
          else user_namespace
      )
      run = _get_client_run_obj(obj, run_id, user_namespace)
  
      run.replace_tags(tags_to_remove, tags_to_add)
  
      obj.echo("Operation successful. New tags:")
      _print_tags_for_one_run(obj, run)
  
imports: import sys
  from itertools import chain
  from metaflow import namespace
  from metaflow.client import Flow, Run
  from metaflow.current import current
  from metaflow.util import resolve_identity
  from metaflow.exception import CommandException, MetaflowNotFound, MetaflowInternalError
  from metaflow.exception import MetaflowNamespaceMismatch
  from metaflow._vendor import click
label_desc: Use image node_id 11 for calling a global function with example usage: replace(obj, run_id, user_namespace, tags_to_add, tags_to_remove) without return types