Cattrs is currently only used in two places: Serialization for operator extra links, and for Lineage.

However cattrs is not a well maintained project and doesn't support many features that attrs itself does; in short, it's not worth the brain cycles to keep cattrs.
try:
                    return model_cls.model_validate(var).model_dump(mode="json")  
                except AttributeError:  
                    return model_cls.from_orm(var).dict()  
            if isinstance(var, Job):
                return cls._encode(_pydantic_model_dump(JobPydantic, var), type_=DAT.BASE_JOB)
            elif isinstance(var, TaskInstance):
                return cls._encode(_pydantic_model_dump(TaskInstancePydantic, var), type_=DAT.TASK_INSTANCE)
            elif isinstance(var, DagRun):
                return cls._encode(_pydantic_model_dump(DagRunPydantic, var), type_=DAT.DAG_RUN)
            elif isinstance(var, Dataset):
                return cls._encode(_pydantic_model_dump(DatasetPydantic, var), type_=DAT.DATA_SET)
            elif isinstance(var, DagModel):
                return cls._encode(_pydantic_model_dump(DagModelPydantic, var), type_=DAT.DAG_MODEL)
            else:
                return cls.default_serialization(strict, var)
        elif isinstance(var, ArgNotSet):
            return cls._encode(None, type_=DAT.ARG_NOT_SET)
        else:
            return cls.default_serialization(strict, var)
    @classmethod
    def default_serialization(cls, strict, var) -> str: