Quickstart · CI
Gate pull requests on a pass rate
Run a Forge exam or your own dataset in GitHub Actions, wait for it, and fail the job when any model is below your bar.
Create an API key
In the web app: Settings → API keys. It is shown once.
Store it as a secret
In your repository: Settings → Secrets and variables → Actions → New repository secret, named
VVDEX_API_KEY.Add the workflow
Save this as
.github/workflows/vvdex.yml:
name: VVDex gate
on:
pull_request:
workflow_dispatch:
jobs:
evaluate:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install https://vvdexops.com/downloads/vvdex-0.2.0-py3-none-any.whl
- name: Evaluate
env:
VVDEX_API_KEY: ${{ secrets.VVDEX_API_KEY }}
run: |
vvdex eval run --forge vvdex.ops.gateway-incident-1 --attempts 3 \
--model con_…:gpt-4.1 \
--wait --fail-under 0.6To test your own prompts instead, replace --forge … --attempts 3 with --dataset YOUR_DATASET_ID --grader exact (or the graders your dataset needs). Repeat --model to test several models; every one must clear the threshold.
What the job does
- Starts the run, prints progress, and waits (up to an hour by default; change it with
--timeout). - Prints each model’s pass rate with its 95% interval, errors by kind, cost and latency.
- Writes the same table to the job summary, with a link to the run.
- Sets step outputs
eval-id,statusandgate(passorfail). - Exits
1if any model is below the threshold or has no scored answers, and2if the run failed, was cancelled or timed out.
How many attempts?
Each Forge attempt is a full working session in a fresh sandbox, so a few attempts take minutes, not seconds. Three attempts give a first signal; more narrow the 95% range. An attempt that fails because the model’s server broke is an endpoint error: shown apart and never counted as a wrong answer. A run with no scored attempt fails the gate.
Composite action
The SDK source also contains a composite action, sdk/github-action/action.yml, that wraps the same steps. Its inputs are api-key, models (one per line), forge (with attempts) or dataset (with graders, one per line), name, fail-under (default 0.8), timeout and base-url; its outputs are eval-id, status and gate.
Each Forge attempt counts toward your plan’s daily Forge attempts, and each dataset question asked of each model toward its monthly evaluation cases. A run that would go over the allowance is refused before it starts, and the job exits 2.