docs: def ConvertValuesWithMetadata(metadata_value_pairs, token=None, options=None):
    """Converts a set of RDFValues into a set of export-friendly RDFValues.
  
    Args:
      metadata_value_pairs: Tuples of (metadata, rdf_value), where metadata is an
        instance of ExportedMetadata and rdf_value is an RDFValue subclass
        instance to be exported.
      token: Security token.
      options: rdfvalue.ExportOptions instance that will be passed to
        ExportConverters.
  
    Yields:
      Converted values. Converted values may be of different types.
  
    Raises:
      NoConverterFound: in case no suitable converters were found for a value in
                        metadata_value_pairs. This error is only raised after
                        all values in metadata_value_pairs are attempted to be
                        converted. If there are multiple value types that could
                        not be converted because of the lack of corresponding
                        converters, only the last one will be specified in the
                        exception message.
    """
    no_converter_found_error = None
    for metadata_values_group in itervalues(
        collection.Group(
            metadata_value_pairs, lambda pair: pair[1].__class__.__name__)):
  
      _, first_value = metadata_values_group[0]
      converters_classes = ExportConverter.GetConvertersByValue(first_value)
      if not converters_classes:
        no_converter_found_error = "No converters found for value: %s" % str(
            first_value)
        continue
  
      converters = [cls(options) for cls in converters_classes]
      for converter in converters:
        for result in converter.BatchConvert(metadata_values_group, token=token):
          yield result
  
    if no_converter_found_error is not None:
      raise NoConverterFound(no_converter_found_error)