{"record":{"id":"3928f6b9608ec9bd","repo":"roboflow/supervision","slug":"conflicting-metadata-for-key-key-type-value","errorCode":null,"errorMessage":"Conflicting metadata for key: '{key}': {type(value)}, {type(other_value)}.","messagePattern":"Conflicting metadata for key: '(.+?)': (.+?), (.+?)\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/supervision/detection/utils/internal.py","lineNumber":636,"sourceCode":"    \"\"\"\n    if not metadata_list:\n        return {}\n\n    all_keys_sets = [set(metadata.keys()) for metadata in metadata_list]\n    if not all(keys_set == all_keys_sets[0] for keys_set in all_keys_sets):\n        raise ValueError(\"All metadata dictionaries must have the same keys to merge.\")\n\n    merged_metadata: _MetadataType = {}\n    for metadata in metadata_list:\n        for key, value in metadata.items():\n            if key not in merged_metadata:\n                merged_metadata[key] = value\n                continue\n\n            other_value = merged_metadata[key]\n            if isinstance(value, np.ndarray) and isinstance(other_value, np.ndarray):\n                if not np.array_equal(merged_metadata[key], value):\n                    raise ValueError(\n                        f\"Conflicting metadata for key: '{key}': \"\n                        f\"{type(value)}, {type(other_value)}.\"\n                    )\n            elif isinstance(value, np.ndarray) or isinstance(other_value, np.ndarray):\n                # Since [] == np.array([]).\n                raise ValueError(\n                    f\"Conflicting metadata for key: '{key}': \"\n                    f\"{type(value)}, {type(other_value)}.\"\n                )\n            else:\n                if merged_metadata[key] != value:\n                    raise ValueError(f\"Conflicting metadata for key: '{key}'.\")\n\n    return merged_metadata\n\n\ndef get_data_item(\n    data: _DetectionDataType,","sourceCodeStart":618,"sourceCodeEnd":654,"githubUrl":"https://github.com/roboflow/supervision/blob/7f254d9784d4c37e0f03cd89ddee164c8db099c0/src/supervision/detection/utils/internal.py#L618-L654","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Rename the key per source (e.g. 'anchors_a'/'anchors_b') or keep only one source's value before merging","Overwrite metadata on all inputs with the single intended value before calling merge","If the differing values are legitimate, carry them in detections.data (per-detection) instead of metadata (per-object)"],"exampleFix":"# before\nmerged = sv.Detections.merge([d1, d2])  # different 'anchors' arrays\n# after\nd2.metadata['anchors'] = d1.metadata['anchors']  # or delete the key\nmerged = sv.Detections.merge([d1, d2])","handlingStrategy":"validation","validationCode":"def assert_consistent_metadata(detections_list, key):\n    vals = [d.metadata.get(key) for d in detections_list]\n    import numpy as np\n    first = vals[0]\n    for d, v in zip(detections_list, vals):\n        if isinstance(first, np.ndarray):\n            assert isinstance(v, np.ndarray) and np.array_equal(first, v), f\"array metadata '{key}' differs\"\n        else:\n            assert v == first, f\"metadata '{key}' differs: {v!r} vs {first!r}\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat metadata as global context: write it once from a single source of truth","Group Detections by metadata content before merging instead of merging heterogeneous batches","Put per-detection varying values in detections.data, not metadata"],"tags":["detections","metadata","merge","numpy"],"backgroundTag":null,"analyzedSha":"7f254d9784d4c37e0f03cd89ddee164c8db099c0","analyzedAt":"2026-08-15T05:13:01.950Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}