Skip to main content

driftless

Poetry-style lock regeneration for prompts — delivered Dependabot-style.

A prompt is pinned to a model and an eval dataset (like pyproject.toml declares deps and poetry.lock pins what works). When either moves, the prompt goes stale. driftless repairs it through your real eval, validates on holdout, and opens a PR with evidence.

Also described as Dependabot for LLM models — same automation shape, different core insight: prompts are lockfiles, not just config files.

Status: public alpha0.3.x release line on PyPI. Upgrading from 0.2.x? Version 0.3.0 rejects legacy migration.allow_* fields; follow the upgrade guide before updating.

Install

pip install driftless

Quickstart

Try Driftless without provider keys by copying the bundled support-classifier example:

driftless copy-example support-classifier --out-dir driftless-classifier-demo
cd driftless-classifier-demo
driftless validate -w support_classifier
driftless compare -w support_classifier --to gpt-4o-mini

The comparison intentionally fails:

F1          current 1.000   target 0.000
Total cost  current 0.024   target 0.004
FAIL min_f1: 0.000 >= 0.9

Smoke-demo warning: this fixture has only 4 rows. It proves packaging, contract execution, metric gating, evidence rendering, and dry-run PR/issue behavior; it does not establish production quality, statistical confidence, provider behavior, or a successful repair. Use a representative eval and real provider credentials before making a shipping decision.

The target is cheaper, but it is not safe to ship because it fails the classifier's quality gate. Continue through the blocked migration path without provider keys:

driftless migrate -w support_classifier --to gpt-4o-mini --generator none
driftless report -w support_classifier
driftless open-pr -w support_classifier

migrate exits non-zero with BLOCKED, as intended. --generator none makes no repair edits, report renders the saved evidence, and open-pr is a dry run unless you explicitly pass --create.

To reproduce a passing repair on the same bundled example, still without provider keys:

driftless migrate -w support_classifier --to gpt-4o-mini --generator fixture
driftless report -w support_classifier
driftless open-pr -w support_classifier

--generator fixture applies the known-good prompt patch shipped for this example. It proves the published CLI can open a passing evidence artifact; it does not replace --generator llm on a real workflow. The four-row set is still too small for production confidence — see eval confidence.

Product proof

This is the actual output of the cold-install quickstart:

Terminal output from Driftless compare showing a cheaper target blocked by the F1 gate

A larger offline migration was also run against the public support-classifier-svc testbed. It produced draft PR #4 with the generated scorecard, holdout evidence, prompt diff, and model update:

Real GitHub pull request created from a passing Driftless migration

PR #4 is historical proof of a 290-label testbed run. The published CLI reproduces a passing four-row repair with --generator fixture; regenerating PR #4's exact patch still needs provider-backed --generator llm (or the testbed's own simulator) and may differ.

Other bundled examples are available for retrieval QA and tool-using agents:

driftless copy-example rag-qa
driftless copy-example tool-agent

To adopt Driftless in an existing repository, follow the guided existing-repository walkthrough. It starts with scan and configure --apply, then gives a concrete draft-to-contract example, exact editable-path rules, provider-cost guidance, and safety checks before repair or CI. configure always saves a reviewable draft; --apply also creates or safely appends the workflow to root driftless.yml without rewriting existing comments.

How it works

You describe your model-dependent workflow once in driftless.yml: how to run it, how to override the model, which files may be edited, and what quality thresholds must hold. driftless orchestrates your workflow under different models, compares results, repairs allowed files, validates on holdout, and opens a PR with the evidence.

The customer owns the workflow. The tool orchestrates it.

Not a classifier? Choose a grading mode that fits the task — the same loop then optimizes against it, with your team owning the definition of "good":

  • eval.score_field / eval.pass_field — your command emits a numeric score or a pass/fail per record (works for any task: summarization, codegen, agents).
  • eval.fields — structured extraction, scored per field with precision/recall/F1 against the gold record.
  • eval.judge — an LLM judge grades each free-form output against a rubric (with an optional human-scored calibration set for a judge-agreement check). Run driftless judge-check -w <workflow> before optimizing; set max_mae / min_correlation in the contract to gate migrate / compare.

