Modeling Complexes and Ranking Ligands with Boltz-2

Most protein–ligand structure-prediction tools, like AlphaFold 3, Boltz-1, and Chai-1, stop at predicting the geometry of the resultant complex. Boltz-2 (preprint) goes further by predicting both structures and small-molecule binding affinity from sequence and SMILES, while supporting DNA and RNA partners. It builds on the cofolding ideas in Boltz-1, then adds a larger backbone, better controllability, and a dual affinity head. The result is a practical way to generate poses, prioritize compounds, and guide follow-up physics or experiments when speed matters.

What's New in Boltz-2

Boltz-2 is similar to Boltz-1, but contains numerous enhancements and new capabilities (as well as some deleterious changes). Here's a brief overview:

AspectBoltz-1Boltz-2
Structural engine48 PairFormer layers, 512-token crop64 layers, trifast kernels, 768-token crop
ControllabilityNone• Method conditioning (X-ray / NMR / MD)
• Multi-chain template steering
• Contact & pocket constraints
Physics qualityOptional steering potential (Boltz-1x)Optional steering potential (Boltz-2x)
Affinity headNonePairFormer-based dual head (probability + pIC50)
MSAOptionalRequired

Here's the authors' architecture diagram:

Boltz-2 architecture diagram

The architecture of Boltz-2 (Figure 2 from the preprint).

Several of these new features are incredibly powerful:

Unfortunately, Boltz-2 removes the ability to run inference without costly MSAs. If MSA-free inference is requested, consider using Boltz-1 or Chai-1 instead.

For more details about how Boltz-2 works, see our full Boltz-2 FAQ or the original preprint.

Where Boltz-2 Can Be Useful

Cofolding is useful whenever a rigid receptor limits realism. Boltz-2 generates binding poses that include side chain and backbone motion, then attaches a confidence score and an affinity estimate. This is not a replacement for FEP or long-timescale MD, but it is a strong first pass that can prune search space and surface plausible chemotypes.

Here's a plot showing Boltz-2's accuracy in virtual screening, illustrating superior accuracy vs. other high-throughput binding-affinity-prediction methods:

Comparison of Boltz-2 to other methods on MF-PCBA.

Figure 7 from the Boltz-2 paper, comparing Boltz-2's affinity prediction to other low-cost methods.

Limitations of Boltz-2

Despite the myriad successes of Boltz-2, challenges remain:

