# In providers/{provider_name}/src/airflow/providers/{provider_name}/version_compat.py
from __future__ import annotations
def get_base_airflow_version_tuple() -> tuple[int, int, int]:
from packaging.version import Version
from airflow import __version__
airflow_version = Version(__version__)
return airflow_version.major, airflow_version.minor, airflow_version.micro
AIRFLOW_V_3_0_PLUS = get_base_airflow_version_tuple() >= (3, 0, 0)
if AIRFLOW_V_3_0_PLUS:
from airflow.sdk import BaseOperator
else:
from airflow.models import BaseOperator
__all__ = ["AIRFLOW_V_3_0_PLUS", "BaseOperator"]
from airflow.models.baseoperator import BaseOperator
def persist(context: Context, task_instance: BaseOperator, url: str):
task_instance.xcom_push(key="link_key", value=url)
def persist(context: Context, url: str):
context["task_instance"].xcom_push(key="link_key", value=url)
# Run provider tests
breeze testing providers-tests --test-type "Providers[{provider_name}]"
We need community help to migrate all provider packages to use the new Task SDK
BaseOperatorimport for Airflow 3.0 compatibility while maintaining backward compatibility with Airflow 2.x.Background
With Airflow 3.0, the
BaseOperatorhas moved to the Task SDK (airflow.sdk). All provider packages need to be updated to use version-compatible imports to work with both Airflow 2.x and 3.x versions.Migration Tasks
Use #52366 & #52292 as reference.
Each provider needs these updates:
version_compat.pywith standardized version compatibility patternBaseOperatorLink.persistmethods that causeAttributeErrorwith SDK BaseOperatordag_maker.run_ti()instead of deprecated patternsProvider Status Checklist
models.BaseOperatorto Task SDK one for Alibaba & Airbyte #52335models.BaseOperatorto Task SDK one for Amazon Provider #52667models.BaseOperatorto Task SDK for apache/hdfs #52505models.BaseOperatorto Task SDK for apache/hive #52453models.BaseOperatorto Task SDK for apache/impala #52455models.BaseOperatorto Task SDK for apache/livy #52499models.BaseOperatorto Task SDK one for Apache Pig #52375models.BaseOperatorto Task SDK one for Apache TinkerPop #52400models.BaseOperatorto Task SDK one for Asana & Arangodb #52374models.BaseOperatorto Task SDK one for Asana & Arangodb #52374models.BaseOperatorto Task SDK one for Atlassian #52376models.BaseOperatorto Task SDK one for DBT & Databricks #52377BaseSensorOperatorto Task SDK fordatadog#52583models.BaseOperatorto Task SDK one for DBT & Databricks #52377BaseOperatorto Task SDK fordingding#52577models.BaseOperatorto Task SDK one for Google Provider #52366models.BaseOperatorto Task SDK for apache/http #52506 | Provider Migration: ReplaceBaseOperatorto Task SDK forapache/http#52528models.BaseSensorOperatorto Task SDK one for Mongo #52566BaseOperatorto Task SDK forOpenAI#52561models.BaseOperatorto Task SDK one for OpsGenie #52564BaseOperatorto Task SDK forPapermill#52565BaseOperatorBaseOperatorto Task SDK forPinecone#52563BaseOperatorto Task SDK forsalesforce#52587BaseOperatorto Task SDK forsamba#52588models.BaseOperatorto Task SDK one for SFTP #52435BaseOperatorto Task SDK forsingularity#52590BaseOperatorto Task SDK forssh#52558models.BaseOperatorto Task SDK one for Standard Provider #52292models.BaseOperatorto Task SDK one for Tableau, Telegram, and Teradata #52642models.BaseOperatorto Task SDK one for Tableau, Telegram, and Teradata #52642models.BaseOperatorto Task SDK one for Tableau, Telegram, and Teradata #52642Implementation Guide
If using AI Agents, refer to #52378 (comment)
Step 1: Create version_compat.py
Step 2: Update imports
Replace:
With:
Step 3: Fix BaseOperatorLink.persist methods
Replace:
With:
Step 4: Update test patterns
Replace
operator.run()withdag_maker.run_ti(task_id, dr). Use #52366 & #52292 as reference.Test your changes:
How to Contribute