BoundaryML/baml · error · ValueError
Class with name already exists.
Error message
Class with name {name} already exists. What it means
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.
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.
Example fix
# before
tb = baml.TypeBuilder()
for req in requests:
tb.add_class("Output") # ValueError on second iteration
# after
for req in requests:
tb = baml.TypeBuilder() # fresh builder per request
tb.add_class("Output") Defensive patterns
Strategy: validation
Validate before calling
registered = set()
def safe_add_class(tb, name):
if name not in registered:
tb.add_class(name)
registered.add(name) Type guard
def class_not_registered(tb, name: str) -> bool:
return name not in getattr(tb, "_TypeBuilder__classes", set()) Try / catch
try:
tb.add_class(name)
except ValueError as e:
if f"Class with name {name} already exists." not in str(e):
raise # unrelated validation error Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
AI-assisted analysis of BoundaryML/baml@bd85ce9dee (2026-09-12).
Data as JSON: /api/errors/5f03da3b431a2a32.
Report an issue: GitHub.
Appendix: source
Thrown at engine/language_client_python/python_src/baml_py/type_builder.py:96
def bool(self):
return self._tb.bool()
def list(self, inner: FieldType):
return self._tb.list(inner)
def null(self):
return self._tb.null()
def map(self, key: FieldType, value: FieldType):
return self._tb.map(key, value)
def union(self, types: typing.List[FieldType]):
return self._tb.union(*types)
def add_class(self, name: str) -> "NewClassBuilder":
if name in self.__classes:
raise ValueError(f"Class with name {name} already exists.")
if name in self.__enums:
raise ValueError(f"Enum with name {name} already exists.")
self.__classes.add(name)
return NewClassBuilder(self._tb, name)
def add_enum(self, name: str) -> "NewEnumBuilder":
if name in self.__classes:
raise ValueError(f"Class with name {name} already exists.")
if name in self.__enums:
raise ValueError(f"Enum with name {name} already exists.")
self.__enums.add(name)
return NewEnumBuilder(self._tb, name)
def add_baml(self, baml: str):
return self._tb.add_baml(baml, self.__runtime)
class NewClassBuilder:View on GitHub (pinned to bd85ce9dee)