CLI

Command Purpose
copy-example Copy a bundled example project (support-classifier, rag-qa, tool-agent).
init Scaffold a driftless.yml.
init-policy Scaffold a .driftless/policy.yml (when to migrate).
init-ci Scaffold .github/workflows/ for scan, migrate, refine, poll, plan, label audit, and judge check.
scan Find probable LLM usage and at-risk models.
plan Discover at-risk workflows and apply the migration policy (CI triage).
plan --act Migrate + open a PR/issue for every actionable trigger (close the loop).
configure <workflow> Write .driftless/configure/<workflow>.yml; add --apply to create or safely merge root driftless.yml.
calibrate -w <w> Measure the baseline and suggest starting thresholds.
compare -w <w> --to <model> Baseline vs target scorecard; add --enforce for a failing CI exit code.
migrate -w <w> --to <model> Repair + validate + produce migrated files.
--strict-label-audit warns/blocks on duplicate-label conflicts.
refine -w <w> Re-optimize the prompt for a changed eval dataset (model pinned).
poll [--act] Detect external eval-dataset changes and refine on a meaningful change.
validate -w <w> Check the contract parses and the harness runs.
judge-check -w <w> Measure judge↔human agreement on a calibration set (--enforce to gate).
audit-labels -w <w> Find duplicate inputs with disagreeing gold labels (--fail for CI).
report Render the latest migration report.
view Open the optimization run viewer (charts + attempt log).
open-pr -w <w> Open a PR (or issue) from the latest migration result.

Configuring when to migrate

plan reads an optional .driftless/policy.yml — the "dependabot.yml" layer. Scaffold it with driftless init-policy; every field matches a default, so an empty file behaves like no file. It controls which triggers are enabled (deprecation is on and forced; cost/quality/new_model are opportunistic), the thresholds a candidate must clear (min_savings_pct, min_gain), a cooldown_days to skip freshly-released models, candidate allow/deny globs, and an ignore list to snooze specific models or moves. The engine still decides whether a candidate actually passes your eval — policy only decides whether to propose it.

GitHub-native usage

A composite GitHub Action (action.yml) wraps the CLI so scans and migrations can run in CI. See .github/workflows/ for a scheduled deprecation scan, weekly plan --act triage, and manually-triggered migration workflows.

- uses: driftless-dev/driftless@v0.3.4
  with:
    command: scan

Documentation

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

driftless-0.3.4.tar.gz (3.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

driftless-0.3.4-py3-none-any.whl (2.5 MB view details)

Uploaded Python 3

File details

Details for the file driftless-0.3.4.tar.gz.

File metadata

  • Download URL: driftless-0.3.4.tar.gz
  • Upload date:
  • Size: 3.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for driftless-0.3.4.tar.gz
Algorithm Hash digest
SHA256 12a7d131598d832bf759b927b6937358e8ecdecf95dc6de2c871b8bd3975d5da
MD5 88d6a1a8b46e82eb224c8cb4ec571ebb
BLAKE2b-256 be291234ec4ffe943c11ace8f109d8a4fefbf1038c6561f581987a43e7531771

See more details on using hashes here.

Provenance

The following attestation bundles were made for driftless-0.3.4.tar.gz:

Publisher: publish.yml on driftless-dev/driftless

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file driftless-0.3.4-py3-none-any.whl.

File metadata

  • Download URL: driftless-0.3.4-py3-none-any.whl
  • Upload date:
  • Size: 2.5 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for driftless-0.3.4-py3-none-any.whl
Algorithm Hash digest
SHA256 bc0b48e8c1915631cbd22acc9f2f043f0ce61d41d5ad6ffc797ee3ae449cb0ee
MD5 dff4da5b79b9227a7f08392b8896ed2f
BLAKE2b-256 7c615d293788e743f94c9eef879b394fb14efb77d52ed69846546cb076c14992

See more details on using hashes here.

Provenance

The following attestation bundles were made for driftless-0.3.4-py3-none-any.whl:

Publisher: publish.yml on driftless-dev/driftless

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page