roboflow/supervision · error · ValueError

Conflicting metadata for key

Error message

Conflicting metadata for key: '{key}'.

What it means

Raised by merge_metadata when the same metadata key holds different non-array (scalar/plain) values in two Detections being merged. After the ndarray special cases, plain inequality of the existing merged value and the new value is treated as a conflict, because merge_metadata has no policy for choosing between competing scalars.

Solutions

  1. Merge only Detections that share the metadata value (group inputs by metadata before merging), e.g. group by d.metadata['video_id'] and merge within each group
  2. Overwrite the conflicting key with a single intended value on all inputs before merge
  3. Drop the per-source key from metadata if it is not needed post-merge

Example fix

# before
merged = sv.Detections.merge([d_v1, d_v2])  # video_id 1 vs 2
# after
from itertools import groupby
groups = {}
for d in detections_list:
    groups.setdefault(d.metadata.get('video_id'), []).append(d)
merged = [sv.Detections.merge(g) for g in groups.values()]
Defensive patterns

Strategy: validation

Validate before calling

def split_by_metadata(detections_list, key):
    groups = {}
    for d in detections_list:
        groups.setdefault(d.metadata.get(key), []).append(d)
    return list(groups.values())
# merge within each group only

Prevention

When it happens

Trigger: sv.Detections.merge([d1, d2]) with d1.metadata={'video_id': 1} and d2.metadata={'video_id': 2}; also the internal pair merge in core.py:3462 and annotations merge (core.py:3366) when inputs come from different videos/cameras.

Common situations: Concatenating Detections accumulated from multiple videos or camera streams where each carries its own video_id/source_id; batching detections per frame with frame-index metadata and merging across frames; reusing a merge helper on heterogeneous batches.

Related errors


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

Appendix: source

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

                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,
    index: int | slice | list[int] | npt.NDArray[np.integer | np.bool_],
) -> _DetectionDataType:
    """
    Retrieve a subset of the data dictionary based on the given index.

    Args:
        data: The data dictionary of the Detections object.
        index: The index or indices specifying the subset to retrieve.

    Returns:
        A subset of the data dictionary corresponding to the specified index.
    """

View on GitHub (pinned to 7f254d9784)