Official Python SDK and CLI for the FastFold API
Project description
FastFold Python SDK and CLI
Python client and CLI for the FastFold Jobs API.
Installation
From the project root:
pip install .
Or for development:
pip install -e .
Requires Python 3.8+.
Authentication
Set your API key in the environment:
export FASTFOLD_API_KEY="sk-...your-api-key"
You can also pass an API key when creating the client or via the CLI flag --api-key.
SDK Usage
from fastfold import Client
client = Client() # Reads FASTFOLD_API_KEY from env by default
myJob = client.fold.create(
sequence="LLGDFFRKSKEKIGKEFKRIVQRIKDFLRNLVPRTES",
model="boltz-2",
is_public=True,
)
print("Job ID:", myJob.id)
# Wait for completion, then fetch CIF URL (boltz-2 complex)
results = client.jobs.wait_for_completion(myJob.id, poll_interval=5.0, timeout=900.0)
print("Status:", results.job.status)
print("CIF URL:", results.cif_url())
print("Mean PLDDT:", results.metrics().mean_PLDDT)
Advanced usage for Boltz-2 with Affinity prediction and pockets:
myJob = client.fold.create(
name="Streptococcal protein G with Pocket",
model="boltz-2",
sequences=[
{
"proteinChain": {
"sequence": "MTYKLILNGKTLKGETTTEAVDAATAEKVFKQYANDNGVDGEWTYDDATKTFTVTE",
"count": 1,
"chain_id": "A",
"label": "mobile-purple",
}
},
{
"ligandSequence": {
"sequence": "ATP",
"count": 1,
"chain_id": "B",
"label": "constitutional-brown",
"is_ccd": True,
"property_type": "affinity",
}
},
],
params={
"modelName": "boltz-2",
"weightSet": "Boltz-2",
"relaxPrediction": True,
"method": "Boltz-2",
"recyclingSteps": 3,
"samplingSteps": 200,
"diffusionSample": 1,
"stepScale": 1.638,
"affinityMwCorrection": False,
"samplingStepsAffinity": 200,
"diffusionSamplesAffinity": 5,
},
constraints={
"pocket": [
{
"binder": {"chain_id": "B"},
"contacts": [
{"chain_id": "A", "res_idx": 12},
{"chain_id": "A", "res_idx": 15},
{"chain_id": "A", "res_idx": 18},
],
}
]
},
)
# Wait for completion and fetch CIF URL (boltz-2 complex)
results = client.jobs.wait_for_completion(myJob.id, poll_interval=5.0, timeout=900.0)
print("Completed CIF URL:", results.cif_url())
metrics = results.metrics()
print("Mean PLDDT:", metrics.mean_PLDDT)
print("ptm_score:", metrics.ptm_score)
print("iptm_score:", metrics.iptm_score)
# Boltz-2 affinity metrics (present only if provided by API)
print("affinity_pred_value:", metrics.affinity_pred_value)
print("affinity_probability_binary:", metrics.affinity_probability_binary)
print("affinity_pred_value1:", metrics.affinity_pred_value1)
print("affinity_probability_binary1:", metrics.affinity_probability_binary1)
print("affinity_pred_value2:", metrics.affinity_pred_value2)
print("affinity_probability_binary2:", metrics.affinity_probability_binary2)
Non-complex multi-sequence artifacts (indexing)
# Create a non-complex job with two protein chains and fetch per-sequence artifacts by index
myJob = client.fold.create(
name="My Protein List",
model="simplefold_100M",
sequences=[
{
"proteinChain": {
"sequence": "MCNTNMSVSTEGAASTSQIPASEQETLVRPKPLLLKLLKSVGAQNDTYTMKEIIFYIGQYIMTKRLYDEKQQHIVYCSNDLLGDVFGVPSFSVKEHRKIYAMIYRNLVAV",
"count": 1,
"chain_id": "A",
"label": "specific-white",
}
},
{
"proteinChain": {
"sequence": "SQETFSGLWKLLPPE",
"count": 1,
"chain_id": "B",
"label": "wily-amethyst",
}
},
],
params={
"modelName": "simplefold_100M",
"weightSet": "SimpleFold",
"method": "SimpleFold",
},
)
# Wait for completion then access per-sequence artifacts by index
results = client.jobs.wait_for_completion(myJob.id, poll_interval=5.0, timeout=900.0)
# Access per-sequence artifacts by index
cif_url_chain_a = results[0].cif_url()
cif_url_chain_b = results[1].cif_url()
print("Chain A CIF:", cif_url_chain_a)
print("Chain B CIF:", cif_url_chain_b)
m0 = results[0].metrics()
m1 = results[1].metrics()
print("Chain A mean PLDDT:", m0.mean_PLDDT)
print("Chain B mean PLDDT:", m1.mean_PLDDT)
Create with library source (from_id) and additional params
myJob = client.fold.create(
model="boltz-2",
sequence="LLGDFFRKSKEKIGKEFKRIVQRIKDFLRNLVPRTES",
from_id="770e8400-e29b-41d4-a716-446655440002",
params={"relaxPrediction": True, "recyclingSteps": 2},
)
# Wait for completion
results = client.jobs.wait_for_completion(myJob.id, poll_interval=5.0, timeout=900.0)
print("Completed:", results.job.status)
Fetch results and status
# Prefer waiting for completion in scripts/notebooks
results = client.jobs.wait_for_completion(myJob.id, poll_interval=5.0, timeout=900.0)
status = results.job.status
print("Status:", status)
Status could be:
- PENDING: Job queued but not yet initialized
- INITIALIZED: Job created and ready to run
- RUNNING: Job is processing
- COMPLETED: Job finished successfully
- FAILED: Job encountered an error
- STOPPED: Job was stopped before completion
Update visibility
client.jobs.set_public(myJob.id, True) # make job publicly accessible
Get artifact URLs
# Ensure we have completed results
results = client.jobs.wait_for_completion(myJob.id, poll_interval=5.0, timeout=900.0)
# Complex jobs (shared artifacts at top level)
if results.job.is_complex:
cif_url = results.cif_url()
pdb_url = results.pdb_url()
pae_url = results.pae_plot_url()
plddt_url = results.plddt_plot_url()
else:
# Non-complex: per-sequence artifacts via indexing
cif_url = results[0].cif_url()
pdb_url = results[0].pdb_url()
Get metrics
# Ensure the job has completed
results = client.jobs.wait_for_completion(myJob.id, poll_interval=5.0, timeout=900.0)
# Complex (boltz-2) jobs: top-level metrics
if results.job.is_complex:
metrics = results.metrics()
print("mean_PLDDT:", metrics.mean_PLDDT)
print("ptm_score:", metrics.ptm_score)
print("iptm_score:", metrics.iptm_score)
print("max_pae_score:", metrics.max_pae_score)
# Boltz-2 affinity metrics (present only if provided by API)
print("affinity_pred_value:", metrics.affinity_pred_value)
print("affinity_probability_binary:", metrics.affinity_probability_binary)
print("affinity_pred_value1:", metrics.affinity_pred_value1)
print("affinity_probability_binary1:", metrics.affinity_probability_binary1)
print("affinity_pred_value2:", metrics.affinity_pred_value2)
print("affinity_probability_binary2:", metrics.affinity_probability_binary2)
else:
# Non-complex: per-sequence metrics via indexing
m0 = results[0].metrics()
print("Chain A mean_PLDDT:", m0.mean_PLDDT)
m1 = results[1].metrics()
print("Chain B mean_PLDDT:", m1.mean_PLDDT)
CLI Usage
Submit a folding job:
fastfold fold --sequence "LLGDFFRKSKEKIGKEFKRIVQRIKDFLRNLVPRTES" --model boltz-2
Optional flags:
fastfold fold \
--sequence "..." \
--model boltz-2 \
--name "My Job" \
--api-key "sk-..." \
--base-url "https://api.fastfold.ai"
On success the CLI prints the created job ID to stdout.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastfold_ai-0.1.1.tar.gz.
File metadata
- Download URL: fastfold_ai-0.1.1.tar.gz
- Upload date:
- Size: 10.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44dea4005dc4469bc95e0ed616262a2aa20cf26a871be850f3b41efb05c56dc7
|
|
| MD5 |
980adc62e242b743e555b75dcc055d12
|
|
| BLAKE2b-256 |
26b7f36f53dba63aeac89aa4f2c9fd14cf7390cf0e9a2d2fe98bc86c01227d32
|
File details
Details for the file fastfold_ai-0.1.1-py3-none-any.whl.
File metadata
- Download URL: fastfold_ai-0.1.1-py3-none-any.whl
- Upload date:
- Size: 11.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a17b62b42fcedbf4592a1c230f95fe6e8821cf83a5f19e59569115e6709e8ecf
|
|
| MD5 |
7d7d25812925286f8f2476ffe2e7907e
|
|
| BLAKE2b-256 |
0297e7896f4bcbd8e62c278de0fbacd3fea7015f8855591c127788c21722bca5
|