Release Channels
BenchFlow uses two PyPI release channels with the same package name:- Public releases are stable versions such as
0.6.2. They are created by pushing a matchingv<version>tag. - Internal preview releases are development versions such as
0.6.3.dev123. They are created automatically after thetestworkflow passes for a push tomain.
0.6.2is the latest stable release published on PyPI (tagv0.6.2). Use the public install commands below.maintracks the next preview line, currently0.6.3.dev0. Internal previews publish as0.6.3.dev<N>automatically after thetestworkflow and integration gate pass 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:
Executables already exist: bench, benchflow, rerun it
with --force to replace stale entrypoints from an older install.
Internal preview Python package users:
uv-managed CLI users:
uv
selects the latest 0.6.3.dev<N> package once the next preview line is open.
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.2, bump main to:
test workflow run number:
0.6.3.dev123 is a
preview of the future 0.6.3, while 0.6.2 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.3.dev0 -> 0.6.3. - Merge the release PR to
main. - Push a matching tag, for example
v0.6.3. .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.4.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.integration-eval-secrets: used by the integration-eval gate for provider credentials. Do not reusepypi-internal-previewhere, because every Actions job environment creates a GitHub deployment record and can make the PyPI preview environment appear stale or inactive.
uv build --no-sources, check distributions with
twine check, and publish with uv publish.