{"record":{"id":"0e05623fcf6c0395","repo":"BoundaryML/baml","slug":"value-name-already-exists","errorCode":null,"errorMessage":"Value {name} already exists.","messagePattern":"Value (.+?) already exists\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"engine/language_client_python/python_src/baml_py/type_builder.py","lineNumber":170,"sourceCode":"class NewEnumBuilder:\n    def __init__(self, tb: _TypeBuilder, name: str):\n        self.__bldr = tb.enum(name)\n        self.__values: typing.Set[str] = set()\n        self.__vals = NewEnumValues(self.__bldr, self.__values)\n\n    def type(self) -> FieldType:\n        return self.__bldr.field()\n\n    @property\n    def values(self) -> \"NewEnumValues\":\n        return self.__vals\n\n    def list_values(self) -> typing.List[typing.Tuple[str, EnumValueBuilder]]:\n        return [(name, self.__bldr.value(name)) for name in self.__values]\n\n    def add_value(self, name: str) -> \"EnumValueBuilder\":\n        if name in self.__values:\n            raise ValueError(f\"Value {name} already exists.\")\n        self.__values.add(name)\n        # NOTE(sam): why is this inconsistent between classes and enums?\n        return self.__bldr.value(name)\n\n\nclass NewEnumValues:\n    def __init__(self, enum_bldr: EnumBuilder, values: typing.Set[str]):\n        self.__bldr = enum_bldr\n        self.__values = values\n\n    def __getattr__(self, name: str) -> \"EnumValueBuilder\":\n        if name not in self.__values:\n            raise AttributeError(f\"Value {name} not found.\")\n        return self.__bldr.value(name)\n\n\nclass EnumValueViewer:\n    def __init__(self, bldr: \"EnumValueBuilder\"):","sourceCodeStart":152,"sourceCodeEnd":188,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/language_client_python/python_src/baml_py/type_builder.py#L152-L188","documentation":"Python type-builder validation: add_value was called with an enum value name that is already registered in this NewEnumBuilder. The builder tracks names in a set to keep enums well-formed (duplicate variants would collide in codegen), so the second registration of the same name is rejected.","triggerScenarios":"Calling enum_builder.add_value('RED') twice on the same NewEnumBuilder instance; re-running value-registration code against a reused builder.","commonSituations":"Idempotency attempts when building enums dynamically; loops over config lists containing duplicate entries; re-running a script without rebuilding the TypeBuilder.","solutions":["Track added value names in a set and skip duplicates before add_value","Use a fresh TypeBuilder/enum builder per registration pass","Catch ValueError and treat 'already exists' as a no-op"],"exampleFix":"// before\nfor v in values:\n    enum_b.add_value(v)\n// after\nseen = set()\nfor v in values:\n    if v not in seen:\n        enum_b.add_value(v)\n        seen.add(v)","handlingStrategy":"validation","validationCode":"names = {n for n, _ in enum_b.list_values()}\nfor v in values:\n    if v not in names:\n        enum_b.add_value(v)","typeGuard":null,"tryCatchPattern":"try:\n    enum_b.add_value(name)\nexcept ValueError as e:\n    if \"already exists\" not in str(e):\n        raise","preventionTips":["Deduplicate config value lists before registration","Track added names in a Python set","Rebuild the builder rather than re-running registration"],"tags":["python","type-builder","duplicate-value"],"backgroundTag":"file-already-exists","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}