Furthermore, there are concerns that the reported performance of Boltz-2 can in large part be attributed to train–test leakage, meaning that the performance on targets dissimilar to the training set will be much worse. (Here's a review from Karson Crispens and co-workers which alleges this.)

For a compilation of Boltz-2 benchmark results, see our external Boltz-2 benchmark page.

Using Boltz-2 on Rowan

Through Rowan's web interface scientists can upload sequences and ligands, submit Boltz-2 jobs to GPU runners and our privately hosted MSA server, and analyze the resulting structures and predicted binding affinity—all totally free of charge. Rowan automatically applies a series of structural checks and filters to help scientists detect model failures or invalid results. Here's what a completed Boltz-2 prediction looks like on Rowan:

Rowan Boltz-2 result

View this calculation on Rowan

Python API

Boltz-2 calculations can also easily be submitted via Rowan's Python API, which is available for free to all Rowan users:

import rowan

rowan.api_key = "rowan-sk-asdf"

workflow = rowan.submit_protein_cofolding_workflow(
    initial_protein_sequences=[
        "MENFQKVEKIGEGTYGVVYKARNKLTGEVVALKKIRLDTETEGVPSTAIREISLLKELNHPNIVKLLDVIHTENKLYLVFEFLHQDLKKFMDASALTGIPLPLIKSYLFQLLQGLAFCHSHRVLHRDLKPQNLLINTEGAIKLADFGLARAFGVPVRTYTHEVVTLWYRAPEILLGCKYYSTAVDIWSLGCIFAEMVTRRALFPGDSEIDQLFRIFRTLGTPDEVVWPGVTSMPDYKPSFPKWARQDFSKVVPPLDEDGRSLLSQMLHYDPNKRISAKAALAHPFFQDVTKPVPHLRL"
    ],
    initial_smiles_list=["CCC(C)CN=C1NCC2(CCCOC2)CN1"],
    name="Boltz-2 cofolding job",
    model="boltz_2",
    ligand_binding_affinity_index=0,
)

workflow.wait_for_result()
workflow.fetch_latest(in_place=True)

print(workflow.data)
print(f"View the 3D structure on the web at labs.rowansci.com/protein-cofolding/{workflow.uuid}")

This prints the following data; the corresponding 3D structure can be viewed through Rowan's web interface.

{
  'lddt': [0.779, 0.909, 0.958, 0.982, 0.979, 0.969, 0.975, 0.959, 0.952, 0.918, 0.885, 0.848, 0.828, 0.803, 0.824, 0.873, 0.912, 0.953, 0.975, 0.985, 0.987, 0.987, 0.978, 0.969, 0.928, 0.946, 0.976, 0.961, 0.984, 0.987, 0.979, 0.977, 0.959, 0.918, 0.889, 0.738, 0.69, 0.614, 0.533, 0.575, 0.578, 0.707, 0.763, 0.809, 0.841, 0.877, 0.904, 0.896, 0.923, 0.948, 0.941, 0.947, 0.952, 0.953, 0.963, 0.962, 0.961, 0.929, 0.969, 0.988, 0.988, 0.99, 0.986, 0.985, 0.985, 0.981, 0.98, 0.971, 0.967, 0.962, 0.909, 0.865, 0.825, 0.766, 0.864, 0.915, 0.964, 0.972, 0.983, 0.979, 0.965, 0.986, 0.985, 0.952, 0.976, 0.972, 0.989, 0.973, 0.973, 0.989, 0.987, 0.982, 0.981, 0.984, 0.977, 0.976, 0.964, 0.986, 0.989, 0.987, 0.989, 0.989, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.989, 0.989, 0.99, 0.988, 0.983, 0.989, 0.987, 0.976, 0.965, 0.974, 0.953, 0.979, 0.951, 0.95, 0.985, 0.972, 0.985, 0.945, 0.914, 0.989, 0.985, 0.989, 0.988, 0.986, 0.977, 0.989, 0.989, 0.99, 0.989, 0.987, 0.971, 0.906, 0.883, 0.876, 0.894, 0.882, 0.877, 0.845, 0.838, 0.814, 0.82, 0.779, 0.752, 0.776, 0.746, 0.678, 0.744, 0.783, 0.766, 0.808, 0.81, 0.928, 0.964, 0.983, 0.987, 0.975, 0.989, 0.989, 0.989, 0.978, 0.987, 0.99, 0.984, 0.979, 0.95, 0.967, 0.939, 0.986, 0.988, 0.99, 0.987, 0.989, 0.99, 0.99, 0.989, 0.99, 0.99, 0.99, 0.99, 0.99, 0.99, 0.989, 0.99, 0.989, 0.988, 0.987, 0.985, 0.986, 0.989, 0.989, 0.985, 0.983, 0.948, 0.967, 0.969, 0.987, 0.985, 0.986, 0.988, 0.989, 0.989, 0.99, 0.99, 0.989, 0.989, 0.989, 0.989, 0.99, 0.989, 0.988, 0.989, 0.986, 0.986, 0.99, 0.989, 0.989, 0.989, 0.989, 0.985, 0.987, 0.987, 0.988, 0.989, 0.989, 0.988, 0.989, 0.989, 0.989, 0.988, 0.989, 0.986, 0.986, 0.981, 0.95, 0.93, 0.974, 0.982, 0.979, 0.987, 0.974, 0.897, 0.989, 0.984, 0.985, 0.989, 0.99, 0.988, 0.988, 0.99, 0.99, 0.987, 0.99, 0.99, 0.99, 0.989, 0.989, 0.99, 0.989, 0.988, 0.987, 0.99, 0.99, 0.99, 0.99, 0.989, 0.99, 0.99, 0.99, 0.989, 0.99, 0.989, 0.99, 0.99, 0.987, 0.988, 0.989, 0.989, 0.988, 0.987, 0.972, 0.984, 0.945, 0.966, 0.901, 0.929, 0.502, 0.601, 0.671, 0.589, 0.677, 0.666, 0.735, 0.695, 0.671, 0.801, 0.71, 0.707, 0.733, 0.743, 0.738, 0.709, 0.69], 
  'model': 'boltz_2', 
  'scores': {'ptm': 0.974, 'iptm': 0.87, 'avg_lddt': 0.936, 'confidence_score': 0.923}, 
  'messages': [], 
  'affinity_score': {'pred_value': 1.434, 'pred_value1': 2.226, 'pred_value2': 0.643, 'probability_binary': 0.045, 'probability_binary1': 0.034, 'probability_binary2': 0.056}, 
  'use_msa_server': True, 
  'use_potentials': False, 
  'pocket_constraints': [], 
  'contact_constraints': [], 
  'initial_smiles_list': ['CCC(C)CN=C1NCC2(CCCOC2)CN1'], 
  'use_templates_server': False, 
  'predicted_structure_uuid': '7eb21671-eec8-450a-a64c-fbb46fdd758d', 
  'initial_protein_sequences': ['MENFQKVEKIGEGTYGVVYKARNKLTGEVVALKKIRLDTETEGVPSTAIREISLLKELNHPNIVKLLDVIHTENKLYLVFEFLHQDLKKFMDASALTGIPLPLIKSYLFQLLQGLAFCHSHRVLHRDLKPQNLLINTEGAIKLADFGLARAFGVPVRTYTHEVVTLWYRAPEILLGCKYYSTAVDIWSLGCIFAEMVTRRALFPGDSEIDQLFRIFRTLGTPDEVVWPGVTSMPDYKPSFPKWARQDFSKVVPPLDEDGRSLLSQMLHYDPNKRISAKAALAHPFFQDVTKPVPHLRL'], 
  'ligand_binding_affinity_index': 0
}

For a more complex example showing how to do a virtual screen in parallel with Boltz-2, see our example script on GitHub. Rowan automatically scales GPU-based compute to meet demand, making it possible to run hundreds or thousands of Boltz-2 jobs in just a few lines of code.

Ready to test a target or a series? Create a free Rowan account and start running Boltz-2 today.

Banner background image