{"record":{"id":"5f03da3b431a2a32","repo":"BoundaryML/baml","slug":"class-with-name-name-already-exists-type-builder","errorCode":null,"errorMessage":"Class with name {name} already exists.","messagePattern":"Class with name (.+?) already exists\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"engine/language_client_python/python_src/baml_py/type_builder.py","lineNumber":96,"sourceCode":"\n    def bool(self):\n        return self._tb.bool()\n\n    def list(self, inner: FieldType):\n        return self._tb.list(inner)\n\n    def null(self):\n        return self._tb.null()\n\n    def map(self, key: FieldType, value: FieldType):\n        return self._tb.map(key, value)\n\n    def union(self, types: typing.List[FieldType]):\n        return self._tb.union(*types)\n\n    def add_class(self, name: str) -> \"NewClassBuilder\":\n        if name in self.__classes:\n            raise ValueError(f\"Class with name {name} already exists.\")\n        if name in self.__enums:\n            raise ValueError(f\"Enum with name {name} already exists.\")\n        self.__classes.add(name)\n        return NewClassBuilder(self._tb, name)\n\n    def add_enum(self, name: str) -> \"NewEnumBuilder\":\n        if name in self.__classes:\n            raise ValueError(f\"Class with name {name} already exists.\")\n        if name in self.__enums:\n            raise ValueError(f\"Enum with name {name} already exists.\")\n        self.__enums.add(name)\n        return NewEnumBuilder(self._tb, name)\n\n    def add_baml(self, baml: str):\n        return self._tb.add_baml(baml, self.__runtime)\n\n\nclass NewClassBuilder:","sourceCodeStart":78,"sourceCodeEnd":114,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/language_client_python/python_src/baml_py/type_builder.py#L78-L114","documentation":"TypeBuilder.add_class() raises ValueError when the requested class name is already registered in this builder's __classes set, since dynamic types must be uniquely named. BAML requires one definition per type name within a builder, so re-adding the same class name is rejected before any request is sent.","triggerScenarios":"Calling tb.add_class(\"Foo\") twice on the same TypeBuilder instance, e.g. inside a loop that rebuilds types per request but reuses a shared builder object.","commonSituations":"Per-request type-building code that forgets to create a fresh TypeBuilder each time; two code paths both defining the same helper class on a shared module-level builder; retry logic re-running the add_class setup on the same builder.","solutions":["Create a new TypeBuilder for each request instead of reusing a shared instance.","Guard the call: skip add_class if the name is already defined (check your own registry).","Refactor so class registration happens once at startup and the builder is copied/reset per request if needed.","Rename the second definition if the two classes are genuinely different types."],"exampleFix":"# before\ntb = baml.TypeBuilder()\nfor req in requests:\n    tb.add_class(\"Output\")  # ValueError on second iteration\n\n# after\nfor req in requests:\n    tb = baml.TypeBuilder()  # fresh builder per request\n    tb.add_class(\"Output\")","handlingStrategy":"validation","validationCode":"registered = set()\ndef safe_add_class(tb, name):\n    if name not in registered:\n        tb.add_class(name)\n        registered.add(name)","typeGuard":"def class_not_registered(tb, name: str) -> bool:\n    return name not in getattr(tb, \"_TypeBuilder__classes\", set())","tryCatchPattern":"try:\n    tb.add_class(name)\nexcept ValueError as e:\n    if f\"Class with name {name} already exists.\" not in str(e):\n        raise  # unrelated validation error","preventionTips":["Create a fresh TypeBuilder per request instead of reusing one","Keep a single registry of registered type names in your code","Wrap per-request type setup in a function that is idempotent","Avoid module-level shared TypeBuilder instances"],"tags":["python","type-builder","duplicate-name","validation"],"backgroundTag":"duplicate-definition","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"}