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.
from airflow.utils.operator_resources import Resources
from airflow.utils.task_group import MappedTaskGroup, TaskGroup
from airflow.utils.types import NOTSET, ArgNotSet
if TYPE_CHECKING:
    from inspect import Parameter
    from pydantic import BaseModel
    from airflow.models.baseoperator import BaseOperatorLink
    from airflow.models.expandinput import ExpandInput
    from airflow.models.operator import Operator
    from airflow.models.taskmixin import DAGNode
    from airflow.serialization.json_schema import Validator
    from airflow.ti_deps.deps.base_ti_dep import BaseTIDep
    from airflow.timetables.base import Timetable
    HAS_KUBERNETES: bool
    try:
        from kubernetes.client import models as k8s
        from airflow.providers.cncf.kubernetes.pod_generator import PodGenerator
    except ImportError:
        pass
log = logging.getLogger(__name__)
_OPERATOR_EXTRA_LINKS: set[str] = {
    "airflow.operators.trigger_dagrun.TriggerDagRunLink",
    "airflow.sensors.external_task.ExternalDagLink",
    
    "airflow.sensors.external_task.ExternalTaskSensorLink",
    "airflow.operators.dagrun_operator.TriggerDagRunLink",
    "airflow.sensors.external_task_sensor.ExternalTaskSensorLink",
}
@cache
def get_operator_extra_links() -> set[str]: