Skip to main content

buildwright

The craftsman who builds per the spec — one model per agent: mechanical steps go to the local model (cheap, fast), important decisions to the remote one (strong). The role→model mapping is configuration, not code — switching models touches zero lines of pipeline.

Install

uv tool install buildwright      # once published to PyPI
# or for development:
uv sync

Division of roles (one tool, one job)

Piece Role Where it lives
LangGraph the ORDER of the steps (graph, state, retries) graph.py
PydanticAI EACH STEP (agent with structured output) agents.py
LiteLLM WHO serves the model (optional proxy, fallbacks) litellm/config.yaml
Langfuse WHETHER IT WORKED (traces, scores) observability.py

The pipeline

START → plan (local)  →  execute (remote)  →  review (local)  →  END
        Plan struct.      final answer        Review struct.

Each node is a PydanticAI agent; the model is decided by the role in Settings (BW_ROLE_*), resolved against the models.yaml registry.

Quickstart

uv sync
cp .env.example .env          # adjust BW_ROLE_* and keys

uv run buildwright models     # list local and remote models
uv run buildwright roles      # role -> model mapping
uv run buildwright ask "write a snake game in python with pygame"

With no endpoints available, ask fails naming the exact model and the missing env var.

Local and remote models

The whole registry speaks OpenAI-compatible (models.yaml):

  • local/qwen3 → Ollama at localhost:11434/v1
  • local/llamacpp → llama-server at localhost:8080/v1 (your GGUF)
  • remote/gpt-4o-mini, gpt-4o → OpenAI (key via OPENAI_API_KEY)
  • remote/claude-sonnet → Anthropic's OpenAI-compat layer
  • litellm/* → via the LiteLLM proxy (see docker-compose.yml)

Registry resolution: BW_MODELS_FILE > project-local ./models.yaml > the models.yaml bundled with the package. Adding a model = adding 5 lines. Reassigning one to an agent = changing a BW_ROLE_* in .env.

Optional full stack (LiteLLM + Langfuse + Ollama)

With Docker, docker compose up -d brings up LiteLLM (routing/fallbacks), Langfuse (traces) and Ollama. Langfuse keys show up in its admin UI; copy them to .env and tracing turns itself on (without keys, the tracer is a no-op).

Publishing to PyPI

Trusted publishing — no API tokens:

  1. Create github.com/jordimarsal/buildwright and push main.
  2. On pypi.org: Add a pending publisher → owner jordimarsal, repo buildwright, workflow release.yml, environment pypi.
  3. git tag v0.1.0 && git push --tags → the workflow runs uv build and publishes.

Tests

uv run pytest        # offline: pydantic-ai's TestModel, zero network

Anti-mess rules

  1. Everything speaks OpenAI protocol; PydanticAI never imports litellm.
  2. One agent = one node = one job. No agents inside agents.
  3. Tracing registered exactly once (observability.py); never scattered.
  4. Offline evals in CI rule; Langfuse is production monitoring.
  5. Each piece joins when it has a real trigger (fallbacks→LiteLLM, non-linear flow→LangGraph is already in).

Metadata

Release files for buildwright 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for buildwright 0.1.0
File Size Uploaded Provenance Actions
buildwright-0.1.0.tar.gz 174.9 kB With provenance Details for buildwright-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for buildwright 0.1.0
File Interpreter ABI Platform Actions
buildwright-0.1.0-py3-none-any.whl Python 3 none any Details for buildwright-0.1.0-py3-none-any.whl

Total release size: 185.7 kB

Release files / buildwright-0.1.0.tar.gz

Download URL buildwright-0.1.0.tar.gz
Size 174.9 kB
Tags Source
SHA-256 checksum
How to use checksums
7a1c65e966ebe80c7b2a9f5e5defd825e567ff0270c4a5a87b46bc39260d31c6
BLAKE2b-256 checksum
How to use checksums
a8ede9d100903dbe8cd7ea46a54a9550cc17079a6f0e726729233652575534b0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.

Transparency log

Release files / buildwright-0.1.0-py3-none-any.whl

Download URL buildwright-0.1.0-py3-none-any.whl
Size 10.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3ef4e1def5b49ee57137ad62184d0de0ef466d5a515f03a0f711916d19b9678d
BLAKE2b-256 checksum
How to use checksums
5289ba7f78aa1bed6eedb96e3170a2dac5632fb5cf106496016cb3b58a120b55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.

Transparency log

Security for buildwright 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for buildwright-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page