This document describes the end-to-end process for releasing GraphRAG packages.
Note: The CI publish workflow (python-publish.yml) is currently non-functional. Packages must be published manually as described below.
- Write access to the
microsoft/graphragrepository. - Maintainer or owner role on all GraphRAG packages on PyPI.
- A project-scoped PyPI API token (see PyPI token setup).
uvinstalled locally.- Dependencies synced:
uv sync --all-packages.
Pull the latest changes on main and run the release task:
git checkout main
git pullYou need to run the following commands:
uv run semversioner release
uv run semversioner changelog > CHANGELOG.md
# verify if the version is correct
$version = uv run semversioner current-version
# check this only on Windows:
if (-not $version) { Write-Error "Failed to get version"; exit 1 }
uv run update-toml update --file packages/graphrag/pyproject.toml --path project.version --value $version
uv run update-toml update --file packages/graphrag-common/pyproject.toml --path project.version --value $version
uv run update-toml update --file packages/graphrag-chunking/pyproject.toml --path project.version --value $version
uv run update-toml update --file packages/graphrag-input/pyproject.toml --path project.version --value $version
uv run update-toml update --file packages/graphrag-storage/pyproject.toml --path project.version --value $version
uv run update-toml update --file packages/graphrag-cache/pyproject.toml --path project.version --value $version
uv run update-toml update --file packages/graphrag-vectors/pyproject.toml --path project.version --value $version
uv run update-toml update --file packages/graphrag-llm/pyproject.toml --path project.version --value $version
uv run python -m scripts.update_workspace_dependency_versions
uv sync --all-packagesCheck CHANGELOG.md or any package's pyproject.toml to find the new version,
then move the changes to a release branch:
git switch -c release/v<VERSION>
git add .
git commit -m "Release v<VERSION>"
git tag -a v<VERSION> -m "Release v<VERSION>"
git push origin release/v<VERSION> -uOpen a PR targeting main. CI checks (semver, linting, tests) will run
automatically. Once approved, merge to main.
Once the PR is merged, switch back to main, build, and publish.
You will need a PyPI API token set as the UV_PUBLISH_TOKEN environment
variable. See the
uv docs on publishing
for details.
For each package, go to https://pypi.org/manage/account/ and create a
project-scoped API token under API tokens > Add API token. Select the
specific project as the scope. Copy the token (starts with pypi-...) -- it is
only shown once.
If you want to publish all packages with one token and a single uv publish
call, create an account-scoped token instead of a project-scoped one.
git checkout main
git pull
uv sync --all-packages
uv run poe buildAll wheels and source distributions will be placed in the dist/ directory.
This requires an account-scoped PyPI token:
export UV_PUBLISH_TOKEN="pypi-..."
uv publishIf you need to publish packages one at a time (e.g. with separate per-package
tokens), publish them in dependency order. The graphrag meta-package depends on
all others, so it goes last.
# 1. graphrag-common (no internal dependencies)
export UV_PUBLISH_TOKEN="pypi-<token-for-graphrag-common>"
uv publish dist/graphrag_common-<version>*
# 2. graphrag-storage (depends on common)
export UV_PUBLISH_TOKEN="pypi-<token-for-graphrag-storage>"
uv publish dist/graphrag_storage-<version>*
# 3. graphrag-chunking (depends on common)
export UV_PUBLISH_TOKEN="pypi-<token-for-graphrag-chunking>"
uv publish dist/graphrag_chunking-<version>*
# 4. graphrag-vectors (depends on common)
export UV_PUBLISH_TOKEN="pypi-<token-for-graphrag-vectors>"
uv publish dist/graphrag_vectors-<version>*
# 5. graphrag-input (depends on common, storage)
export UV_PUBLISH_TOKEN="pypi-<token-for-graphrag-input>"
uv publish dist/graphrag_input-<version>*
# 6. graphrag-cache (depends on common, storage)
export UV_PUBLISH_TOKEN="pypi-<token-for-graphrag-cache>"
uv publish dist/graphrag_cache-<version>*
# 7. graphrag-llm (depends on cache, common)
export UV_PUBLISH_TOKEN="pypi-<token-for-graphrag-llm>"
uv publish dist/graphrag_llm-<version>*
# 8. graphrag (depends on ALL of the above -- publish last)
export UV_PUBLISH_TOKEN="pypi-<token-for-graphrag>"
uv publish dist/graphrag-<version>*After publishing, confirm the new versions are live:
pip index versions graphragOr visit https://pypi.org/project/graphrag/ and check each sub-package page.
- Go to https://github.com/microsoft/graphrag/releases/new.
- Select the tag you pushed earlier (e.g.
v3.1.0). Target:main. - Title: the version number (e.g.
v3.1.0). - Use a previous release as a template for the release notes, or click "Generate release notes".
- Publish the release.
graphrag-common (no internal deps)
├── graphrag-storage (common)
├── graphrag-chunking (common)
├── graphrag-vectors (common)
├── graphrag-input (common, storage)
├── graphrag-cache (common, storage)
├── graphrag-llm (cache, common)
└── graphrag (all of the above)