Skip to main content
Docs

Search guides and API endpoints, for example “Idempotency-Key” or “submit job”.

    Tools · Computational Biology

    RFOptimization

    Improve a protein binder design by cycling RoseTTAFold3 or Boltz-2 prediction with LigandMPNN redesign, with the predicted structure and scores of every cycle.

    Updated October 21, 2026

    On this page

    Prices, workflows, and method papersOpen in the app

    RFOptimization (RFO) takes a protein design you already have, such as a binder from RFdiffusion3 with a sequence from MPNN Sequence Design, and improves it through repeated sequence optimization and structure prediction. It does not generate designs from scratch; it makes a starting design better.

    How it works

    You give one starting complex and name the chain to optimize. Each cycle picks one of two structure steps at random. The RoseTTAFold3 step searches the designed sequence with gradients from the model's confidence scores, and keeps the structure of the best step. The Boltz-2 step predicts the complex as it stands. Then LigandMPNN redesigns the designed chain, keeping the residues next to the partner chain (RoseTTAFold3 cycles) or the confidently predicted stretches (Boltz-2 cycles) fixed, and the redesigned complex starts the next cycle. RFO is part of the RosettaCommons Foundry, released under a BSD license; Boltz-2 and LigandMPNN are MIT-licensed.

    Inputs

    • Starting complex: a PDB or mmCIF file, or a PDB entry fetched by its ID, with the designed chain (a standard protein with complete backbone atoms) and at least one partner chain, which can be a protein, DNA, RNA or a ligand. The first partner chain is the one the interface is scored against. Ions and ligands inside a chain are read as entities of their own. The complex may hold up to 500 residues and ligand atoms in all, until the tool has been benchmarked.
    • Sequence for the designed chain (optional): written onto the chain's backbone before the first cycle, for example a sequence from MPNN Sequence Design for a generated backbone. In a workflow the optional sequence input does this from an upstream sequence set.
    • Partner alignments (optional): an A3M or FASTA file for a partner protein chain, used by both predictors. Without one the chain is predicted from its sequence alone. The designed chain takes none, because its sequence changes every cycle.
    • Cycling: the number of cycles (up to 20), the share of cycles that use RoseTTAFold3, its search steps per cycle (up to 20) and objective, the Boltz-2 samples (up to 3), the LigandMPNN model and temperature, and a seed. The cycles and the search steps are capped together.

    Outputs

    • predictions/: the predicted structure of every completed cycle as mmCIF.
    • designs/: the complex each cycle handed to the next, and the starting complex.
    • scores.csv: one row per cycle with the method that scored it, the interface ipTM and, where the method reports them, pTM, interface PAE, pLDDT, the search loss, the Boltz-2 ranking score and RMSD.
    • sequences.fasta: the sequence each cycle scored, and a last final sequence.
    • summary.json: the settings, the chain map, every cycle and any warnings.

    A run that stops early, because a step failed repeatedly or the time limit passed, still returns the cycles it completed, with a warning. In a workflow the designs port carries each cycle's structure with the interface ipTM as confidence.

    Reading the results

    • The two methods score differently. RoseTTAFold3 and Boltz-2 are different models, so a RoseTTAFold3 cycle and a Boltz-2 cycle cannot be compared by their numbers. The method is recorded for every cycle.
    • Each score belongs to the sequence of its own structure, not to the sequence LigandMPNN writes after it.
    • The final sequence has not been scored by any model. Check it with RoseTTAFold3 or Boltz-2 before using it.
    • Confidence is not accuracy. A high ipTM means the models are confident about the interface, not that the binder works. Test designs in the lab.

    Limits

    • Mutations are limited to the 20 standard amino acids. Cyclic peptides, RoseTTAFold3 templates and more than one LigandMPNN sample per cycle are not offered.
    • Every cycle loads its models again, so the run is slower than the prediction steps alone. Gradients through RoseTTAFold3 need a GPU with a lot of memory, so only L40s and larger GPUs are offered.

    RFdiffusion3, BoltzGen and FreeBindCraft generate designs to optimize, MPNN Sequence Design writes their sequences, and RoseTTAFold3 and Boltz-2 check the result.

    Run it from the API

    Submit with Submit a job and the job_type below. Price it first with Estimate job reservation cost: submitting reserves that amount from your wallet, and the charge settles at the actual runtime.

    RFOptimization rfo-optimize

    Job type
    rfo-optimize
    Hardware
    l40sa100-40gba100-80gb (default)h100h200b200
    Typical runtime
    30 min on Nvidia A100, 80 GB

    Payload

    Payload fields
    FieldTypeDescription
    structurerequiredfile_object
    designed_chainstring

    Default: "A"Limits: pattern ^[A-Za-z0-9]$

    designed_sequencestring

    Limits: min length 1, max length 400, pattern ^[ACDEFGHIKLMNPQRSTVWY]+$

    msas[]object[]

    Limits: min items 1, max items 8

    msas.chainrequiredstring

    Limits: pattern ^[A-Za-z0-9]$

    msas.a3mrequiredfile_object
    total_cyclesinteger

    Default: 10Limits: ≥ 1, ≤ 20

    backprop_fractionnumber

    Default: 0.5Limits: ≥ 0, ≤ 1

    rf3_opt_stepsinteger

    Default: 5Limits: ≥ 1, ≤ 20

    lossany

    Default: "pae_interface_mean"One of: "pae_interface_mean", "pae_interface_min", "pae_mean", "pde_mean", "plddt_mean"

    mpnn_modelany

    Default: "protein_mpnn"One of: "protein_mpnn", "ligand_mpnn"

    mpnn_temperaturenumber

    Default: 0.1Limits: ≥ 0.01, ≤ 1

    boltz_samplesinteger

    Default: 1Limits: ≥ 1, ≤ 3

    template_plddt_thresholdinteger

    Default: 80Limits: ≥ 0, ≤ 100

    seedinteger

    Limits: ≥ 0, ≤ 2147483647

    record_idstring

    Limits: pattern ^[A-Za-z0-9][A-Za-z0-9._:|+-]{0,99}$

    File fields take {"name": "x.pdb", "content_b64": "…"} or a stored artifact, {"$artifact": {"id": "art-…", "port": "…"}}. Files are up to 25 MiB each.

    Example

    from cognichem_client import CogniChem
    
    client = CogniChem.from_env()  # reads COGNICHEM_API_KEY
    payload = {
        "structure": {
            "name": "start_complex.pdb",
            "content_b64": "<file contents, base64>",
        },
        "designed_chain": "A",
        "total_cycles": 3,
        "backprop_fraction": 0.5,
        "rf3_opt_steps": 5,
        "mpnn_model": "protein_mpnn",
        "seed": 7,
    }
    
    estimate = client.jobs.estimate(job_type="rfo-optimize", payload=payload, resource="a100-80gb")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-rfo-optimize-run",
        job_type="rfo-optimize",
        payload=payload,
        resource="a100-80gb",
    )
    status = client.jobs.wait(job.process_id)
    if status.status == "completed":
        client.jobs.result(job.process_id, save_path=".")

    Sample data from the job catalog; long values are shortened here. Each job_name must be unique among your jobs.

    Workflow inputs

    • Structures · optionalPDB, CIF
    • Protein sequences · optionalFASTA, RAW
    • Protein structure · optionalPDB, CIF

    Workflow outputs

    • ArchiveZIP
    • StructuresCIF
    • TableCSV
    • Protein sequencesFASTA