Skip to main content

TofuPilot Python SDK

PyPI version License: MIT Tests

The official Python SDK for TofuPilot. Integrate your hardware test runs into one app with just a few lines of Python.

Installation

pip install tofupilot

Quick Start

import os
from tofupilot.v2 import TofuPilot

with TofuPilot(api_key=os.getenv("TOFUPILOT_API_KEY")) as client:
    run = client.runs.create(
        procedure_id="your-procedure-id",
        serial_number="SN001",
        part_number="PN001",
        outcome="PASS",
    )
    print(f"Run created: {run.id}")

Authentication

Set your API key as an environment variable:

export TOFUPILOT_API_KEY="your-api-key"

Or pass it directly:

client = TofuPilot(api_key="your-api-key")

To point to a different server (e.g. self-hosted):

client = TofuPilot(api_key="your-api-key", server_url="https://your-instance.com/api")

Available Resources

Resource Operations
client.runs list, create, get, delete, update
client.runs.attachments upload, download
client.units list, create, get, delete, update, add_child, remove_child
client.units.attachments upload, download, delete
client.parts list, create, get, delete, update
client.parts.revisions create, get, delete, update
client.procedures list, create, get, delete, update
client.procedures.versions create, get, delete
client.batches list, create, get, delete, update
client.stations list, create, get, get_current, remove, update
client.user list

Usage Examples

Create a run with measurements

from datetime import datetime, timedelta, timezone

run = client.runs.create(
    procedure_id=procedure_id,
    serial_number="SN-001",
    part_number="PCB-V1",
    outcome="PASS",
    started_at=datetime.now(timezone.utc) - timedelta(minutes=5),
    ended_at=datetime.now(timezone.utc),
    phases=[{
        "name": "Voltage Test",
        "outcome": "PASS",
        "started_at": datetime.now(timezone.utc) - timedelta(minutes=5),
        "ended_at": datetime.now(timezone.utc),
        "measurements": [{
            "name": "Output Voltage",
            "outcome": "PASS",
            "measured_value": 3.3,
            "units": "V",
            "validators": [
                {"operator": ">=", "expected_value": 3.0},
                {"operator": "<=", "expected_value": 3.6},
            ],
        }],
    }],
)

List and filter runs

result = client.runs.list(
    part_numbers=["PCB-V1"],
    outcomes=["PASS"],
    limit=10,
)

for run in result.data:
    print(f"{run.id} — {run.unit.serial_number}")

Manage units and sub-units

# Create part and revision
client.parts.create(number="PCB-V1", name="Main Board")
client.parts.revisions.create(part_number="PCB-V1", number="REV-A")

# Create units
client.units.create(serial_number="PARENT-001", part_number="PCB-V1", revision_number="REV-A")
client.units.create(serial_number="CHILD-001", part_number="PCB-V1", revision_number="REV-A")

# Link parent-child
client.units.add_child(serial_number="PARENT-001", child_serial_number="CHILD-001")

Attach files to runs and units

# Upload a file to a run
client.runs.attachments.upload(id=run_id, file="report.pdf")

# Upload a file to a unit
client.units.attachments.upload(serial_number="SN-0001", file="calibration.pdf")

# Download an attachment
run = client.runs.get(id=run_id)
client.runs.attachments.download(run.attachments[0], dest="local-copy.pdf")

# Delete a unit attachment
client.units.attachments.delete(serial_number="SN-0001", ids=[attachment_id])

Error Handling

from tofupilot.v2.models.errors import ErrorNOTFOUND, ErrorBADREQUEST

try:
    client.runs.get(id="nonexistent-id")
except ErrorNOTFOUND as e:
    print(f"Not found: {e.message}")
except ErrorBADREQUEST as e:
    print(f"Bad request: {e.message}")
Exception Status Code
ErrorBADREQUEST 400
ErrorUNAUTHORIZED 401
ErrorFORBIDDEN 403
ErrorNOTFOUND 404
ErrorCONFLICT 409
ErrorUNPROCESSABLECONTENT 422
ErrorINTERNALSERVERERROR 500

Running Tests

cd clients/python-speakeasy
cp tests/.env.local.example tests/.env.local  # Set your API key and URL
python -m pytest tests/v2/

Documentation

License

MIT

Metadata

Release files for tofupilot 2.20.1

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

Source distribution (sdist)

Source distribution for tofupilot 2.20.1
File Size Uploaded
tofupilot-2.20.1.tar.gz 137.5 kB Details

Built distribution (wheel)

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

Total release size: 359.9 kB

Release files / tofupilot-2.20.1.tar.gz

Download URL tofupilot-2.20.1.tar.gz
Size 137.5 kB
Tags Source
SHA-256 checksum
How to use checksums
4f77d48f44f227f558207850fe4bbb30c3ba1e5950b3fb9f5ba9f5cfbfb595bb
BLAKE2b-256 checksum
How to use checksums
4e1fe25e042a825d938801b485fae5c8035e739d3c4c19785347a678c523f64e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Sep 4, 2026.

Transparency log

Release files / tofupilot-2.20.1-py3-none-any.whl

Download URL tofupilot-2.20.1-py3-none-any.whl
Size 222.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
25406400eadd9069d5d371e3917ebe5601b374d07a53f7fe6e0d3a12ffa2dfec
BLAKE2b-256 checksum
How to use checksums
261381dae7ceedbdfb869d93832f9a6f7e284b87a57d464e8bd3b4b1f9eab7c4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Sep 4, 2026.

Transparency log

Release history Release notifications | RSS feed

2.22.2

2 release files

2.22.1

2 release files

2.22.0

2 release files

2.21.0

2 release files

This release

2.20.1 This release

2 release files

2.18.0

2 release files

2.17.0

2 release files

2.16.1

2 release files

2.16.0

2 release files

2.15.2

2 release files

2.15.1

2 release files

2.15.0

2 release files

2.14.0

2 release files

2.13.1

2 release files

2.12.3

2 release files

2.12.2

2 release files

2.12.1

2 release files

2.11.0

2 release files

2.10.0

2 release files

2.8.1

2 release files

2.7.0

2 release files

2.6.0

2 release files

2.5.0

2 release files

2.2.7

2 release files

2.2.6

2 release files

2.2.5

2 release files

2.2.4

2 release files

2.2.3

2 release files

2.2.2

2 release files

2.2.1

2 release files

2.1.0

2 release files

2.0.6

2 release files

2.0.5

2 release files

2.0.4

2 release files

2.0.1

2 release files

1.11.2

2 release files

1.9.4

2 release files

1.9.3

2 release files

1.9.2

2 release files

1.9.1

2 release files

1.9.0

2 release files

1.8.0

2 release files

1.6.2

2 release files

1.6.1

2 release files

1.6

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.1.19

2 release files

0.1.18

2 release files

0.1.17

2 release files

0.1.16

2 release files

0.1.15

2 release files

0.1.14

2 release files

0.1.13

2 release files

0.1.12

2 release files

0.1.11

2 release files

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

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