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.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 tofupilot 2.20.0
File Size Uploaded
tofupilot-2.20.0.tar.gz 137.5 kB Details

Built distribution (wheel)

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

Total release size: 359.9 kB

Release files / tofupilot-2.20.0.tar.gz

Download URL tofupilot-2.20.0.tar.gz
Size 137.5 kB
Tags Source
SHA-256 checksum
How to use checksums
eded94a0b62362550f6a5a981cf8b54620ddf1dd1aafd179e822296e712ddd2c
BLAKE2b-256 checksum
How to use checksums
254b36fa6c0f5c310418a7253be9dcd45ab00bd90aedb9e7033911cc6603e22c
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 3, 2026.

Transparency log

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

Download URL tofupilot-2.20.0-py3-none-any.whl
Size 222.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a8ff41f8f6ba9717d22e2ddac7bf61a3c902bb3861004092b954f96a11efe999
BLAKE2b-256 checksum
How to use checksums
7e46b503571a8680cf1cfce4ea6489ad4a48bbae0d1b0e63b9bf3fe2702e2d5f
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 3, 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.0 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