Skip to main content
Assets are Python nodes that produce or observe an external artifact - an exported file, a published dataset, a dashboard refresh, an ML model. They behave like tasks but add dataset-like metadata (columns, column lineage) and a materialization flag. See Python Nodes for the shared model and the SQL boundary rules.

Defining an asset

Place Python files under assets/ and decorate functions with @asset:
The asset receives an AssetContext and returns through ctx.result(...).

Materialization

Assets record whether they actually produced an artifact via materialized:
  • materialized=True - the artifact was produced this run.
  • materialized=False - the asset ran but produced nothing (e.g. it only observed state). This is not a skip; the node still succeeded.
Only assets have materialized; tasks do not.

Dependencies

Assets declare dependencies with depends_on (a single function, tuple, or list), and may depend on tasks, assets, and loaders:
To read a SQL model or source, declare a typed reference and resolve it at runtime - see SQL references:

Columns and column lineage

Assets can declare a schema for catalog and lineage purposes. This does not enforce anything at runtime; it describes the artifact:
  • columns - column declarations with name, optional type, nullable, description, and meta.
  • column_lineage - maps each asset column to upstream {node, column} references, surfaced in the DAG artifact and integrations.
Tasks and checks do not support columns or column_lineage.

Skipping and retries

Assets support the same ctx.skip(...) and retry behavior as tasks:
See Tasks for the full retry policy fields.

Decorator parameters

Running assets

Assets run during sqb build. Use --no-python to suppress read-side assets while still loading sources.