The Task SDK (airflow.sdk) is the stable surface for DAG authors (DAG, task, Asset, Variable, BaseOperator and more); old paths such as airflow.decorators still work with deprecation warnings. Since 3.1 it upgrades independently of the server, because it speaks only the versioned Task Execution API.
That API also made tasks in other languages possible. Airflow 3.3 129 added Java and Go Task SDKs: the task body is a Java method or a Go handler built into a JAR or binary, which the supervisor starts and which calls back over a local socket. The DAG's shape stays in Python, with a @task.stub whose queue routes it to that runtime:
from airflow.sdk import DAG, __version__, task
with DAG("booknest_go_scoring", schedule=None) as dag:
@task
def extract() -> str:
return "landing/orders/date=2026-06-29/orders.jsonl"
@task.stub(queue="golang") # body lives in a compiled Go bundle
def score_orders(path: str): ...
score_orders(extract())
print("task-sdk", __version__)
for t in dag.tasks:
print(f"{t.task_id:13} {type(t).__name__:22} queue={t.queue}")task-sdk 1.3.2 extract _PythonDecoratedOperator queue=default score_orders _StubOperator queue=golang
The file parses on 3.3.2; running it needs the Go bundle and a coordinator on the workers (not run here). The Go SDK's README calls it experimental, so keep production tasks in Python, or call other languages through a container (the Docker 514 and Kubernetes 5,150 providers).