{"record":{"id":"5a559833f0faad00","repo":"hiyouga/LlamaFactory","slug":"dataset-converter-name-already-exists","errorCode":null,"errorMessage":"Dataset converter {name} already exists.","messagePattern":"Dataset converter (.+?) already exists\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/llamafactory/data/converter.py","lineNumber":380,"sourceCode":"            \"_tools\": tools,\n            \"_images\": self._find_medias(example[self.dataset_attr.images]) if self.dataset_attr.images else None,\n            \"_videos\": self._find_medias(example[self.dataset_attr.videos]) if self.dataset_attr.videos else None,\n            \"_audios\": self._find_medias(example[self.dataset_attr.audios]) if self.dataset_attr.audios else None,\n        }\n        return output\n\n\nDATASET_CONVERTERS = {\n    \"alpaca\": AlpacaDatasetConverter,\n    \"sharegpt\": SharegptDatasetConverter,\n    \"openai\": OpenAIDatasetConverter,\n}\n\n\ndef register_dataset_converter(name: str, dataset_converter: type[\"DatasetConverter\"]) -> None:\n    r\"\"\"Register a new dataset converter.\"\"\"\n    if name in DATASET_CONVERTERS:\n        raise ValueError(f\"Dataset converter {name} already exists.\")\n\n    DATASET_CONVERTERS[name] = dataset_converter\n\n\ndef get_dataset_converter(name: str, dataset_attr: \"DatasetAttr\", data_args: \"DataArguments\") -> \"DatasetConverter\":\n    r\"\"\"Get a dataset converter.\"\"\"\n    if name not in DATASET_CONVERTERS:\n        raise ValueError(f\"Dataset converter {name} not found.\")\n\n    return DATASET_CONVERTERS[name](dataset_attr, data_args)\n\n\ndef align_dataset(\n    dataset: Union[\"Dataset\", \"IterableDataset\"],\n    dataset_attr: \"DatasetAttr\",\n    data_args: \"DataArguments\",\n    training_args: \"Seq2SeqTrainingArguments\",\n) -> Union[\"Dataset\", \"IterableDataset\"]:","sourceCodeStart":362,"sourceCodeEnd":398,"githubUrl":"https://github.com/hiyouga/LlamaFactory/blob/f28afaf6355af515454dfb16c97d728307c93897/src/llamafactory/data/converter.py#L362-L398","documentation":"register_dataset_converter raises ValueError when the given name already exists in the DATASET_CONVERTERS registry (built-ins: alpaca, sharegpt, openai). This is a plugin-API guard against silently replacing an existing converter implementation.","triggerScenarios":"Calling register_dataset_converter('alpaca', MyConverter) or registering a plugin whose name collides with a built-in or with another already-registered plugin; double-importing a registration module (e.g. via reload) that registers the same name twice.","commonSituations":"Third-party dataset plugins with generic names; notebook workflows where a cell registering the converter is re-run; two plugins both claiming 'sharegpt'.","solutions":["Choose a unique, namespaced converter name (e.g. 'myorg_sharegpt').","Make registration idempotent in your plugin: check `name in DATASET_CONVERTERS` (or wrap in try/except ValueError) before registering.","To override a built-in intentionally, mutate DATASET_CONVERTERS[name] directly — but prefer a new name to avoid surprising behavior."],"exampleFix":"# before\nregister_dataset_converter(\"sharegpt\", MyConverter)\n\n# after\nfrom llamafactory.data.converter import DATASET_CONVERTERS\nif \"my_sharegpt\" not in DATASET_CONVERTERS:\n    register_dataset_converter(\"my_sharegpt\", MyConverter)","handlingStrategy":"validation","validationCode":"from llamafactory.data.converter import DATASET_CONVERTERS\nif name in DATASET_CONVERTERS:\n    return  # idempotent plugin registration\nregister_dataset_converter(name, MyConverter)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Namespace plugin converter names (vendor/product style).","Register plugins once at process start, guarded by a registry membership check."],"tags":["registry","plugin","dataset","converter"],"backgroundTag":null,"analyzedSha":"f28afaf6355af515454dfb16c97d728307c93897","analyzedAt":"2026-08-14T21:57:28.298Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}