{"record":{"id":"0200b3921c81f1c8","repo":"BoundaryML/baml","slug":"value-name-not-found","errorCode":null,"errorMessage":"Value {name} not found.","messagePattern":"Value (.+?) not found\\.","errorType":"validation","errorClass":"AttributeError","httpStatus":null,"severity":"error","filePath":"engine/language_client_python/python_src/baml_py/type_builder.py","lineNumber":183,"sourceCode":"    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\"):\n        self.__bldr = bldr\n","sourceCodeStart":165,"sourceCodeEnd":190,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/language_client_python/python_src/baml_py/type_builder.py#L165-L190","documentation":"NewEnumValues.__getattr__ lets you access enum values as attributes (e.g. bldr.values.RED). If the attribute name was never registered via add_value, it raises AttributeError('Value {name} not found.').","triggerScenarios":"Attribute access on the values object for a name not passed to add_value; typos in value names; accessing values after constructing a new builder object that lost the tracking set.","commonSituations":"Typo in an enum value name; copy-pasted code referencing values from a different enum; accessing a value before calling add_value.","solutions":["Call add_value(name) before accessing bldr.values.<name>","Verify the exact value name spelling","Use list_values() to see registered names","Wrap access in try/except AttributeError"],"exampleFix":"// before\nval = enum_b.values.REDD\n// after\nenum_b.add_value(\"RED\")\nval = enum_b.values.RED","handlingStrategy":"try-catch","validationCode":"known = {n for n, _ in enum_b.list_values()}\nassert value_name in known, f\"{value_name} not added yet\"","typeGuard":"def has_value(enum_b, name: str) -> bool:\n    return name in {n for n, _ in enum_b.list_values()}","tryCatchPattern":"try:\n    val = enum_b.values.RED\nexcept AttributeError as e:\n    if \"Value\" in str(e) and \"not found\" in str(e):\n        val = enum_b.add_value(\"RED\")\n    else:\n        raise","preventionTips":["Always add_value before attribute access","Use list_values to confirm registered names","Copy names from the BAML schema, don't type from memory"],"tags":["python","type-builder","attribute-error"],"backgroundTag":"entity-not-found","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"}