You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by ur...@apache.org on 2025/03/26 05:53:05 UTC

(airflow) branch main updated: Move BaseNotifier to Task SDK (#48008)

This is an automated email from the ASF dual-hosted git repository.

uranusjr pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 6b32358673a Move BaseNotifier to Task SDK (#48008)
6b32358673a is described below

commit 6b32358673af89f598009dfb3f280c957a5f2da4
Author: Tzu-ping Chung <ur...@gmail.com>
AuthorDate: Wed Mar 26 13:52:59 2025 +0800

    Move BaseNotifier to Task SDK (#48008)
    
    An entry is added to the compat provider for all providers to use.
---
 airflow-core/docs/howto/notifications.rst          |  4 +--
 airflow-core/src/airflow/notifications/__init__.py | 16 -----------
 .../tests/unit/models/test_taskinstance.py         |  2 +-
 .../tests/test_pytest_args_for_test_types.py       |  1 -
 generated/provider_dependencies.json               | 31 +++++++++++++++++----
 newsfragments/48008.significant.rst                | 20 ++++++++++++++
 providers/amazon/README.rst                        |  2 +-
 providers/amazon/pyproject.toml                    |  2 +-
 .../providers/amazon/aws/notifications/chime.py    |  3 +-
 .../providers/amazon/aws/notifications/sns.py      |  2 +-
 .../providers/amazon/aws/notifications/sqs.py      |  2 +-
 .../airflow/providers/amazon/get_provider_info.py  |  2 +-
 providers/apprise/README.rst                       | 32 ++++++++++++++++++----
 providers/apprise/pyproject.toml                   |  2 ++
 .../airflow/providers/apprise/get_provider_info.py |  6 +++-
 .../providers/apprise/notifications/apprise.py     |  2 +-
 providers/atlassian/jira/README.rst                | 32 ++++++++++++++++++----
 providers/atlassian/jira/pyproject.toml            |  2 ++
 .../providers/atlassian/jira/get_provider_info.py  |  6 +++-
 .../providers/atlassian/jira/notifications/jira.py |  2 +-
 providers/common/compat/README.rst                 |  6 ++--
 providers/common/compat/provider.yaml              |  2 +-
 providers/common/compat/pyproject.toml             |  6 ++--
 .../airflow/providers/common/compat/__init__.py    |  2 +-
 .../providers/common/compat/get_provider_info.py   |  2 +-
 .../providers/common/compat/notifier}/__init__.py  | 16 +++++++++++
 providers/discord/README.rst                       | 24 ++++++++--------
 providers/discord/pyproject.toml                   |  2 ++
 .../airflow/providers/discord/get_provider_info.py |  6 +++-
 .../providers/discord/notifications/discord.py     |  2 +-
 providers/opsgenie/README.rst                      | 32 ++++++++++++++++++----
 providers/opsgenie/pyproject.toml                  |  2 ++
 .../providers/opsgenie/get_provider_info.py        |  6 +++-
 .../providers/opsgenie/notifications/opsgenie.py   |  2 +-
 providers/pagerduty/README.rst                     | 32 ++++++++++++++++++----
 providers/pagerduty/pyproject.toml                 |  2 ++
 .../providers/pagerduty/get_provider_info.py       |  6 +++-
 .../providers/pagerduty/notifications/pagerduty.py |  2 +-
 providers/slack/README.rst                         | 28 ++++++++++---------
 providers/slack/pyproject.toml                     |  2 ++
 .../airflow/providers/slack/get_provider_info.py   |  1 +
 .../airflow/providers/slack/notifications/slack.py |  2 +-
 .../providers/slack/notifications/slack_webhook.py |  2 +-
 providers/smtp/README.rst                          | 30 ++++++++++++++++----
 providers/smtp/pyproject.toml                      |  2 ++
 .../airflow/providers/smtp/get_provider_info.py    |  2 +-
 .../airflow/providers/smtp/notifications/smtp.py   |  2 +-
 scripts/in_container/verify_providers.py           |  2 +-
 task-sdk/src/airflow/sdk/__init__.py               |  3 ++
 .../src/airflow/sdk/definitions/notifier.py        |  0
 .../definitions/notifier}/test_notifier.txt        |  0
 .../tests/task_sdk/definitions/test_notifier.py    | 28 +++++++++----------
 52 files changed, 302 insertions(+), 125 deletions(-)

diff --git a/airflow-core/docs/howto/notifications.rst b/airflow-core/docs/howto/notifications.rst
index 993a36b3894..0f53b20027d 100644
--- a/airflow-core/docs/howto/notifications.rst
+++ b/airflow-core/docs/howto/notifications.rst
@@ -17,7 +17,7 @@
 
 Creating a notifier
 ===================
-The :class:`~airflow.notifications.basenotifier.BaseNotifier` is an abstract class that provides a basic
+The :class:`~airflow.sdk.definitions.notifier.BaseNotifier` is an abstract class that provides a basic
 structure for sending notifications in Airflow using the various ``on_*__callback``.
 It is intended for providers to extend and customize for their specific needs.
 
@@ -31,7 +31,7 @@ Here's an example of how you can create a Notifier class:
 
 .. code-block:: python
 
-    from airflow.notifications.basenotifier import BaseNotifier
+    from airflow.sdk import BaseNotifier
     from my_provider import send_message
 
 
diff --git a/airflow-core/src/airflow/notifications/__init__.py b/airflow-core/src/airflow/notifications/__init__.py
deleted file mode 100644
index 13a83393a91..00000000000
--- a/airflow-core/src/airflow/notifications/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
diff --git a/airflow-core/tests/unit/models/test_taskinstance.py b/airflow-core/tests/unit/models/test_taskinstance.py
index 0b993caed19..19331c97d05 100644
--- a/airflow-core/tests/unit/models/test_taskinstance.py
+++ b/airflow-core/tests/unit/models/test_taskinstance.py
@@ -73,13 +73,13 @@ from airflow.models.taskmap import TaskMap
 from airflow.models.taskreschedule import TaskReschedule
 from airflow.models.variable import Variable
 from airflow.models.xcom import XComModel
-from airflow.notifications.basenotifier import BaseNotifier
 from airflow.providers.standard.operators.bash import BashOperator
 from airflow.providers.standard.operators.empty import EmptyOperator
 from airflow.providers.standard.operators.python import PythonOperator
 from airflow.providers.standard.sensors.python import PythonSensor
 from airflow.sdk.api.datamodels._generated import AssetEventResponse, AssetResponse
 from airflow.sdk.definitions.asset import Asset, AssetAlias
+from airflow.sdk.definitions.notifier import BaseNotifier
 from airflow.sdk.definitions.param import process_params
 from airflow.sdk.execution_time.comms import (
     AssetEventsResult,
diff --git a/dev/breeze/tests/test_pytest_args_for_test_types.py b/dev/breeze/tests/test_pytest_args_for_test_types.py
index 6c7f114e925..0fb3e1a0f72 100644
--- a/dev/breeze/tests/test_pytest_args_for_test_types.py
+++ b/dev/breeze/tests/test_pytest_args_for_test_types.py
@@ -164,7 +164,6 @@ def _find_all_integration_folders() -> list[str]:
                 "airflow-core/tests/unit/lineage",
                 "airflow-core/tests/unit/listeners",
                 "airflow-core/tests/unit/macros",
-                "airflow-core/tests/unit/notifications",
                 "airflow-core/tests/unit/plugins",
                 "airflow-core/tests/unit/secrets",
                 "airflow-core/tests/unit/security",
diff --git a/generated/provider_dependencies.json b/generated/provider_dependencies.json
index fd2b3607e22..938474d4e09 100644
--- a/generated/provider_dependencies.json
+++ b/generated/provider_dependencies.json
@@ -26,7 +26,7 @@
   "amazon": {
     "deps": [
       "PyAthena>=3.0.10",
-      "apache-airflow-providers-common-compat>=1.3.0",
+      "apache-airflow-providers-common-compat>=1.6.0",
       "apache-airflow-providers-common-sql>=1.20.0",
       "apache-airflow-providers-http",
       "apache-airflow>=2.9.0",
@@ -300,12 +300,15 @@
   },
   "apprise": {
     "deps": [
+      "apache-airflow-providers-common-compat>=1.6.0",
       "apache-airflow>=2.9.0",
       "apprise>=1.8.0"
     ],
     "devel-deps": [],
     "plugins": [],
-    "cross-providers-deps": [],
+    "cross-providers-deps": [
+      "common.compat"
+    ],
     "excluded-python-versions": [],
     "state": "ready"
   },
@@ -333,12 +336,15 @@
   },
   "atlassian.jira": {
     "deps": [
+      "apache-airflow-providers-common-compat>=1.6.0",
       "apache-airflow>=2.9.0",
       "atlassian-python-api>3.41.10"
     ],
     "devel-deps": [],
     "plugins": [],
-    "cross-providers-deps": [],
+    "cross-providers-deps": [
+      "common.compat"
+    ],
     "excluded-python-versions": [],
     "state": "ready"
   },
@@ -518,12 +524,14 @@
   },
   "discord": {
     "deps": [
+      "apache-airflow-providers-common-compat>=1.6.0",
       "apache-airflow-providers-http",
       "apache-airflow>=2.9.0"
     ],
     "devel-deps": [],
     "plugins": [],
     "cross-providers-deps": [
+      "common.compat",
       "http"
     ],
     "excluded-python-versions": [],
@@ -1033,12 +1041,15 @@
   },
   "opsgenie": {
     "deps": [
+      "apache-airflow-providers-common-compat>=1.6.0",
       "apache-airflow>=2.9.0",
       "opsgenie-sdk>=2.1.5"
     ],
     "devel-deps": [],
     "plugins": [],
-    "cross-providers-deps": [],
+    "cross-providers-deps": [
+      "common.compat"
+    ],
     "excluded-python-versions": [],
     "state": "ready"
   },
@@ -1058,12 +1069,15 @@
   },
   "pagerduty": {
     "deps": [
+      "apache-airflow-providers-common-compat>=1.6.0",
       "apache-airflow>=2.9.0",
       "pdpyras>=4.2.0"
     ],
     "devel-deps": [],
     "plugins": [],
-    "cross-providers-deps": [],
+    "cross-providers-deps": [
+      "common.compat"
+    ],
     "excluded-python-versions": [],
     "state": "ready"
   },
