Great Expectations 1.21.0 was published on 19 August 2026. Numeric batch parameters are now integers on every datasource family. Checkpoint.run() applies one batch_parameters dict to every validation definition it holds, and that dict can now drive a file source and a SQL source in the same run.
The full release notes and downloads are on the GitHub release page.
Integer batch parameters on every datasource family ¶
The families used to disagree on types for the same temporal keys. File and path assets required strings and raised on an integer. SQL assets required integers and silently matched nothing when given a string. Directory assets required integers too, but a string produced an empty batch with no error. A checkpoint that spanned files and a warehouse was unreachable from a single dict.
#12065 makes integers the contract on every family. {"year": 2020, "month": 4} selects the equivalent batch on file, SQL, and directory assets. Digit strings still work. They emit a GxDeprecationWarning that subclasses UserWarning, because a bare DeprecationWarning is suppressed by default Python filters when the caller lives in an imported module. String values are scheduled for removal in 2.0.
The warning is attributed to the caller’s own code and fires once per call site, not once per validation definition. A scheduled job that still passes "2020" and "04" can look clean after the first execution while the 2.0 removal risk keeps accruing.
A SQL request that matches nothing now says why. Previously a malformed parameter produced the same No available batches found. text as genuinely absent data. The message now distinguishes an empty table from candidates that exist but did not match, and names the offending parameter when a value cannot be read as an integer.
Classification is by partitioner kind, never by parameter name. A string column literally named year is not coerced. Booleans stay rejected. File captures stay zero padded strings, so batch IDs do not churn for requests that already work. The path and dataframe parameters are never coerced.
Checkpoint skills ship inside the wheel ¶
#12061 and #12068 add version matched agent skills to the installed package, so the guidance cannot drift from the code on disk. Install with:
python -m great_expectations skills install --target agents
--target claude and --target all are the other selectors. Copy is the default. --symlink and --force exist. A destination with no ownership manifest is refused even under --force. python -m great_expectations skills list reports what the wheel carries and what each target currently holds.
The bundled set covers data sources (gx-configure-data-source), expectations (gx-configure-expectations), and checkpoint orchestration. The checkpoint skill binds assets and suites into validation definitions, groups them into a named checkpoint with post run actions, and verifies with a single run. An expectations session is no longer a terminal state. The flow offers the checkpoint skill next, and declining remains a valid end.
#12073 gates actions that change the environment. Four of eight attachable actions accept environment variable templates in credential fields. The other four treat those fields as plain strings, so a template is stored literally and fails at run time. The skill refuses to write a real credential into checkpoints/<name>.json, which the scaffolded .gitignore does not exclude.
#12063 gates project creation on the user having named the directory. #12055 ships version matched expectation and datasource catalogs that the skills read at runtime.
Outlier expectation and the Redshift extra ¶
#12011 promotes ExpectColumnValuesToNotBeOutliers to supported core across Pandas, SQL, and Spark. The iqr method uses Tukey’s fences (Q1 - multiplier * IQR and Q3 + multiplier * IQR). A value sitting exactly on a fence is an inlier. The std method uses sample standard deviation, and a value exactly at its threshold is still an outlier. Nulls are excluded from the aggregates. Spark uses interpolating percentile rather than percentile_approx.
#12018 promotes a multicolumn values equal expectation.
#12044 drops the GX fork of the Redshift dialect. The redshift extra used to live in sqla1x_only_keys and carried sqlalchemy<2.0.0, which forced sqlalchemy-redshift back to 0.8.14 from April 2023. The extra now points at upstream sqlalchemy-redshift. The import namespace stays sqlalchemy_redshift. great_expectations[gx-redshift] remains a deprecated alias that resolves the same way. Pip has no deprecation mechanism for extras, so there is no warning at install time. #12060 drops the gx-redshift CI marker.
#11937 appends a great-expectations suffix to S3 client user agents, which is useful if you filter access logs by client.
#12077 syncs the SparkDBFSDatasource schema with its deprecation notice. The Trino and ClickHouse SQL backend test harnesses in #12049, #12050, and #12053 are CI machinery. They do not change the runtime contract.
Upgrade notes ¶
Numeric batch parameters should be integers. Digit strings still select the same batches, with a warning, until 2.0. Prefer {"year": 2020, "month": 4} over the string form even when a file regex captures zero padded text.
Prefer great_expectations[redshift] over great_expectations[gx-redshift]. On SQLAlchemy 2 the extra resolves sqlalchemy-redshift 1.0.0. A SQLAlchemy 1.4 environment still falls back to 0.8.14.
If you copy agent skills into a project, rerun python -m great_expectations skills list after the upgrade. Directories the installer did not create, and copies the user has edited, are left alone unless you pass --force.
Where to get it ¶
- Release page: 1.21.0 on GitHub
- Repository: great-expectations/great_expectations
- Tag:
1.21.0