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

  1. Create a new TypeBuilder for each request instead of reusing a shared instance.
  2. Guard the call: skip add_class if the name is already defined (check your own registry).
  3. Refactor so class registration happens once at startup and the builder is copied/reset per request if needed.
  4. 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

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)