@@ -1241,6 +1255,7 @@
   },
   "slack": {
     "deps": [
+      "apache-airflow-providers-common-compat>=1.6.0",
       "apache-airflow-providers-common-sql>=1.20.0",
       "apache-airflow>=2.9.0",
       "slack_sdk>=3.19.0"
@@ -1248,6 +1263,7 @@
     "devel-deps": [],
     "plugins": [],
     "cross-providers-deps": [
+      "common.compat",
       "common.sql"
     ],
     "excluded-python-versions": [],
@@ -1255,11 +1271,14 @@
   },
   "smtp": {
     "deps": [
+      "apache-airflow-providers-common-compat>=1.6.0",
       "apache-airflow>=2.9.0"
     ],
     "devel-deps": [],
     "plugins": [],
-    "cross-providers-deps": [],
+    "cross-providers-deps": [
+      "common.compat"
+    ],
     "excluded-python-versions": [],
     "state": "ready"
   },
diff --git a/newsfragments/48008.significant.rst b/newsfragments/48008.significant.rst
new file mode 100644
index 00000000000..e154f597d7e
--- /dev/null
+++ b/newsfragments/48008.significant.rst
@@ -0,0 +1,20 @@
+The BaseNotifier class has been moved to ``airflow.sdk``.
+
+* Types of change
+
+  * [ ] Dag changes
+  * [ ] Config changes
+  * [ ] API changes
+  * [ ] CLI changes
+  * [ ] Behaviour changes
+  * [ ] Plugin changes
+  * [ ] Dependency changes
+  * [x] Code interface changes
+
+* Migration rules needed
+
+  * ruff
+
+    * AIR302
+
+      * [ ] ``airflow.notifications.basenotifier.BaseNotifier`` → ``airflow.sdk.BaseNotifier``
diff --git a/providers/amazon/README.rst b/providers/amazon/README.rst
index 2af061712a5..fb7a21632bb 100644
--- a/providers/amazon/README.rst
+++ b/providers/amazon/README.rst
@@ -54,7 +54,7 @@ Requirements
 PIP package                                 Version required
 ==========================================  ======================
 ``apache-airflow``                          ``>=2.9.0``
-``apache-airflow-providers-common-compat``  ``>=1.3.0``
+``apache-airflow-providers-common-compat``  ``>=1.6.0``
 ``apache-airflow-providers-common-sql``     ``>=1.20.0``
 ``apache-airflow-providers-http``
 ``boto3``                                   ``>=1.37.0``
diff --git a/providers/amazon/pyproject.toml b/providers/amazon/pyproject.toml
index 37d96a38508..8a55971985c 100644
--- a/providers/amazon/pyproject.toml
+++ b/providers/amazon/pyproject.toml
@@ -58,7 +58,7 @@ requires-python = "~=3.9"
 # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
 dependencies = [
     "apache-airflow>=2.9.0",
-    "apache-airflow-providers-common-compat>=1.3.0",
+    "apache-airflow-providers-common-compat>=1.6.0",
     "apache-airflow-providers-common-sql>=1.20.0",
     "apache-airflow-providers-http",
     # We should update minimum version of boto3 and here regularly to avoid `pip` backtracking with the number
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/notifications/chime.py b/providers/amazon/src/airflow/providers/amazon/aws/notifications/chime.py
index 75c2e4fb894..226b6fbb648 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/notifications/chime.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/notifications/chime.py
@@ -21,12 +21,11 @@ from functools import cached_property
 from typing import TYPE_CHECKING
 
 from airflow.providers.amazon.aws.hooks.chime import ChimeWebhookHook
+from airflow.providers.common.compat.notifier import BaseNotifier
 
 if TYPE_CHECKING:
     from airflow.utils.context import Context
 
-from airflow.notifications.basenotifier import BaseNotifier
-
 
 class ChimeNotifier(BaseNotifier):
     """
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/notifications/sns.py b/providers/amazon/src/airflow/providers/amazon/aws/notifications/sns.py
index 1ed61f3276b..c73d52e85cc 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/notifications/sns.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/notifications/sns.py
@@ -20,8 +20,8 @@ from __future__ import annotations
 from collections.abc import Sequence
 from functools import cached_property
 
-from airflow.notifications.basenotifier import BaseNotifier
 from airflow.providers.amazon.aws.hooks.sns import SnsHook
+from airflow.providers.common.compat.notifier import BaseNotifier
 
 
 class SnsNotifier(BaseNotifier):
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/notifications/sqs.py b/providers/amazon/src/airflow/providers/amazon/aws/notifications/sqs.py
index e0188542c83..38e0663521f 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/notifications/sqs.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/notifications/sqs.py
@@ -20,8 +20,8 @@ from __future__ import annotations
 from collections.abc import Sequence
 from functools import cached_property
 
-from airflow.notifications.basenotifier import BaseNotifier
 from airflow.providers.amazon.aws.hooks.sqs import SqsHook
+from airflow.providers.common.compat.notifier import BaseNotifier
 
 
 class SqsNotifier(BaseNotifier):
diff --git a/providers/amazon/src/airflow/providers/amazon/get_provider_info.py b/providers/amazon/src/airflow/providers/amazon/get_provider_info.py
index 912107bc4fc..5e3fb340b07 100644
--- a/providers/amazon/src/airflow/providers/amazon/get_provider_info.py
+++ b/providers/amazon/src/airflow/providers/amazon/get_provider_info.py
@@ -1372,7 +1372,7 @@ def get_provider_info():
         "executors": ["airflow.providers.amazon.aws.executors.ecs.ecs_executor.AwsEcsExecutor"],
         "dependencies": [
             "apache-airflow>=2.9.0",
-            "apache-airflow-providers-common-compat>=1.3.0",
+            "apache-airflow-providers-common-compat>=1.6.0",
             "apache-airflow-providers-common-sql>=1.20.0",
             "apache-airflow-providers-http",
             "boto3>=1.37.0",
diff --git a/providers/apprise/README.rst b/providers/apprise/README.rst
index e2a1d99d1a0..610a0a86f02 100644
--- a/providers/apprise/README.rst
+++ b/providers/apprise/README.rst
@@ -50,12 +50,32 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12
 Requirements
 ------------
 
-==================  ==================
-PIP package         Version required
-==================  ==================
-``apache-airflow``  ``>=2.9.0``
-``apprise``         ``>=1.8.0``
-==================  ==================
+==========================================  ==================
+PIP package                                 Version required
+==========================================  ==================
+``apache-airflow``                          ``>=2.9.0``
+``apache-airflow-providers-common-compat``  ``>=1.6.0``
+``apprise``                                 ``>=1.8.0``
+==========================================  ==================
+
+Cross provider package dependencies
+-----------------------------------
+
+Those are dependencies that might be needed in order to use all the features of the package.
+You need to install the specified providers in order to use them.
+
+You can install such cross-provider dependencies when installing from PyPI. For example:
+
+.. code-block:: bash
+
+    pip install apache-airflow-providers-apprise[common.compat]
+
+
+==================================================================================================================  =================
+Dependent package                                                                                                   Extra
+==================================================================================================================  =================
+`apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_  ``common.compat``
+==================================================================================================================  =================
 
 The changelog for the provider package can be found in the
 `changelog <https://airflow.apache.org/docs/apache-airflow-providers-apprise/2.0.1/changelog.html>`_.
diff --git a/providers/apprise/pyproject.toml b/providers/apprise/pyproject.toml
index a637d5c4fef..ec832fc2b7e 100644
--- a/providers/apprise/pyproject.toml
+++ b/providers/apprise/pyproject.toml
@@ -58,6 +58,7 @@ requires-python = "~=3.9"
 # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
 dependencies = [
     "apache-airflow>=2.9.0",
+    "apache-airflow-providers-common-compat>=1.6.0",
     "apprise>=1.8.0",
 ]
 
@@ -66,6 +67,7 @@ dev = [
     "apache-airflow",
     "apache-airflow-task-sdk",
     "apache-airflow-devel-common",
+    "apache-airflow-providers-common-compat",
     # Additional devel dependencies (do not remove this line and add extra development dependencies)
 ]
 
diff --git a/providers/apprise/src/airflow/providers/apprise/get_provider_info.py b/providers/apprise/src/airflow/providers/apprise/get_provider_info.py
index 612d3401300..bb74b4813fd 100644
--- a/providers/apprise/src/airflow/providers/apprise/get_provider_info.py
+++ b/providers/apprise/src/airflow/providers/apprise/get_provider_info.py
@@ -61,6 +61,10 @@ def get_provider_info():
             }
         ],
         "notifications": ["airflow.providers.apprise.notifications.apprise.AppriseNotifier"],
-        "dependencies": ["apache-airflow>=2.9.0", "apprise>=1.8.0"],
+        "dependencies": [
+            "apache-airflow>=2.9.0",
+            "apache-airflow-providers-common-compat>=1.6.0",
+            "apprise>=1.8.0",
+        ],
         "devel-dependencies": [],
     }
diff --git a/providers/apprise/src/airflow/providers/apprise/notifications/apprise.py b/providers/apprise/src/airflow/providers/apprise/notifications/apprise.py
index a1fe7e3c4be..e4774df5007 100644
--- a/providers/apprise/src/airflow/providers/apprise/notifications/apprise.py
+++ b/providers/apprise/src/airflow/providers/apprise/notifications/apprise.py
@@ -22,8 +22,8 @@ from functools import cached_property
 
 from apprise import AppriseConfig, NotifyFormat, NotifyType
 
-from airflow.notifications.basenotifier import BaseNotifier
 from airflow.providers.apprise.hooks.apprise import AppriseHook
+from airflow.providers.common.compat.notifier import BaseNotifier
 
 
 class AppriseNotifier(BaseNotifier):
diff --git a/providers/atlassian/jira/README.rst b/providers/atlassian/jira/README.rst
index aa99398c2e6..f903d3d4711 100644
--- a/providers/atlassian/jira/README.rst
+++ b/providers/atlassian/jira/README.rst
@@ -50,12 +50,32 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12
 Requirements
 ------------
 
-========================  ==================
-PIP package               Version required
-========================  ==================
-``apache-airflow``        ``>=2.9.0``
-``atlassian-python-api``  ``>3.41.10``
-========================  ==================
+==========================================  ==================
+PIP package                                 Version required
+==========================================  ==================
+``apache-airflow``                          ``>=2.9.0``
+``apache-airflow-providers-common-compat``  ``>=1.6.0``
+``atlassian-python-api``                    ``>3.41.10``
+==========================================  ==================
+
+Cross provider package dependencies
+-----------------------------------
+
+Those are dependencies that might be needed in order to use all the features of the package.
+You need to install the specified providers in order to use them.
+
+You can install such cross-provider dependencies when installing from PyPI. For example:
+
+.. code-block:: bash
+
+    pip install apache-airflow-providers-atlassian-jira[common.compat]
+
+
+==================================================================================================================  =================
+Dependent package                                                                                                   Extra
+==================================================================================================================  =================
+`apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_  ``common.compat``
+==================================================================================================================  =================
 
 The changelog for the provider package can be found in the
 `changelog <https://airflow.apache.org/docs/apache-airflow-providers-atlassian-jira/3.0.1/changelog.html>`_.
diff --git a/providers/atlassian/jira/pyproject.toml b/providers/atlassian/jira/pyproject.toml
index f2b64ecbbbc..8eee00d91e2 100644
--- a/providers/atlassian/jira/pyproject.toml
+++ b/providers/atlassian/jira/pyproject.toml
@@ -58,6 +58,7 @@ requires-python = "~=3.9"
 # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
 dependencies = [
     "apache-airflow>=2.9.0",
+    "apache-airflow-providers-common-compat>=1.6.0",
     "atlassian-python-api>3.41.10",
 ]
 
@@ -66,6 +67,7 @@ dev = [
     "apache-airflow",
     "apache-airflow-task-sdk",
     "apache-airflow-devel-common",
+    "apache-airflow-providers-common-compat",
     # Additional devel dependencies (do not remove this line and add extra development dependencies)
 ]
 
diff --git a/providers/atlassian/jira/src/airflow/providers/atlassian/jira/get_provider_info.py b/providers/atlassian/jira/src/airflow/providers/atlassian/jira/get_provider_info.py
index e0b69fae223..9a2afece9f8 100644
--- a/providers/atlassian/jira/src/airflow/providers/atlassian/jira/get_provider_info.py
+++ b/providers/atlassian/jira/src/airflow/providers/atlassian/jira/get_provider_info.py
@@ -80,6 +80,10 @@ def get_provider_info():
             }
         ],
         "notifications": ["airflow.providers.atlassian.jira.notifications.jira.JiraNotifier"],
-        "dependencies": ["apache-airflow>=2.9.0", "atlassian-python-api>3.41.10"],
+        "dependencies": [
+            "apache-airflow>=2.9.0",
+            "apache-airflow-providers-common-compat>=1.6.0",
+            "atlassian-python-api>3.41.10",
+        ],
         "devel-dependencies": [],
     }
diff --git a/providers/atlassian/jira/src/airflow/providers/atlassian/jira/notifications/jira.py b/providers/atlassian/jira/src/airflow/providers/atlassian/jira/notifications/jira.py
index 9e639fa20c1..151d225575e 100644
--- a/providers/atlassian/jira/src/airflow/providers/atlassian/jira/notifications/jira.py
+++ b/providers/atlassian/jira/src/airflow/providers/atlassian/jira/notifications/jira.py
@@ -20,8 +20,8 @@ from __future__ import annotations
 from functools import cached_property
 from typing import Any
 
-from airflow.notifications.basenotifier import BaseNotifier
 from airflow.providers.atlassian.jira.hooks.jira import JiraHook
+from airflow.providers.common.compat.notifier import BaseNotifier
 
 
 class JiraNotifier(BaseNotifier):
diff --git a/providers/common/compat/README.rst b/providers/common/compat/README.rst
index 149a1fe275d..f801a5b1256 100644
--- a/providers/common/compat/README.rst
+++ b/providers/common/compat/README.rst
@@ -23,7 +23,7 @@
 
 Package ``apache-airflow-providers-common-compat``
 
-Release: ``1.6.0b1``
+Release: ``1.6.0``
 
 
 ``Common Compatibility Provider - providing compatibility code for previous Airflow versions.``
@@ -36,7 +36,7 @@ This is a provider package for ``common.compat`` provider. All classes for this
 are in ``airflow.providers.common.compat`` python package.
 
 You can find package information and changelog for the provider
-in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0b1/>`_.
+in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0/>`_.
 
 Installation
 ------------
@@ -77,4 +77,4 @@ Dependent package
 ==============================================================================================================  ===============
 
 The changelog for the provider package can be found in the
-`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0b1/changelog.html>`_.
+`changelog <https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0/changelog.html>`_.
diff --git a/providers/common/compat/provider.yaml b/providers/common/compat/provider.yaml
index 6c31c6406c2..b5a8367de0c 100644
--- a/providers/common/compat/provider.yaml
+++ b/providers/common/compat/provider.yaml
@@ -25,7 +25,7 @@ state: ready
 source-date-epoch: 1742480214
 # note that those versions are maintained by release manager - do not update them manually
 versions:
-  - 1.6.0b1
+  - 1.6.0
   - 1.5.1
   - 1.5.0
   - 1.3.0
diff --git a/providers/common/compat/pyproject.toml b/providers/common/compat/pyproject.toml
index 3de69489d94..cbd60597169 100644
--- a/providers/common/compat/pyproject.toml
+++ b/providers/common/compat/pyproject.toml
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
 
 [project]
 name = "apache-airflow-providers-common-compat"
-version = "1.6.0b1"
+version = "1.6.0"
 description = "Provider package apache-airflow-providers-common-compat for Apache Airflow"
 readme = "README.rst"
 authors = [
@@ -91,8 +91,8 @@ apache-airflow-providers-fab = {workspace = true}
 apache-airflow-providers-standard = {workspace = true}
 
 [project.urls]
-"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0b1"
-"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0b1/changelog.html"
+"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0"
+"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-common-compat/1.6.0/changelog.html"
 "Bug Tracker" = "https://github.com/apache/airflow/issues"
 "Source Code" = "https://github.com/apache/airflow"
 "Slack Chat" = "https://s.apache.org/airflow-slack"
diff --git a/providers/common/compat/src/airflow/providers/common/compat/__init__.py b/providers/common/compat/src/airflow/providers/common/compat/__init__.py
index ff1c95140f5..ebf33970e4e 100644
--- a/providers/common/compat/src/airflow/providers/common/compat/__init__.py
+++ b/providers/common/compat/src/airflow/providers/common/compat/__init__.py
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
 
 __all__ = ["__version__"]
 
-__version__ = "1.6.0b1"
+__version__ = "1.6.0"
 
 if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
     "2.9.0"
diff --git a/providers/common/compat/src/airflow/providers/common/compat/get_provider_info.py b/providers/common/compat/src/airflow/providers/common/compat/get_provider_info.py
index 744b6ce9235..dd35ceccaa2 100644
--- a/providers/common/compat/src/airflow/providers/common/compat/get_provider_info.py
+++ b/providers/common/compat/src/airflow/providers/common/compat/get_provider_info.py
@@ -28,7 +28,7 @@ def get_provider_info():
         "description": "``Common Compatibility Provider - providing compatibility code for previous Airflow versions.``\n",
         "state": "ready",
         "source-date-epoch": 1742480214,
-        "versions": ["1.6.0b1", "1.5.1", "1.5.0", "1.3.0", "1.2.2", "1.2.1", "1.2.0", "1.1.0", "1.0.0"],
+        "versions": ["1.6.0", "1.5.1", "1.5.0", "1.3.0", "1.2.2", "1.2.1", "1.2.0", "1.1.0", "1.0.0"],
         "integrations": [
             {
                 "integration-name": "Common Compat",
diff --git a/airflow-core/tests/unit/notifications/__init__.py b/providers/common/compat/src/airflow/providers/common/compat/notifier/__init__.py
similarity index 65%
rename from airflow-core/tests/unit/notifications/__init__.py
rename to providers/common/compat/src/airflow/providers/common/compat/notifier/__init__.py
index 13a83393a91..91ce1cdb71d 100644
--- a/airflow-core/tests/unit/notifications/__init__.py
+++ b/providers/common/compat/src/airflow/providers/common/compat/notifier/__init__.py
@@ -14,3 +14,19 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+from airflow.providers.common.compat.version_compat import AIRFLOW_V_3_0_PLUS
+
+if TYPE_CHECKING:
+    from airflow.sdk.definitions.notifier import BaseNotifier
+elif AIRFLOW_V_3_0_PLUS:
+    from airflow.sdk.definitions.notifier import BaseNotifier
+else:
+    from airflow.notifications.basenotifier import BaseNotifier
+
+
+__all__ = ["BaseNotifier"]
diff --git a/providers/discord/README.rst b/providers/discord/README.rst
index a3d40eb42cd..dbbdbbaaaea 100644
--- a/providers/discord/README.rst
+++ b/providers/discord/README.rst
@@ -50,12 +50,13 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12
 Requirements
 ------------
 
-=================================  ==================
-PIP package                        Version required
-=================================  ==================
-``apache-airflow``                 ``>=2.9.0``
+==========================================  ==================
+PIP package                                 Version required
+==========================================  ==================
+``apache-airflow``                          ``>=2.9.0``
+``apache-airflow-providers-common-compat``  ``>=1.6.0``
 ``apache-airflow-providers-http``
-=================================  ==================
+==========================================  ==================
 
 Cross provider package dependencies
 -----------------------------------
@@ -67,14 +68,15 @@ You can install such cross-provider dependencies when installing from PyPI. For
 
 .. code-block:: bash
 
-    pip install apache-airflow-providers-discord[http]
+    pip install apache-airflow-providers-discord[common.compat]
 
 
-================================================================================================  ========
-Dependent package                                                                                 Extra
-================================================================================================  ========
-`apache-airflow-providers-http <https://airflow.apache.org/docs/apache-airflow-providers-http>`_  ``http``
-================================================================================================  ========
+==================================================================================================================  =================
+Dependent package                                                                                                   Extra
+==================================================================================================================  =================
+`apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_  ``common.compat``
+`apache-airflow-providers-http <https://airflow.apache.org/docs/apache-airflow-providers-http>`_                    ``http``
+==================================================================================================================  =================
 
 The changelog for the provider package can be found in the
 `changelog <https://airflow.apache.org/docs/apache-airflow-providers-discord/3.9.3/changelog.html>`_.
diff --git a/providers/discord/pyproject.toml b/providers/discord/pyproject.toml
index 16da0b05dad..b42b49e6b09 100644
--- a/providers/discord/pyproject.toml
+++ b/providers/discord/pyproject.toml
@@ -58,6 +58,7 @@ requires-python = "~=3.9"
 # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
 dependencies = [
     "apache-airflow>=2.9.0",
+    "apache-airflow-providers-common-compat>=1.6.0",
     "apache-airflow-providers-http",
 ]
 
@@ -66,6 +67,7 @@ dev = [
     "apache-airflow",
     "apache-airflow-task-sdk",
     "apache-airflow-devel-common",
+    "apache-airflow-providers-common-compat",
     "apache-airflow-providers-http",
     # Additional devel dependencies (do not remove this line and add extra development dependencies)
 ]
diff --git a/providers/discord/src/airflow/providers/discord/get_provider_info.py b/providers/discord/src/airflow/providers/discord/get_provider_info.py
index 5fbee378318..4de47b35d3b 100644
--- a/providers/discord/src/airflow/providers/discord/get_provider_info.py
+++ b/providers/discord/src/airflow/providers/discord/get_provider_info.py
@@ -80,6 +80,10 @@ def get_provider_info():
             }
         ],
         "notifications": ["airflow.providers.discord.notifications.discord.DiscordNotifier"],
-        "dependencies": ["apache-airflow>=2.9.0", "apache-airflow-providers-http"],
+        "dependencies": [
+            "apache-airflow>=2.9.0",
+            "apache-airflow-providers-common-compat>=1.6.0",
+            "apache-airflow-providers-http",
+        ],
         "devel-dependencies": [],
     }
diff --git a/providers/discord/src/airflow/providers/discord/notifications/discord.py b/providers/discord/src/airflow/providers/discord/notifications/discord.py
index d6a3407db60..dbea1c504c1 100644
--- a/providers/discord/src/airflow/providers/discord/notifications/discord.py
+++ b/providers/discord/src/airflow/providers/discord/notifications/discord.py
@@ -19,7 +19,7 @@ from __future__ import annotations
 
 from functools import cached_property
 
-from airflow.notifications.basenotifier import BaseNotifier
+from airflow.providers.common.compat.notifier import BaseNotifier
 from airflow.providers.discord.hooks.discord_webhook import DiscordWebhookHook
 
 ICON_URL: str = "https://raw.githubusercontent.com/apache/airflow/main/airflow/www/static/pin_100.png"
diff --git a/providers/opsgenie/README.rst b/providers/opsgenie/README.rst
index 5ab10e0385b..779eaea76e3 100644
--- a/providers/opsgenie/README.rst
+++ b/providers/opsgenie/README.rst
@@ -50,12 +50,32 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12
 Requirements
 ------------
 
-==================  ==================
-PIP package         Version required
-==================  ==================
-``apache-airflow``  ``>=2.9.0``
-``opsgenie-sdk``    ``>=2.1.5``
-==================  ==================
+==========================================  ==================
+PIP package                                 Version required
+==========================================  ==================
+``apache-airflow``                          ``>=2.9.0``
+``apache-airflow-providers-common-compat``  ``>=1.6.0``
+``opsgenie-sdk``                            ``>=2.1.5``
+==========================================  ==================
+
+Cross provider package dependencies
+-----------------------------------
+
+Those are dependencies that might be needed in order to use all the features of the package.
+You need to install the specified providers in order to use them.
+
+You can install such cross-provider dependencies when installing from PyPI. For example:
+
+.. code-block:: bash
+
+    pip install apache-airflow-providers-opsgenie[common.compat]
+
+
+==================================================================================================================  =================
+Dependent package                                                                                                   Extra
+==================================================================================================================  =================
+`apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_  ``common.compat``
+==================================================================================================================  =================
 
 The changelog for the provider package can be found in the
 `changelog <https://airflow.apache.org/docs/apache-airflow-providers-opsgenie/5.8.2/changelog.html>`_.
diff --git a/providers/opsgenie/pyproject.toml b/providers/opsgenie/pyproject.toml
index 6dac35b633e..7290b4c896f 100644
--- a/providers/opsgenie/pyproject.toml
+++ b/providers/opsgenie/pyproject.toml
@@ -58,6 +58,7 @@ requires-python = "~=3.9"
 # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
 dependencies = [
     "apache-airflow>=2.9.0",
+    "apache-airflow-providers-common-compat>=1.6.0",
     "opsgenie-sdk>=2.1.5",
 ]
 
@@ -66,6 +67,7 @@ dev = [
     "apache-airflow",
     "apache-airflow-task-sdk",
     "apache-airflow-devel-common",
+    "apache-airflow-providers-common-compat",
     # Additional devel dependencies (do not remove this line and add extra development dependencies)
 ]
 
diff --git a/providers/opsgenie/src/airflow/providers/opsgenie/get_provider_info.py b/providers/opsgenie/src/airflow/providers/opsgenie/get_provider_info.py
index 3610e9078c9..ac62c43bf9a 100644
--- a/providers/opsgenie/src/airflow/providers/opsgenie/get_provider_info.py
+++ b/providers/opsgenie/src/airflow/providers/opsgenie/get_provider_info.py
@@ -79,6 +79,10 @@ def get_provider_info():
             }
         ],
         "notifications": ["airflow.providers.opsgenie.notifications.opsgenie.OpsgenieNotifier"],
-        "dependencies": ["apache-airflow>=2.9.0", "opsgenie-sdk>=2.1.5"],
+        "dependencies": [
+            "apache-airflow>=2.9.0",
+            "apache-airflow-providers-common-compat>=1.6.0",
+            "opsgenie-sdk>=2.1.5",
+        ],
         "devel-dependencies": [],
     }
diff --git a/providers/opsgenie/src/airflow/providers/opsgenie/notifications/opsgenie.py b/providers/opsgenie/src/airflow/providers/opsgenie/notifications/opsgenie.py
index f87e2f9ae51..5e561c2a8bc 100644
--- a/providers/opsgenie/src/airflow/providers/opsgenie/notifications/opsgenie.py
+++ b/providers/opsgenie/src/airflow/providers/opsgenie/notifications/opsgenie.py
@@ -21,7 +21,7 @@ from collections.abc import Sequence
 from functools import cached_property
 from typing import TYPE_CHECKING
 
-from airflow.notifications.basenotifier import BaseNotifier
+from airflow.providers.common.compat.notifier import BaseNotifier
 from airflow.providers.opsgenie.hooks.opsgenie import OpsgenieAlertHook
 
 if TYPE_CHECKING:
diff --git a/providers/pagerduty/README.rst b/providers/pagerduty/README.rst
index 743fdef69b9..b1cfa00dc1a 100644
--- a/providers/pagerduty/README.rst
+++ b/providers/pagerduty/README.rst
@@ -50,12 +50,32 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12
 Requirements
 ------------
 
-==================  ==================
-PIP package         Version required
-==================  ==================
-``apache-airflow``  ``>=2.9.0``
-``pdpyras``         ``>=4.2.0``
-==================  ==================
+==========================================  ==================
+PIP package                                 Version required
+==========================================  ==================
+``apache-airflow``                          ``>=2.9.0``
+``apache-airflow-providers-common-compat``  ``>=1.6.0``
+``pdpyras``                                 ``>=4.2.0``
+==========================================  ==================
+
+Cross provider package dependencies
+-----------------------------------
+
+Those are dependencies that might be needed in order to use all the features of the package.
+You need to install the specified providers in order to use them.
+
+You can install such cross-provider dependencies when installing from PyPI. For example:
+
+.. code-block:: bash
+
+    pip install apache-airflow-providers-pagerduty[common.compat]
+
+
+==================================================================================================================  =================
+Dependent package                                                                                                   Extra
+==================================================================================================================  =================
+`apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_  ``common.compat``
+==================================================================================================================  =================
 
 The changelog for the provider package can be found in the
 `changelog <https://airflow.apache.org/docs/apache-airflow-providers-pagerduty/4.0.2/changelog.html>`_.
diff --git a/providers/pagerduty/pyproject.toml b/providers/pagerduty/pyproject.toml
index a27389e1773..031b9e6aad5 100644
--- a/providers/pagerduty/pyproject.toml
+++ b/providers/pagerduty/pyproject.toml
@@ -58,6 +58,7 @@ requires-python = "~=3.9"
 # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
 dependencies = [
     "apache-airflow>=2.9.0",
+    "apache-airflow-providers-common-compat>=1.6.0",
     "pdpyras>=4.2.0",
 ]
 
@@ -66,6 +67,7 @@ dev = [
     "apache-airflow",
     "apache-airflow-task-sdk",
     "apache-airflow-devel-common",
+    "apache-airflow-providers-common-compat",
     # Additional devel dependencies (do not remove this line and add extra development dependencies)
 ]
 
diff --git a/providers/pagerduty/src/airflow/providers/pagerduty/get_provider_info.py b/providers/pagerduty/src/airflow/providers/pagerduty/get_provider_info.py
index c422b4d58a8..8ba12e09415 100644
--- a/providers/pagerduty/src/airflow/providers/pagerduty/get_provider_info.py
+++ b/providers/pagerduty/src/airflow/providers/pagerduty/get_provider_info.py
@@ -85,6 +85,10 @@ def get_provider_info():
             }
         ],
         "notifications": ["airflow.providers.pagerduty.notifications.pagerduty.PagerdutyNotifier"],
-        "dependencies": ["apache-airflow>=2.9.0", "pdpyras>=4.2.0"],
+        "dependencies": [
+            "apache-airflow>=2.9.0",
+            "apache-airflow-providers-common-compat>=1.6.0",
+            "pdpyras>=4.2.0",
+        ],
         "devel-dependencies": [],
     }
diff --git a/providers/pagerduty/src/airflow/providers/pagerduty/notifications/pagerduty.py b/providers/pagerduty/src/airflow/providers/pagerduty/notifications/pagerduty.py
index 21453596854..b976cfff5dd 100644
--- a/providers/pagerduty/src/airflow/providers/pagerduty/notifications/pagerduty.py
+++ b/providers/pagerduty/src/airflow/providers/pagerduty/notifications/pagerduty.py
@@ -20,7 +20,7 @@ from __future__ import annotations
 from functools import cached_property
 from typing import Any
 
-from airflow.notifications.basenotifier import BaseNotifier
+from airflow.providers.common.compat.notifier import BaseNotifier
 from airflow.providers.pagerduty.hooks.pagerduty_events import PagerdutyEventsHook
 
 
diff --git a/providers/slack/README.rst b/providers/slack/README.rst
index 65d1ef0d9b2..c5be1cb6659 100644
--- a/providers/slack/README.rst
+++ b/providers/slack/README.rst
@@ -53,13 +53,14 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12
 Requirements
 ------------
 
-=======================================  ==================
-PIP package                              Version required
-=======================================  ==================
-``apache-airflow``                       ``>=2.9.0``
-``apache-airflow-providers-common-sql``  ``>=1.20.0``
-``slack_sdk``                            ``>=3.19.0``
-=======================================  ==================
+==========================================  ==================
+PIP package                                 Version required
+==========================================  ==================
+``apache-airflow``                          ``>=2.9.0``
+``apache-airflow-providers-common-compat``  ``>=1.6.0``
+``apache-airflow-providers-common-sql``     ``>=1.20.0``
+``slack_sdk``                               ``>=3.19.0``
+==========================================  ==================
 
 Cross provider package dependencies
 -----------------------------------
@@ -71,14 +72,15 @@ You can install such cross-provider dependencies when installing from PyPI. For
 
 .. code-block:: bash
 
-    pip install apache-airflow-providers-slack[common.sql]
+    pip install apache-airflow-providers-slack[common.compat]
 
 
-============================================================================================================  ==============
-Dependent package                                                                                             Extra
-============================================================================================================  ==============
-`apache-airflow-providers-common-sql <https://airflow.apache.org/docs/apache-airflow-providers-common-sql>`_  ``common.sql``
-============================================================================================================  ==============
+==================================================================================================================  =================
+Dependent package                                                                                                   Extra
+==================================================================================================================  =================
+`apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_  ``common.compat``
+`apache-airflow-providers-common-sql <https://airflow.apache.org/docs/apache-airflow-providers-common-sql>`_        ``common.sql``
+==================================================================================================================  =================
 
 The changelog for the provider package can be found in the
 `changelog <https://airflow.apache.org/docs/apache-airflow-providers-slack/9.0.2/changelog.html>`_.
diff --git a/providers/slack/pyproject.toml b/providers/slack/pyproject.toml
index af2c1fb17e4..b9797b20918 100644
--- a/providers/slack/pyproject.toml
+++ b/providers/slack/pyproject.toml
@@ -58,6 +58,7 @@ requires-python = "~=3.9"
 # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
 dependencies = [
     "apache-airflow>=2.9.0",
+    "apache-airflow-providers-common-compat>=1.6.0",
     "apache-airflow-providers-common-sql>=1.20.0",
     "slack_sdk>=3.19.0",
 ]
@@ -67,6 +68,7 @@ dev = [
     "apache-airflow",
     "apache-airflow-task-sdk",
     "apache-airflow-devel-common",
+    "apache-airflow-providers-common-compat",
     "apache-airflow-providers-common-sql",
     # Additional devel dependencies (do not remove this line and add extra development dependencies)
 ]
diff --git a/providers/slack/src/airflow/providers/slack/get_provider_info.py b/providers/slack/src/airflow/providers/slack/get_provider_info.py
index d9fb59f579f..6a55c327881 100644
--- a/providers/slack/src/airflow/providers/slack/get_provider_info.py
+++ b/providers/slack/src/airflow/providers/slack/get_provider_info.py
@@ -135,6 +135,7 @@ def get_provider_info():
         ],
         "dependencies": [
             "apache-airflow>=2.9.0",
+            "apache-airflow-providers-common-compat>=1.6.0",
             "apache-airflow-providers-common-sql>=1.20.0",
             "slack_sdk>=3.19.0",
         ],
diff --git a/providers/slack/src/airflow/providers/slack/notifications/slack.py b/providers/slack/src/airflow/providers/slack/notifications/slack.py
index 0678a759217..d9662328fd7 100644
--- a/providers/slack/src/airflow/providers/slack/notifications/slack.py
+++ b/providers/slack/src/airflow/providers/slack/notifications/slack.py
@@ -22,7 +22,7 @@ from collections.abc import Sequence
 from functools import cached_property
 from typing import TYPE_CHECKING
 
-from airflow.notifications.basenotifier import BaseNotifier
+from airflow.providers.common.compat.notifier import BaseNotifier
 from airflow.providers.slack.hooks.slack import SlackHook
 
 if TYPE_CHECKING:
diff --git a/providers/slack/src/airflow/providers/slack/notifications/slack_webhook.py b/providers/slack/src/airflow/providers/slack/notifications/slack_webhook.py
index a373695201a..36b7ccd851d 100644
--- a/providers/slack/src/airflow/providers/slack/notifications/slack_webhook.py
+++ b/providers/slack/src/airflow/providers/slack/notifications/slack_webhook.py
@@ -20,7 +20,7 @@ from __future__ import annotations
 from functools import cached_property
 from typing import TYPE_CHECKING
 
-from airflow.notifications.basenotifier import BaseNotifier
+from airflow.providers.common.compat.notifier import BaseNotifier
 from airflow.providers.slack.hooks.slack_webhook import SlackWebhookHook
 
 if TYPE_CHECKING:
diff --git a/providers/smtp/README.rst b/providers/smtp/README.rst
index 2e92966bf2f..a9f311dd2fb 100644
--- a/providers/smtp/README.rst
+++ b/providers/smtp/README.rst
@@ -50,11 +50,31 @@ The package supports the following python versions: 3.9,3.10,3.11,3.12
 Requirements
 ------------
 
-==================  ==================
-PIP package         Version required
-==================  ==================
-``apache-airflow``  ``>=2.9.0``
-==================  ==================
+==========================================  ==================
+PIP package                                 Version required
+==========================================  ==================
+``apache-airflow``                          ``>=2.9.0``
+``apache-airflow-providers-common-compat``  ``>=1.6.0``
+==========================================  ==================
+
+Cross provider package dependencies
+-----------------------------------
+
+Those are dependencies that might be needed in order to use all the features of the package.
+You need to install the specified providers in order to use them.
+
+You can install such cross-provider dependencies when installing from PyPI. For example:
+
+.. code-block:: bash
+
+    pip install apache-airflow-providers-smtp[common.compat]
+
+
+==================================================================================================================  =================
+Dependent package                                                                                                   Extra
+==================================================================================================================  =================
+`apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_  ``common.compat``
+==================================================================================================================  =================
 
 The changelog for the provider package can be found in the
 `changelog <https://airflow.apache.org/docs/apache-airflow-providers-smtp/2.0.1/changelog.html>`_.
diff --git a/providers/smtp/pyproject.toml b/providers/smtp/pyproject.toml
index 2ce581f7026..a459952612e 100644
--- a/providers/smtp/pyproject.toml
+++ b/providers/smtp/pyproject.toml
@@ -58,6 +58,7 @@ requires-python = "~=3.9"
 # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
 dependencies = [
     "apache-airflow>=2.9.0",
+    "apache-airflow-providers-common-compat>=1.6.0",
 ]
 
 [dependency-groups]
@@ -65,6 +66,7 @@ dev = [
     "apache-airflow",
     "apache-airflow-task-sdk",
     "apache-airflow-devel-common",
+    "apache-airflow-providers-common-compat",
     # Additional devel dependencies (do not remove this line and add extra development dependencies)
 ]
 
diff --git a/providers/smtp/src/airflow/providers/smtp/get_provider_info.py b/providers/smtp/src/airflow/providers/smtp/get_provider_info.py
index aca8622998a..c3ca2317f17 100644
--- a/providers/smtp/src/airflow/providers/smtp/get_provider_info.py
+++ b/providers/smtp/src/airflow/providers/smtp/get_provider_info.py
@@ -73,6 +73,6 @@ def get_provider_info():
             {"hook-class-name": "airflow.providers.smtp.hooks.smtp.SmtpHook", "connection-type": "smtp"}
         ],
         "notifications": ["airflow.providers.smtp.notifications.smtp.SmtpNotifier"],
-        "dependencies": ["apache-airflow>=2.9.0"],
+        "dependencies": ["apache-airflow>=2.9.0", "apache-airflow-providers-common-compat>=1.6.0"],
         "devel-dependencies": [],
     }
diff --git a/providers/smtp/src/airflow/providers/smtp/notifications/smtp.py b/providers/smtp/src/airflow/providers/smtp/notifications/smtp.py
index 85f71172d23..721c2e75d87 100644
--- a/providers/smtp/src/airflow/providers/smtp/notifications/smtp.py
+++ b/providers/smtp/src/airflow/providers/smtp/notifications/smtp.py
@@ -22,7 +22,7 @@ from functools import cached_property
 from pathlib import Path
 from typing import Any
 
-from airflow.notifications.basenotifier import BaseNotifier
+from airflow.providers.common.compat.notifier import BaseNotifier
 from airflow.providers.smtp.hooks.smtp import SmtpHook
 
 
diff --git a/scripts/in_container/verify_providers.py b/scripts/in_container/verify_providers.py
index 66222b0acfc..de2a297ae6f 100755
--- a/scripts/in_container/verify_providers.py
+++ b/scripts/in_container/verify_providers.py
@@ -471,7 +471,7 @@ def get_package_class_summary(
 
     # Remove this conditional check after providers are 2.6+ compatible
     try:
-        from airflow.notifications.basenotifier import BaseNotifier
+        from airflow.providers.common.compat.notifier import BaseNotifier
 
         has_notifier = True
     except ImportError:
diff --git a/task-sdk/src/airflow/sdk/__init__.py b/task-sdk/src/airflow/sdk/__init__.py
index edf4215aed0..f0b011bc18e 100644
--- a/task-sdk/src/airflow/sdk/__init__.py
+++ b/task-sdk/src/airflow/sdk/__init__.py
@@ -25,6 +25,7 @@ __all__ = [
     "AssetAll",
     "AssetAny",
     "AssetWatcher",
+    "BaseNotifier",
     "BaseOperator",
     "BaseOperatorLink",
     "Connection",
@@ -59,6 +60,7 @@ if TYPE_CHECKING:
     from airflow.sdk.definitions.context import Context, get_current_context, get_parsing_context
     from airflow.sdk.definitions.dag import DAG, dag
     from airflow.sdk.definitions.edges import EdgeModifier, Label
+    from airflow.sdk.definitions.notifier import BaseNotifier
     from airflow.sdk.definitions.param import Param
     from airflow.sdk.definitions.taskgroup import TaskGroup
     from airflow.sdk.definitions.template import literal
@@ -71,6 +73,7 @@ __lazy_imports: dict[str, str] = {
     "AssetAll": ".definitions.asset",
     "AssetAny": ".definitions.asset",
     "AssetWatcher": ".definitions.asset",
+    "BaseNotifier": ".definitions.notifier",
     "BaseOperator": ".definitions.baseoperator",
     "BaseOperatorLink": ".definitions.baseoperatorlink",
     "Connection": ".definitions.connection",
diff --git a/airflow-core/src/airflow/notifications/basenotifier.py b/task-sdk/src/airflow/sdk/definitions/notifier.py
similarity index 100%
rename from airflow-core/src/airflow/notifications/basenotifier.py
rename to task-sdk/src/airflow/sdk/definitions/notifier.py
diff --git a/airflow-core/tests/unit/notifications/test_notifier.txt b/task-sdk/tests/task_sdk/definitions/notifier/test_notifier.txt
similarity index 100%
rename from airflow-core/tests/unit/notifications/test_notifier.txt
rename to task-sdk/tests/task_sdk/definitions/notifier/test_notifier.txt
diff --git a/airflow-core/tests/unit/notifications/test_basenotifier.py b/task-sdk/tests/task_sdk/definitions/test_notifier.py
similarity index 78%
rename from airflow-core/tests/unit/notifications/test_basenotifier.py
rename to task-sdk/tests/task_sdk/definitions/test_notifier.py
index 554fe4b508e..cc8b5f9659b 100644
--- a/airflow-core/tests/unit/notifications/test_basenotifier.py
+++ b/task-sdk/tests/task_sdk/definitions/test_notifier.py
@@ -23,11 +23,9 @@ from unittest.mock import MagicMock
 import jinja2
 import pytest
 
-from airflow.notifications.basenotifier import BaseNotifier
 from airflow.providers.standard.operators.empty import EmptyOperator
-
-pytestmark = pytest.mark.db_test
-
+from airflow.sdk.definitions.dag import DAG
+from airflow.sdk.definitions.notifier import BaseNotifier
 
 if TYPE_CHECKING:
     from airflow.sdk.definitions.context import Context
@@ -48,8 +46,8 @@ class MockNotifier(BaseNotifier):
 
 
 class TestBaseNotifier:
-    def test_render_message_with_message(self, dag_maker):
-        with dag_maker("test_render_message_with_message") as dag:
+    def test_render_message_with_message(self):
+        with DAG("test_render_message_with_message") as dag:
             EmptyOperator(task_id="test_id")
 
         notifier = MockNotifier(message="Hello {{ dag.dag_id }}")
@@ -57,24 +55,24 @@ class TestBaseNotifier:
         notifier.render_template_fields(context)
         assert notifier.message == "Hello test_render_message_with_message"
 
-    def test_render_message_with_template(self, dag_maker, caplog):
-        with dag_maker("test_render_message_with_template") as dag:
+    def test_render_message_with_template(self, caplog):
+        with DAG("test_render_message_with_template") as dag:
             EmptyOperator(task_id="test_id")
         notifier = MockNotifier(message="test.txt")
         context: Context = {"dag": dag}
         with pytest.raises(jinja2.exceptions.TemplateNotFound):
             notifier.render_template_fields(context)
 
-    def test_render_message_with_template_works(self, dag_maker, caplog):
-        with dag_maker("test_render_message_with_template_works") as dag:
+    def test_render_message_with_template_works(self, caplog):
+        with DAG("test_render_message_with_template_works") as dag:
             EmptyOperator(task_id="test_id")
-        notifier = MockNotifier(message="test_notifier.txt")
+        notifier = MockNotifier(message="notifier/test_notifier.txt")
         context: Context = {"dag": dag}
         notifier.render_template_fields(context)
         assert notifier.message == "Hello test_render_message_with_template_works"
 
-    def test_notifier_call_with_passed_context(self, dag_maker, caplog):
-        with dag_maker("test_render_message_with_template_works") as dag:
+    def test_notifier_call_with_passed_context(self, caplog):
+        with DAG("test_render_message_with_template_works") as dag:
             EmptyOperator(task_id="test_id")
         notifier = MockNotifier(message="Hello {{ dag.dag_id }}")
         notifier.notify = MagicMock()
@@ -83,8 +81,8 @@ class TestBaseNotifier:
         notifier.notify.assert_called_once_with({"dag": dag, "message": "Hello {{ dag.dag_id }}"})
         assert notifier.message == "Hello test_render_message_with_template_works"
 
-    def test_notifier_call_with_prepared_context(self, dag_maker, caplog):
-        with dag_maker("test_render_message_with_template_works"):
+    def test_notifier_call_with_prepared_context(self, caplog):
+        with DAG("test_render_message_with_template_works"):
             EmptyOperator(task_id="test_id")
         notifier = MockNotifier(message="task: {{ task_list[0] }}")
         notifier.notify = MagicMock()