roboflow/supervision · error · ValueError

Conflicting metadata for key: '{key}': {type(value)}, {type(

Error message

Conflicting metadata for key: '{key}': {type(value)}, {type(other_value)}.

What it means

Raised by merge_metadata when two Detections being merged both carry the same metadata key as np.ndarray but the arrays are not equal (np.array_equal fails). Metadata must be identical across merged objects; array-valued metadata that differs in content is a conflict.

Source

Thrown at src/supervision/detection/utils/internal.py:636

    """
    if not metadata_list:
        return {}

    all_keys_sets = [set(metadata.keys()) for metadata in metadata_list]
    if not all(keys_set == all_keys_sets[0] for keys_set in all_keys_sets):
        raise ValueError("All metadata dictionaries must have the same keys to merge.")

    merged_metadata: _MetadataType = {}
    for metadata in metadata_list:
        for key, value in metadata.items():
            if key not in merged_metadata:
                merged_metadata[key] = value
                continue

            other_value = merged_metadata[key]
            if isinstance(value, np.ndarray) and isinstance(other_value, np.ndarray):
                if not np.array_equal(merged_metadata[key], value):
                    raise ValueError(
                        f"Conflicting metadata for key: '{key}': "
                        f"{type(value)}, {type(other_value)}."
                    )
            elif isinstance(value, np.ndarray) or isinstance(other_value, np.ndarray):
                # Since [] == np.array([]).
                raise ValueError(
                    f"Conflicting metadata for key: '{key}': "
                    f"{type(value)}, {type(other_value)}."
                )
            else:
                if merged_metadata[key] != value:
                    raise ValueError(f"Conflicting metadata for key: '{key}'.")

    return merged_metadata


def get_data_item(
    data: _DetectionDataType,

View on GitHub (pinned to 7f254d9784)

Solutions

  1. Rename the key per source (e.g. 'anchors_a'/'anchors_b') or keep only one source's value before merging
  2. Overwrite metadata on all inputs with the single intended value before calling merge
  3. If the differing values are legitimate, carry them in detections.data (per-detection) instead of metadata (per-object)

Example fix

# before
merged = sv.Detections.merge([d1, d2])  # different 'anchors' arrays
# after
d2.metadata['anchors'] = d1.metadata['anchors']  # or delete the key
merged = sv.Detections.merge([d1, d2])
Defensive patterns

Strategy: validation

Validate before calling

def assert_consistent_metadata(detections_list, key):
    vals = [d.metadata.get(key) for d in detections_list]
    import numpy as np
    first = vals[0]
    for d, v in zip(detections_list, vals):
        if isinstance(first, np.ndarray):
            assert isinstance(v, np.ndarray) and np.array_equal(first, v), f"array metadata '{key}' differs"
        else:
            assert v == first, f"metadata '{key}' differs: {v!r} vs {first!r}"

Prevention

When it happens

Trigger: sv.Detections.merge([d1, d2]) with d1.metadata={'anchors': np.array([1,2])} and d2.metadata={'anchors': np.array([3,4])}; also annotations.merge() or the internal two-detection merge (core.py:3462) on objects from different sources carrying the same metadata key with different array values.

Common situations: Merging detections produced by two models/pipelines that store their own anchor boxes, calibration arrays, or transform matrices under the same metadata key; merging Detections from different frames/segments of a video where the metadata was populated from frame-specific state.

Related errors


AI-assisted analysis of roboflow/supervision@7f254d9784 (2026-08-15). Data as JSON: /api/errors/3928f6b9608ec9bd. Report an issue: GitHub.