AirLLM's release process is triggered by a GitHub Release or manual workflow dispatch; it validates the version tag matches setup.py, copies the top-level README into the package, and publishes to PyPI using OIDC Trusted Publishing without stored credentials. The workflow gates publishing to a protected PyPI environment that enforces review and validation steps, ensuring only intentional, correctly-versioned releases reach users.
A release is triggered by publishing a GitHub Release; .github/workflows/release.yml also supports a manual workflow_dispatch with a dry_run boolean input (default true) that builds but skips publishing to PyPI.[1]
To cut a release, contributors must: (1) bump version= in air_llm/setup.py and commit, then (2) create a GitHub Release whose tag matches that version (e.g. "3.0.1" or "v3.0.1").[1] On a real GitHub Release, .github/workflows/release.yml enforces a version guard: the workflow extracts the version from air_llm/setup.py and compares it to the release tag (stripping a leading v), failing the build with an error if they disagree.[1]
The release workflow uses Python 3.11 for both building and packaging.[1] Before building, .github/workflows/release.yml copies the top-level README.md into air_llm/README.md so the distributed package always contains the current top-level readme.[1] Distribution metadata is validated with twine check dist/* before uploading, catching packaging problems before they reach PyPI.[1]
.github/workflows/release.yml publishes the airllm package to PyPI using PyPI Trusted Publishing (OIDC), so no API tokens need to be stored in the repository.[1] The publish job requires the id-token: write permission, which is mandatory for PyPI Trusted Publishing via OIDC.[1] Publishing is gated by the pypi GitHub environment and only runs on a real GitHub Release or an explicit non-dry-run manual dispatch, ensuring the environment's protections (e.g. required reviewers) are always applied.[1]
Sources