Release Channels
BenchFlow uses two PyPI release channels with the same package name:- Public releases are stable versions such as
0.6.0. They are created by pushing a matchingv<version>tag. - Internal preview releases are development versions such as
0.6.1.dev123. They are created automatically after thetestworkflow passes for a push tomain.
0.6.0is published on PyPI (tagv0.6.0). Use the public install commands below.maincurrently carries0.6.0. To resume internal-preview builds for the next line, bumpmainto0.6.1.dev0— internal previews then publish as0.6.1.dev<N>automatically after thetestworkflow passes onmain.
Install and Upgrade Commands
Use the public channel by default. Opt into internal preview only when you want the newest build frommain before the next public tag.
Public Python package users:
uv-managed CLI users:
benchflow==0.6.0 pin keeps uv on the public release while
--prerelease allow permits the release-candidate LiteLLM dependency used by
this package line.
Internal preview Python package users:
uv-managed CLI users:
uv
selects the latest 0.6.1.dev<N> package. If a machine was previously
installed with pip install --user or another non-uv tool method, the command
can fail with Executables already exist: bench, benchflow. In that case,
rerun the same command with --force:
uv, keep public dependencies pinned unless
the project intentionally tracks preview builds:
Version Model
pyproject.toml on main should track the next public version as .dev0.
For example, after publishing 0.6.0, bump main to:
test workflow run number:
0.6.1.dev123 is a
preview of the future 0.6.1, while 0.6.0 remains the public release users
get by default.
If main temporarily contains a final public version during the release flow,
the internal preview workflow skips publishing and lets the tag-driven public
workflow handle that commit.
Publishing Flow
Internal preview:- Merge a PR to
main. .github/workflows/test.ymlruns..github/workflows/integration-eval.ymlruns a real rollout after the testedmaincommit passes..github/workflows/internal-preview-release.ymlpublishes to PyPI only if the integration gate passed.
DEEPSEEK_API_KEY, GLM_API_KEY,
QWEN_API_KEY, LITELLM_API_KEY/BF_TOKEN, OPENAI_API_KEY, or
GITHUB_MODELS_TOKEN as GitHub Actions secrets for the job environment.
DAYTONA_API_KEY is optional and enables the Daytona parity and reaper checks.
Public release:
- Update
pyproject.tomlfrom the next.dev0version to the final public version, for example0.6.1.dev0 -> 0.6.1. - Merge the release PR to
main. - Push a matching tag, for example
v0.6.1. .github/workflows/public-release.ymlvalidates the tag, publishes to PyPI, and creates a GitHub Release. The workflow refuses tags whose commits are not contained inorigin/main.- Bump
mainto the next.dev0, for example0.6.2.dev0.
One-Time PyPI Setup
Configure PyPI Trusted Publishing for thebenchflow project. No PyPI token is
stored in GitHub.
Create these PyPI trusted publishers:
| Channel | Repository | Workflow filename | Environment |
|---|---|---|---|
| Internal preview | benchflow-ai/benchflow | internal-preview-release.yml | pypi-internal-preview |
| Public | benchflow-ai/benchflow | public-release.yml | pypi-public |
pypi-internal-preview: used for automatic preview publishing frommain.pypi-public: used for tag-driven public releases.
uv build --no-sources, check distributions with
twine check, and publish with uv publish.