{
  "openapi": "3.1.0",
  "info": {
    "title": "Athanor Bio Tools API",
    "version": "1.0.0",
    "description": "One pair of endpoints per tool. A POST queues a job and returns immediately; the job is polled for its result."
  },
  "servers": [
    {
      "url": "https://athanortools.com"
    }
  ],
  "paths": {
    "/api/rdkit/": {
      "get": {
        "summary": "RDKit field schema",
        "description": "Molecule properties, standardization and substructure search, and explicit bond edits from atom-mapped reactions.",
        "operationId": "rdkit_schema",
        "tags": [
          "RDKit"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a RDKit job",
        "description": "Molecule properties, standardization and substructure search, and explicit bond edits from atom-mapped reactions. RDKit is the open-source cheminformatics toolkit. Given SMILES or an SD file, a run reports canonical structures with descriptors, Lipinski counts, standardized parent forms, InChI, molecule hashes, Murcko scaffolds, ring and stereochemistry analysis, SMARTS substructure matches, fingerprints and the maximum common substructure of the set. Given atom-mapped reaction SMILES, it reports the reaction's participants, its element and formal-charge balance, the quality of its atom mapping, and the bonds formed, broken or changed in order -- the reaction centre a precedent search or an enzyme design starts from.",
        "operationId": "rdkit_submit",
        "tags": [
          "RDKit"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the table this run leaves: <job name>.csv. A single line of text.",
                    "maxLength": 80,
                    "default": "rdkit-demo"
                  },
                  "smiles": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "One molecule per line, in the format RDKit's SmilesMolSupplier reads: a SMILES string, then optionally whitespace and a name. Lines beginning with # are ignored. Up to 5000 molecules and 200,000 characters per run. A molecule RDKit cannot parse is reported as a row with an error rather than failing the run, so one bad line in a list does not lose the rest. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 200000,
                    "default": "CC(=O)OC1=CC=CC=C1C(=O)O aspirin\nCN1C=NC2=C1C(=O)N(C)C(=O)N2C caffeine\nCC(C)Cc1ccc(cc1)C(C)C(=O)O ibuprofen\nCC(=O)Nc1ccc(O)cc1 paracetamol\n"
                  },
                  "reaction_smiles": {
                    "type": "string",
                    "title": "Reactions",
                    "description": "One reaction per line as reactants>>products, or reactants>agents>products, then optionally whitespace and a name. Atom maps are required for reliable bond-edit extraction: every atom should be mapped exactly once per side. Up to 1000 reactions per run. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 200000,
                    "default": "[CH3:1][C:2](=[O:3])[O:4][CH3:5].[OH2:6]>>[CH3:1][C:2](=[O:3])[OH:6].[OH:4][CH3:5] methyl-acetate-hydrolysis\n"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Molecule or reaction file",
                    "description": "Upload a SMILES list (.smi, .txt, .csv) or an SD file (.sdf, .mol); an SD file is recognised by its own connection table and read with RDKit's SDMolSupplier, keeping the _Name field as each molecule's name. For the reaction task, upload one reaction SMILES per line. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "descriptor_set": {
                    "type": "string",
                    "title": "Descriptors",
                    "description": "The common set is formula, molecular weight and exact mass, cLogP, TPSA, hydrogen-bond donors and acceptors, rotatable bonds, rings, aromatic rings, heavy atoms, fraction of sp3 carbons, formal charge and the number of Lipinski rule-of-five violations. Every descriptor is RDKit's own Descriptors.CalcMolDescriptors, which is upwards of two hundred columns. One of the field's option values.",
                    "enum": [
                      "common",
                      "all",
                      "none"
                    ],
                    "default": "common"
                  },
                  "standardize": {
                    "type": "boolean",
                    "title": "Standardized parent forms",
                    "description": "Adds the four rdMolStandardize parents as columns: cleanup, fragment parent (the largest fragment), charge parent (neutralized) and tautomer parent. Useful as search keys; keep the original charged, stereospecific molecule for anything that has to account for mass or charge. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "include_inchi": {
                    "type": "boolean",
                    "title": "InChI and InChIKey",
                    "description": "Adds InChI and InChIKey columns, when the RDKit build includes InChI support. The InChIKey is the usual key for matching a molecule across databases. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "hashes": {
                    "type": "boolean",
                    "title": "Molecule hash strings",
                    "description": "Adds the rdMolHash strings from the Cookbook's molecule-hash recipe: canonical SMILES, the tautomer-insensitive HetAtomTautomer hash, the Murcko scaffold hash, the anonymous graph and the net charge. Two molecules that agree on a hash are the same under that hash's notion of sameness. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "murcko_scaffold": {
                    "type": "boolean",
                    "title": "Murcko scaffold",
                    "description": "Adds the Bemis-Murcko scaffold (the ring systems and the linkers between them, with side chains removed) and its generic form, where every atom becomes carbon and every bond single. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "ring_analysis": {
                    "type": "boolean",
                    "title": "Rings and aromaticity",
                    "description": "Adds the number of rings in the symmetrized smallest set of smallest rings, the number of ring systems (fused rings counted once), the number of aromatic rings and the number of aromatic atoms. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "stereo": {
                    "type": "boolean",
                    "title": "Stereochemistry",
                    "description": "Adds the stereocentres and stereo bonds RDKit's FindPotentialStereo finds, and how many of them are unspecified in the input -- which is what says whether a SMILES string names one stereoisomer or a family of them. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "substructure_smarts": {
                    "type": "string",
                    "title": "Substructure query (SMARTS)",
                    "description": "A SMARTS pattern matched against every molecule, as in the Cookbook's functional-group recipes: for example [NX1]#[CX2] for a nitrile or [CX3](=O)[OX2H1] for a carboxylic acid. Adds the number of matches and the atom indices of the first one. Leave empty to skip. A single line of text.",
                    "maxLength": 2000
                  },
                  "find_mcs": {
                    "type": "boolean",
                    "title": "Maximum common substructure",
                    "description": "Runs rdFMCS.FindMCS across every molecule that parsed and reports the largest substructure they all share, as SMARTS, with its atom and bond counts. This is one answer for the whole set rather than a column, so it is reported in the run's JSON rather than the table. Needs at least two molecules. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "mcs_timeout": {
                    "type": "number",
                    "title": "MCS timeout (seconds)",
                    "description": "rdFMCS.FindMCS's own timeout. A search that runs out of time still returns the largest substructure it had found, flagged as having timed out. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 600,
                    "default": 20
                  },
                  "fingerprint": {
                    "type": "string",
                    "title": "Fingerprint",
                    "description": "Adds a fingerprint column as a bit string, through rdFingerprintGenerator. Morgan with radius 2 is the usual ECFP4 analogue. MACCS keys are a fixed 166-bit set and ignore the size and radius below. One of the field's option values.",
                    "enum": [
                      "none",
                      "morgan",
                      "rdkit",
                      "atom_pair",
                      "topological_torsion",
                      "maccs"
                    ],
                    "default": "none"
                  },
                  "fingerprint_bits": {
                    "type": "number",
                    "title": "Fingerprint size (bits)",
                    "description": "The folded length of the fingerprint. Ignored for MACCS keys. A number, within the range given for the field.",
                    "minimum": 32,
                    "maximum": 16384,
                    "default": 2048
                  },
                  "fingerprint_radius": {
                    "type": "number",
                    "title": "Morgan radius",
                    "description": "How far from each atom the Morgan environment reaches. Radius 2 corresponds to ECFP4. Used only by the Morgan fingerprint. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 6,
                    "default": 2
                  },
                  "reaction_participants": {
                    "type": "boolean",
                    "title": "Per-participant summaries",
                    "description": "Reports each reactant, agent and product on its own: canonical SMILES, formula, formal charge, and how many of its atoms carry a map number. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "reaction_balance": {
                    "type": "boolean",
                    "title": "Element and charge balance",
                    "description": "Counts every element, implicit hydrogens included, and the formal charge on each side, and reports the difference. Agents are excluded from the count, as they are from the bond edits. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "reaction_bond_edits": {
                    "type": "boolean",
                    "title": "Bonds formed, broken and changed",
                    "description": "Compares the mapped bonds on each side and reports the bonds formed, the bonds broken, the bonds whose order changed, and the atom maps making up the reaction centre. Only reliable when the atom mapping is complete, which is reported alongside it. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "descriptors",
                      "murcko_scaffolds",
                      "nitrile_substructure",
                      "mcs_and_fingerprints",
                      "oxidations",
                      "ester_hydrolysis"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "text",
                      "upload"
                    ],
                    "default": "text"
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "molecule",
                      "reaction"
                    ],
                    "default": "molecule"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "task": "molecule",
                  "input_mode": "text",
                  "job_name": "rdkit-demo",
                  "smiles": "CC(=O)OC1=CC=CC=C1C(=O)O aspirin\nCN1C=NC2=C1C(=O)N(C)C(=O)N2C caffeine\nCC(C)Cc1ccc(cc1)C(C)C(=O)O ibuprofen\nCC(=O)Nc1ccc(O)cc1 paracetamol\n",
                  "descriptor_set": "common",
                  "standardize": false,
                  "include_inchi": false,
                  "hashes": false,
                  "murcko_scaffold": false,
                  "ring_analysis": false,
                  "stereo": false,
                  "substructure_smarts": "",
                  "find_mcs": false,
                  "mcs_timeout": 20,
                  "fingerprint": "none",
                  "fingerprint_bits": 2048,
                  "fingerprint_radius": 2
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the table this run leaves: <job name>.csv. A single line of text.",
                    "maxLength": 80,
                    "default": "rdkit-demo"
                  },
                  "smiles": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "One molecule per line, in the format RDKit's SmilesMolSupplier reads: a SMILES string, then optionally whitespace and a name. Lines beginning with # are ignored. Up to 5000 molecules and 200,000 characters per run. A molecule RDKit cannot parse is reported as a row with an error rather than failing the run, so one bad line in a list does not lose the rest. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 200000,
                    "default": "CC(=O)OC1=CC=CC=C1C(=O)O aspirin\nCN1C=NC2=C1C(=O)N(C)C(=O)N2C caffeine\nCC(C)Cc1ccc(cc1)C(C)C(=O)O ibuprofen\nCC(=O)Nc1ccc(O)cc1 paracetamol\n"
                  },
                  "reaction_smiles": {
                    "type": "string",
                    "title": "Reactions",
                    "description": "One reaction per line as reactants>>products, or reactants>agents>products, then optionally whitespace and a name. Atom maps are required for reliable bond-edit extraction: every atom should be mapped exactly once per side. Up to 1000 reactions per run. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 200000,
                    "default": "[CH3:1][C:2](=[O:3])[O:4][CH3:5].[OH2:6]>>[CH3:1][C:2](=[O:3])[OH:6].[OH:4][CH3:5] methyl-acetate-hydrolysis\n"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Molecule or reaction file",
                    "description": "Upload a SMILES list (.smi, .txt, .csv) or an SD file (.sdf, .mol); an SD file is recognised by its own connection table and read with RDKit's SDMolSupplier, keeping the _Name field as each molecule's name. For the reaction task, upload one reaction SMILES per line. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "descriptor_set": {
                    "type": "string",
                    "title": "Descriptors",
                    "description": "The common set is formula, molecular weight and exact mass, cLogP, TPSA, hydrogen-bond donors and acceptors, rotatable bonds, rings, aromatic rings, heavy atoms, fraction of sp3 carbons, formal charge and the number of Lipinski rule-of-five violations. Every descriptor is RDKit's own Descriptors.CalcMolDescriptors, which is upwards of two hundred columns. One of the field's option values.",
                    "enum": [
                      "common",
                      "all",
                      "none"
                    ],
                    "default": "common"
                  },
                  "standardize": {
                    "type": "boolean",
                    "title": "Standardized parent forms",
                    "description": "Adds the four rdMolStandardize parents as columns: cleanup, fragment parent (the largest fragment), charge parent (neutralized) and tautomer parent. Useful as search keys; keep the original charged, stereospecific molecule for anything that has to account for mass or charge. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "include_inchi": {
                    "type": "boolean",
                    "title": "InChI and InChIKey",
                    "description": "Adds InChI and InChIKey columns, when the RDKit build includes InChI support. The InChIKey is the usual key for matching a molecule across databases. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "hashes": {
                    "type": "boolean",
                    "title": "Molecule hash strings",
                    "description": "Adds the rdMolHash strings from the Cookbook's molecule-hash recipe: canonical SMILES, the tautomer-insensitive HetAtomTautomer hash, the Murcko scaffold hash, the anonymous graph and the net charge. Two molecules that agree on a hash are the same under that hash's notion of sameness. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "murcko_scaffold": {
                    "type": "boolean",
                    "title": "Murcko scaffold",
                    "description": "Adds the Bemis-Murcko scaffold (the ring systems and the linkers between them, with side chains removed) and its generic form, where every atom becomes carbon and every bond single. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "ring_analysis": {
                    "type": "boolean",
                    "title": "Rings and aromaticity",
                    "description": "Adds the number of rings in the symmetrized smallest set of smallest rings, the number of ring systems (fused rings counted once), the number of aromatic rings and the number of aromatic atoms. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "stereo": {
                    "type": "boolean",
                    "title": "Stereochemistry",
                    "description": "Adds the stereocentres and stereo bonds RDKit's FindPotentialStereo finds, and how many of them are unspecified in the input -- which is what says whether a SMILES string names one stereoisomer or a family of them. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "substructure_smarts": {
                    "type": "string",
                    "title": "Substructure query (SMARTS)",
                    "description": "A SMARTS pattern matched against every molecule, as in the Cookbook's functional-group recipes: for example [NX1]#[CX2] for a nitrile or [CX3](=O)[OX2H1] for a carboxylic acid. Adds the number of matches and the atom indices of the first one. Leave empty to skip. A single line of text.",
                    "maxLength": 2000
                  },
                  "find_mcs": {
                    "type": "boolean",
                    "title": "Maximum common substructure",
                    "description": "Runs rdFMCS.FindMCS across every molecule that parsed and reports the largest substructure they all share, as SMARTS, with its atom and bond counts. This is one answer for the whole set rather than a column, so it is reported in the run's JSON rather than the table. Needs at least two molecules. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "mcs_timeout": {
                    "type": "number",
                    "title": "MCS timeout (seconds)",
                    "description": "rdFMCS.FindMCS's own timeout. A search that runs out of time still returns the largest substructure it had found, flagged as having timed out. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 600,
                    "default": 20
                  },
                  "fingerprint": {
                    "type": "string",
                    "title": "Fingerprint",
                    "description": "Adds a fingerprint column as a bit string, through rdFingerprintGenerator. Morgan with radius 2 is the usual ECFP4 analogue. MACCS keys are a fixed 166-bit set and ignore the size and radius below. One of the field's option values.",
                    "enum": [
                      "none",
                      "morgan",
                      "rdkit",
                      "atom_pair",
                      "topological_torsion",
                      "maccs"
                    ],
                    "default": "none"
                  },
                  "fingerprint_bits": {
                    "type": "number",
                    "title": "Fingerprint size (bits)",
                    "description": "The folded length of the fingerprint. Ignored for MACCS keys. A number, within the range given for the field.",
                    "minimum": 32,
                    "maximum": 16384,
                    "default": 2048
                  },
                  "fingerprint_radius": {
                    "type": "number",
                    "title": "Morgan radius",
                    "description": "How far from each atom the Morgan environment reaches. Radius 2 corresponds to ECFP4. Used only by the Morgan fingerprint. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 6,
                    "default": 2
                  },
                  "reaction_participants": {
                    "type": "boolean",
                    "title": "Per-participant summaries",
                    "description": "Reports each reactant, agent and product on its own: canonical SMILES, formula, formal charge, and how many of its atoms carry a map number. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "reaction_balance": {
                    "type": "boolean",
                    "title": "Element and charge balance",
                    "description": "Counts every element, implicit hydrogens included, and the formal charge on each side, and reports the difference. Agents are excluded from the count, as they are from the bond edits. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "reaction_bond_edits": {
                    "type": "boolean",
                    "title": "Bonds formed, broken and changed",
                    "description": "Compares the mapped bonds on each side and reports the bonds formed, the bonds broken, the bonds whose order changed, and the atom maps making up the reaction centre. Only reliable when the atom mapping is complete, which is reported alongside it. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "descriptors",
                      "murcko_scaffolds",
                      "nitrile_substructure",
                      "mcs_and_fingerprints",
                      "oxidations",
                      "ester_hydrolysis"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "text",
                      "upload"
                    ],
                    "default": "text"
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "molecule",
                      "reaction"
                    ],
                    "default": "molecule"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "task": "molecule",
                  "input_mode": "text",
                  "job_name": "rdkit-demo",
                  "smiles": "CC(=O)OC1=CC=CC=C1C(=O)O aspirin\nCN1C=NC2=C1C(=O)N(C)C(=O)N2C caffeine\nCC(C)Cc1ccc(cc1)C(C)C(=O)O ibuprofen\nCC(=O)Nc1ccc(O)cc1 paracetamol\n",
                  "descriptor_set": "common",
                  "standardize": false,
                  "include_inchi": false,
                  "hashes": false,
                  "murcko_scaffold": false,
                  "ring_analysis": false,
                  "stereo": false,
                  "substructure_smarts": "",
                  "find_mcs": false,
                  "mcs_timeout": 20,
                  "fingerprint": "none",
                  "fingerprint_bits": 2048,
                  "fingerprint_radius": 2
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/opendde/": {
      "get": {
        "summary": "OpenDDE field schema",
        "description": "Structure prediction for proteins, DNA/RNA, ligands, and ions. Supports co-folding.",
        "operationId": "opendde_schema",
        "tags": [
          "OpenDDE"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a OpenDDE job",
        "description": "Structure prediction for proteins, DNA/RNA, ligands, and ions. Supports co-folding. OpenDDE is an all-atom biomolecular foundation model that turns co-folding into a scalable engine for structure prediction, design, and optimization in drug discovery. It models proteins, nucleic acids, and small molecules in one all-atom system.",
        "operationId": "opendde_submit",
        "tags": [
          "OpenDDE"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the single OpenDDE job generated from these parameters. A single line of text.",
                    "maxLength": 80,
                    "default": "opendde-job"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per unique OpenDDE entity. Set count and an optional matching list of comma-separated IDs, plus the sequence/ligand/ion, type-specific modifications, and optional MSA or template paths. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"A\", \"count\": 1, \"sequence\": \"ACDEFGHIKLMNPQRSTVWY\", \"modifications\": []}]"
                  },
                  "covalent_bonds": {
                    "type": "string",
                    "title": "Covalent bonds (JSON, optional)",
                    "description": "Native OpenDDE covalent_bonds array. Entity references are 1-based sequence indexes; copy references are 1-based within count. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "input_json": {
                    "type": "string",
                    "title": "OpenDDE inference jobs (JSON)",
                    "description": "Complete native OpenDDE input: a non-empty top-level list of named jobs using proteinChain, dnaSequence, rnaSequence, ligand, or ion entities. Bio Web writes this text to input.json. Any MSA, template, or ligand-file paths inside it must be absolute paths available to the runner. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 1000000,
                    "default": "[\n  {\n    \"name\": \"opendde-demo\",\n    \"modelSeeds\": [101],\n    \"sequences\": [\n      {\n        \"proteinChain\": {\n          \"sequence\": \"ACDEFGHIKLMNPQRSTVWY\",\n          \"count\": 1,\n          \"id\": [\"A\"]\n        }\n      }\n    ]\n  }\n]"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Inference jobs file (JSON)",
                    "description": "The JSON file defining this run's jobs, in OpenDDE's own input format. Choose a file. Its contents are read here and sent as the input document. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "seeds": {
                    "type": "string",
                    "title": "Override model seeds (optional)",
                    "description": "Comma-separated integers. When set, --seeds overrides every job's modelSeeds; otherwise OpenDDE uses modelSeeds from the JSON or samples a random seed. A single line of text.",
                    "maxLength": 200
                  },
                  "samples": {
                    "type": "number",
                    "title": "Samples",
                    "description": "Number of structure samples per seed. The OpenDDE CLI default is 5. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 64,
                    "default": 5
                  },
                  "steps": {
                    "type": "number",
                    "title": "Diffusion steps",
                    "description": "Number of diffusion steps. The OpenDDE CLI default is 200. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 200
                  },
                  "cycles": {
                    "type": "number",
                    "title": "Pairformer cycles",
                    "description": "Number of Pairformer recycling cycles. The OpenDDE CLI default is 10. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 10
                  },
                  "dtype": {
                    "type": "string",
                    "title": "Inference precision",
                    "description": "OpenDDE defaults to FP32; BF16 can reduce memory use on supported devices. One of the field's option values.",
                    "enum": [
                      "fp32",
                      "bf16"
                    ],
                    "default": "fp32"
                  },
                  "device": {
                    "type": "string",
                    "title": "Device",
                    "description": "Auto selects CUDA when available and otherwise CPU. One of the field's option values.",
                    "enum": [
                      "auto",
                      "cuda",
                      "cpu"
                    ],
                    "default": "auto"
                  },
                  "use_msa": {
                    "type": "boolean",
                    "title": "Use or generate protein MSAs",
                    "description": "Use protein MSA features. A protein without paired or unpaired MSA paths has its sequence sent to the public ColabFold MMseqs2 server (https://api.colabfold.com; set MMSEQS_SERVICE_HOST_URL on the runner to use your own). If that search fails, OpenDDE continues with a query-only MSA and the result lists a warning. Turn off for private sequences or offline runs, at a significant cost in accuracy. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "use_template": {
                    "type": "boolean",
                    "title": "Use protein templates",
                    "description": "Use template features from each protein's templatesPath. A protein without one gets a local template search instead, which needs protein MSAs, HMMER (hmmsearch and hmmbuild) on the runner's PATH, and downloads the ~220 MB PDB seqres database on first use. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_rna_msa": {
                    "type": "boolean",
                    "title": "Use RNA MSAs",
                    "description": "Use RNA MSA features from each RNA's unpaired MSA path. An RNA without one gets a local nhmmer search instead, which needs HMMER on the runner's PATH and downloads roughly 90 GB of RNA databases on first use. Requires protein MSAs to be on. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_guidance": {
                    "type": "boolean",
                    "title": "Use training-free guidance",
                    "description": "Apply OpenDDE's geometry-based Training-Free Guidance to protein-ligand sampling. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "need_atom_confidence": {
                    "type": "boolean",
                    "title": "Write atom-level confidence data",
                    "description": "Write OpenDDE's full per-atom confidence JSON in addition to summary confidence. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "deterministic": {
                    "type": "boolean",
                    "title": "Deterministic PyTorch algorithms",
                    "description": "Ask OpenDDE to use deterministic PyTorch algorithms for reproducible inference. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "minimal_protein",
                      "synthetic_protein_200",
                      "protein_dna_ligand_7pzb"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "input_json"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "opendde-job",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"A\", \"count\": 1, \"sequence\": \"ACDEFGHIKLMNPQRSTVWY\", \"modifications\": []}]",
                  "covalent_bonds": "",
                  "seeds": "",
                  "samples": 5,
                  "steps": 200,
                  "cycles": 10,
                  "dtype": "fp32",
                  "device": "auto",
                  "use_msa": true,
                  "use_template": false,
                  "use_rna_msa": false,
                  "use_guidance": false,
                  "need_atom_confidence": true,
                  "deterministic": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the single OpenDDE job generated from these parameters. A single line of text.",
                    "maxLength": 80,
                    "default": "opendde-job"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per unique OpenDDE entity. Set count and an optional matching list of comma-separated IDs, plus the sequence/ligand/ion, type-specific modifications, and optional MSA or template paths. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"A\", \"count\": 1, \"sequence\": \"ACDEFGHIKLMNPQRSTVWY\", \"modifications\": []}]"
                  },
                  "covalent_bonds": {
                    "type": "string",
                    "title": "Covalent bonds (JSON, optional)",
                    "description": "Native OpenDDE covalent_bonds array. Entity references are 1-based sequence indexes; copy references are 1-based within count. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "input_json": {
                    "type": "string",
                    "title": "OpenDDE inference jobs (JSON)",
                    "description": "Complete native OpenDDE input: a non-empty top-level list of named jobs using proteinChain, dnaSequence, rnaSequence, ligand, or ion entities. Bio Web writes this text to input.json. Any MSA, template, or ligand-file paths inside it must be absolute paths available to the runner. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 1000000,
                    "default": "[\n  {\n    \"name\": \"opendde-demo\",\n    \"modelSeeds\": [101],\n    \"sequences\": [\n      {\n        \"proteinChain\": {\n          \"sequence\": \"ACDEFGHIKLMNPQRSTVWY\",\n          \"count\": 1,\n          \"id\": [\"A\"]\n        }\n      }\n    ]\n  }\n]"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Inference jobs file (JSON)",
                    "description": "The JSON file defining this run's jobs, in OpenDDE's own input format. Choose a file. Its contents are read here and sent as the input document. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "seeds": {
                    "type": "string",
                    "title": "Override model seeds (optional)",
                    "description": "Comma-separated integers. When set, --seeds overrides every job's modelSeeds; otherwise OpenDDE uses modelSeeds from the JSON or samples a random seed. A single line of text.",
                    "maxLength": 200
                  },
                  "samples": {
                    "type": "number",
                    "title": "Samples",
                    "description": "Number of structure samples per seed. The OpenDDE CLI default is 5. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 64,
                    "default": 5
                  },
                  "steps": {
                    "type": "number",
                    "title": "Diffusion steps",
                    "description": "Number of diffusion steps. The OpenDDE CLI default is 200. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 200
                  },
                  "cycles": {
                    "type": "number",
                    "title": "Pairformer cycles",
                    "description": "Number of Pairformer recycling cycles. The OpenDDE CLI default is 10. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 10
                  },
                  "dtype": {
                    "type": "string",
                    "title": "Inference precision",
                    "description": "OpenDDE defaults to FP32; BF16 can reduce memory use on supported devices. One of the field's option values.",
                    "enum": [
                      "fp32",
                      "bf16"
                    ],
                    "default": "fp32"
                  },
                  "device": {
                    "type": "string",
                    "title": "Device",
                    "description": "Auto selects CUDA when available and otherwise CPU. One of the field's option values.",
                    "enum": [
                      "auto",
                      "cuda",
                      "cpu"
                    ],
                    "default": "auto"
                  },
                  "use_msa": {
                    "type": "boolean",
                    "title": "Use or generate protein MSAs",
                    "description": "Use protein MSA features. A protein without paired or unpaired MSA paths has its sequence sent to the public ColabFold MMseqs2 server (https://api.colabfold.com; set MMSEQS_SERVICE_HOST_URL on the runner to use your own). If that search fails, OpenDDE continues with a query-only MSA and the result lists a warning. Turn off for private sequences or offline runs, at a significant cost in accuracy. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "use_template": {
                    "type": "boolean",
                    "title": "Use protein templates",
                    "description": "Use template features from each protein's templatesPath. A protein without one gets a local template search instead, which needs protein MSAs, HMMER (hmmsearch and hmmbuild) on the runner's PATH, and downloads the ~220 MB PDB seqres database on first use. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_rna_msa": {
                    "type": "boolean",
                    "title": "Use RNA MSAs",
                    "description": "Use RNA MSA features from each RNA's unpaired MSA path. An RNA without one gets a local nhmmer search instead, which needs HMMER on the runner's PATH and downloads roughly 90 GB of RNA databases on first use. Requires protein MSAs to be on. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_guidance": {
                    "type": "boolean",
                    "title": "Use training-free guidance",
                    "description": "Apply OpenDDE's geometry-based Training-Free Guidance to protein-ligand sampling. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "need_atom_confidence": {
                    "type": "boolean",
                    "title": "Write atom-level confidence data",
                    "description": "Write OpenDDE's full per-atom confidence JSON in addition to summary confidence. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "deterministic": {
                    "type": "boolean",
                    "title": "Deterministic PyTorch algorithms",
                    "description": "Ask OpenDDE to use deterministic PyTorch algorithms for reproducible inference. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "minimal_protein",
                      "synthetic_protein_200",
                      "protein_dna_ligand_7pzb"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "input_json"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "opendde-job",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"A\", \"count\": 1, \"sequence\": \"ACDEFGHIKLMNPQRSTVWY\", \"modifications\": []}]",
                  "covalent_bonds": "",
                  "seeds": "",
                  "samples": 5,
                  "steps": 200,
                  "cycles": 10,
                  "dtype": "fp32",
                  "device": "auto",
                  "use_msa": true,
                  "use_template": false,
                  "use_rna_msa": false,
                  "use_guidance": false,
                  "need_atom_confidence": true,
                  "deterministic": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/boltz2/": {
      "get": {
        "summary": "Boltz-2 field schema",
        "description": "All-atom biomolecular structure and binding-affinity prediction.",
        "operationId": "boltz2_schema",
        "tags": [
          "Boltz-2"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Boltz-2 job",
        "description": "All-atom biomolecular structure and binding-affinity prediction. Models complex structures and binding affinities, a critical component towards accurate molecular design. Boltz-2 is the first deep learning model to approach the accuracy of physics-based free-energy perturbation (FEP) methods, while running 1000x faster \u2014 making accurate in silico screening practical for early-stage drug discovery.",
        "operationId": "boltz2_submit",
        "tags": [
          "Boltz-2"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the output directory for this run. A single line of text.",
                    "maxLength": 80,
                    "default": "boltz2-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per unique protein, ligand, DNA, or RNA entity. Set its native Boltz chain ID (or comma-separated IDs for identical copies), sequence or ligand, cyclic flag, and residue modifications. A protein's MSA may be left blank (generated by the MSA server when it is on, otherwise single-sequence), set to an absolute .a3m or .csv path, or set to empty for single-sequence mode. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"A\", \"sequence\": \"QLEDSEVEAVAKGLEEMYANGVTEDNFKNYVKNNFAQQEIS\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "constraints": {
                    "type": "string",
                    "title": "Constraints (JSON, optional)",
                    "description": "Native Boltz constraints array. Supports bond, pocket, and contact entries using the chain IDs above. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "templates": {
                    "type": "string",
                    "title": "Templates (JSON, optional)",
                    "description": "Native Boltz templates array. Each entry may select a CIF/PDB, chain mapping, force flag, and threshold. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "properties": {
                    "type": "string",
                    "title": "Properties (JSON, optional)",
                    "description": "Native Boltz properties array, such as [{\"affinity\": {\"binder\": \"B\"}}]. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "yaml_spec": {
                    "type": "string",
                    "title": "Boltz input (YAML)",
                    "description": "Complete native Boltz YAML. Define protein, DNA, RNA, and ligand entities under sequences; optional constraints, templates, and affinity properties use the same schema as the Boltz CLI. A protein without an msa key gets one from the MSA server; give msa a path to supply your own, or msa: empty for single-sequence mode. Bio Web writes this text to input.yaml and passes that file to boltz predict. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000,
                    "default": "version: 1\nsequences:\n  - protein:\n      id: A\n      sequence: QLEDSEVEAVAKGLEEMYANGVTEDNFKNYVKNNFAQQEIS\n"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Boltz input file (YAML)",
                    "description": "The YAML file defining this prediction, in the same schema as the Boltz CLI takes. Choose a file. Its contents are read here and sent as the input document. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "use_msa_server": {
                    "type": "boolean",
                    "title": "Use the public MSA server",
                    "description": "Generate an MSA for every protein that has no MSA of its own, using the ColabFold MMseqs2 server below. This sends those protein sequences to that server. Proteins with an MSA path or msa: empty are left as they are. Turn off for private sequences or offline runs; each protein then needs a path or msa: empty. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "msa_server_url": {
                    "type": "string",
                    "title": "MSA server URL",
                    "description": "ColabFold-compatible MMseqs2 endpoint; used only when the MSA server is on. The public server asks for serial queries from a single IP, so host your own for large batches. A single line of text.",
                    "default": "https://api.colabfold.com"
                  },
                  "use_potentials": {
                    "type": "boolean",
                    "title": "Use inference-time potentials",
                    "description": "Apply Boltz-2 inference-time potentials to improve physical plausibility. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "recycling_steps": {
                    "type": "number",
                    "title": "Recycling steps",
                    "description": "Number of recycling steps. The Boltz CLI default is 3. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 20,
                    "default": 3
                  },
                  "sampling_steps": {
                    "type": "number",
                    "title": "Structure sampling steps",
                    "description": "Diffusion steps used for structure prediction. The Boltz CLI default is 200. A number, within the range given for the field.",
                    "minimum": 10,
                    "maximum": 1000,
                    "default": 200
                  },
                  "diffusion_samples": {
                    "type": "number",
                    "title": "Structure samples",
                    "description": "Independent diffusion samples generated for each input. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 50,
                    "default": 1
                  },
                  "step_scale": {
                    "type": "number",
                    "title": "Structure step scale",
                    "description": "Diffusion temperature/step size. Boltz-2 defaults to 1.5 and recommends values between 1 and 2; lower values increase diversity. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 5,
                    "default": 1.5
                  },
                  "sampling_steps_affinity": {
                    "type": "number",
                    "title": "Affinity sampling steps",
                    "description": "Sampling steps for the affinity head. Used only when the YAML requests an affinity property. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 200
                  },
                  "diffusion_samples_affinity": {
                    "type": "number",
                    "title": "Affinity samples",
                    "description": "Diffusion samples for the affinity head. The Boltz CLI default is 5. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 50,
                    "default": 5
                  },
                  "affinity_mw_correction": {
                    "type": "boolean",
                    "title": "Apply affinity molecular-weight correction",
                    "description": "Enable Boltz's molecular-weight correction for the affinity value head. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "Seed used by the Boltz random-number generator. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 4294967295,
                    "default": 0
                  },
                  "output_format": {
                    "type": "string",
                    "title": "Coordinate format",
                    "description": "Format of predicted coordinate files. One of the field's option values.",
                    "enum": [
                      "mmcif",
                      "pdb"
                    ],
                    "default": "mmcif"
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "protein_msa_server",
                      "protein_single_sequence",
                      "protein_multimer",
                      "cyclic_protein",
                      "protein_ligand_affinity"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "yaml_spec"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "boltz2-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"A\", \"sequence\": \"QLEDSEVEAVAKGLEEMYANGVTEDNFKNYVKNNFAQQEIS\", \"cyclic\": false, \"modifications\": []}]",
                  "constraints": "",
                  "templates": "",
                  "properties": "",
                  "use_msa_server": true,
                  "msa_server_url": "https://api.colabfold.com",
                  "use_potentials": false,
                  "recycling_steps": 3,
                  "sampling_steps": 200,
                  "diffusion_samples": 1,
                  "step_scale": 1.5,
                  "sampling_steps_affinity": 200,
                  "diffusion_samples_affinity": 5,
                  "affinity_mw_correction": false,
                  "seed": 0,
                  "output_format": "mmcif"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the output directory for this run. A single line of text.",
                    "maxLength": 80,
                    "default": "boltz2-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per unique protein, ligand, DNA, or RNA entity. Set its native Boltz chain ID (or comma-separated IDs for identical copies), sequence or ligand, cyclic flag, and residue modifications. A protein's MSA may be left blank (generated by the MSA server when it is on, otherwise single-sequence), set to an absolute .a3m or .csv path, or set to empty for single-sequence mode. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"A\", \"sequence\": \"QLEDSEVEAVAKGLEEMYANGVTEDNFKNYVKNNFAQQEIS\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "constraints": {
                    "type": "string",
                    "title": "Constraints (JSON, optional)",
                    "description": "Native Boltz constraints array. Supports bond, pocket, and contact entries using the chain IDs above. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "templates": {
                    "type": "string",
                    "title": "Templates (JSON, optional)",
                    "description": "Native Boltz templates array. Each entry may select a CIF/PDB, chain mapping, force flag, and threshold. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "properties": {
                    "type": "string",
                    "title": "Properties (JSON, optional)",
                    "description": "Native Boltz properties array, such as [{\"affinity\": {\"binder\": \"B\"}}]. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "yaml_spec": {
                    "type": "string",
                    "title": "Boltz input (YAML)",
                    "description": "Complete native Boltz YAML. Define protein, DNA, RNA, and ligand entities under sequences; optional constraints, templates, and affinity properties use the same schema as the Boltz CLI. A protein without an msa key gets one from the MSA server; give msa a path to supply your own, or msa: empty for single-sequence mode. Bio Web writes this text to input.yaml and passes that file to boltz predict. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000,
                    "default": "version: 1\nsequences:\n  - protein:\n      id: A\n      sequence: QLEDSEVEAVAKGLEEMYANGVTEDNFKNYVKNNFAQQEIS\n"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Boltz input file (YAML)",
                    "description": "The YAML file defining this prediction, in the same schema as the Boltz CLI takes. Choose a file. Its contents are read here and sent as the input document. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "use_msa_server": {
                    "type": "boolean",
                    "title": "Use the public MSA server",
                    "description": "Generate an MSA for every protein that has no MSA of its own, using the ColabFold MMseqs2 server below. This sends those protein sequences to that server. Proteins with an MSA path or msa: empty are left as they are. Turn off for private sequences or offline runs; each protein then needs a path or msa: empty. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "msa_server_url": {
                    "type": "string",
                    "title": "MSA server URL",
                    "description": "ColabFold-compatible MMseqs2 endpoint; used only when the MSA server is on. The public server asks for serial queries from a single IP, so host your own for large batches. A single line of text.",
                    "default": "https://api.colabfold.com"
                  },
                  "use_potentials": {
                    "type": "boolean",
                    "title": "Use inference-time potentials",
                    "description": "Apply Boltz-2 inference-time potentials to improve physical plausibility. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "recycling_steps": {
                    "type": "number",
                    "title": "Recycling steps",
                    "description": "Number of recycling steps. The Boltz CLI default is 3. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 20,
                    "default": 3
                  },
                  "sampling_steps": {
                    "type": "number",
                    "title": "Structure sampling steps",
                    "description": "Diffusion steps used for structure prediction. The Boltz CLI default is 200. A number, within the range given for the field.",
                    "minimum": 10,
                    "maximum": 1000,
                    "default": 200
                  },
                  "diffusion_samples": {
                    "type": "number",
                    "title": "Structure samples",
                    "description": "Independent diffusion samples generated for each input. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 50,
                    "default": 1
                  },
                  "step_scale": {
                    "type": "number",
                    "title": "Structure step scale",
                    "description": "Diffusion temperature/step size. Boltz-2 defaults to 1.5 and recommends values between 1 and 2; lower values increase diversity. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 5,
                    "default": 1.5
                  },
                  "sampling_steps_affinity": {
                    "type": "number",
                    "title": "Affinity sampling steps",
                    "description": "Sampling steps for the affinity head. Used only when the YAML requests an affinity property. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 200
                  },
                  "diffusion_samples_affinity": {
                    "type": "number",
                    "title": "Affinity samples",
                    "description": "Diffusion samples for the affinity head. The Boltz CLI default is 5. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 50,
                    "default": 5
                  },
                  "affinity_mw_correction": {
                    "type": "boolean",
                    "title": "Apply affinity molecular-weight correction",
                    "description": "Enable Boltz's molecular-weight correction for the affinity value head. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "Seed used by the Boltz random-number generator. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 4294967295,
                    "default": 0
                  },
                  "output_format": {
                    "type": "string",
                    "title": "Coordinate format",
                    "description": "Format of predicted coordinate files. One of the field's option values.",
                    "enum": [
                      "mmcif",
                      "pdb"
                    ],
                    "default": "mmcif"
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "protein_msa_server",
                      "protein_single_sequence",
                      "protein_multimer",
                      "cyclic_protein",
                      "protein_ligand_affinity"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "yaml_spec"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "boltz2-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"A\", \"sequence\": \"QLEDSEVEAVAKGLEEMYANGVTEDNFKNYVKNNFAQQEIS\", \"cyclic\": false, \"modifications\": []}]",
                  "constraints": "",
                  "templates": "",
                  "properties": "",
                  "use_msa_server": true,
                  "msa_server_url": "https://api.colabfold.com",
                  "use_potentials": false,
                  "recycling_steps": 3,
                  "sampling_steps": 200,
                  "diffusion_samples": 1,
                  "step_scale": 1.5,
                  "sampling_steps_affinity": 200,
                  "diffusion_samples_affinity": 5,
                  "affinity_mw_correction": false,
                  "seed": 0,
                  "output_format": "mmcif"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/chai1/": {
      "get": {
        "summary": "Chai-1 field schema",
        "description": "Molecular structure prediction, including proteins. Similar to AlphaFold3.",
        "operationId": "chai1_schema",
        "tags": [
          "Chai-1"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Chai-1 job",
        "description": "Molecular structure prediction, including proteins. Similar to AlphaFold3. A multi-modal foundation model for molecular structure prediction that performs at the state-of-the-art across a variety of benchmarks. Chai-1 enables unified prediction of proteins, small molecules, DNA, RNA, glycosylations, and more.",
        "operationId": "chai1_submit",
        "tags": [
          "Chai-1"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the run and its result archive. A single line of text.",
                    "default": "chai1-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "One box per entity. Its name becomes the name of its FASTA record, which is what restraints refer to it by; left blank, entities are named A, B, C\u2026 in order. Proteins, DNA, RNA and SMILES ligands are supported. Use the FASTA mode for glycans. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"A\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "input_fasta": {
                    "type": "string",
                    "title": "Chai FASTA",
                    "description": "Native Chai FASTA: >protein|name=A, >dna|name=B, >rna|name=C, >ligand|name=D (SMILES), or >glycan|name=E (CCD glycan syntax). Each entity must have a unique name. Use (CCD) in polymer sequences for modified residues. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000,
                    "default": ">protein|name=A\nMSTNPKPQRKTKRNTNRRPQDVKFPGG\n"
                  },
                  "input_file": {
                    "type": "string",
                    "title": "Chai FASTA file",
                    "description": "Upload a native Chai FASTA file. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "maxLength": 500000
                  },
                  "use_esm_embeddings": {
                    "type": "boolean",
                    "title": "Use ESM embeddings",
                    "description": "Upstream default. Disable for a sequence-only ablation. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "use_msa_server": {
                    "type": "boolean",
                    "title": "Use public MSA server",
                    "description": "Generate protein MSAs with the ColabFold MMseqs2 server below. This sends the protein sequences to that server and needs network access. A local aligned.pqt directory or the supplied example MSAs take precedence. Turn off for private sequences or offline runs; Chai-1 then relies on its ESM embeddings alone. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "msa_server_url": {
                    "type": "string",
                    "title": "MSA server URL",
                    "description": "ColabFold-compatible MMseqs2 endpoint; used only when the MSA server is on. The public server asks for serial queries from a single IP, so host your own for large batches. A single line of text.",
                    "default": "https://api.colabfold.com"
                  },
                  "msa_directory": {
                    "type": "string",
                    "title": "Local aligned.pqt directory",
                    "description": "Existing compute-node directory with one <sequence SHA256>.aligned.pqt per protein, as documented in the official MSA example. Takes precedence over the MSA server. A single line of text."
                  },
                  "use_example_msas": {
                    "type": "boolean",
                    "title": "Use supplied example MSAs",
                    "description": "Use the two aligned.pqt files from Chai\u2019s official examples, downloaded when Chai-1 is installed or first used. Only suitable for the sequences in the official protein-complex preset. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_templates_server": {
                    "type": "boolean",
                    "title": "Search public templates",
                    "description": "Search pdb100 templates with the MSA server; requires the public MSA server. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "template_hits_path": {
                    "type": "string",
                    "title": "Local template hits .m8",
                    "description": "Existing compute-node MMseqs2 .m8 template hits file. Exclusive with the template server. A single line of text."
                  },
                  "restraints_csv": {
                    "type": "string",
                    "title": "Native restraints CSV",
                    "description": "Paste a Chai restraint table with the official header. Supports contact, pocket and covalent rows. Use either this table or the guided fields below. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "restraints_file": {
                    "type": "string",
                    "title": "Restraints CSV file",
                    "description": "Upload the same native restraint table instead of pasting it. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "maxLength": 500000
                  },
                  "pocket_restraints": {
                    "type": "string",
                    "title": "Pocket restraints (JSON)",
                    "description": "Guided format: [{\"chainA\":\"A\",\"res_idxA\":387,\"chainB\":\"B\"}]. First chain has the specific residue. Chain letters follow FASTA entity order. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "contact_restraints": {
                    "type": "string",
                    "title": "Contact restraints (JSON)",
                    "description": "Guided format: [{\"chainA\":\"A\",\"res_idxA\":387,\"chainB\":\"B\",\"res_idxB\":101}]. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "covalent_restraints": {
                    "type": "string",
                    "title": "Covalent restraints (JSON)",
                    "description": "Guided format: [{\"chainA\":\"A\",\"res_idxA\":217,\"covalentAtomA\":\"SG\",\"chainB\":\"B\",\"covalentAtomB\":\"S1\"}]. Ligand/glycan partners need an atom name but no residue index. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "restraints_min_distance": {
                    "type": "number",
                    "title": "Guided minimum distance (\u00c5)",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 0
                  },
                  "restraints_max_distance": {
                    "type": "number",
                    "title": "Guided maximum distance (\u00c5)",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 5
                  },
                  "num_trunk_samples": {
                    "type": "number",
                    "title": "Trunk samples",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10,
                    "default": 1
                  },
                  "num_recycles": {
                    "type": "number",
                    "title": "Trunk recycles",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 20,
                    "default": 3
                  },
                  "num_diffn_timesteps": {
                    "type": "number",
                    "title": "Diffusion timesteps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 200
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Diffusion samples per trunk",
                    "description": "Number of candidate structures to generate per trunk. More samples use more GPU memory; try 1 for large complexes or 16 GB GPUs. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 25,
                    "default": 5
                  },
                  "recycle_msa_subsample": {
                    "type": "number",
                    "title": "MSA subsample per recycle",
                    "description": "Upstream recycle_msa_subsample argument; 0 disables subsampling. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1000,
                    "default": 0
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "low_memory": {
                    "type": "boolean",
                    "title": "Low-memory inference",
                    "description": "Move model components as needed to lower peak GPU memory. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "device": {
                    "type": "string",
                    "title": "CUDA device",
                    "description": "CUDA device such as cuda:0. A single line of text.",
                    "default": "cuda:0"
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "protein_ligand",
                      "supplied_msas",
                      "msa_server",
                      "templates_7wcu",
                      "contact_7syz",
                      "pocket_7syz",
                      "glycan_1ac5",
                      "covalent_ligand_8cyo"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "input_fasta",
                  "input_file"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "chai1-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"A\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]",
                  "use_esm_embeddings": true,
                  "use_msa_server": true,
                  "msa_server_url": "https://api.colabfold.com",
                  "msa_directory": "",
                  "use_example_msas": false,
                  "use_templates_server": false,
                  "template_hits_path": "",
                  "restraints_csv": "",
                  "restraints_file": "",
                  "pocket_restraints": "",
                  "contact_restraints": "",
                  "covalent_restraints": "",
                  "restraints_min_distance": 0,
                  "restraints_max_distance": 5,
                  "num_trunk_samples": 1,
                  "num_recycles": 3,
                  "num_diffn_timesteps": 200,
                  "num_samples": 5,
                  "recycle_msa_subsample": 0,
                  "seed": 0,
                  "low_memory": true,
                  "device": "cuda:0"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the run and its result archive. A single line of text.",
                    "default": "chai1-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "One box per entity. Its name becomes the name of its FASTA record, which is what restraints refer to it by; left blank, entities are named A, B, C\u2026 in order. Proteins, DNA, RNA and SMILES ligands are supported. Use the FASTA mode for glycans. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"A\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "input_fasta": {
                    "type": "string",
                    "title": "Chai FASTA",
                    "description": "Native Chai FASTA: >protein|name=A, >dna|name=B, >rna|name=C, >ligand|name=D (SMILES), or >glycan|name=E (CCD glycan syntax). Each entity must have a unique name. Use (CCD) in polymer sequences for modified residues. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000,
                    "default": ">protein|name=A\nMSTNPKPQRKTKRNTNRRPQDVKFPGG\n"
                  },
                  "input_file": {
                    "type": "string",
                    "title": "Chai FASTA file",
                    "description": "Upload a native Chai FASTA file. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "maxLength": 500000
                  },
                  "use_esm_embeddings": {
                    "type": "boolean",
                    "title": "Use ESM embeddings",
                    "description": "Upstream default. Disable for a sequence-only ablation. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "use_msa_server": {
                    "type": "boolean",
                    "title": "Use public MSA server",
                    "description": "Generate protein MSAs with the ColabFold MMseqs2 server below. This sends the protein sequences to that server and needs network access. A local aligned.pqt directory or the supplied example MSAs take precedence. Turn off for private sequences or offline runs; Chai-1 then relies on its ESM embeddings alone. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "msa_server_url": {
                    "type": "string",
                    "title": "MSA server URL",
                    "description": "ColabFold-compatible MMseqs2 endpoint; used only when the MSA server is on. The public server asks for serial queries from a single IP, so host your own for large batches. A single line of text.",
                    "default": "https://api.colabfold.com"
                  },
                  "msa_directory": {
                    "type": "string",
                    "title": "Local aligned.pqt directory",
                    "description": "Existing compute-node directory with one <sequence SHA256>.aligned.pqt per protein, as documented in the official MSA example. Takes precedence over the MSA server. A single line of text."
                  },
                  "use_example_msas": {
                    "type": "boolean",
                    "title": "Use supplied example MSAs",
                    "description": "Use the two aligned.pqt files from Chai\u2019s official examples, downloaded when Chai-1 is installed or first used. Only suitable for the sequences in the official protein-complex preset. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_templates_server": {
                    "type": "boolean",
                    "title": "Search public templates",
                    "description": "Search pdb100 templates with the MSA server; requires the public MSA server. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "template_hits_path": {
                    "type": "string",
                    "title": "Local template hits .m8",
                    "description": "Existing compute-node MMseqs2 .m8 template hits file. Exclusive with the template server. A single line of text."
                  },
                  "restraints_csv": {
                    "type": "string",
                    "title": "Native restraints CSV",
                    "description": "Paste a Chai restraint table with the official header. Supports contact, pocket and covalent rows. Use either this table or the guided fields below. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "restraints_file": {
                    "type": "string",
                    "title": "Restraints CSV file",
                    "description": "Upload the same native restraint table instead of pasting it. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "maxLength": 500000
                  },
                  "pocket_restraints": {
                    "type": "string",
                    "title": "Pocket restraints (JSON)",
                    "description": "Guided format: [{\"chainA\":\"A\",\"res_idxA\":387,\"chainB\":\"B\"}]. First chain has the specific residue. Chain letters follow FASTA entity order. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "contact_restraints": {
                    "type": "string",
                    "title": "Contact restraints (JSON)",
                    "description": "Guided format: [{\"chainA\":\"A\",\"res_idxA\":387,\"chainB\":\"B\",\"res_idxB\":101}]. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "covalent_restraints": {
                    "type": "string",
                    "title": "Covalent restraints (JSON)",
                    "description": "Guided format: [{\"chainA\":\"A\",\"res_idxA\":217,\"covalentAtomA\":\"SG\",\"chainB\":\"B\",\"covalentAtomB\":\"S1\"}]. Ligand/glycan partners need an atom name but no residue index. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "restraints_min_distance": {
                    "type": "number",
                    "title": "Guided minimum distance (\u00c5)",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 0
                  },
                  "restraints_max_distance": {
                    "type": "number",
                    "title": "Guided maximum distance (\u00c5)",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 5
                  },
                  "num_trunk_samples": {
                    "type": "number",
                    "title": "Trunk samples",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10,
                    "default": 1
                  },
                  "num_recycles": {
                    "type": "number",
                    "title": "Trunk recycles",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 20,
                    "default": 3
                  },
                  "num_diffn_timesteps": {
                    "type": "number",
                    "title": "Diffusion timesteps",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 200
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Diffusion samples per trunk",
                    "description": "Number of candidate structures to generate per trunk. More samples use more GPU memory; try 1 for large complexes or 16 GB GPUs. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 25,
                    "default": 5
                  },
                  "recycle_msa_subsample": {
                    "type": "number",
                    "title": "MSA subsample per recycle",
                    "description": "Upstream recycle_msa_subsample argument; 0 disables subsampling. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1000,
                    "default": 0
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "low_memory": {
                    "type": "boolean",
                    "title": "Low-memory inference",
                    "description": "Move model components as needed to lower peak GPU memory. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "device": {
                    "type": "string",
                    "title": "CUDA device",
                    "description": "CUDA device such as cuda:0. A single line of text.",
                    "default": "cuda:0"
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "protein_ligand",
                      "supplied_msas",
                      "msa_server",
                      "templates_7wcu",
                      "contact_7syz",
                      "pocket_7syz",
                      "glycan_1ac5",
                      "covalent_ligand_8cyo"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "input_fasta",
                  "input_file"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "chai1-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"A\", \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]",
                  "use_esm_embeddings": true,
                  "use_msa_server": true,
                  "msa_server_url": "https://api.colabfold.com",
                  "msa_directory": "",
                  "use_example_msas": false,
                  "use_templates_server": false,
                  "template_hits_path": "",
                  "restraints_csv": "",
                  "restraints_file": "",
                  "pocket_restraints": "",
                  "contact_restraints": "",
                  "covalent_restraints": "",
                  "restraints_min_distance": 0,
                  "restraints_max_distance": 5,
                  "num_trunk_samples": 1,
                  "num_recycles": 3,
                  "num_diffn_timesteps": 200,
                  "num_samples": 5,
                  "recycle_msa_subsample": 0,
                  "seed": 0,
                  "low_memory": true,
                  "device": "cuda:0"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/protenix/": {
      "get": {
        "summary": "Protenix-v2 field schema",
        "description": "Structure prediction for proteins, DNA/RNA, ligands, and ions. Supports co-folding.",
        "operationId": "protenix_schema",
        "tags": [
          "Protenix-v2"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Protenix-v2 job",
        "description": "Structure prediction for proteins, DNA/RNA, ligands, and ions. Supports co-folding. Protenix is ByteDance's trainable, open reproduction of AlphaFold 3. It predicts all-atom structures of biomolecular complexes, including proteins, DNA, RNA, ligands, ions, and covalent modifications, with optional MSA, template, RNA MSA, and pocket or contact constraint inputs.",
        "operationId": "protenix_submit",
        "tags": [
          "Protenix-v2"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the single Protenix job generated from these parameters; results are written under this name. A single line of text.",
                    "maxLength": 80,
                    "default": "protenix-job"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per unique Protenix entity. Set count and an optional matching list of comma-separated chain IDs, plus the sequence, ligand (a CCD_ code such as CCD_ATP, several joined for a glycan such as CCD_NAG_BMA_BGC, a SMILES string, or FILE_ and an absolute path to a 3D structure file), or ion code (e.g. MG, without CCD_). Modifications take a CCD code at a 1-based position. \"Cyclic\" closes a peptide with a head-to-tail amide bond. MSA and template paths are optional precomputed files. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"A\", \"count\": 1, \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "covalent_bonds": {
                    "type": "string",
                    "title": "Covalent bonds (JSON, optional)",
                    "description": "Native Protenix covalent_bonds array, e.g. [{\"entity1\": \"2\", \"copy1\": 1, \"position1\": \"2\", \"atom1\": \"N6\", \"entity2\": \"3\", \"copy2\": 1, \"position2\": \"1\", \"atom2\": \"C1\"}]. Entities are 1-based box indexes; copies are 1-based within count and may be omitted together to bond every copy pair. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "constraint": {
                    "type": "string",
                    "title": "Constraint (JSON, optional)",
                    "description": "Native Protenix constraint object with a \"contact\" list and/or a \"pocket\" object, e.g. {\"pocket\": {\"binder_chain\": {\"entity\": 2, \"copy\": 1}, \"contact_residues\": [{\"entity\": 1, \"copy\": 1, \"position\": 69}], \"max_distance\": 8}}. A soft constraint, read only by protenix_base_constraint_v0.5.0. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 20000
                  },
                  "input_json": {
                    "type": "string",
                    "title": "Protenix inference jobs (JSON)",
                    "description": "Complete native Protenix input: a non-empty top-level list of named jobs using proteinChain, dnaSequence, rnaSequence, ligand, or ion entities, with optional covalent_bonds, constraint, and modelSeeds. Bio Web writes this text to input.json. Any MSA, template, or FILE_ ligand paths inside it must be absolute paths available to the runner. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 1000000,
                    "default": "[\n  {\n    \"name\": \"protenix-demo\",\n    \"sequences\": [\n      {\n        \"proteinChain\": {\n          \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\",\n          \"count\": 1\n        }\n      }\n    ]\n  }\n]"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Inference jobs file (JSON)",
                    "description": "The JSON file defining this run's jobs, in Protenix's own input format. Choose a file. Its contents are read here and sent as the input document. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "model": {
                    "type": "string",
                    "title": "Model",
                    "description": "Checkpoint to run; weights download on first use. protenix-v2 and the v1.0.0 base models add template and RNA MSA support; only protenix_base_constraint_v0.5.0 reads constraints; the mini and tiny models trade accuracy for speed (recommended: 4 cycles and 5 steps), and the ESM and ISM variants add ESM2-3B embeddings for use without MSAs. The protenix pred CLI default is protenix_base_default_v1.0.0. One of the field's option values.",
                    "enum": [
                      "protenix-v2",
                      "protenix_base_default_v1.0.0",
                      "protenix_base_20250630_v1.0.0",
                      "protenix_base_default_v0.5.0",
                      "protenix_base_constraint_v0.5.0",
                      "protenix_mini_esm_v0.5.0",
                      "protenix_mini_ism_v0.5.0",
                      "protenix_mini_default_v0.5.0",
                      "protenix_tiny_default_v0.5.0"
                    ],
                    "default": "protenix-v2"
                  },
                  "seeds": {
                    "type": "string",
                    "title": "Seeds",
                    "description": "Comma-separated integers passed to --seeds; every job runs once per seed. The CLI default is 101. A single line of text.",
                    "maxLength": 200,
                    "default": "101"
                  },
                  "use_seeds_in_json": {
                    "type": "boolean",
                    "title": "Use seeds from the input JSON",
                    "description": "Use modelSeeds from the first job in place of Seeds, for every job in the run. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "samples": {
                    "type": "number",
                    "title": "Samples",
                    "description": "Number of structure samples per seed (--sample). The CLI default is 5. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 64,
                    "default": 5
                  },
                  "cycles": {
                    "type": "number",
                    "title": "Pairformer cycles",
                    "description": "Number of Pairformer recycling cycles (--cycle). The CLI default is 10. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 10
                  },
                  "steps": {
                    "type": "number",
                    "title": "Diffusion steps",
                    "description": "Number of diffusion steps (--step). The CLI default is 200. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 200
                  },
                  "use_default_params": {
                    "type": "boolean",
                    "title": "Use the model's recommended parameters",
                    "description": "Replace cycles and steps with the selected model's recommended values: 10 and 200 for base models and protenix-v2, 4 and 5 for mini and tiny models. Also turns MSAs off for the mini ESM and ISM models. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_msa": {
                    "type": "boolean",
                    "title": "Use or generate protein MSAs",
                    "description": "Use protein MSA features. A protein without paired or unpaired MSA paths has its sequence sent to the MSA server chosen below. Turn off for private sequences or offline runs, at a significant cost in accuracy unless an ESM model is used. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "msa_server_mode": {
                    "type": "string",
                    "title": "MSA server",
                    "description": "Where missing protein MSAs are searched: the Protenix MSA service (https://protenix-server.com/api/msa; set MMSEQS_SERVICE_HOST_URL on the runner to use your own) or the public ColabFold MMseqs2 server (https://api.colabfold.com). One of the field's option values.",
                    "enum": [
                      "protenix",
                      "colabfold"
                    ],
                    "default": "protenix"
                  },
                  "use_template": {
                    "type": "boolean",
                    "title": "Use protein templates",
                    "description": "Use template features from each protein's templatesPath (.a3m or .hhr). A protein without one gets a local template search instead, which needs protein MSAs, HMMER (hmmsearch and hmmbuild) on the runner's PATH, and downloads the PDB seqres database on first use. Requires protenix-v2 or a v1.0.0 base model. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_rna_msa": {
                    "type": "boolean",
                    "title": "Use RNA MSAs",
                    "description": "Use RNA MSA features from each RNA's unpaired MSA path. An RNA without one gets a local nhmmer search instead, which needs HMMER on the runner's PATH and downloads the Rfam, RNAcentral, and NT-RNA databases on first use. Requires protein MSAs to be on, and protenix-v2 or a v1.0.0 base model. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_guidance": {
                    "type": "boolean",
                    "title": "Use training-free guidance",
                    "description": "Apply Training-Free Guidance (--use_tfg_guidance) for improved ligand plausibility, such as chirality and planarity; increases compute time. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "need_atom_confidence": {
                    "type": "boolean",
                    "title": "Write atom-level confidence data",
                    "description": "Write full per-atom confidence JSON in addition to each sample's summary confidence. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "dtype": {
                    "type": "string",
                    "title": "Inference precision",
                    "description": "Protenix defaults to BF16; FP32 uses more memory. One of the field's option values.",
                    "enum": [
                      "bf16",
                      "fp32"
                    ],
                    "default": "bf16"
                  },
                  "triatt_kernel": {
                    "type": "string",
                    "title": "Triangle attention kernel",
                    "description": "Kernel for triangle attention. DeepSpeed needs DeepSpeed and CUTLASS_PATH on the runner; PyTorch needs no extra kernels. One of the field's option values.",
                    "enum": [
                      "cuequivariance",
                      "triattention",
                      "deepspeed",
                      "torch"
                    ],
                    "default": "cuequivariance"
                  },
                  "trimul_kernel": {
                    "type": "string",
                    "title": "Triangle multiplicative kernel",
                    "description": "Kernel for the triangle multiplicative update. One of the field's option values.",
                    "enum": [
                      "cuequivariance",
                      "torch"
                    ],
                    "default": "cuequivariance"
                  },
                  "enable_cache": {
                    "type": "boolean",
                    "title": "Cache diffusion variables",
                    "description": "Cache shareable variables in the diffusion module. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "enable_fusion": {
                    "type": "boolean",
                    "title": "Kernel fusion",
                    "description": "Enable efficient kernel fusion in the diffusion transformer. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "enable_tf32": {
                    "type": "boolean",
                    "title": "TF32 matrix multiplication",
                    "description": "Enable TF32 for FP32 matrix multiplications on supported GPUs. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "quick_prediction",
                      "protein_dna_ligand_7pzb",
                      "precomputed_msas_7r6r_7wux",
                      "mini_esm_7r6r_7wux",
                      "constraints_7st3_5sak",
                      "rna_msa_9gmw"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "input_json"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "protenix-job",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"A\", \"count\": 1, \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]",
                  "covalent_bonds": "",
                  "constraint": "",
                  "model": "protenix-v2",
                  "seeds": "101",
                  "use_seeds_in_json": false,
                  "samples": 5,
                  "cycles": 10,
                  "steps": 200,
                  "use_default_params": false,
                  "use_msa": true,
                  "msa_server_mode": "protenix",
                  "use_template": false,
                  "use_rna_msa": false,
                  "use_guidance": false,
                  "need_atom_confidence": false,
                  "dtype": "bf16",
                  "triatt_kernel": "cuequivariance",
                  "trimul_kernel": "cuequivariance",
                  "enable_cache": true,
                  "enable_fusion": true,
                  "enable_tf32": true
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the single Protenix job generated from these parameters; results are written under this name. A single line of text.",
                    "maxLength": 80,
                    "default": "protenix-job"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per unique Protenix entity. Set count and an optional matching list of comma-separated chain IDs, plus the sequence, ligand (a CCD_ code such as CCD_ATP, several joined for a glycan such as CCD_NAG_BMA_BGC, a SMILES string, or FILE_ and an absolute path to a 3D structure file), or ion code (e.g. MG, without CCD_). Modifications take a CCD code at a 1-based position. \"Cyclic\" closes a peptide with a head-to-tail amide bond. MSA and template paths are optional precomputed files. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"A\", \"count\": 1, \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]"
                  },
                  "covalent_bonds": {
                    "type": "string",
                    "title": "Covalent bonds (JSON, optional)",
                    "description": "Native Protenix covalent_bonds array, e.g. [{\"entity1\": \"2\", \"copy1\": 1, \"position1\": \"2\", \"atom1\": \"N6\", \"entity2\": \"3\", \"copy2\": 1, \"position2\": \"1\", \"atom2\": \"C1\"}]. Entities are 1-based box indexes; copies are 1-based within count and may be omitted together to bond every copy pair. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "constraint": {
                    "type": "string",
                    "title": "Constraint (JSON, optional)",
                    "description": "Native Protenix constraint object with a \"contact\" list and/or a \"pocket\" object, e.g. {\"pocket\": {\"binder_chain\": {\"entity\": 2, \"copy\": 1}, \"contact_residues\": [{\"entity\": 1, \"copy\": 1, \"position\": 69}], \"max_distance\": 8}}. A soft constraint, read only by protenix_base_constraint_v0.5.0. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 20000
                  },
                  "input_json": {
                    "type": "string",
                    "title": "Protenix inference jobs (JSON)",
                    "description": "Complete native Protenix input: a non-empty top-level list of named jobs using proteinChain, dnaSequence, rnaSequence, ligand, or ion entities, with optional covalent_bonds, constraint, and modelSeeds. Bio Web writes this text to input.json. Any MSA, template, or FILE_ ligand paths inside it must be absolute paths available to the runner. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 1000000,
                    "default": "[\n  {\n    \"name\": \"protenix-demo\",\n    \"sequences\": [\n      {\n        \"proteinChain\": {\n          \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\",\n          \"count\": 1\n        }\n      }\n    ]\n  }\n]"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Inference jobs file (JSON)",
                    "description": "The JSON file defining this run's jobs, in Protenix's own input format. Choose a file. Its contents are read here and sent as the input document. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "model": {
                    "type": "string",
                    "title": "Model",
                    "description": "Checkpoint to run; weights download on first use. protenix-v2 and the v1.0.0 base models add template and RNA MSA support; only protenix_base_constraint_v0.5.0 reads constraints; the mini and tiny models trade accuracy for speed (recommended: 4 cycles and 5 steps), and the ESM and ISM variants add ESM2-3B embeddings for use without MSAs. The protenix pred CLI default is protenix_base_default_v1.0.0. One of the field's option values.",
                    "enum": [
                      "protenix-v2",
                      "protenix_base_default_v1.0.0",
                      "protenix_base_20250630_v1.0.0",
                      "protenix_base_default_v0.5.0",
                      "protenix_base_constraint_v0.5.0",
                      "protenix_mini_esm_v0.5.0",
                      "protenix_mini_ism_v0.5.0",
                      "protenix_mini_default_v0.5.0",
                      "protenix_tiny_default_v0.5.0"
                    ],
                    "default": "protenix-v2"
                  },
                  "seeds": {
                    "type": "string",
                    "title": "Seeds",
                    "description": "Comma-separated integers passed to --seeds; every job runs once per seed. The CLI default is 101. A single line of text.",
                    "maxLength": 200,
                    "default": "101"
                  },
                  "use_seeds_in_json": {
                    "type": "boolean",
                    "title": "Use seeds from the input JSON",
                    "description": "Use modelSeeds from the first job in place of Seeds, for every job in the run. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "samples": {
                    "type": "number",
                    "title": "Samples",
                    "description": "Number of structure samples per seed (--sample). The CLI default is 5. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 64,
                    "default": 5
                  },
                  "cycles": {
                    "type": "number",
                    "title": "Pairformer cycles",
                    "description": "Number of Pairformer recycling cycles (--cycle). The CLI default is 10. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 10
                  },
                  "steps": {
                    "type": "number",
                    "title": "Diffusion steps",
                    "description": "Number of diffusion steps (--step). The CLI default is 200. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 200
                  },
                  "use_default_params": {
                    "type": "boolean",
                    "title": "Use the model's recommended parameters",
                    "description": "Replace cycles and steps with the selected model's recommended values: 10 and 200 for base models and protenix-v2, 4 and 5 for mini and tiny models. Also turns MSAs off for the mini ESM and ISM models. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_msa": {
                    "type": "boolean",
                    "title": "Use or generate protein MSAs",
                    "description": "Use protein MSA features. A protein without paired or unpaired MSA paths has its sequence sent to the MSA server chosen below. Turn off for private sequences or offline runs, at a significant cost in accuracy unless an ESM model is used. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "msa_server_mode": {
                    "type": "string",
                    "title": "MSA server",
                    "description": "Where missing protein MSAs are searched: the Protenix MSA service (https://protenix-server.com/api/msa; set MMSEQS_SERVICE_HOST_URL on the runner to use your own) or the public ColabFold MMseqs2 server (https://api.colabfold.com). One of the field's option values.",
                    "enum": [
                      "protenix",
                      "colabfold"
                    ],
                    "default": "protenix"
                  },
                  "use_template": {
                    "type": "boolean",
                    "title": "Use protein templates",
                    "description": "Use template features from each protein's templatesPath (.a3m or .hhr). A protein without one gets a local template search instead, which needs protein MSAs, HMMER (hmmsearch and hmmbuild) on the runner's PATH, and downloads the PDB seqres database on first use. Requires protenix-v2 or a v1.0.0 base model. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_rna_msa": {
                    "type": "boolean",
                    "title": "Use RNA MSAs",
                    "description": "Use RNA MSA features from each RNA's unpaired MSA path. An RNA without one gets a local nhmmer search instead, which needs HMMER on the runner's PATH and downloads the Rfam, RNAcentral, and NT-RNA databases on first use. Requires protein MSAs to be on, and protenix-v2 or a v1.0.0 base model. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "use_guidance": {
                    "type": "boolean",
                    "title": "Use training-free guidance",
                    "description": "Apply Training-Free Guidance (--use_tfg_guidance) for improved ligand plausibility, such as chirality and planarity; increases compute time. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "need_atom_confidence": {
                    "type": "boolean",
                    "title": "Write atom-level confidence data",
                    "description": "Write full per-atom confidence JSON in addition to each sample's summary confidence. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "dtype": {
                    "type": "string",
                    "title": "Inference precision",
                    "description": "Protenix defaults to BF16; FP32 uses more memory. One of the field's option values.",
                    "enum": [
                      "bf16",
                      "fp32"
                    ],
                    "default": "bf16"
                  },
                  "triatt_kernel": {
                    "type": "string",
                    "title": "Triangle attention kernel",
                    "description": "Kernel for triangle attention. DeepSpeed needs DeepSpeed and CUTLASS_PATH on the runner; PyTorch needs no extra kernels. One of the field's option values.",
                    "enum": [
                      "cuequivariance",
                      "triattention",
                      "deepspeed",
                      "torch"
                    ],
                    "default": "cuequivariance"
                  },
                  "trimul_kernel": {
                    "type": "string",
                    "title": "Triangle multiplicative kernel",
                    "description": "Kernel for the triangle multiplicative update. One of the field's option values.",
                    "enum": [
                      "cuequivariance",
                      "torch"
                    ],
                    "default": "cuequivariance"
                  },
                  "enable_cache": {
                    "type": "boolean",
                    "title": "Cache diffusion variables",
                    "description": "Cache shareable variables in the diffusion module. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "enable_fusion": {
                    "type": "boolean",
                    "title": "Kernel fusion",
                    "description": "Enable efficient kernel fusion in the diffusion transformer. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "enable_tf32": {
                    "type": "boolean",
                    "title": "TF32 matrix multiplication",
                    "description": "Enable TF32 for FP32 matrix multiplications on supported GPUs. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "quick_prediction",
                      "protein_dna_ligand_7pzb",
                      "precomputed_msas_7r6r_7wux",
                      "mini_esm_7r6r_7wux",
                      "constraints_7st3_5sak",
                      "rna_msa_9gmw"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "input_json"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "protenix-job",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"A\", \"count\": 1, \"sequence\": \"MSTNPKPQRKTKRNTNRRPQDVKFPGG\", \"cyclic\": false, \"modifications\": []}]",
                  "covalent_bonds": "",
                  "constraint": "",
                  "model": "protenix-v2",
                  "seeds": "101",
                  "use_seeds_in_json": false,
                  "samples": 5,
                  "cycles": 10,
                  "steps": 200,
                  "use_default_params": false,
                  "use_msa": true,
                  "msa_server_mode": "protenix",
                  "use_template": false,
                  "use_rna_msa": false,
                  "use_guidance": false,
                  "need_atom_confidence": false,
                  "dtype": "bf16",
                  "triatt_kernel": "cuequivariance",
                  "trimul_kernel": "cuequivariance",
                  "enable_cache": true,
                  "enable_fusion": true,
                  "enable_tf32": true
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/esmfold2/": {
      "get": {
        "summary": "ESMFold 2 field schema",
        "description": "Fast all-atom structure prediction for biomolecular complexes.",
        "operationId": "esmfold2_schema",
        "tags": [
          "ESMFold 2"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a ESMFold 2 job",
        "description": "Fast all-atom structure prediction for biomolecular complexes. ESMFold2 predicts all-atom structures for protein complexes, DNA, RNA, ligands, modified residues, and covalent complexes through the released 6B-parameter model.",
        "operationId": "esmfold2_submit",
        "tags": [
          "ESMFold 2"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Used to name the predicted mmCIF file. A single line of text.",
                    "maxLength": 80,
                    "default": "esmfold2-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per unique ESMFold2 entity. Set its ID (or comma-separated IDs for identical copies), sequence or ligand, zero-indexed residue modifications, and optional protein/RNA MSA. An MSA is an absolute .a3m path on the compute node, a {\"sequences\": [...]} object whose first row is the query, or ESMFold2's serialized form; left blank, the chain folds from its sequence alone, which is ESMFold2's usual mode. Ligands may contain one or more comma-separated CCD_ codes. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"A\", \"sequence\": \"MSHHWGYGKHNGPEHWHKDFPIAKGERQSPVDIDTHTAKYDPSLK\", \"modifications\": []}]"
                  },
                  "pocket": {
                    "type": "string",
                    "title": "Pocket conditioning (JSON, optional)",
                    "description": "Native ESMFold2 pocket object with binder_chain_id and contacts. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "distogram_conditioning": {
                    "type": "string",
                    "title": "Distogram conditioning (JSON, optional)",
                    "description": "Native ESMFold2 distogram_conditioning array with chain_id and JSON matrix values. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "covalent_bonds": {
                    "type": "string",
                    "title": "Covalent bonds (JSON, optional)",
                    "description": "Native ESMFold2 covalent_bonds array using chain_id, residue index, and atom index fields for each endpoint. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "input_json": {
                    "type": "string",
                    "title": "StructurePredictionInput (JSON)",
                    "description": "JSON representation of ESMFold2's StructurePredictionInput. Sequence entries use type protein, dna, rna, or ligand; polymers take id and sequence, while ligands take id plus either smiles or a ccd list. Native pocket, distogram, covalent-bond, modification, and serialized MSA fields are passed through. A protein or RNA msa may also be an absolute .a3m path, which is read with MSA.from_a3m. Modification positions are zero-indexed, exactly as in the official ESMFold2 Python dataclass. Use the JSON-safe shape produced by serialize_structure_prediction_input. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000,
                    "default": "{\n  \"sequences\": [\n    {\n      \"type\": \"protein\",\n      \"id\": \"A\",\n      \"sequence\": \"MSHHWGYGKHNGPEHWHKDFPIAKGERQSPVDIDTHTAKYDPSLK\"\n    }\n  ]\n}"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "StructurePredictionInput file (JSON)",
                    "description": "The JSON file defining this prediction, in ESMFold2's own StructurePredictionInput format. Choose a file. Its contents are read here and sent as the input document. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "num_loops": {
                    "type": "number",
                    "title": "Recycling loops",
                    "description": "Recycling loops passed to ESMFold2InputBuilder.fold. The released API default is 20. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 64,
                    "default": 20
                  },
                  "num_sampling_steps": {
                    "type": "number",
                    "title": "Diffusion sampling steps",
                    "description": "Diffusion sampling steps passed to ESMFold2InputBuilder.fold. The released API default is 200. A number, within the range given for the field.",
                    "minimum": 2,
                    "maximum": 1000,
                    "default": 200
                  },
                  "num_diffusion_samples": {
                    "type": "number",
                    "title": "Diffusion samples",
                    "description": "Number of independently sampled structures. More than one produces one mmCIF per sample. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 16,
                    "default": 1
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "Seeds input preparation and diffusion sampling. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 4294967295,
                    "default": 0
                  },
                  "lm_dropout": {
                    "type": "number",
                    "title": "Language-model dropout",
                    "description": "Inference-time LM embedding dropout. The released folding API defaults to 0.3; set 0 to disable it. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.3
                  },
                  "chunk_size": {
                    "type": "number",
                    "title": "Pair-operation chunk size",
                    "description": "Chunk size for memory-heavy pair operations. The released model defaults to 64; smaller values use less memory. Set 0 to disable chunking. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 512,
                    "default": 64
                  },
                  "device": {
                    "type": "string",
                    "title": "Device",
                    "description": "Auto selects CUDA when available and otherwise CPU. The published 6B model is intended for GPU inference. One of the field's option values.",
                    "enum": [
                      "auto",
                      "cuda",
                      "cpu"
                    ],
                    "default": "auto"
                  },
                  "precision": {
                    "type": "string",
                    "title": "Model precision",
                    "description": "Use the checkpoint's published dtype, or explicitly cast model weights to BF16 or FP32. One of the field's option values.",
                    "enum": [
                      "default",
                      "bf16",
                      "fp32"
                    ],
                    "default": "default"
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "carbonic_anhydrase_2cba",
                      "protein_dna_ligand_1mht"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "input_json"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "esmfold2-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"A\", \"sequence\": \"MSHHWGYGKHNGPEHWHKDFPIAKGERQSPVDIDTHTAKYDPSLK\", \"modifications\": []}]",
                  "pocket": "",
                  "distogram_conditioning": "",
                  "covalent_bonds": "",
                  "num_loops": 20,
                  "num_sampling_steps": 200,
                  "num_diffusion_samples": 1,
                  "seed": 0,
                  "lm_dropout": 0.3,
                  "chunk_size": 64,
                  "device": "auto",
                  "precision": "default"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Used to name the predicted mmCIF file. A single line of text.",
                    "maxLength": 80,
                    "default": "esmfold2-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Molecules",
                    "description": "Add one box per unique ESMFold2 entity. Set its ID (or comma-separated IDs for identical copies), sequence or ligand, zero-indexed residue modifications, and optional protein/RNA MSA. An MSA is an absolute .a3m path on the compute node, a {\"sequences\": [...]} object whose first row is the query, or ESMFold2's serialized form; left blank, the chain folds from its sequence alone, which is ESMFold2's usual mode. Ligands may contain one or more comma-separated CCD_ codes. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"A\", \"sequence\": \"MSHHWGYGKHNGPEHWHKDFPIAKGERQSPVDIDTHTAKYDPSLK\", \"modifications\": []}]"
                  },
                  "pocket": {
                    "type": "string",
                    "title": "Pocket conditioning (JSON, optional)",
                    "description": "Native ESMFold2 pocket object with binder_chain_id and contacts. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "distogram_conditioning": {
                    "type": "string",
                    "title": "Distogram conditioning (JSON, optional)",
                    "description": "Native ESMFold2 distogram_conditioning array with chain_id and JSON matrix values. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "covalent_bonds": {
                    "type": "string",
                    "title": "Covalent bonds (JSON, optional)",
                    "description": "Native ESMFold2 covalent_bonds array using chain_id, residue index, and atom index fields for each endpoint. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000
                  },
                  "input_json": {
                    "type": "string",
                    "title": "StructurePredictionInput (JSON)",
                    "description": "JSON representation of ESMFold2's StructurePredictionInput. Sequence entries use type protein, dna, rna, or ligand; polymers take id and sequence, while ligands take id plus either smiles or a ccd list. Native pocket, distogram, covalent-bond, modification, and serialized MSA fields are passed through. A protein or RNA msa may also be an absolute .a3m path, which is read with MSA.from_a3m. Modification positions are zero-indexed, exactly as in the official ESMFold2 Python dataclass. Use the JSON-safe shape produced by serialize_structure_prediction_input. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 500000,
                    "default": "{\n  \"sequences\": [\n    {\n      \"type\": \"protein\",\n      \"id\": \"A\",\n      \"sequence\": \"MSHHWGYGKHNGPEHWHKDFPIAKGERQSPVDIDTHTAKYDPSLK\"\n    }\n  ]\n}"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "StructurePredictionInput file (JSON)",
                    "description": "The JSON file defining this prediction, in ESMFold2's own StructurePredictionInput format. Choose a file. Its contents are read here and sent as the input document. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "num_loops": {
                    "type": "number",
                    "title": "Recycling loops",
                    "description": "Recycling loops passed to ESMFold2InputBuilder.fold. The released API default is 20. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 64,
                    "default": 20
                  },
                  "num_sampling_steps": {
                    "type": "number",
                    "title": "Diffusion sampling steps",
                    "description": "Diffusion sampling steps passed to ESMFold2InputBuilder.fold. The released API default is 200. A number, within the range given for the field.",
                    "minimum": 2,
                    "maximum": 1000,
                    "default": 200
                  },
                  "num_diffusion_samples": {
                    "type": "number",
                    "title": "Diffusion samples",
                    "description": "Number of independently sampled structures. More than one produces one mmCIF per sample. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 16,
                    "default": 1
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "Seeds input preparation and diffusion sampling. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 4294967295,
                    "default": 0
                  },
                  "lm_dropout": {
                    "type": "number",
                    "title": "Language-model dropout",
                    "description": "Inference-time LM embedding dropout. The released folding API defaults to 0.3; set 0 to disable it. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.3
                  },
                  "chunk_size": {
                    "type": "number",
                    "title": "Pair-operation chunk size",
                    "description": "Chunk size for memory-heavy pair operations. The released model defaults to 64; smaller values use less memory. Set 0 to disable chunking. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 512,
                    "default": 64
                  },
                  "device": {
                    "type": "string",
                    "title": "Device",
                    "description": "Auto selects CUDA when available and otherwise CPU. The published 6B model is intended for GPU inference. One of the field's option values.",
                    "enum": [
                      "auto",
                      "cuda",
                      "cpu"
                    ],
                    "default": "auto"
                  },
                  "precision": {
                    "type": "string",
                    "title": "Model precision",
                    "description": "Use the checkpoint's published dtype, or explicitly cast model weights to BF16 or FP32. One of the field's option values.",
                    "enum": [
                      "default",
                      "bf16",
                      "fp32"
                    ],
                    "default": "default"
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "carbonic_anhydrase_2cba",
                      "protein_dna_ligand_1mht"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "input_json"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "esmfold2-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"A\", \"sequence\": \"MSHHWGYGKHNGPEHWHKDFPIAKGERQSPVDIDTHTAKYDPSLK\", \"modifications\": []}]",
                  "pocket": "",
                  "distogram_conditioning": "",
                  "covalent_bonds": "",
                  "num_loops": 20,
                  "num_sampling_steps": 200,
                  "num_diffusion_samples": 1,
                  "seed": 0,
                  "lm_dropout": 0.3,
                  "chunk_size": 64,
                  "device": "auto",
                  "precision": "default"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/esmc/": {
      "get": {
        "summary": "ESMC field schema",
        "description": "Protein language-model embeddings, amino-acid probabilities, and substitution scores.",
        "operationId": "esmc_schema",
        "tags": [
          "ESMC"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a ESMC job",
        "description": "Protein language-model embeddings, amino-acid probabilities, and substitution scores. ESM Cambrian analyzes protein sequences with local 300M, 600M, or 6B models. Exports per-residue and mean-pooled embeddings, optional hidden states and logits, position-level predictions, and optional masked-marginal single-substitution log-odds. Representations support downstream property prediction; scores are not calibrated measurements of stability, fitness, or function.",
        "operationId": "esmc_submit",
        "tags": [
          "ESMC"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the output directory. A single line of text.",
                    "maxLength": 80,
                    "default": "esmc-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Proteins",
                    "description": "One independent protein per box (up to 26). Amino-acid letters only; no complexes, modifications, MSAs or templates. Maximum 2046 residues per protein, reserving two positions for start/end tokens. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"GFP\", \"sequence\": \"MSKGEELFTGVVPILVELDGDVNGHKFSVSGEGEGDATYGKLTLKFICTTGKLPVPWPTLVTTFSYGVQCFSRYPDHMKQHDFFKSAMPEGYVQERTIFFKDDGNYKTRAEVKFEGDTLVNRIELKGIDFKEDGNILGHKLEYNYNSHNVYIMADKQKNGIKVNFKIRHNIEDGSVQLADHYQQNTPIGDGPVLLPDNHYLSTQSALSKDPNEKRDHMVLLEFVTAAGITHGMDELYK\", \"modifications\": []}]"
                  },
                  "input_fasta": {
                    "type": "string",
                    "title": "Protein sequence or FASTA",
                    "description": "Enter one bare sequence (line wrapping allowed) or up to 26 FASTA records with unique headers. Each protein is analyzed independently. Accepts standard amino acids plus X, B, Z, U and O. Maximum 2046 residues per protein; sequences are never truncated. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 100000,
                    "default": ">GFP\nMSKGEELFTGVVPILVELDGDVNGHKFSVSGEGEGDATYGKLTLKFICTTGKLPVPWPTLVTTFSYGVQCFSRYPDHMKQHDFFKSAMPEGYVQERTIFFKDDGNYKTRAEVKFEGDTLVNRIELKGIDFKEDGNILGHKLEYNYNSHNVYIMADKQKNGIKVNFKIRHNIEDGSVQLADHYQQNTPIGDGPVLLPDNHYLSTQSALSKDPNEKRDHMVLLEFVTAAGITHGMDELYK"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Sequence file",
                    "description": "Upload FASTA or a plain-text protein sequence. The file contents are sent to the compute node. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "model": {
                    "type": "string",
                    "title": "Model",
                    "description": "Current Biohub MIT-licensed checkpoints, downloaded on first use. 300M is the lightest; 6B requires substantially more RAM/VRAM. One of the field's option values.",
                    "enum": [
                      "biohub/ESMC-300M",
                      "biohub/ESMC-600M",
                      "biohub/ESMC-6B"
                    ],
                    "default": "biohub/ESMC-300M"
                  },
                  "save_embeddings": {
                    "type": "boolean",
                    "title": "Save residue and mean embeddings",
                    "description": "Export FP32 embeddings [residues, dimensions] and mean_embedding [dimensions] in one compressed NPZ per sequence. Excludes start/end tokens and padding. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "save_logits": {
                    "type": "boolean",
                    "title": "Save full logits and probabilities",
                    "description": "Export [residues, 64] raw logits and softmax probabilities in NPZ. summary.json maps vocabulary indices; unused slots are null. Position predictions and CSV summaries are always saved. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "hidden_layer": {
                    "type": "number",
                    "title": "Additional hidden-state layer",
                    "description": "-1 disables additional hidden-state export. Otherwise upstream indices are 0 through 30 (300M), 36 (600M), or 80 (6B). Index 0 is the first block input; the last is the final normalized output. Upstream collects all layers in memory when this is enabled; reduce batch size for long sequences. A number, within the range given for the field.",
                    "minimum": -1,
                    "maximum": 80,
                    "default": -1
                  },
                  "mutations": {
                    "type": "string",
                    "title": "Single substitutions (optional)",
                    "description": "Exactly one input protein. Enter up to 100 substitutions such as M1A, separated by spaces, commas or newlines. Positions are one-based and the reference residue must match. Each substitution is scored independently by masking its position and computing log P(mutant) - log P(reference). Positive means model preference, not measured fitness or stability. Saves mutation_scores.csv. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 10000
                  },
                  "batch_size": {
                    "type": "number",
                    "title": "Batch size",
                    "description": "Number of independent proteins per inference batch. Smaller batches reduce memory use; sequences are padded only within a batch. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 8,
                    "default": 1
                  },
                  "device": {
                    "type": "string",
                    "title": "Device",
                    "description": "Auto uses CUDA when available, otherwise CPU. An explicitly requested unavailable CUDA device fails clearly. One of the field's option values.",
                    "enum": [
                      "auto",
                      "cuda",
                      "cpu"
                    ],
                    "default": "auto"
                  },
                  "precision": {
                    "type": "string",
                    "title": "Precision",
                    "description": "Model weight dtype. BF16 reduces memory on supported hardware. All exported floating arrays use FP32. One of the field's option values.",
                    "enum": [
                      "default",
                      "fp32",
                      "bf16"
                    ],
                    "default": "default"
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "gfp_embeddings",
                      "gfp_substitution"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "input_fasta"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "esmc-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"GFP\", \"sequence\": \"MSKGEELFTGVVPILVELDGDVNGHKFSVSGEGEGDATYGKLTLKFICTTGKLPVPWPTLVTTFSYGVQCFSRYPDHMKQHDFFKSAMPEGYVQERTIFFKDDGNYKTRAEVKFEGDTLVNRIELKGIDFKEDGNILGHKLEYNYNSHNVYIMADKQKNGIKVNFKIRHNIEDGSVQLADHYQQNTPIGDGPVLLPDNHYLSTQSALSKDPNEKRDHMVLLEFVTAAGITHGMDELYK\", \"modifications\": []}]",
                  "model": "biohub/ESMC-300M",
                  "save_embeddings": true,
                  "save_logits": false,
                  "hidden_layer": -1,
                  "mutations": "",
                  "batch_size": 1,
                  "device": "auto",
                  "precision": "default"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the output directory. A single line of text.",
                    "maxLength": 80,
                    "default": "esmc-demo"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Proteins",
                    "description": "One independent protein per box (up to 26). Amino-acid letters only; no complexes, modifications, MSAs or templates. Maximum 2046 residues per protein, reserving two positions for start/end tokens. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"GFP\", \"sequence\": \"MSKGEELFTGVVPILVELDGDVNGHKFSVSGEGEGDATYGKLTLKFICTTGKLPVPWPTLVTTFSYGVQCFSRYPDHMKQHDFFKSAMPEGYVQERTIFFKDDGNYKTRAEVKFEGDTLVNRIELKGIDFKEDGNILGHKLEYNYNSHNVYIMADKQKNGIKVNFKIRHNIEDGSVQLADHYQQNTPIGDGPVLLPDNHYLSTQSALSKDPNEKRDHMVLLEFVTAAGITHGMDELYK\", \"modifications\": []}]"
                  },
                  "input_fasta": {
                    "type": "string",
                    "title": "Protein sequence or FASTA",
                    "description": "Enter one bare sequence (line wrapping allowed) or up to 26 FASTA records with unique headers. Each protein is analyzed independently. Accepts standard amino acids plus X, B, Z, U and O. Maximum 2046 residues per protein; sequences are never truncated. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 100000,
                    "default": ">GFP\nMSKGEELFTGVVPILVELDGDVNGHKFSVSGEGEGDATYGKLTLKFICTTGKLPVPWPTLVTTFSYGVQCFSRYPDHMKQHDFFKSAMPEGYVQERTIFFKDDGNYKTRAEVKFEGDTLVNRIELKGIDFKEDGNILGHKLEYNYNSHNVYIMADKQKNGIKVNFKIRHNIEDGSVQLADHYQQNTPIGDGPVLLPDNHYLSTQSALSKDPNEKRDHMVLLEFVTAAGITHGMDELYK"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Sequence file",
                    "description": "Upload FASTA or a plain-text protein sequence. The file contents are sent to the compute node. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "model": {
                    "type": "string",
                    "title": "Model",
                    "description": "Current Biohub MIT-licensed checkpoints, downloaded on first use. 300M is the lightest; 6B requires substantially more RAM/VRAM. One of the field's option values.",
                    "enum": [
                      "biohub/ESMC-300M",
                      "biohub/ESMC-600M",
                      "biohub/ESMC-6B"
                    ],
                    "default": "biohub/ESMC-300M"
                  },
                  "save_embeddings": {
                    "type": "boolean",
                    "title": "Save residue and mean embeddings",
                    "description": "Export FP32 embeddings [residues, dimensions] and mean_embedding [dimensions] in one compressed NPZ per sequence. Excludes start/end tokens and padding. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "save_logits": {
                    "type": "boolean",
                    "title": "Save full logits and probabilities",
                    "description": "Export [residues, 64] raw logits and softmax probabilities in NPZ. summary.json maps vocabulary indices; unused slots are null. Position predictions and CSV summaries are always saved. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "hidden_layer": {
                    "type": "number",
                    "title": "Additional hidden-state layer",
                    "description": "-1 disables additional hidden-state export. Otherwise upstream indices are 0 through 30 (300M), 36 (600M), or 80 (6B). Index 0 is the first block input; the last is the final normalized output. Upstream collects all layers in memory when this is enabled; reduce batch size for long sequences. A number, within the range given for the field.",
                    "minimum": -1,
                    "maximum": 80,
                    "default": -1
                  },
                  "mutations": {
                    "type": "string",
                    "title": "Single substitutions (optional)",
                    "description": "Exactly one input protein. Enter up to 100 substitutions such as M1A, separated by spaces, commas or newlines. Positions are one-based and the reference residue must match. Each substitution is scored independently by masking its position and computing log P(mutant) - log P(reference). Positive means model preference, not measured fitness or stability. Saves mutation_scores.csv. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 10000
                  },
                  "batch_size": {
                    "type": "number",
                    "title": "Batch size",
                    "description": "Number of independent proteins per inference batch. Smaller batches reduce memory use; sequences are padded only within a batch. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 8,
                    "default": 1
                  },
                  "device": {
                    "type": "string",
                    "title": "Device",
                    "description": "Auto uses CUDA when available, otherwise CPU. An explicitly requested unavailable CUDA device fails clearly. One of the field's option values.",
                    "enum": [
                      "auto",
                      "cuda",
                      "cpu"
                    ],
                    "default": "auto"
                  },
                  "precision": {
                    "type": "string",
                    "title": "Precision",
                    "description": "Model weight dtype. BF16 reduces memory on supported hardware. All exported floating arrays use FP32. One of the field's option values.",
                    "enum": [
                      "default",
                      "fp32",
                      "bf16"
                    ],
                    "default": "default"
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "gfp_embeddings",
                      "gfp_substitution"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "input_fasta"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "esmc-demo",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"GFP\", \"sequence\": \"MSKGEELFTGVVPILVELDGDVNGHKFSVSGEGEGDATYGKLTLKFICTTGKLPVPWPTLVTTFSYGVQCFSRYPDHMKQHDFFKSAMPEGYVQERTIFFKDDGNYKTRAEVKFEGDTLVNRIELKGIDFKEDGNILGHKLEYNYNSHNVYIMADKQKNGIKVNFKIRHNIEDGSVQLADHYQQNTPIGDGPVLLPDNHYLSTQSALSKDPNEKRDHMVLLEFVTAAGITHGMDELYK\", \"modifications\": []}]",
                  "model": "biohub/ESMC-300M",
                  "save_embeddings": true,
                  "save_logits": false,
                  "hidden_layer": -1,
                  "mutations": "",
                  "batch_size": 1,
                  "device": "auto",
                  "precision": "default"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/immunebuilder/": {
      "get": {
        "summary": "ImmuneBuilder field schema",
        "description": "Deep-Learning models for predicting the structures of immune proteins.",
        "operationId": "immunebuilder_schema",
        "tags": [
          "ImmuneBuilder"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a ImmuneBuilder job",
        "description": "Deep-Learning models for predicting the structures of immune proteins. A set of deep learning models trained to accurately predict the structure of antibodies (ABodyBuilder2), nanobodies (NanoBodyBuilder2) and T-Cell receptors (TCRBuilder2). By predicting an ensemble of structures, ImmuneBuilder also gives an error estimate for every residue in its final prediction.",
        "operationId": "immunebuilder_submit",
        "tags": [
          "ImmuneBuilder"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "immunebuilder-demo"
                  },
                  "heavy_sequence": {
                    "type": "string",
                    "title": "Heavy-chain sequence",
                    "description": "Variable domain only; constant domains are not modelled. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"
                  },
                  "light_sequence": {
                    "type": "string",
                    "title": "Light-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                  },
                  "vhh_sequence": {
                    "type": "string",
                    "title": "VHH sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGRTFSYNPMGWFRQAPGKGRELVAAISRTGGSTYYPDSVEGRFTISRDNAKRMVYLQMNSLRAEDTAVYYCAAAGVRAEDGRVRTLPSEYTFWGQGTQVTVSS"
                  },
                  "alpha_sequence": {
                    "type": "string",
                    "title": "TCR alpha-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "QSVTQPDARVTVSEGASLQLRCKYSYSATPYLFWYVQYPRQGLQLLLKYYSGDPVVQGVNGFEAEFSKSNSSFHLRKASVHWSDSAVYFCAVRPTSGGSYIPTFGRGTSLIVHPY"
                  },
                  "beta_sequence": {
                    "type": "string",
                    "title": "TCR beta-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "NAGVTQTPKFQVLKTGQSMTLQCAQDMNHEYMSWYRQDPGMGLRLIHYSVGAGITDQGEVPNGYNVSRSTTEDFPLRLLSAAPSQTSVYFCASSYVGNTGELFFGEGSRLTVL"
                  },
                  "numbering_scheme": {
                    "type": "string",
                    "title": "Numbering scheme",
                    "description": "How the residues of the returned structure are numbered. One of the field's option values.",
                    "enum": [
                      "imgt",
                      "chothia",
                      "kabat",
                      "aho",
                      "martin",
                      "wolfguy",
                      "raw"
                    ],
                    "default": "imgt"
                  },
                  "n_threads": {
                    "type": "number",
                    "title": "CPU threads for refinement",
                    "description": "0 refines on the GPU; any other value forces OpenMM onto that many CPU threads. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 64,
                    "default": 0
                  },
                  "no_sidechain_bond_check": {
                    "type": "boolean",
                    "title": "Skip the strained-bond check",
                    "description": "Slightly faster, at the risk of an occasional unphysical side chain. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "original_weights": {
                    "type": "boolean",
                    "title": "Use the original TCRBuilder2 weights",
                    "description": "Off by default, which uses the newer TCRBuilder2+ weights. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "antibody",
                      "nanobody",
                      "tcr"
                    ],
                    "default": "antibody"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "task": "antibody",
                  "job_name": "immunebuilder-demo",
                  "heavy_sequence": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS",
                  "light_sequence": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK",
                  "numbering_scheme": "imgt",
                  "n_threads": 0,
                  "no_sidechain_bond_check": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "immunebuilder-demo"
                  },
                  "heavy_sequence": {
                    "type": "string",
                    "title": "Heavy-chain sequence",
                    "description": "Variable domain only; constant domains are not modelled. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"
                  },
                  "light_sequence": {
                    "type": "string",
                    "title": "Light-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                  },
                  "vhh_sequence": {
                    "type": "string",
                    "title": "VHH sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGRTFSYNPMGWFRQAPGKGRELVAAISRTGGSTYYPDSVEGRFTISRDNAKRMVYLQMNSLRAEDTAVYYCAAAGVRAEDGRVRTLPSEYTFWGQGTQVTVSS"
                  },
                  "alpha_sequence": {
                    "type": "string",
                    "title": "TCR alpha-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "QSVTQPDARVTVSEGASLQLRCKYSYSATPYLFWYVQYPRQGLQLLLKYYSGDPVVQGVNGFEAEFSKSNSSFHLRKASVHWSDSAVYFCAVRPTSGGSYIPTFGRGTSLIVHPY"
                  },
                  "beta_sequence": {
                    "type": "string",
                    "title": "TCR beta-chain sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "NAGVTQTPKFQVLKTGQSMTLQCAQDMNHEYMSWYRQDPGMGLRLIHYSVGAGITDQGEVPNGYNVSRSTTEDFPLRLLSAAPSQTSVYFCASSYVGNTGELFFGEGSRLTVL"
                  },
                  "numbering_scheme": {
                    "type": "string",
                    "title": "Numbering scheme",
                    "description": "How the residues of the returned structure are numbered. One of the field's option values.",
                    "enum": [
                      "imgt",
                      "chothia",
                      "kabat",
                      "aho",
                      "martin",
                      "wolfguy",
                      "raw"
                    ],
                    "default": "imgt"
                  },
                  "n_threads": {
                    "type": "number",
                    "title": "CPU threads for refinement",
                    "description": "0 refines on the GPU; any other value forces OpenMM onto that many CPU threads. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 64,
                    "default": 0
                  },
                  "no_sidechain_bond_check": {
                    "type": "boolean",
                    "title": "Skip the strained-bond check",
                    "description": "Slightly faster, at the risk of an occasional unphysical side chain. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "original_weights": {
                    "type": "boolean",
                    "title": "Use the original TCRBuilder2 weights",
                    "description": "Off by default, which uses the newer TCRBuilder2+ weights. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "antibody",
                      "nanobody",
                      "tcr"
                    ],
                    "default": "antibody"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "task": "antibody",
                  "job_name": "immunebuilder-demo",
                  "heavy_sequence": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS",
                  "light_sequence": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK",
                  "numbering_scheme": "imgt",
                  "n_threads": 0,
                  "no_sidechain_bond_check": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/highfold/": {
      "get": {
        "summary": "HighFold field schema",
        "description": "Predict the structure of a cyclic peptide or a cyclic-peptide complex.",
        "operationId": "highfold_schema",
        "tags": [
          "HighFold"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a HighFold job",
        "description": "Predict the structure of a cyclic peptide or a cyclic-peptide complex. Runs HighFold, which folds cyclic peptides by feeding AlphaFold 2 a cyclic position offset matrix in place of its usual relative positional encoding, so head-to-tail and disulfide-bridged macrocycles are modelled as closed rather than as linear chains whose ends happen to meet.",
        "operationId": "highfold_submit",
        "tags": [
          "HighFold"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "highfold-demo"
                  },
                  "peptide_sequence": {
                    "type": "string",
                    "title": "Peptide sequence",
                    "description": "Join the chains of a complex with a colon; the first chain is the cyclic peptide. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "GNLWATGHFMGGSGSGSG"
                  },
                  "disulfide_pairs": {
                    "type": "string",
                    "title": "Disulfide bridges (optional)",
                    "description": "Comma-separated 1-indexed residue pairs in the cyclic chain, for example 3-11,5-17. HighFold always closes the backbone head-to-tail; these add disulfide bridges on top of it. A single line of text."
                  },
                  "msa_mode": {
                    "type": "string",
                    "title": "MSA mode",
                    "description": "Short macrocycles have no useful alignment, so single-sequence is the usual choice. One of the field's option values.",
                    "enum": [
                      "single_sequence",
                      "mmseqs2_uniref_env",
                      "mmseqs2_uniref"
                    ],
                    "default": "single_sequence"
                  },
                  "num_models": {
                    "type": "number",
                    "title": "Models",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 5,
                    "default": 5
                  },
                  "num_recycles": {
                    "type": "number",
                    "title": "Recycles",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 48,
                    "default": 3
                  },
                  "num_seeds": {
                    "type": "number",
                    "title": "Seeds per model",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 16,
                    "default": 1
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "use_templates": {
                    "type": "boolean",
                    "title": "Use PDB templates",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "amber_relax": {
                    "type": "boolean",
                    "title": "Relax the top model with Amber",
                    "description": "Cleans up bond geometry at the cyclization point, at a few minutes of extra runtime. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "peptide_sequence"
                ],
                "example": {
                  "job_name": "highfold-demo",
                  "peptide_sequence": "GNLWATGHFMGGSGSGSG",
                  "disulfide_pairs": "",
                  "msa_mode": "single_sequence",
                  "num_models": 5,
                  "num_recycles": 3,
                  "num_seeds": 1,
                  "seed": 0,
                  "use_templates": false,
                  "amber_relax": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "highfold-demo"
                  },
                  "peptide_sequence": {
                    "type": "string",
                    "title": "Peptide sequence",
                    "description": "Join the chains of a complex with a colon; the first chain is the cyclic peptide. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "GNLWATGHFMGGSGSGSG"
                  },
                  "disulfide_pairs": {
                    "type": "string",
                    "title": "Disulfide bridges (optional)",
                    "description": "Comma-separated 1-indexed residue pairs in the cyclic chain, for example 3-11,5-17. HighFold always closes the backbone head-to-tail; these add disulfide bridges on top of it. A single line of text."
                  },
                  "msa_mode": {
                    "type": "string",
                    "title": "MSA mode",
                    "description": "Short macrocycles have no useful alignment, so single-sequence is the usual choice. One of the field's option values.",
                    "enum": [
                      "single_sequence",
                      "mmseqs2_uniref_env",
                      "mmseqs2_uniref"
                    ],
                    "default": "single_sequence"
                  },
                  "num_models": {
                    "type": "number",
                    "title": "Models",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 5,
                    "default": 5
                  },
                  "num_recycles": {
                    "type": "number",
                    "title": "Recycles",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 48,
                    "default": 3
                  },
                  "num_seeds": {
                    "type": "number",
                    "title": "Seeds per model",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 16,
                    "default": 1
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "use_templates": {
                    "type": "boolean",
                    "title": "Use PDB templates",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "amber_relax": {
                    "type": "boolean",
                    "title": "Relax the top model with Amber",
                    "description": "Cleans up bond geometry at the cyclization point, at a few minutes of extra runtime. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "peptide_sequence"
                ],
                "example": {
                  "job_name": "highfold-demo",
                  "peptide_sequence": "GNLWATGHFMGGSGSGSG",
                  "disulfide_pairs": "",
                  "msa_mode": "single_sequence",
                  "num_models": 5,
                  "num_recycles": 3,
                  "num_seeds": 1,
                  "seed": 0,
                  "use_templates": false,
                  "amber_relax": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/boltzgen/": {
      "get": {
        "summary": "BoltzGen field schema",
        "description": "Designs proteins and peptides that bind to a wide range of biomolecular targets.",
        "operationId": "boltzgen_schema",
        "tags": [
          "BoltzGen"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a BoltzGen job",
        "description": "Designs proteins and peptides that bind to a wide range of biomolecular targets. It unifies design and structure prediction, resulting in a single model that also\n        achieves state-of-the-art folding performance. \nBoltzGen was developed at MIT and experimentally validated in a large-scale distributed effort involving\nmultiple academic and industry labs.\nExplicitly focuses our experimental validation on targets that are highly dissimilar to any proteins for\n which bound structures exist.",
        "operationId": "boltzgen_submit",
        "tags": [
          "BoltzGen"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "boltzgen-demo"
                  },
                  "target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "Uploaded structure file for the binding target. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "Comma-separated chain IDs to include from the target file; blank includes all. A single line of text."
                  },
                  "binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "One \"chain:residues\" per line, e.g. \"A:5..7,13\"; BoltzGen residue ranges use \"..\". A single line of text."
                  },
                  "not_binding_site": {
                    "type": "string",
                    "title": "Excluded site (optional)",
                    "description": "One \"chain:residues\" per line, residues the binder must not contact. A single line of text."
                  },
                  "binder_chain_id": {
                    "type": "string",
                    "title": "Binder chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 60
                  },
                  "maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 100
                  },
                  "redesign_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "redesign_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_not_binding_site": {
                    "type": "string",
                    "title": "Excluded site (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_binder_chain_id": {
                    "type": "string",
                    "title": "Binder chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "redesign_minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 60
                  },
                  "redesign_maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 100
                  },
                  "peptide_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF, optional)",
                    "description": "Leave blank to design a free peptide with no target. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "peptide_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "peptide_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "peptide_sequence": {
                    "type": "string",
                    "title": "Peptide sequence pattern",
                    "description": "A fixed sequence, a length range like \"10..20\", or a mix using BoltzGen's pattern syntax. A single line of text.",
                    "default": "10..20"
                  },
                  "peptide_disulfide_bonds": {
                    "type": "string",
                    "title": "Disulfide bonds (optional)",
                    "description": "JSON list, e.g. [{\"position1\": 2, \"position2\": 10}], 1-indexed into the peptide. Positions must land on a literal residue already written into the sequence pattern (e.g. a \"C\"), not inside a design-length run. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "peptide_cyclic": {
                    "type": "boolean",
                    "title": "Cyclic backbone",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "peptide_chain_id": {
                    "type": "string",
                    "title": "Peptide chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "cyclotide_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF, optional)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "cyclotide_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "cyclotide_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "cyclotide_sequence": {
                    "type": "string",
                    "title": "Cyclotide sequence pattern",
                    "description": "BoltzGen sequence pattern mixing fixed residues and design-length runs. A single line of text.",
                    "default": "3C8C6C5C3C1C2"
                  },
                  "cyclotide_disulfide_bonds": {
                    "type": "string",
                    "title": "Disulfide bonds",
                    "description": "JSON list of 1-indexed {\"position1\", \"position2\"} pairs. Positions must land on a literal residue already written into the sequence pattern (e.g. one of its \"C\"s), not inside a design-length run. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "[{\"position1\": 4, \"position2\": 26}, {\"position1\": 13, \"position2\": 30}, {\"position1\": 20, \"position2\": 32}]"
                  },
                  "cyclotide_chain_id": {
                    "type": "string",
                    "title": "Cyclotide chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "target_ligand_format": {
                    "type": "string",
                    "title": "Target ligand format",
                    "description": "One of the field's option values.",
                    "enum": [
                      "smiles",
                      "ccd"
                    ],
                    "default": "smiles"
                  },
                  "target_ligand": {
                    "type": "string",
                    "title": "Target ligand",
                    "description": "A single line of text.",
                    "default": "N[C@@H](Cc1ccc(O)cc1)C(=O)O"
                  },
                  "small_molecule_minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 100
                  },
                  "small_molecule_maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 150
                  },
                  "small_molecule_target_chain_id": {
                    "type": "string",
                    "title": "Target ligand chain ID",
                    "description": "A single line of text.",
                    "default": "L"
                  },
                  "small_molecule_binder_chain_id": {
                    "type": "string",
                    "title": "Binder chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "nanobody_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "nanobody_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "nanobody_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "nanobody_framework_file": {
                    "type": "string",
                    "title": "Nanobody framework structure (PDB or mmCIF)",
                    "description": "A solved nanobody scaffold to graft new CDR loops onto. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "nanobody_framework_chain": {
                    "type": "string",
                    "title": "Framework chain ID",
                    "description": "A single line of text.",
                    "default": "B"
                  },
                  "nanobody_cdr_regions": {
                    "type": "string",
                    "title": "CDR regions to redesign",
                    "description": "Residue ranges in the framework file, BoltzGen syntax (e.g. \"26..34,52..59,98..118\"). A single line of text.",
                    "default": "26..34,52..59,98..118"
                  },
                  "nanobody_cdr_exclude": {
                    "type": "string",
                    "title": "Framework residues to drop (optional)",
                    "description": "Residue ranges to strip from the template before redesign, e.g. to shorten a loop. A single line of text."
                  },
                  "nanobody_cdr_insertions": {
                    "type": "string",
                    "title": "Variable-length insertions (optional)",
                    "description": "JSON list, e.g. [{\"position\": 26, \"lengths\": \"1..5\"}], inserted at a framework residue. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "antibody_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "antibody_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_heavy_framework_file": {
                    "type": "string",
                    "title": "Heavy-chain framework structure",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "antibody_heavy_framework_chain": {
                    "type": "string",
                    "title": "Heavy framework chain ID",
                    "description": "A single line of text.",
                    "default": "B"
                  },
                  "antibody_heavy_cdr_regions": {
                    "type": "string",
                    "title": "Heavy-chain CDR regions",
                    "description": "A single line of text.",
                    "default": "26..32,52..57,99..110"
                  },
                  "antibody_heavy_cdr_exclude": {
                    "type": "string",
                    "title": "Heavy-chain residues to drop (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_heavy_cdr_insertions": {
                    "type": "string",
                    "title": "Heavy-chain insertions (optional)",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "antibody_light_framework_file": {
                    "type": "string",
                    "title": "Light-chain framework structure",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "antibody_light_framework_chain": {
                    "type": "string",
                    "title": "Light framework chain ID",
                    "description": "A single line of text.",
                    "default": "A"
                  },
                  "antibody_light_cdr_regions": {
                    "type": "string",
                    "title": "Light-chain CDR regions",
                    "description": "A single line of text.",
                    "default": "24..34,50..56,89..97"
                  },
                  "antibody_light_cdr_exclude": {
                    "type": "string",
                    "title": "Light-chain residues to drop (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_light_cdr_insertions": {
                    "type": "string",
                    "title": "Light-chain insertions (optional)",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "yaml_spec": {
                    "type": "string",
                    "title": "Design specification (YAML)",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "entities:\n  - protein:\n      id: B\n      sequence: 60..100\n"
                  },
                  "yaml_protocol": {
                    "type": "string",
                    "title": "Protocol",
                    "description": "One of the field's option values.",
                    "enum": [
                      "antibody-anything",
                      "nanobody-anything",
                      "peptide-anything",
                      "protein-anything",
                      "protein-redesign",
                      "protein-small_molecule"
                    ],
                    "default": "protein-anything"
                  },
                  "num_designs": {
                    "type": "number",
                    "title": "Intermediate designs",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10000,
                    "default": 10
                  },
                  "budget": {
                    "type": "number",
                    "title": "Final design budget",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "diffusion_batch_size": {
                    "type": "number",
                    "title": "Diffusion batch size (optional)",
                    "description": "Leave at 0 for BoltzGen's own default. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1000,
                    "default": 0
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Omit amino acids from inverse folding (optional)",
                    "description": "One-letter amino-acid codes to avoid when designing sequences. A single line of text."
                  },
                  "skip_refolding": {
                    "type": "boolean",
                    "title": "Skip refolding and confidence filtering",
                    "description": "Stops after design and inverse folding; faster, but skips BoltzGen's own quality filtering. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "protein",
                      "peptide",
                      "cyclotide",
                      "small_molecule",
                      "nanobody",
                      "antibody",
                      "redesign",
                      "yaml"
                    ],
                    "default": "protein"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "task": "protein",
                  "job_name": "boltzgen-demo",
                  "target_file": "",
                  "target_chains": "",
                  "binding_site": "",
                  "not_binding_site": "",
                  "binder_chain_id": "Z",
                  "minimum_length": 60,
                  "maximum_length": 100,
                  "num_designs": 10,
                  "budget": 1,
                  "diffusion_batch_size": 0,
                  "omit_amino_acids": "",
                  "skip_refolding": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "boltzgen-demo"
                  },
                  "target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "Uploaded structure file for the binding target. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "Comma-separated chain IDs to include from the target file; blank includes all. A single line of text."
                  },
                  "binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "One \"chain:residues\" per line, e.g. \"A:5..7,13\"; BoltzGen residue ranges use \"..\". A single line of text."
                  },
                  "not_binding_site": {
                    "type": "string",
                    "title": "Excluded site (optional)",
                    "description": "One \"chain:residues\" per line, residues the binder must not contact. A single line of text."
                  },
                  "binder_chain_id": {
                    "type": "string",
                    "title": "Binder chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 60
                  },
                  "maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 100
                  },
                  "redesign_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "redesign_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_not_binding_site": {
                    "type": "string",
                    "title": "Excluded site (optional)",
                    "description": "A single line of text."
                  },
                  "redesign_binder_chain_id": {
                    "type": "string",
                    "title": "Binder chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "redesign_minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 60
                  },
                  "redesign_maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 100
                  },
                  "peptide_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF, optional)",
                    "description": "Leave blank to design a free peptide with no target. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "peptide_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "peptide_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "peptide_sequence": {
                    "type": "string",
                    "title": "Peptide sequence pattern",
                    "description": "A fixed sequence, a length range like \"10..20\", or a mix using BoltzGen's pattern syntax. A single line of text.",
                    "default": "10..20"
                  },
                  "peptide_disulfide_bonds": {
                    "type": "string",
                    "title": "Disulfide bonds (optional)",
                    "description": "JSON list, e.g. [{\"position1\": 2, \"position2\": 10}], 1-indexed into the peptide. Positions must land on a literal residue already written into the sequence pattern (e.g. a \"C\"), not inside a design-length run. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "peptide_cyclic": {
                    "type": "boolean",
                    "title": "Cyclic backbone",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "peptide_chain_id": {
                    "type": "string",
                    "title": "Peptide chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "cyclotide_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF, optional)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "cyclotide_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "cyclotide_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "cyclotide_sequence": {
                    "type": "string",
                    "title": "Cyclotide sequence pattern",
                    "description": "BoltzGen sequence pattern mixing fixed residues and design-length runs. A single line of text.",
                    "default": "3C8C6C5C3C1C2"
                  },
                  "cyclotide_disulfide_bonds": {
                    "type": "string",
                    "title": "Disulfide bonds",
                    "description": "JSON list of 1-indexed {\"position1\", \"position2\"} pairs. Positions must land on a literal residue already written into the sequence pattern (e.g. one of its \"C\"s), not inside a design-length run. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "[{\"position1\": 4, \"position2\": 26}, {\"position1\": 13, \"position2\": 30}, {\"position1\": 20, \"position2\": 32}]"
                  },
                  "cyclotide_chain_id": {
                    "type": "string",
                    "title": "Cyclotide chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "target_ligand_format": {
                    "type": "string",
                    "title": "Target ligand format",
                    "description": "One of the field's option values.",
                    "enum": [
                      "smiles",
                      "ccd"
                    ],
                    "default": "smiles"
                  },
                  "target_ligand": {
                    "type": "string",
                    "title": "Target ligand",
                    "description": "A single line of text.",
                    "default": "N[C@@H](Cc1ccc(O)cc1)C(=O)O"
                  },
                  "small_molecule_minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 100
                  },
                  "small_molecule_maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 150
                  },
                  "small_molecule_target_chain_id": {
                    "type": "string",
                    "title": "Target ligand chain ID",
                    "description": "A single line of text.",
                    "default": "L"
                  },
                  "small_molecule_binder_chain_id": {
                    "type": "string",
                    "title": "Binder chain ID",
                    "description": "A single line of text.",
                    "default": "Z"
                  },
                  "nanobody_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "nanobody_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "nanobody_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "nanobody_framework_file": {
                    "type": "string",
                    "title": "Nanobody framework structure (PDB or mmCIF)",
                    "description": "A solved nanobody scaffold to graft new CDR loops onto. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "nanobody_framework_chain": {
                    "type": "string",
                    "title": "Framework chain ID",
                    "description": "A single line of text.",
                    "default": "B"
                  },
                  "nanobody_cdr_regions": {
                    "type": "string",
                    "title": "CDR regions to redesign",
                    "description": "Residue ranges in the framework file, BoltzGen syntax (e.g. \"26..34,52..59,98..118\"). A single line of text.",
                    "default": "26..34,52..59,98..118"
                  },
                  "nanobody_cdr_exclude": {
                    "type": "string",
                    "title": "Framework residues to drop (optional)",
                    "description": "Residue ranges to strip from the template before redesign, e.g. to shorten a loop. A single line of text."
                  },
                  "nanobody_cdr_insertions": {
                    "type": "string",
                    "title": "Variable-length insertions (optional)",
                    "description": "JSON list, e.g. [{\"position\": 26, \"lengths\": \"1..5\"}], inserted at a framework residue. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "antibody_target_file": {
                    "type": "string",
                    "title": "Target structure (PDB or mmCIF)",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "antibody_target_chains": {
                    "type": "string",
                    "title": "Target chains (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_binding_site": {
                    "type": "string",
                    "title": "Binding site (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_heavy_framework_file": {
                    "type": "string",
                    "title": "Heavy-chain framework structure",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "antibody_heavy_framework_chain": {
                    "type": "string",
                    "title": "Heavy framework chain ID",
                    "description": "A single line of text.",
                    "default": "B"
                  },
                  "antibody_heavy_cdr_regions": {
                    "type": "string",
                    "title": "Heavy-chain CDR regions",
                    "description": "A single line of text.",
                    "default": "26..32,52..57,99..110"
                  },
                  "antibody_heavy_cdr_exclude": {
                    "type": "string",
                    "title": "Heavy-chain residues to drop (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_heavy_cdr_insertions": {
                    "type": "string",
                    "title": "Heavy-chain insertions (optional)",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "antibody_light_framework_file": {
                    "type": "string",
                    "title": "Light-chain framework structure",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "antibody_light_framework_chain": {
                    "type": "string",
                    "title": "Light framework chain ID",
                    "description": "A single line of text.",
                    "default": "A"
                  },
                  "antibody_light_cdr_regions": {
                    "type": "string",
                    "title": "Light-chain CDR regions",
                    "description": "A single line of text.",
                    "default": "24..34,50..56,89..97"
                  },
                  "antibody_light_cdr_exclude": {
                    "type": "string",
                    "title": "Light-chain residues to drop (optional)",
                    "description": "A single line of text."
                  },
                  "antibody_light_cdr_insertions": {
                    "type": "string",
                    "title": "Light-chain insertions (optional)",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "yaml_spec": {
                    "type": "string",
                    "title": "Design specification (YAML)",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "entities:\n  - protein:\n      id: B\n      sequence: 60..100\n"
                  },
                  "yaml_protocol": {
                    "type": "string",
                    "title": "Protocol",
                    "description": "One of the field's option values.",
                    "enum": [
                      "antibody-anything",
                      "nanobody-anything",
                      "peptide-anything",
                      "protein-anything",
                      "protein-redesign",
                      "protein-small_molecule"
                    ],
                    "default": "protein-anything"
                  },
                  "num_designs": {
                    "type": "number",
                    "title": "Intermediate designs",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10000,
                    "default": 10
                  },
                  "budget": {
                    "type": "number",
                    "title": "Final design budget",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "diffusion_batch_size": {
                    "type": "number",
                    "title": "Diffusion batch size (optional)",
                    "description": "Leave at 0 for BoltzGen's own default. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1000,
                    "default": 0
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Omit amino acids from inverse folding (optional)",
                    "description": "One-letter amino-acid codes to avoid when designing sequences. A single line of text."
                  },
                  "skip_refolding": {
                    "type": "boolean",
                    "title": "Skip refolding and confidence filtering",
                    "description": "Stops after design and inverse folding; faster, but skips BoltzGen's own quality filtering. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "protein",
                      "peptide",
                      "cyclotide",
                      "small_molecule",
                      "nanobody",
                      "antibody",
                      "redesign",
                      "yaml"
                    ],
                    "default": "protein"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "task": "protein",
                  "job_name": "boltzgen-demo",
                  "target_file": "",
                  "target_chains": "",
                  "binding_site": "",
                  "not_binding_site": "",
                  "binder_chain_id": "Z",
                  "minimum_length": 60,
                  "maximum_length": 100,
                  "num_designs": 10,
                  "budget": 1,
                  "diffusion_batch_size": 0,
                  "omit_amino_acids": "",
                  "skip_refolding": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/bindcraft/": {
      "get": {
        "summary": "BindCraft field schema",
        "description": "Design de novo protein or peptide binders against a target structure.",
        "operationId": "bindcraft_schema",
        "tags": [
          "BindCraft"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a BindCraft job",
        "description": "Design de novo protein or peptide binders against a target structure. Builds a BindCraft target/advanced/filter settings trio and runs the official pipeline end to end (hallucination, ProteinMPNN redesign, AlphaFold2 validation, and filtering).",
        "operationId": "bindcraft_submit",
        "tags": [
          "BindCraft"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "binder_name": {
                    "type": "string",
                    "title": "Binder name",
                    "description": "A single line of text.",
                    "default": "demo-binder"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE A TRIMMED TARGET PDB HERE"
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chain IDs",
                    "description": "Comma-separated chain IDs. A single line of text.",
                    "default": "A"
                  },
                  "hotspot_residues": {
                    "type": "string",
                    "title": "Hotspot residues (optional)",
                    "description": "One \"chain: residues\" per line, e.g. \"A: 54,56,58\" or \"A: 1-10\". Leave blank to let AF2 pick a binding site. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "auto_trim_target": {
                    "type": "boolean",
                    "title": "Trim target around hotspots",
                    "description": "Requires hotspot residues. Keeps local sequence segments around residues within the trim radius, reducing AlphaFold GPU-memory use without changing the uploaded PDB. Disconnected retained segments become separate chains and are recorded in a trim manifest. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "trim_radius": {
                    "type": "number",
                    "title": "Target trim radius, angstrom",
                    "description": "A selected-chain residue is considered local context when any of its atoms is within this distance of a hotspot atom. A number, within the range given for the field.",
                    "minimum": 8,
                    "maximum": 100,
                    "default": 25
                  },
                  "trim_sequence_padding": {
                    "type": "number",
                    "title": "Target trim sequence padding",
                    "description": "Additional residues retained before and after each spatially selected sequence segment to avoid cutting directly at the local structural context. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 8
                  },
                  "minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "BindCraft's own default range is 65-150 for protein binders, 10-20 for peptides. A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 65
                  },
                  "maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 150
                  },
                  "final_designs": {
                    "type": "number",
                    "title": "Accepted designs requested",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "filter_type": {
                    "type": "string",
                    "title": "Filter set",
                    "description": "One of the field's option values.",
                    "enum": [
                      "default",
                      "relaxed",
                      "no_filters",
                      "peptide",
                      "peptide_relaxed"
                    ],
                    "default": "default"
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Omit amino acids",
                    "description": "One-letter amino-acid codes ProteinMPNN redesign must not sample. A single line of text.",
                    "default": "C"
                  },
                  "predict_bigbang": {
                    "type": "boolean",
                    "title": "Use BigBang initialization",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "weights_helicity": {
                    "type": "number",
                    "title": "Helicity weight",
                    "description": "Negative biases toward helical binders, positive toward non-helical, 0 is neutral. A number, within the range given for the field.",
                    "minimum": -5,
                    "maximum": 5,
                    "default": -0.3
                  },
                  "betasheet_advanced": {
                    "type": "boolean",
                    "title": "Bias toward beta-sheet designs",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "mpnn_advanced": {
                    "type": "boolean",
                    "title": "Use ProteinMPNN-biased trajectory design",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "flexible_advanced": {
                    "type": "boolean",
                    "title": "Allow a flexible target interface",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "hardtarget_advanced": {
                    "type": "boolean",
                    "title": "Treat the target as a hard (rigid) target",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "filter_plddt": {
                    "type": "number",
                    "title": "Average pLDDT threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.8
                  },
                  "filter_ptm": {
                    "type": "number",
                    "title": "Average pTM threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.55
                  },
                  "filter_iptm": {
                    "type": "number",
                    "title": "Average interface pTM threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.5
                  },
                  "filter_i_pae": {
                    "type": "number",
                    "title": "Average interface PAE threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.35
                  },
                  "filter_surface_hydrophobicity": {
                    "type": "number",
                    "title": "Average surface hydrophobicity threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.35
                  },
                  "filter_n_interface_residues": {
                    "type": "number",
                    "title": "Minimum interface residues",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 7
                  },
                  "filter_n_interface_hbonds": {
                    "type": "number",
                    "title": "Minimum interface H-bonds",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 3
                  },
                  "filter_hotspot_rmsd": {
                    "type": "number",
                    "title": "Maximum hotspot RMSD, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 50,
                    "default": 6
                  },
                  "filter_binder_plddt": {
                    "type": "number",
                    "title": "Average binder pLDDT threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.8
                  },
                  "filter_binder_rmsd": {
                    "type": "number",
                    "title": "Maximum binder RMSD, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 50,
                    "default": 3.5
                  },
                  "max_run_time": {
                    "type": "number",
                    "title": "Maximum run time, minutes",
                    "description": "Bounds this request's own subprocess; BindCraft itself has no built-in time limit. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1440,
                    "default": 16
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "default",
                      "peptide"
                    ],
                    "default": "default"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "target_pdb",
                  "target_chains"
                ],
                "example": {
                  "task": "default",
                  "binder_name": "demo-binder",
                  "target_pdb": "HEADER    PASTE A TRIMMED TARGET PDB HERE",
                  "target_chains": "A",
                  "hotspot_residues": "",
                  "auto_trim_target": false,
                  "trim_radius": 25,
                  "trim_sequence_padding": 8,
                  "minimum_length": 65,
                  "maximum_length": 150,
                  "final_designs": 1,
                  "filter_type": "default",
                  "omit_amino_acids": "C",
                  "predict_bigbang": false,
                  "weights_helicity": -0.3,
                  "betasheet_advanced": false,
                  "mpnn_advanced": false,
                  "flexible_advanced": false,
                  "hardtarget_advanced": false,
                  "filter_plddt": 0.8,
                  "filter_ptm": 0.55,
                  "filter_iptm": 0.5,
                  "filter_i_pae": 0.35,
                  "filter_surface_hydrophobicity": 0.35,
                  "filter_n_interface_residues": 7,
                  "filter_n_interface_hbonds": 3,
                  "filter_hotspot_rmsd": 6,
                  "filter_binder_plddt": 0.8,
                  "filter_binder_rmsd": 3.5,
                  "max_run_time": 16
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "binder_name": {
                    "type": "string",
                    "title": "Binder name",
                    "description": "A single line of text.",
                    "default": "demo-binder"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE A TRIMMED TARGET PDB HERE"
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chain IDs",
                    "description": "Comma-separated chain IDs. A single line of text.",
                    "default": "A"
                  },
                  "hotspot_residues": {
                    "type": "string",
                    "title": "Hotspot residues (optional)",
                    "description": "One \"chain: residues\" per line, e.g. \"A: 54,56,58\" or \"A: 1-10\". Leave blank to let AF2 pick a binding site. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "auto_trim_target": {
                    "type": "boolean",
                    "title": "Trim target around hotspots",
                    "description": "Requires hotspot residues. Keeps local sequence segments around residues within the trim radius, reducing AlphaFold GPU-memory use without changing the uploaded PDB. Disconnected retained segments become separate chains and are recorded in a trim manifest. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "trim_radius": {
                    "type": "number",
                    "title": "Target trim radius, angstrom",
                    "description": "A selected-chain residue is considered local context when any of its atoms is within this distance of a hotspot atom. A number, within the range given for the field.",
                    "minimum": 8,
                    "maximum": 100,
                    "default": 25
                  },
                  "trim_sequence_padding": {
                    "type": "number",
                    "title": "Target trim sequence padding",
                    "description": "Additional residues retained before and after each spatially selected sequence segment to avoid cutting directly at the local structural context. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 8
                  },
                  "minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "BindCraft's own default range is 65-150 for protein binders, 10-20 for peptides. A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 65
                  },
                  "maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 500,
                    "default": 150
                  },
                  "final_designs": {
                    "type": "number",
                    "title": "Accepted designs requested",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "filter_type": {
                    "type": "string",
                    "title": "Filter set",
                    "description": "One of the field's option values.",
                    "enum": [
                      "default",
                      "relaxed",
                      "no_filters",
                      "peptide",
                      "peptide_relaxed"
                    ],
                    "default": "default"
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Omit amino acids",
                    "description": "One-letter amino-acid codes ProteinMPNN redesign must not sample. A single line of text.",
                    "default": "C"
                  },
                  "predict_bigbang": {
                    "type": "boolean",
                    "title": "Use BigBang initialization",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "weights_helicity": {
                    "type": "number",
                    "title": "Helicity weight",
                    "description": "Negative biases toward helical binders, positive toward non-helical, 0 is neutral. A number, within the range given for the field.",
                    "minimum": -5,
                    "maximum": 5,
                    "default": -0.3
                  },
                  "betasheet_advanced": {
                    "type": "boolean",
                    "title": "Bias toward beta-sheet designs",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "mpnn_advanced": {
                    "type": "boolean",
                    "title": "Use ProteinMPNN-biased trajectory design",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "flexible_advanced": {
                    "type": "boolean",
                    "title": "Allow a flexible target interface",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "hardtarget_advanced": {
                    "type": "boolean",
                    "title": "Treat the target as a hard (rigid) target",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "filter_plddt": {
                    "type": "number",
                    "title": "Average pLDDT threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.8
                  },
                  "filter_ptm": {
                    "type": "number",
                    "title": "Average pTM threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.55
                  },
                  "filter_iptm": {
                    "type": "number",
                    "title": "Average interface pTM threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.5
                  },
                  "filter_i_pae": {
                    "type": "number",
                    "title": "Average interface PAE threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.35
                  },
                  "filter_surface_hydrophobicity": {
                    "type": "number",
                    "title": "Average surface hydrophobicity threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.35
                  },
                  "filter_n_interface_residues": {
                    "type": "number",
                    "title": "Minimum interface residues",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 7
                  },
                  "filter_n_interface_hbonds": {
                    "type": "number",
                    "title": "Minimum interface H-bonds",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 3
                  },
                  "filter_hotspot_rmsd": {
                    "type": "number",
                    "title": "Maximum hotspot RMSD, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 50,
                    "default": 6
                  },
                  "filter_binder_plddt": {
                    "type": "number",
                    "title": "Average binder pLDDT threshold",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.8
                  },
                  "filter_binder_rmsd": {
                    "type": "number",
                    "title": "Maximum binder RMSD, angstrom",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 50,
                    "default": 3.5
                  },
                  "max_run_time": {
                    "type": "number",
                    "title": "Maximum run time, minutes",
                    "description": "Bounds this request's own subprocess; BindCraft itself has no built-in time limit. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1440,
                    "default": 16
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "default",
                      "peptide"
                    ],
                    "default": "default"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "target_pdb",
                  "target_chains"
                ],
                "example": {
                  "task": "default",
                  "binder_name": "demo-binder",
                  "target_pdb": "HEADER    PASTE A TRIMMED TARGET PDB HERE",
                  "target_chains": "A",
                  "hotspot_residues": "",
                  "auto_trim_target": false,
                  "trim_radius": 25,
                  "trim_sequence_padding": 8,
                  "minimum_length": 65,
                  "maximum_length": 150,
                  "final_designs": 1,
                  "filter_type": "default",
                  "omit_amino_acids": "C",
                  "predict_bigbang": false,
                  "weights_helicity": -0.3,
                  "betasheet_advanced": false,
                  "mpnn_advanced": false,
                  "flexible_advanced": false,
                  "hardtarget_advanced": false,
                  "filter_plddt": 0.8,
                  "filter_ptm": 0.55,
                  "filter_iptm": 0.5,
                  "filter_i_pae": 0.35,
                  "filter_surface_hydrophobicity": 0.35,
                  "filter_n_interface_residues": 7,
                  "filter_n_interface_hbonds": 3,
                  "filter_hotspot_rmsd": 6,
                  "filter_binder_plddt": 0.8,
                  "filter_binder_rmsd": 3.5,
                  "max_run_time": 16
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/igblast/": {
      "get": {
        "summary": "IgBLAST field schema",
        "description": "Annotate antibody and T cell receptor sequences against germline V, D and J genes.",
        "operationId": "igblast_schema",
        "tags": [
          "IgBLAST"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a IgBLAST job",
        "description": "Annotate antibody and T cell receptor sequences against germline V, D and J genes. IgBLAST is NCBI's aligner for immunoglobulin and T cell receptor variable domains. It reports the top germline V, D, J and constant-region matches for each query, the rearrangement summary (chain type, stop codons, V-J frame, productivity), the V-D and D-J junction details with their N/P nucleotides, and the framework and complementarity determining regions under either the IMGT or the Kabat delineation. Nucleotide queries run through igblastn and protein queries through igblastp; a nucleotide run also writes the AIRR Rearrangement TSV and, on request, a clonotype summary of the whole repertoire.",
        "operationId": "igblast_submit",
        "tags": [
          "IgBLAST"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the files this run leaves: <job name>.airr.tsv, <job name>.igblast.txt and <job name>.clonotypes.txt. A single line of text.",
                    "maxLength": 80,
                    "default": "igblast-demo"
                  },
                  "sequence_type": {
                    "type": "string",
                    "title": "Query type",
                    "description": "igblastn aligns a rearranged nucleotide sequence against V, D and J germline genes and can also call the constant region. igblastp aligns a translated V domain against germline V genes only: D, J, C, the junction and the AIRR table do not apply to it. One field chooses the program, because IgBLAST ships the two as separate executables. One of the field's option values.",
                    "enum": [
                      "nucleotide",
                      "protein"
                    ],
                    "default": "nucleotide"
                  },
                  "input_fasta": {
                    "type": "string",
                    "title": "Query sequence or FASTA",
                    "description": "One bare sequence (line wrapping allowed) or FASTA records with unique headers; every record is annotated independently. Nucleotide queries accept A, C, G, T, U and the IUPAC ambiguity letters; protein queries accept the amino-acid letters. Up to 5000 records and 400,000 characters per run. IgBLAST's -query takes a file; what you enter here is written to query.fasta inside the isolated run directory. A designed sequence from an earlier ProteinMPNN, LigandMPNN, AbMPNN or AntiFold run can be dropped in whole from the picker above; those write amino acids, so set the query type to protein. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 400000,
                    "default": ">Y14934.1 Homo sapiens mRNA for IgG1 rheumatoid factor immunoglobulin heavy chain\nGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCCCCTTCAGTA\nACTACACCATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTACTAGTAG\nTAGTAGTTACAGATATTACGCAGACTCAGTGGAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAAC\nTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTTCTGTGTGAGAGATCGGG\nGCTATGATAGTAGTGGTTATTACGGAAATCTTGACTGCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTC\nA\n"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Query file",
                    "description": "Upload a FASTA file, or a plain-text sequence. The file's text is sent to the compute node and used exactly as if it had been typed above. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "organism": {
                    "type": "string",
                    "title": "Organism",
                    "description": "IgBLAST's -organism. Chooses the internal annotation data that places the framework and CDR boundaries, so it has to match the germline databases below. Ig is supported for human, mouse, rat, rabbit and rhesus monkey; TCR only for human and mouse. One of the field's option values.",
                    "enum": [
                      "human",
                      "mouse",
                      "rat",
                      "rabbit",
                      "rhesus_monkey"
                    ],
                    "default": "human"
                  },
                  "ig_seqtype": {
                    "type": "string",
                    "title": "Receptor type",
                    "description": "IgBLAST's -ig_seqtype. TCR needs TCR germline databases, which NCBI does not distribute prebuilt: build them from IMGT with bin/edit_imgt_file.pl and bin/makeblastdb, and point IGBLAST_GERMLINE_ROOT at them. One of the field's option values.",
                    "enum": [
                      "Ig",
                      "TCR"
                    ],
                    "default": "Ig"
                  },
                  "germline_db_v": {
                    "type": "string",
                    "title": "Germline V database",
                    "description": "IgBLAST's -germline_db_V. Automatic picks NCBI's recommended prebuilt set for the organism above: the AIRR-C set for human, NCBI's own set for mouse and rhesus monkey. Any BLAST database installed under the germline root can be chosen instead. One of the field's option values.",
                    "enum": [
                      "auto",
                      "airr_c_129S1_SvImJ.V",
                      "airr_c_AKR_J.V",
                      "airr_c_A_J.V",
                      "airr_c_BALB_c_ByJ.V",
                      "airr_c_C3H_HeJ.V",
                      "airr_c_C57BL_6.V",
                      "airr_c_C57BL_6J.V",
                      "airr_c_CAST_EiJ.V",
                      "airr_c_CBA_J.V",
                      "airr_c_DBA_1J.V",
                      "airr_c_DBA_2J.V",
                      "airr_c_LEWES_EiJ.V",
                      "airr_c_MRL_MpJ.V",
                      "airr_c_MSM_MsJI.V",
                      "airr_c_NOD_ShiLtJ.V",
                      "airr_c_NOR_LtJ.V",
                      "airr_c_NZB_BlNJ.V",
                      "airr_c_PWD_PhJ.V",
                      "airr_c_SJL_J.V",
                      "airr_c_balbc.V",
                      "airr_c_human_ig.V",
                      "mouse_gl_V",
                      "rhesus_monkey_V"
                    ],
                    "default": "auto"
                  },
                  "germline_db_d": {
                    "type": "string",
                    "title": "Germline D database",
                    "description": "IgBLAST's -germline_db_D, for nucleotide queries only. Light-chain and TCR alpha/gamma rearrangements have no D segment and IgBLAST simply reports none, so leaving this on Automatic is safe for a mixed repertoire. One of the field's option values.",
                    "enum": [
                      "auto",
                      "",
                      "airr_c_human_igh.D",
                      "mouse_gl_D"
                    ],
                    "default": "auto"
                  },
                  "germline_db_j": {
                    "type": "string",
                    "title": "Germline J database",
                    "description": "IgBLAST's -germline_db_J, for nucleotide queries only. The auxiliary coding-frame file is keyed to the J genes, so the CDR3 end and FWR4 are only annotated when the two agree. One of the field's option values.",
                    "enum": [
                      "auto",
                      "",
                      "airr_c_human_ig.J",
                      "mouse_gl_J",
                      "rhesus_monkey_J"
                    ],
                    "default": "auto"
                  },
                  "c_region_db": {
                    "type": "string",
                    "title": "Constant region database",
                    "description": "IgBLAST's -c_region_db, for nucleotide queries only. Identifies the isotype when the query runs into the constant region. NCBI distributes a prebuilt set for human only, so Automatic leaves it unset for every other organism. A query that stops at the end of the J segment, as most V(D)J amplicons do, has no constant region to call and reports an empty c_call. One of the field's option values.",
                    "enum": [
                      "auto",
                      "",
                      "ncbi_human_c_genes"
                    ],
                    "default": "auto"
                  },
                  "domain_system": {
                    "type": "string",
                    "title": "Domain delineation",
                    "description": "IgBLAST's -domain_system: which numbering convention the framework and complementarity determining regions are cut at. One of the field's option values.",
                    "enum": [
                      "imgt",
                      "kabat"
                    ],
                    "default": "imgt"
                  },
                  "show_translation": {
                    "type": "boolean",
                    "title": "Show translated alignments",
                    "description": "IgBLAST's -show_translation. Prints the amino-acid translation above the nucleotide alignment in the readable report. Nucleotide queries only. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "extend_align5end": {
                    "type": "boolean",
                    "title": "Extend V alignment at the 5' end",
                    "description": "IgBLAST's -extend_align5end. Forces the V alignment out to the start of the query, which recovers the first framework residues of a read beginning inside FR1. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "extend_align3end": {
                    "type": "boolean",
                    "title": "Extend J alignment at the 3' end",
                    "description": "IgBLAST's -extend_align3end. Forces the J alignment out to the end of the query. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "min_v_length": {
                    "type": "number",
                    "title": "Minimum V length",
                    "description": "IgBLAST's -min_V_length: shorter V alignments are not reported. Default 9. A number, within the range given for the field.",
                    "minimum": 9,
                    "maximum": 1000,
                    "default": 9
                  },
                  "min_j_length": {
                    "type": "number",
                    "title": "Minimum J length",
                    "description": "IgBLAST's -min_J_length: shorter J alignments are not reported. Default 0, meaning no minimum. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1000,
                    "default": 0
                  },
                  "min_d_match": {
                    "type": "number",
                    "title": "Minimum D match",
                    "description": "IgBLAST's -min_D_match: the consecutive nucleotide bases a D gene must match to be called. Raise it to suppress the spurious short D hits a hypermutated junction attracts. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 100,
                    "default": 5
                  },
                  "v_penalty": {
                    "type": "number",
                    "title": "V mismatch penalty",
                    "description": "IgBLAST's -V_penalty. Default -1, which tolerates the somatic hypermutation a matured V segment carries. A number, within the range given for the field.",
                    "minimum": -3,
                    "maximum": -1,
                    "default": -1
                  },
                  "d_penalty": {
                    "type": "number",
                    "title": "D mismatch penalty",
                    "description": "IgBLAST's -D_penalty. Default -2. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": -4,
                    "maximum": -1,
                    "default": -2
                  },
                  "j_penalty": {
                    "type": "number",
                    "title": "J mismatch penalty",
                    "description": "IgBLAST's -J_penalty. Default -2. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": -3,
                    "maximum": -1,
                    "default": -2
                  },
                  "allow_vdj_overlap": {
                    "type": "boolean",
                    "title": "Allow V(D)J genes to overlap",
                    "description": "IgBLAST's -allow_vdj_overlap. Active only when the D and J mismatch penalties are set to -4 and -3; a run that asks for it without them is refused rather than silently ignoring the option. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "write_airr": {
                    "type": "boolean",
                    "title": "Write the AIRR rearrangement table",
                    "description": "Runs IgBLAST with -outfmt 19 and keeps the result as <job name>.airr.tsv: one row per query with the V, D, J and C calls, the junction, every FWR and CDR, and the per-segment alignment coordinates, under the AIRR Rearrangement schema. This is the file offered at the top of the results page. Nucleotide queries only. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "report_format": {
                    "type": "string",
                    "title": "Readable report format",
                    "description": "IgBLAST's -outfmt for the readable report kept as <job name>.igblast.txt. Format 3 is IgBLAST's own default and the one its documented examples use. One of the field's option values.",
                    "enum": [
                      "3",
                      "4",
                      "7",
                      ""
                    ],
                    "default": "3"
                  },
                  "num_alignments_v": {
                    "type": "number",
                    "title": "V alignments to report",
                    "description": "IgBLAST's -num_alignments_V: germline V genes shown per query in the readable report. Default 3. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 3
                  },
                  "num_alignments_d": {
                    "type": "number",
                    "title": "D alignments to report",
                    "description": "IgBLAST's -num_alignments_D. Default 3. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 3
                  },
                  "num_alignments_j": {
                    "type": "number",
                    "title": "J alignments to report",
                    "description": "IgBLAST's -num_alignments_J. Default 3. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 3
                  },
                  "num_alignments_c": {
                    "type": "number",
                    "title": "C alignments to report",
                    "description": "IgBLAST's -num_alignments_C. Default 2. Only used when a constant region database is selected. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 2
                  },
                  "num_clonotype": {
                    "type": "number",
                    "title": "Top clonotypes to report",
                    "description": "IgBLAST's -num_clonotype, written to <job name>.clonotypes.txt through -clonotype_out. A clonotype groups the queries sharing their V(D)J calls, productivity and CDR3. Set to 0 to skip the clonotype pass. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100000,
                    "default": 100
                  },
                  "evalue": {
                    "type": "string",
                    "title": "E-value threshold",
                    "description": "IgBLAST's -evalue. Leave empty for the program's own default: 20 for igblastn, 1 for igblastp. A single line of text.",
                    "maxLength": 32
                  },
                  "word_size": {
                    "type": "string",
                    "title": "Word size",
                    "description": "IgBLAST's -word_size, the length of the best perfect match the word finder seeds on. Leave empty for the program's default; the minimum is 4 for nucleotide queries and 2 for protein. A single line of text.",
                    "maxLength": 8
                  },
                  "gapopen": {
                    "type": "string",
                    "title": "Gap open cost",
                    "description": "IgBLAST's -gapopen. Leave empty for the program's default. A single line of text.",
                    "maxLength": 8
                  },
                  "gapextend": {
                    "type": "string",
                    "title": "Gap extend cost",
                    "description": "IgBLAST's -gapextend. Leave empty for the program's default. A single line of text.",
                    "maxLength": 8
                  },
                  "strand": {
                    "type": "string",
                    "title": "Query strand",
                    "description": "IgBLAST's -strand. Default both, which is what lets IgBLAST report a reverse-complemented read and set rev_comp in the AIRR table. Nucleotide queries only. One of the field's option values.",
                    "enum": [
                      "both",
                      "plus",
                      "minus"
                    ],
                    "default": "both"
                  },
                  "num_threads": {
                    "type": "number",
                    "title": "Threads",
                    "description": "IgBLAST's -num_threads. Default 4. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 32,
                    "default": 4
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "human_igh_airr",
                      "human_rf_repertoire",
                      "mouse_igh_report",
                      "mouse_vh_protein"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "text",
                      "upload"
                    ],
                    "default": "text"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "input_fasta"
                ],
                "example": {
                  "input_mode": "text",
                  "job_name": "igblast-demo",
                  "sequence_type": "nucleotide",
                  "input_fasta": ">Y14934.1 Homo sapiens mRNA for IgG1 rheumatoid factor immunoglobulin heavy chain\nGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCCCCTTCAGTA\nACTACACCATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTACTAGTAG\nTAGTAGTTACAGATATTACGCAGACTCAGTGGAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAAC\nTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTTCTGTGTGAGAGATCGGG\nGCTATGATAGTAGTGGTTATTACGGAAATCTTGACTGCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTC\nA\n",
                  "organism": "human",
                  "ig_seqtype": "Ig",
                  "germline_db_v": "auto",
                  "germline_db_d": "auto",
                  "germline_db_j": "auto",
                  "c_region_db": "auto",
                  "domain_system": "imgt",
                  "show_translation": true,
                  "extend_align5end": false,
                  "extend_align3end": false,
                  "min_v_length": 9,
                  "min_j_length": 0,
                  "min_d_match": 5,
                  "v_penalty": -1,
                  "d_penalty": -2,
                  "j_penalty": -2,
                  "allow_vdj_overlap": false,
                  "write_airr": true,
                  "report_format": "3",
                  "num_alignments_v": 3,
                  "num_alignments_d": 3,
                  "num_alignments_j": 3,
                  "num_alignments_c": 2,
                  "num_clonotype": 100,
                  "evalue": "",
                  "word_size": "",
                  "gapopen": "",
                  "gapextend": "",
                  "strand": "both",
                  "num_threads": 4
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the files this run leaves: <job name>.airr.tsv, <job name>.igblast.txt and <job name>.clonotypes.txt. A single line of text.",
                    "maxLength": 80,
                    "default": "igblast-demo"
                  },
                  "sequence_type": {
                    "type": "string",
                    "title": "Query type",
                    "description": "igblastn aligns a rearranged nucleotide sequence against V, D and J germline genes and can also call the constant region. igblastp aligns a translated V domain against germline V genes only: D, J, C, the junction and the AIRR table do not apply to it. One field chooses the program, because IgBLAST ships the two as separate executables. One of the field's option values.",
                    "enum": [
                      "nucleotide",
                      "protein"
                    ],
                    "default": "nucleotide"
                  },
                  "input_fasta": {
                    "type": "string",
                    "title": "Query sequence or FASTA",
                    "description": "One bare sequence (line wrapping allowed) or FASTA records with unique headers; every record is annotated independently. Nucleotide queries accept A, C, G, T, U and the IUPAC ambiguity letters; protein queries accept the amino-acid letters. Up to 5000 records and 400,000 characters per run. IgBLAST's -query takes a file; what you enter here is written to query.fasta inside the isolated run directory. A designed sequence from an earlier ProteinMPNN, LigandMPNN, AbMPNN or AntiFold run can be dropped in whole from the picker above; those write amino acids, so set the query type to protein. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 400000,
                    "default": ">Y14934.1 Homo sapiens mRNA for IgG1 rheumatoid factor immunoglobulin heavy chain\nGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCCCCTTCAGTA\nACTACACCATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTACTAGTAG\nTAGTAGTTACAGATATTACGCAGACTCAGTGGAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAAC\nTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTTCTGTGTGAGAGATCGGG\nGCTATGATAGTAGTGGTTATTACGGAAATCTTGACTGCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTC\nA\n"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Query file",
                    "description": "Upload a FASTA file, or a plain-text sequence. The file's text is sent to the compute node and used exactly as if it had been typed above. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "organism": {
                    "type": "string",
                    "title": "Organism",
                    "description": "IgBLAST's -organism. Chooses the internal annotation data that places the framework and CDR boundaries, so it has to match the germline databases below. Ig is supported for human, mouse, rat, rabbit and rhesus monkey; TCR only for human and mouse. One of the field's option values.",
                    "enum": [
                      "human",
                      "mouse",
                      "rat",
                      "rabbit",
                      "rhesus_monkey"
                    ],
                    "default": "human"
                  },
                  "ig_seqtype": {
                    "type": "string",
                    "title": "Receptor type",
                    "description": "IgBLAST's -ig_seqtype. TCR needs TCR germline databases, which NCBI does not distribute prebuilt: build them from IMGT with bin/edit_imgt_file.pl and bin/makeblastdb, and point IGBLAST_GERMLINE_ROOT at them. One of the field's option values.",
                    "enum": [
                      "Ig",
                      "TCR"
                    ],
                    "default": "Ig"
                  },
                  "germline_db_v": {
                    "type": "string",
                    "title": "Germline V database",
                    "description": "IgBLAST's -germline_db_V. Automatic picks NCBI's recommended prebuilt set for the organism above: the AIRR-C set for human, NCBI's own set for mouse and rhesus monkey. Any BLAST database installed under the germline root can be chosen instead. One of the field's option values.",
                    "enum": [
                      "auto",
                      "airr_c_129S1_SvImJ.V",
                      "airr_c_AKR_J.V",
                      "airr_c_A_J.V",
                      "airr_c_BALB_c_ByJ.V",
                      "airr_c_C3H_HeJ.V",
                      "airr_c_C57BL_6.V",
                      "airr_c_C57BL_6J.V",
                      "airr_c_CAST_EiJ.V",
                      "airr_c_CBA_J.V",
                      "airr_c_DBA_1J.V",
                      "airr_c_DBA_2J.V",
                      "airr_c_LEWES_EiJ.V",
                      "airr_c_MRL_MpJ.V",
                      "airr_c_MSM_MsJI.V",
                      "airr_c_NOD_ShiLtJ.V",
                      "airr_c_NOR_LtJ.V",
                      "airr_c_NZB_BlNJ.V",
                      "airr_c_PWD_PhJ.V",
                      "airr_c_SJL_J.V",
                      "airr_c_balbc.V",
                      "airr_c_human_ig.V",
                      "mouse_gl_V",
                      "rhesus_monkey_V"
                    ],
                    "default": "auto"
                  },
                  "germline_db_d": {
                    "type": "string",
                    "title": "Germline D database",
                    "description": "IgBLAST's -germline_db_D, for nucleotide queries only. Light-chain and TCR alpha/gamma rearrangements have no D segment and IgBLAST simply reports none, so leaving this on Automatic is safe for a mixed repertoire. One of the field's option values.",
                    "enum": [
                      "auto",
                      "",
                      "airr_c_human_igh.D",
                      "mouse_gl_D"
                    ],
                    "default": "auto"
                  },
                  "germline_db_j": {
                    "type": "string",
                    "title": "Germline J database",
                    "description": "IgBLAST's -germline_db_J, for nucleotide queries only. The auxiliary coding-frame file is keyed to the J genes, so the CDR3 end and FWR4 are only annotated when the two agree. One of the field's option values.",
                    "enum": [
                      "auto",
                      "",
                      "airr_c_human_ig.J",
                      "mouse_gl_J",
                      "rhesus_monkey_J"
                    ],
                    "default": "auto"
                  },
                  "c_region_db": {
                    "type": "string",
                    "title": "Constant region database",
                    "description": "IgBLAST's -c_region_db, for nucleotide queries only. Identifies the isotype when the query runs into the constant region. NCBI distributes a prebuilt set for human only, so Automatic leaves it unset for every other organism. A query that stops at the end of the J segment, as most V(D)J amplicons do, has no constant region to call and reports an empty c_call. One of the field's option values.",
                    "enum": [
                      "auto",
                      "",
                      "ncbi_human_c_genes"
                    ],
                    "default": "auto"
                  },
                  "domain_system": {
                    "type": "string",
                    "title": "Domain delineation",
                    "description": "IgBLAST's -domain_system: which numbering convention the framework and complementarity determining regions are cut at. One of the field's option values.",
                    "enum": [
                      "imgt",
                      "kabat"
                    ],
                    "default": "imgt"
                  },
                  "show_translation": {
                    "type": "boolean",
                    "title": "Show translated alignments",
                    "description": "IgBLAST's -show_translation. Prints the amino-acid translation above the nucleotide alignment in the readable report. Nucleotide queries only. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "extend_align5end": {
                    "type": "boolean",
                    "title": "Extend V alignment at the 5' end",
                    "description": "IgBLAST's -extend_align5end. Forces the V alignment out to the start of the query, which recovers the first framework residues of a read beginning inside FR1. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "extend_align3end": {
                    "type": "boolean",
                    "title": "Extend J alignment at the 3' end",
                    "description": "IgBLAST's -extend_align3end. Forces the J alignment out to the end of the query. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "min_v_length": {
                    "type": "number",
                    "title": "Minimum V length",
                    "description": "IgBLAST's -min_V_length: shorter V alignments are not reported. Default 9. A number, within the range given for the field.",
                    "minimum": 9,
                    "maximum": 1000,
                    "default": 9
                  },
                  "min_j_length": {
                    "type": "number",
                    "title": "Minimum J length",
                    "description": "IgBLAST's -min_J_length: shorter J alignments are not reported. Default 0, meaning no minimum. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1000,
                    "default": 0
                  },
                  "min_d_match": {
                    "type": "number",
                    "title": "Minimum D match",
                    "description": "IgBLAST's -min_D_match: the consecutive nucleotide bases a D gene must match to be called. Raise it to suppress the spurious short D hits a hypermutated junction attracts. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": 5,
                    "maximum": 100,
                    "default": 5
                  },
                  "v_penalty": {
                    "type": "number",
                    "title": "V mismatch penalty",
                    "description": "IgBLAST's -V_penalty. Default -1, which tolerates the somatic hypermutation a matured V segment carries. A number, within the range given for the field.",
                    "minimum": -3,
                    "maximum": -1,
                    "default": -1
                  },
                  "d_penalty": {
                    "type": "number",
                    "title": "D mismatch penalty",
                    "description": "IgBLAST's -D_penalty. Default -2. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": -4,
                    "maximum": -1,
                    "default": -2
                  },
                  "j_penalty": {
                    "type": "number",
                    "title": "J mismatch penalty",
                    "description": "IgBLAST's -J_penalty. Default -2. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": -3,
                    "maximum": -1,
                    "default": -2
                  },
                  "allow_vdj_overlap": {
                    "type": "boolean",
                    "title": "Allow V(D)J genes to overlap",
                    "description": "IgBLAST's -allow_vdj_overlap. Active only when the D and J mismatch penalties are set to -4 and -3; a run that asks for it without them is refused rather than silently ignoring the option. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "write_airr": {
                    "type": "boolean",
                    "title": "Write the AIRR rearrangement table",
                    "description": "Runs IgBLAST with -outfmt 19 and keeps the result as <job name>.airr.tsv: one row per query with the V, D, J and C calls, the junction, every FWR and CDR, and the per-segment alignment coordinates, under the AIRR Rearrangement schema. This is the file offered at the top of the results page. Nucleotide queries only. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "report_format": {
                    "type": "string",
                    "title": "Readable report format",
                    "description": "IgBLAST's -outfmt for the readable report kept as <job name>.igblast.txt. Format 3 is IgBLAST's own default and the one its documented examples use. One of the field's option values.",
                    "enum": [
                      "3",
                      "4",
                      "7",
                      ""
                    ],
                    "default": "3"
                  },
                  "num_alignments_v": {
                    "type": "number",
                    "title": "V alignments to report",
                    "description": "IgBLAST's -num_alignments_V: germline V genes shown per query in the readable report. Default 3. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 3
                  },
                  "num_alignments_d": {
                    "type": "number",
                    "title": "D alignments to report",
                    "description": "IgBLAST's -num_alignments_D. Default 3. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 3
                  },
                  "num_alignments_j": {
                    "type": "number",
                    "title": "J alignments to report",
                    "description": "IgBLAST's -num_alignments_J. Default 3. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 3
                  },
                  "num_alignments_c": {
                    "type": "number",
                    "title": "C alignments to report",
                    "description": "IgBLAST's -num_alignments_C. Default 2. Only used when a constant region database is selected. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 2
                  },
                  "num_clonotype": {
                    "type": "number",
                    "title": "Top clonotypes to report",
                    "description": "IgBLAST's -num_clonotype, written to <job name>.clonotypes.txt through -clonotype_out. A clonotype groups the queries sharing their V(D)J calls, productivity and CDR3. Set to 0 to skip the clonotype pass. Nucleotide queries only. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 100000,
                    "default": 100
                  },
                  "evalue": {
                    "type": "string",
                    "title": "E-value threshold",
                    "description": "IgBLAST's -evalue. Leave empty for the program's own default: 20 for igblastn, 1 for igblastp. A single line of text.",
                    "maxLength": 32
                  },
                  "word_size": {
                    "type": "string",
                    "title": "Word size",
                    "description": "IgBLAST's -word_size, the length of the best perfect match the word finder seeds on. Leave empty for the program's default; the minimum is 4 for nucleotide queries and 2 for protein. A single line of text.",
                    "maxLength": 8
                  },
                  "gapopen": {
                    "type": "string",
                    "title": "Gap open cost",
                    "description": "IgBLAST's -gapopen. Leave empty for the program's default. A single line of text.",
                    "maxLength": 8
                  },
                  "gapextend": {
                    "type": "string",
                    "title": "Gap extend cost",
                    "description": "IgBLAST's -gapextend. Leave empty for the program's default. A single line of text.",
                    "maxLength": 8
                  },
                  "strand": {
                    "type": "string",
                    "title": "Query strand",
                    "description": "IgBLAST's -strand. Default both, which is what lets IgBLAST report a reverse-complemented read and set rev_comp in the AIRR table. Nucleotide queries only. One of the field's option values.",
                    "enum": [
                      "both",
                      "plus",
                      "minus"
                    ],
                    "default": "both"
                  },
                  "num_threads": {
                    "type": "number",
                    "title": "Threads",
                    "description": "IgBLAST's -num_threads. Default 4. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 32,
                    "default": 4
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "human_igh_airr",
                      "human_rf_repertoire",
                      "mouse_igh_report",
                      "mouse_vh_protein"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "text",
                      "upload"
                    ],
                    "default": "text"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "input_fasta"
                ],
                "example": {
                  "input_mode": "text",
                  "job_name": "igblast-demo",
                  "sequence_type": "nucleotide",
                  "input_fasta": ">Y14934.1 Homo sapiens mRNA for IgG1 rheumatoid factor immunoglobulin heavy chain\nGGGGGAGGCCTGGTCAAGCCTGGGGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCCCCTTCAGTA\nACTACACCATGCACTGGGTCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTCTCATCCATTACTAGTAG\nTAGTAGTTACAGATATTACGCAGACTCAGTGGAGGGCCGATTCACCATCTCCAGAGACAACGCCAAGAAC\nTCACTGTATCTGCAAATGAACAGCCTGAGAGCCGAGGACACGGCTGTGTATTTCTGTGTGAGAGATCGGG\nGCTATGATAGTAGTGGTTATTACGGAAATCTTGACTGCTGGGGCCAGGGAACCCTGGTCACCGTCTCCTC\nA\n",
                  "organism": "human",
                  "ig_seqtype": "Ig",
                  "germline_db_v": "auto",
                  "germline_db_d": "auto",
                  "germline_db_j": "auto",
                  "c_region_db": "auto",
                  "domain_system": "imgt",
                  "show_translation": true,
                  "extend_align5end": false,
                  "extend_align3end": false,
                  "min_v_length": 9,
                  "min_j_length": 0,
                  "min_d_match": 5,
                  "v_penalty": -1,
                  "d_penalty": -2,
                  "j_penalty": -2,
                  "allow_vdj_overlap": false,
                  "write_airr": true,
                  "report_format": "3",
                  "num_alignments_v": 3,
                  "num_alignments_d": 3,
                  "num_alignments_j": 3,
                  "num_alignments_c": 2,
                  "num_clonotype": 100,
                  "evalue": "",
                  "word_size": "",
                  "gapopen": "",
                  "gapextend": "",
                  "strand": "both",
                  "num_threads": 4
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/biophi/": {
      "get": {
        "summary": "BioPhi field schema",
        "description": "Humanize antibody sequences or estimate their humanness.",
        "operationId": "biophi_schema",
        "tags": [
          "BioPhi"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a BioPhi job",
        "description": "Humanize antibody sequences or estimate their humanness. Prepares paired antibody FASTA and invokes BioPhi Sapiens or OASis.",
        "operationId": "biophi_submit",
        "tags": [
          "BioPhi"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Antibody name",
                    "description": "A single line of text.",
                    "default": "mouse-4d5"
                  },
                  "heavy_sequence": {
                    "type": "string",
                    "title": "Heavy-chain sequence",
                    "description": "Variable domain only. The placeholder is the murine 4D5 heavy chain, the mouse parent of trastuzumab. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DVQLQESGPGLVRPSQTLSLTCTVSGFSLTNYGVHWVRQSPGKGLEWLGVIWSGGNTDYNTPFTSRLSINKDNSKSQVFFKMNSLQSNDTAIYYCARALTYYDYEFAYWGQGTLVTVSA"
                  },
                  "light_sequence": {
                    "type": "string",
                    "title": "Light-chain sequence",
                    "description": "Variable domain only. The placeholder is the murine 4D5 light chain. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DIVMTQSHKFMSTSVGDRVSITCKASQDVNTAVAWYQQKPGHSPKLLIYSASFRYTGVPDRFTGSRSGTDFTFTISSVQAEDLAVYYCQQHYTTPPTFGGGTKVEIK"
                  },
                  "operation": {
                    "type": "string",
                    "title": "Operation",
                    "description": "One of the field's option values.",
                    "enum": [
                      "humanize",
                      "mean_score",
                      "oasis"
                    ],
                    "default": "humanize"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "heavy_sequence",
                  "light_sequence"
                ],
                "example": {
                  "job_name": "mouse-4d5",
                  "heavy_sequence": "DVQLQESGPGLVRPSQTLSLTCTVSGFSLTNYGVHWVRQSPGKGLEWLGVIWSGGNTDYNTPFTSRLSINKDNSKSQVFFKMNSLQSNDTAIYYCARALTYYDYEFAYWGQGTLVTVSA",
                  "light_sequence": "DIVMTQSHKFMSTSVGDRVSITCKASQDVNTAVAWYQQKPGHSPKLLIYSASFRYTGVPDRFTGSRSGTDFTFTISSVQAEDLAVYYCQQHYTTPPTFGGGTKVEIK",
                  "operation": "humanize"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Antibody name",
                    "description": "A single line of text.",
                    "default": "mouse-4d5"
                  },
                  "heavy_sequence": {
                    "type": "string",
                    "title": "Heavy-chain sequence",
                    "description": "Variable domain only. The placeholder is the murine 4D5 heavy chain, the mouse parent of trastuzumab. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DVQLQESGPGLVRPSQTLSLTCTVSGFSLTNYGVHWVRQSPGKGLEWLGVIWSGGNTDYNTPFTSRLSINKDNSKSQVFFKMNSLQSNDTAIYYCARALTYYDYEFAYWGQGTLVTVSA"
                  },
                  "light_sequence": {
                    "type": "string",
                    "title": "Light-chain sequence",
                    "description": "Variable domain only. The placeholder is the murine 4D5 light chain. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DIVMTQSHKFMSTSVGDRVSITCKASQDVNTAVAWYQQKPGHSPKLLIYSASFRYTGVPDRFTGSRSGTDFTFTISSVQAEDLAVYYCQQHYTTPPTFGGGTKVEIK"
                  },
                  "operation": {
                    "type": "string",
                    "title": "Operation",
                    "description": "One of the field's option values.",
                    "enum": [
                      "humanize",
                      "mean_score",
                      "oasis"
                    ],
                    "default": "humanize"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "heavy_sequence",
                  "light_sequence"
                ],
                "example": {
                  "job_name": "mouse-4d5",
                  "heavy_sequence": "DVQLQESGPGLVRPSQTLSLTCTVSGFSLTNYGVHWVRQSPGKGLEWLGVIWSGGNTDYNTPFTSRLSINKDNSKSQVFFKMNSLQSNDTAIYYCARALTYYDYEFAYWGQGTLVTVSA",
                  "light_sequence": "DIVMTQSHKFMSTSVGDRVSITCKASQDVNTAVAWYQQKPGHSPKLLIYSASFRYTGVPDRFTGSRSGTDFTFTISSVQAEDLAVYYCQQHYTTPPTFGGGTKVEIK",
                  "operation": "humanize"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/antifold/": {
      "get": {
        "summary": "AntiFold field schema",
        "description": "Structure-based antibody design using inverse folding",
        "operationId": "antifold_schema",
        "tags": [
          "AntiFold"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a AntiFold job",
        "description": "Structure-based antibody design using inverse folding AntiFold predicts sequences which fit into an input antibody variable domain structure.\n         The tool outputs residue log-likelihoods in CSV format, and can sample sequences to a FASTA format directly.\n         Sampled sequences show high structural agreement with experimental structures. \nAntiFold is based on the ESM-IF1 model and is fine-tuned on solved and predicted antibody structures from SAbDab and OAS.",
        "operationId": "antifold_submit",
        "tags": [
          "AntiFold"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdb": {
                    "type": "string",
                    "title": "IMGT-numbered PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE AN IMGT-NUMBERED PDB HERE"
                  },
                  "heavy_chain": {
                    "type": "string",
                    "title": "Heavy-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "H"
                  },
                  "light_chain": {
                    "type": "string",
                    "title": "Light-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "L"
                  },
                  "antigen_chain": {
                    "type": "string",
                    "title": "Antigen-chain ID (optional)",
                    "description": "A single line of text."
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Sequences to sample",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 10
                  },
                  "sampling_temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 2.0,
                    "default": 0.2
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "pdb",
                  "heavy_chain",
                  "light_chain"
                ],
                "example": {
                  "pdb": "HEADER    PASTE AN IMGT-NUMBERED PDB HERE",
                  "heavy_chain": "H",
                  "light_chain": "L",
                  "antigen_chain": "",
                  "num_sequences": 10,
                  "sampling_temperature": 0.2
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdb": {
                    "type": "string",
                    "title": "IMGT-numbered PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE AN IMGT-NUMBERED PDB HERE"
                  },
                  "heavy_chain": {
                    "type": "string",
                    "title": "Heavy-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "H"
                  },
                  "light_chain": {
                    "type": "string",
                    "title": "Light-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "L"
                  },
                  "antigen_chain": {
                    "type": "string",
                    "title": "Antigen-chain ID (optional)",
                    "description": "A single line of text."
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Sequences to sample",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 10
                  },
                  "sampling_temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 2.0,
                    "default": 0.2
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "pdb",
                  "heavy_chain",
                  "light_chain"
                ],
                "example": {
                  "pdb": "HEADER    PASTE AN IMGT-NUMBERED PDB HERE",
                  "heavy_chain": "H",
                  "light_chain": "L",
                  "antigen_chain": "",
                  "num_sequences": 10,
                  "sampling_temperature": 0.2
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/abmpnn/": {
      "get": {
        "summary": "AbMPNN field schema",
        "description": "Design antibody sequences from a backbone structure.",
        "operationId": "abmpnn_schema",
        "tags": [
          "AbMPNN"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a AbMPNN job",
        "description": "Design antibody sequences from a backbone structure. Prepares an antibody-specific ProteinMPNN run using separately supplied AbMPNN weights.",
        "operationId": "abmpnn_submit",
        "tags": [
          "AbMPNN"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdb": {
                    "type": "string",
                    "title": "Antibody PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE AN ANTIBODY PDB HERE"
                  },
                  "designed_chains": {
                    "type": "string",
                    "title": "Chains to design",
                    "description": "Space-separated chain IDs; heavy chain first. A single line of text.",
                    "default": "H L"
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Number of sequences",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 8
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 1.0,
                    "default": 0.2
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Amino acids to omit",
                    "description": "One-letter amino-acid codes. A single line of text.",
                    "default": "X"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "pdb",
                  "designed_chains"
                ],
                "example": {
                  "pdb": "HEADER    PASTE AN ANTIBODY PDB HERE",
                  "designed_chains": "H L",
                  "num_sequences": 8,
                  "temperature": 0.2,
                  "omit_amino_acids": "X"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "pdb": {
                    "type": "string",
                    "title": "Antibody PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE AN ANTIBODY PDB HERE"
                  },
                  "designed_chains": {
                    "type": "string",
                    "title": "Chains to design",
                    "description": "Space-separated chain IDs; heavy chain first. A single line of text.",
                    "default": "H L"
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Number of sequences",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 8
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 1.0,
                    "default": 0.2
                  },
                  "omit_amino_acids": {
                    "type": "string",
                    "title": "Amino acids to omit",
                    "description": "One-letter amino-acid codes. A single line of text.",
                    "default": "X"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "pdb",
                  "designed_chains"
                ],
                "example": {
                  "pdb": "HEADER    PASTE AN ANTIBODY PDB HERE",
                  "designed_chains": "H L",
                  "num_sequences": 8,
                  "temperature": 0.2,
                  "omit_amino_acids": "X"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/proteinmpnn/": {
      "get": {
        "summary": "ProteinMPNN field schema",
        "description": "Protein sequence prediction, to conform with backbone coordinates. Does not take external molecules into account. A useful step after RFDiffusion in a protein design pipeline, and before validation with structure prediction.",
        "operationId": "proteinmpnn_schema",
        "tags": [
          "ProteinMPNN"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a ProteinMPNN job",
        "description": "Protein sequence prediction, to conform with backbone coordinates. Does not take external molecules into account. A useful step after RFDiffusion in a protein design pipeline, and before validation with structure prediction. A graph neural network designed for protein inverse folding, meaning it predicts the amino acid sequences most likely to fold into a specific 3D protein backbone structure. By interpreting the spatial coordinates and geometric features of a target structure, the model generates sequence candidates. Researchers use ProteinMPNN for applications such as optimizing enzymes, designing novel therapeutics, and improving the stability or solubility of synthetic proteins.",
        "operationId": "proteinmpnn_submit",
        "tags": [
          "ProteinMPNN"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A label for this run and its results. A single line of text.",
                    "default": "proteinmpnn-demo"
                  },
                  "pdb_path": {
                    "type": "string",
                    "title": "Backbone structure",
                    "description": "A single protein backbone to design or score. Leave chains blank to use every chain. Upload a PDB or mmCIF, or choose a preset with an included structure. The first model is used for multi-model structures. mmCIF is converted to PDB and requires single-character chain IDs. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "pdb_path_chains": {
                    "type": "string",
                    "title": "Chains to design or score",
                    "description": "Space-separated chain IDs, e.g. A C. Other chains supply fixed sequence and structural context. Blank selects all chains. A single line of text."
                  },
                  "path_to_fasta": {
                    "type": "string",
                    "title": "Sequences to score (FASTA)",
                    "description": "Optional sequences for score-only mode. The native sequence is also scored. Supply one sequence per FASTA record, with designed chains in alphabetical order separated by /. Each chain must match its parsed backbone length. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "model_name": {
                    "type": "string",
                    "title": "Model checkpoint",
                    "description": "48-neighbor models trained with backbone noise of 0.02, 0.10, 0.20 or 0.30 angstroms. CA-only weights are available through v_48_020. One of the field's option values.",
                    "enum": [
                      "v_48_002",
                      "v_48_010",
                      "v_48_020",
                      "v_48_030"
                    ],
                    "default": "v_48_020"
                  },
                  "use_soluble_model": {
                    "type": "boolean",
                    "title": "Use soluble-protein weights",
                    "description": "Use weights trained on soluble proteins. Cannot be combined with CA-only mode. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "ca_only": {
                    "type": "boolean",
                    "title": "Use CA-only structures and weights",
                    "description": "Use only alpha-carbon coordinates. Requires a CA-only checkpoint; v_48_030 is unavailable. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "num_seq_per_target": {
                    "type": "number",
                    "title": "Samples per target",
                    "description": "Sequences per temperature in design mode; repeated evaluations in score/probability modes. Must be a multiple of batch size. This service accepts up to 1,000 samples per target. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "batch_size": {
                    "type": "number",
                    "title": "Batch size",
                    "description": "Samples processed together. Reduce if GPU memory runs out. Must divide the sample count exactly. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "sampling_temp": {
                    "type": "string",
                    "title": "Sampling temperatures",
                    "description": "One or more positive temperatures separated by spaces, e.g. 0.1 0.2 0.3. Higher values give more sequence diversity. A single line of text.",
                    "default": "0.1"
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "Zero chooses a random seed. Set a nonzero seed for reproducible sampling in the same runtime. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "backbone_noise": {
                    "type": "number",
                    "title": "Inference backbone noise",
                    "description": "Standard deviation in angstroms of Gaussian noise added to backbone coordinates during inference; separate from checkpoint training noise. A number, within the range given for the field.",
                    "minimum": 0,
                    "default": 0.0
                  },
                  "max_length": {
                    "type": "number",
                    "title": "Maximum total sequence length",
                    "description": "Maximum parsed sequence length across all chains. Longer inputs are rejected before running. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 200000,
                    "default": 200000
                  },
                  "fixed_positions_jsonl": {
                    "type": "string",
                    "title": "Fixed positions (JSON)",
                    "description": "Positions whose native amino acids are retained, e.g. {\"A\": [1, 2, 3], \"C\": [10]}. Omitted chains are designed in full. Positions are 1-based indices in each parsed chain, including gaps and insertion-code residues, not PDB residue numbers. Enter the chain dictionary or the upstream dictionary keyed by structure name. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "tied_positions_jsonl": {
                    "type": "string",
                    "title": "Tied positions (JSON)",
                    "description": "Groups sampled as the same amino acid, e.g. [{\"A\": [1], \"C\": [1]}, {\"A\": [2], \"C\": [2]}]. Uses the same 1-based parsed positions. Weighted groups also accept {\"A\": [[1], [0.5]], \"C\": [[1], [0.5]]}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "homo_oligomer": {
                    "type": "boolean",
                    "title": "Tie all designed chains as a homo-oligomer",
                    "description": "Tie matching positions across the designed chains. Requires at least two chains of equal parsed length. Convenience equivalent of the official homooligomer helper. Use either this option or custom tied positions. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "omit_AAs": {
                    "type": "string",
                    "title": "Omit amino acids",
                    "description": "One-letter amino-acid codes excluded from sampling everywhere, e.g. AC excludes alanine and cysteine. X excludes the unknown residue. A single line of text.",
                    "default": "X"
                  },
                  "bias_AA_jsonl": {
                    "type": "string",
                    "title": "Global amino-acid bias (JSON)",
                    "description": "Bias for each amino acid, e.g. {\"A\": -1.1, \"F\": 0.7}. Positive values favor an amino acid; negative values discourage it. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "omit_AA_jsonl": {
                    "type": "string",
                    "title": "Per-position omitted amino acids (JSON)",
                    "description": "Chain-specific exclusions, e.g. {\"A\": [[[1, 2], \"CP\"], [[3], \"W\"]]}. Uses 1-based parsed positions. Enter a chain dictionary or an upstream dictionary keyed by structure name. Missing chains have no local exclusions. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "bias_by_res_jsonl": {
                    "type": "string",
                    "title": "Per-position amino-acid bias (JSON)",
                    "description": "Chain dictionary of L \u00d7 21 numeric bias matrices in alphabet order ACDEFGHIKLMNPQRSTVWYX. L is the parsed chain length. Upload JSON or provide an object through the API. An upstream dictionary keyed by structure name is also accepted. Missing chains receive zero bias. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "pssm_jsonl": {
                    "type": "string",
                    "title": "PSSM guidance (JSON)",
                    "description": "Chain dictionaries containing pssm_coef (L), pssm_bias (L \u00d7 21 probability distributions), and pssm_log_odds (L \u00d7 21). Alphabet: ACDEFGHIKLMNPQRSTVWYX. Use the output of the official make_pssm_input_dict.py helper, or a chain dictionary. The PSSM presets include converted official inputs. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "pssm_multi": {
                    "type": "number",
                    "title": "PSSM mixing weight",
                    "description": "Global PSSM weight from 0 to 1, multiplied by each position\u2019s pssm_coef. Zero uses ProteinMPNN alone; one with coefficient one uses PSSM alone. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.0
                  },
                  "pssm_bias_flag": {
                    "type": "boolean",
                    "title": "Mix in PSSM probabilities",
                    "description": "Enable probability mixing using pssm_multi and per-position pssm_coef. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "pssm_log_odds_flag": {
                    "type": "boolean",
                    "title": "Restrict amino acids using PSSM log odds",
                    "description": "Apply the PSSM log-odds mask to sampling. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "pssm_threshold": {
                    "type": "number",
                    "title": "PSSM log-odds threshold",
                    "description": "Keep amino acids whose PSSM log odds are greater than this threshold when the log-odds option is enabled. A number, within the range given for the field.",
                    "default": 0.0
                  },
                  "conditional_probs_only_backbone": {
                    "type": "boolean",
                    "title": "Condition only on the backbone",
                    "description": "For conditional probabilities, compute p(amino acid | backbone) instead of also conditioning on the other residues. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "save_score": {
                    "type": "boolean",
                    "title": "Save sampled sequence scores",
                    "description": "Save negative log probabilities for designed residues and global scores as NumPy .npz files. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "save_probs": {
                    "type": "boolean",
                    "title": "Save sampled sequence probabilities",
                    "description": "Save per-position probabilities, log probabilities, sequences, masks and chain order as NumPy .npz files. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "suppress_print": {
                    "type": "boolean",
                    "title": "Suppress progress output",
                    "description": "Suppress ProteinMPNN\u2019s progress messages. Result files are still saved. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "example_1/5L33",
                      "example_1/6MRR",
                      "example_2/3HTN",
                      "example_2/4YOW",
                      "example_3/3HTN",
                      "example_3_score_only/3HTN",
                      "example_3_score_only_from_fasta/3HTN",
                      "example_4/3HTN",
                      "example_4_non_fixed/3HTN",
                      "example_5/3HTN",
                      "example_4/4YOW",
                      "example_4_non_fixed/4YOW",
                      "example_5/4YOW",
                      "example_6/4GYT",
                      "example_6/6EHB",
                      "example_7/5L33",
                      "example_8/5L33",
                      "example_7/6MRR",
                      "example_8/6MRR",
                      "example_pssm/3HTN",
                      "example_pssm/4YOW"
                    ]
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "design",
                      "score_only",
                      "conditional_probs_only",
                      "unconditional_probs_only"
                    ],
                    "default": "design"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "pdb_path"
                ],
                "example": {
                  "task": "design",
                  "job_name": "proteinmpnn-demo",
                  "pdb_path": "",
                  "pdb_path_chains": "",
                  "model_name": "v_48_020",
                  "use_soluble_model": false,
                  "ca_only": false,
                  "num_seq_per_target": 1,
                  "batch_size": 1,
                  "sampling_temp": "0.1",
                  "seed": 0,
                  "backbone_noise": 0.0,
                  "max_length": 200000,
                  "fixed_positions_jsonl": "",
                  "tied_positions_jsonl": "",
                  "homo_oligomer": false,
                  "omit_AAs": "X",
                  "bias_AA_jsonl": "",
                  "omit_AA_jsonl": "",
                  "bias_by_res_jsonl": "",
                  "pssm_jsonl": "",
                  "pssm_multi": 0.0,
                  "pssm_bias_flag": false,
                  "pssm_log_odds_flag": false,
                  "pssm_threshold": 0.0,
                  "save_score": false,
                  "save_probs": false,
                  "suppress_print": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A label for this run and its results. A single line of text.",
                    "default": "proteinmpnn-demo"
                  },
                  "pdb_path": {
                    "type": "string",
                    "title": "Backbone structure",
                    "description": "A single protein backbone to design or score. Leave chains blank to use every chain. Upload a PDB or mmCIF, or choose a preset with an included structure. The first model is used for multi-model structures. mmCIF is converted to PDB and requires single-character chain IDs. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "pdb_path_chains": {
                    "type": "string",
                    "title": "Chains to design or score",
                    "description": "Space-separated chain IDs, e.g. A C. Other chains supply fixed sequence and structural context. Blank selects all chains. A single line of text."
                  },
                  "path_to_fasta": {
                    "type": "string",
                    "title": "Sequences to score (FASTA)",
                    "description": "Optional sequences for score-only mode. The native sequence is also scored. Supply one sequence per FASTA record, with designed chains in alphabetical order separated by /. Each chain must match its parsed backbone length. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "model_name": {
                    "type": "string",
                    "title": "Model checkpoint",
                    "description": "48-neighbor models trained with backbone noise of 0.02, 0.10, 0.20 or 0.30 angstroms. CA-only weights are available through v_48_020. One of the field's option values.",
                    "enum": [
                      "v_48_002",
                      "v_48_010",
                      "v_48_020",
                      "v_48_030"
                    ],
                    "default": "v_48_020"
                  },
                  "use_soluble_model": {
                    "type": "boolean",
                    "title": "Use soluble-protein weights",
                    "description": "Use weights trained on soluble proteins. Cannot be combined with CA-only mode. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "ca_only": {
                    "type": "boolean",
                    "title": "Use CA-only structures and weights",
                    "description": "Use only alpha-carbon coordinates. Requires a CA-only checkpoint; v_48_030 is unavailable. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "num_seq_per_target": {
                    "type": "number",
                    "title": "Samples per target",
                    "description": "Sequences per temperature in design mode; repeated evaluations in score/probability modes. Must be a multiple of batch size. This service accepts up to 1,000 samples per target. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "batch_size": {
                    "type": "number",
                    "title": "Batch size",
                    "description": "Samples processed together. Reduce if GPU memory runs out. Must divide the sample count exactly. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "sampling_temp": {
                    "type": "string",
                    "title": "Sampling temperatures",
                    "description": "One or more positive temperatures separated by spaces, e.g. 0.1 0.2 0.3. Higher values give more sequence diversity. A single line of text.",
                    "default": "0.1"
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "Zero chooses a random seed. Set a nonzero seed for reproducible sampling in the same runtime. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "backbone_noise": {
                    "type": "number",
                    "title": "Inference backbone noise",
                    "description": "Standard deviation in angstroms of Gaussian noise added to backbone coordinates during inference; separate from checkpoint training noise. A number, within the range given for the field.",
                    "minimum": 0,
                    "default": 0.0
                  },
                  "max_length": {
                    "type": "number",
                    "title": "Maximum total sequence length",
                    "description": "Maximum parsed sequence length across all chains. Longer inputs are rejected before running. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 200000,
                    "default": 200000
                  },
                  "fixed_positions_jsonl": {
                    "type": "string",
                    "title": "Fixed positions (JSON)",
                    "description": "Positions whose native amino acids are retained, e.g. {\"A\": [1, 2, 3], \"C\": [10]}. Omitted chains are designed in full. Positions are 1-based indices in each parsed chain, including gaps and insertion-code residues, not PDB residue numbers. Enter the chain dictionary or the upstream dictionary keyed by structure name. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "tied_positions_jsonl": {
                    "type": "string",
                    "title": "Tied positions (JSON)",
                    "description": "Groups sampled as the same amino acid, e.g. [{\"A\": [1], \"C\": [1]}, {\"A\": [2], \"C\": [2]}]. Uses the same 1-based parsed positions. Weighted groups also accept {\"A\": [[1], [0.5]], \"C\": [[1], [0.5]]}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "homo_oligomer": {
                    "type": "boolean",
                    "title": "Tie all designed chains as a homo-oligomer",
                    "description": "Tie matching positions across the designed chains. Requires at least two chains of equal parsed length. Convenience equivalent of the official homooligomer helper. Use either this option or custom tied positions. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "omit_AAs": {
                    "type": "string",
                    "title": "Omit amino acids",
                    "description": "One-letter amino-acid codes excluded from sampling everywhere, e.g. AC excludes alanine and cysteine. X excludes the unknown residue. A single line of text.",
                    "default": "X"
                  },
                  "bias_AA_jsonl": {
                    "type": "string",
                    "title": "Global amino-acid bias (JSON)",
                    "description": "Bias for each amino acid, e.g. {\"A\": -1.1, \"F\": 0.7}. Positive values favor an amino acid; negative values discourage it. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "omit_AA_jsonl": {
                    "type": "string",
                    "title": "Per-position omitted amino acids (JSON)",
                    "description": "Chain-specific exclusions, e.g. {\"A\": [[[1, 2], \"CP\"], [[3], \"W\"]]}. Uses 1-based parsed positions. Enter a chain dictionary or an upstream dictionary keyed by structure name. Missing chains have no local exclusions. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "bias_by_res_jsonl": {
                    "type": "string",
                    "title": "Per-position amino-acid bias (JSON)",
                    "description": "Chain dictionary of L \u00d7 21 numeric bias matrices in alphabet order ACDEFGHIKLMNPQRSTVWYX. L is the parsed chain length. Upload JSON or provide an object through the API. An upstream dictionary keyed by structure name is also accepted. Missing chains receive zero bias. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "pssm_jsonl": {
                    "type": "string",
                    "title": "PSSM guidance (JSON)",
                    "description": "Chain dictionaries containing pssm_coef (L), pssm_bias (L \u00d7 21 probability distributions), and pssm_log_odds (L \u00d7 21). Alphabet: ACDEFGHIKLMNPQRSTVWYX. Use the output of the official make_pssm_input_dict.py helper, or a chain dictionary. The PSSM presets include converted official inputs. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "pssm_multi": {
                    "type": "number",
                    "title": "PSSM mixing weight",
                    "description": "Global PSSM weight from 0 to 1, multiplied by each position\u2019s pssm_coef. Zero uses ProteinMPNN alone; one with coefficient one uses PSSM alone. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.0
                  },
                  "pssm_bias_flag": {
                    "type": "boolean",
                    "title": "Mix in PSSM probabilities",
                    "description": "Enable probability mixing using pssm_multi and per-position pssm_coef. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "pssm_log_odds_flag": {
                    "type": "boolean",
                    "title": "Restrict amino acids using PSSM log odds",
                    "description": "Apply the PSSM log-odds mask to sampling. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "pssm_threshold": {
                    "type": "number",
                    "title": "PSSM log-odds threshold",
                    "description": "Keep amino acids whose PSSM log odds are greater than this threshold when the log-odds option is enabled. A number, within the range given for the field.",
                    "default": 0.0
                  },
                  "conditional_probs_only_backbone": {
                    "type": "boolean",
                    "title": "Condition only on the backbone",
                    "description": "For conditional probabilities, compute p(amino acid | backbone) instead of also conditioning on the other residues. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "save_score": {
                    "type": "boolean",
                    "title": "Save sampled sequence scores",
                    "description": "Save negative log probabilities for designed residues and global scores as NumPy .npz files. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "save_probs": {
                    "type": "boolean",
                    "title": "Save sampled sequence probabilities",
                    "description": "Save per-position probabilities, log probabilities, sequences, masks and chain order as NumPy .npz files. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "suppress_print": {
                    "type": "boolean",
                    "title": "Suppress progress output",
                    "description": "Suppress ProteinMPNN\u2019s progress messages. Result files are still saved. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "example_1/5L33",
                      "example_1/6MRR",
                      "example_2/3HTN",
                      "example_2/4YOW",
                      "example_3/3HTN",
                      "example_3_score_only/3HTN",
                      "example_3_score_only_from_fasta/3HTN",
                      "example_4/3HTN",
                      "example_4_non_fixed/3HTN",
                      "example_5/3HTN",
                      "example_4/4YOW",
                      "example_4_non_fixed/4YOW",
                      "example_5/4YOW",
                      "example_6/4GYT",
                      "example_6/6EHB",
                      "example_7/5L33",
                      "example_8/5L33",
                      "example_7/6MRR",
                      "example_8/6MRR",
                      "example_pssm/3HTN",
                      "example_pssm/4YOW"
                    ]
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "design",
                      "score_only",
                      "conditional_probs_only",
                      "unconditional_probs_only"
                    ],
                    "default": "design"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "pdb_path"
                ],
                "example": {
                  "task": "design",
                  "job_name": "proteinmpnn-demo",
                  "pdb_path": "",
                  "pdb_path_chains": "",
                  "model_name": "v_48_020",
                  "use_soluble_model": false,
                  "ca_only": false,
                  "num_seq_per_target": 1,
                  "batch_size": 1,
                  "sampling_temp": "0.1",
                  "seed": 0,
                  "backbone_noise": 0.0,
                  "max_length": 200000,
                  "fixed_positions_jsonl": "",
                  "tied_positions_jsonl": "",
                  "homo_oligomer": false,
                  "omit_AAs": "X",
                  "bias_AA_jsonl": "",
                  "omit_AA_jsonl": "",
                  "bias_by_res_jsonl": "",
                  "pssm_jsonl": "",
                  "pssm_multi": 0.0,
                  "pssm_bias_flag": false,
                  "pssm_log_odds_flag": false,
                  "pssm_threshold": 0.0,
                  "save_score": false,
                  "save_probs": false,
                  "suppress_print": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/ligandmpnn/": {
      "get": {
        "summary": "LigandMPNN field schema",
        "description": "Protein sequence prediction, to conform with backbone coordinates. Takes external molecules into account; to some degree a superset of ProteinMPNN, but is a different model. A useful step after RFDiffusion in a protein design pipeline, and before validation with structure prediction.",
        "operationId": "ligandmpnn_schema",
        "tags": [
          "LigandMPNN"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a LigandMPNN job",
        "description": "Protein sequence prediction, to conform with backbone coordinates. Takes external molecules into account; to some degree a superset of ProteinMPNN, but is a different model. A useful step after RFDiffusion in a protein design pipeline, and before validation with structure prediction. A deep learning-based protein sequence design method that explicitly models all non-protein components of biomolecular systems. LigandMPNN generates not only sequences but also sidechain conformations to allow detailed evaluation of binding interactions. Experimental characterization demonstrates that LigandMPNN can generate small molecule and DNA-binding proteins with high affinity and specificity. It allows explicit modeling of small molecule, nucleotide, metal, and other atomic contexts.",
        "operationId": "ligandmpnn_submit",
        "tags": [
          "LigandMPNN"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A label for this run and its results. A single line of text.",
                    "default": "ligandmpnn-demo"
                  },
                  "pdb_path": {
                    "type": "string",
                    "title": "Structure (PDB)",
                    "description": "Upload a protein or protein\u2013ligand PDB, or choose a bundled official example. Required unless multiple structures are supplied. PDB contents are mapped to --pdb_path. Preserve HETATM records for ligand, nucleotide and metal context. This upstream parser reads PDB, not mmCIF. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "pdb_path_multi": {
                    "type": "string",
                    "title": "Multiple structures (JSON)",
                    "description": "Object mapping unique names to PDB contents or bundled references. Leave the single-structure field blank. Example: {\"first\": \"bio-tools://ligandmpnn/inputs/1BC8.pdb\", \"second\": \"bio-tools://ligandmpnn/inputs/4GYT.pdb\"}. The service creates a native --pdb_path_multi file with job-local paths; server paths are not accepted. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "chains_to_design": {
                    "type": "string",
                    "title": "Chains to design or score",
                    "description": "Comma-separated chain IDs, e.g. A,B. Other chains remain fixed context. Blank selects all parsed protein chains. A single line of text."
                  },
                  "parse_these_chains_only": {
                    "type": "string",
                    "title": "Parse only these chains",
                    "description": "Comma-separated chain IDs. Excludes every other chain, including its ligand atoms, from parsing and output; blank keeps all chains. A single line of text."
                  },
                  "parse_atoms_with_zero_occupancy": {
                    "type": "boolean",
                    "title": "Include atoms with zero occupancy",
                    "description": "Upstream normally discards atoms whose occupancy is zero. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "model_type": {
                    "type": "string",
                    "title": "Model",
                    "description": "The upstream default is ProteinMPNN. Select LigandMPNN to condition sequence design or scoring on non-protein atoms. One of the field's option values.",
                    "enum": [
                      "protein_mpnn",
                      "ligand_mpnn",
                      "soluble_mpnn",
                      "per_residue_label_membrane_mpnn",
                      "global_label_membrane_mpnn"
                    ],
                    "default": "protein_mpnn"
                  },
                  "checkpoint_protein_mpnn": {
                    "type": "string",
                    "title": "ProteinMPNN checkpoint",
                    "description": "Official checkpoint filename in the configured model directory. Noise is the training backbone noise in angstroms. One of the field's option values.",
                    "enum": [
                      "proteinmpnn_v_48_002.pt",
                      "proteinmpnn_v_48_010.pt",
                      "proteinmpnn_v_48_020.pt",
                      "proteinmpnn_v_48_030.pt"
                    ],
                    "default": "proteinmpnn_v_48_020.pt"
                  },
                  "checkpoint_ligand_mpnn": {
                    "type": "string",
                    "title": "LigandMPNN checkpoint",
                    "description": "Official checkpoint filename in the configured model directory. Noise is the training backbone noise in angstroms. One of the field's option values.",
                    "enum": [
                      "ligandmpnn_v_32_005_25.pt",
                      "ligandmpnn_v_32_010_25.pt",
                      "ligandmpnn_v_32_020_25.pt",
                      "ligandmpnn_v_32_030_25.pt"
                    ],
                    "default": "ligandmpnn_v_32_010_25.pt"
                  },
                  "checkpoint_soluble_mpnn": {
                    "type": "string",
                    "title": "SolubleMPNN checkpoint",
                    "description": "Official checkpoint filename in the configured model directory. Noise is the training backbone noise in angstroms. One of the field's option values.",
                    "enum": [
                      "solublempnn_v_48_002.pt",
                      "solublempnn_v_48_010.pt",
                      "solublempnn_v_48_020.pt",
                      "solublempnn_v_48_030.pt"
                    ],
                    "default": "solublempnn_v_48_020.pt"
                  },
                  "checkpoint_per_residue_label_membrane_mpnn": {
                    "type": "string",
                    "title": "Membrane: per-residue labels checkpoint",
                    "description": "Official checkpoint filename in the configured model directory. Noise is the training backbone noise in angstroms. One of the field's option values.",
                    "enum": [
                      "per_residue_label_membrane_mpnn_v_48_020.pt"
                    ],
                    "default": "per_residue_label_membrane_mpnn_v_48_020.pt"
                  },
                  "checkpoint_global_label_membrane_mpnn": {
                    "type": "string",
                    "title": "Membrane: global label checkpoint",
                    "description": "Official checkpoint filename in the configured model directory. Noise is the training backbone noise in angstroms. One of the field's option values.",
                    "enum": [
                      "global_label_membrane_mpnn_v_48_020.pt"
                    ],
                    "default": "global_label_membrane_mpnn_v_48_020.pt"
                  },
                  "batch_size": {
                    "type": "number",
                    "title": "Batch size",
                    "description": "Samples evaluated together; reduce to 1 for a small CPU run. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "number_of_batches": {
                    "type": "number",
                    "title": "Number of batches",
                    "description": "Total samples = batch size \u00d7 number of batches. For scoring, upstream recommends at least 10 batches to average decoding-order effects. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 1
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "Positive temperature; higher values give more sequence diversity. A number, within the range given for the field.",
                    "minimum": 1e-06,
                    "default": 0.1
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "Zero chooses a random seed. A nonzero seed is reproducible within the same runtime. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "use_sequence": {
                    "type": "boolean",
                    "title": "Condition scores on sequence",
                    "description": "Use the sequence in the PDB as well as the backbone. Disable for backbone-only probabilities. Scoring writes a .pt dictionary of per-residue probabilities and statistics. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "fixed_residues": {
                    "type": "string",
                    "title": "Fixed residues",
                    "description": "Space-separated PDB residue IDs, e.g. C1 C2 C3. These residues retain their input amino acids. Uses chain + author residue number + optional insertion code, e.g. B82A. Unlike original ProteinMPNN, numbering gaps are not filled with X. A single line of text."
                  },
                  "fixed_residues_multi": {
                    "type": "string",
                    "title": "Fixed residues per structure (JSON)",
                    "description": "Object keyed by the names in pdb_path_multi, with a space-separated residue list per structure. Overrides the common list for that structure. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "redesigned_residues": {
                    "type": "string",
                    "title": "Redesign only these residues",
                    "description": "Space-separated PDB residue IDs; every other residue is fixed. Choose this or fixed_residues. Uses chain + author residue number + optional insertion code, e.g. B82A. Unlike original ProteinMPNN, numbering gaps are not filled with X. A single line of text."
                  },
                  "redesigned_residues_multi": {
                    "type": "string",
                    "title": "Redesign only these residues per structure (JSON)",
                    "description": "Object keyed by the names in pdb_path_multi, with a space-separated residue list per structure. Overrides the common list for that structure. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "symmetry_residues": {
                    "type": "string",
                    "title": "Tied residue groups",
                    "description": "Comma-separated residues within each group, | between groups: C1,C2,C3|C4,C5|C6,C7. Groups cannot overlap. A single line of text."
                  },
                  "symmetry_weights": {
                    "type": "string",
                    "title": "Tied residue weights",
                    "description": "Matching weights for every group: 0.33,0.33,0.33|0.5,0.5|0.5,0.5. Required with explicit design symmetry; finite negative weights are supported. A single line of text."
                  },
                  "homo_oligomer": {
                    "type": "boolean",
                    "title": "Tie all parsed protein chains",
                    "description": "Upstream ties matching PDB residue numbers and insertion codes across ALL parsed chains with equal weights. Chains must have identical residue IDs. Use parse-only chains to restrict the assembly. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "bias_AA": {
                    "type": "string",
                    "title": "Global amino-acid bias",
                    "description": "Comma-separated AA:value pairs, e.g. W:3.0,P:3.0,C:3.0,A:-3.0. Positive values favor an amino acid. A single line of text."
                  },
                  "omit_AA": {
                    "type": "string",
                    "title": "Globally omitted amino acids",
                    "description": "One-letter codes to exclude, e.g. CDFGHILMNPQRSTVWY leaves A, E and K. LigandMPNN samples the 20 standard amino acids. A single line of text."
                  },
                  "bias_AA_per_residue": {
                    "type": "string",
                    "title": "Per-residue amino-acid bias",
                    "description": "JSON keyed by PDB residue IDs, e.g. {\"C1\": {\"G\": -0.3, \"P\": 10.8}}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "bias_AA_per_residue_multi": {
                    "type": "string",
                    "title": "Per-residue amino-acid bias per structure",
                    "description": "JSON keyed by pdb_path_multi names; each value is a per-residue object. Overrides common guidance for that structure. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "omit_AA_per_residue": {
                    "type": "string",
                    "title": "Per-residue amino-acid exclusions",
                    "description": "JSON keyed by PDB residue IDs, e.g. {\"C1\": \"ACDEFGHIKLMNPQRSTVW\"} leaves Y at C1. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "omit_AA_per_residue_multi": {
                    "type": "string",
                    "title": "Per-residue amino-acid exclusions per structure",
                    "description": "JSON keyed by pdb_path_multi names; each value is a per-residue object. Overrides common guidance for that structure. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "ligand_mpnn_use_atom_context": {
                    "type": "boolean",
                    "title": "Use ligand atom context",
                    "description": "LigandMPNN only: condition on nearby non-protein atoms, including small molecules, nucleotides and metals. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "ligand_mpnn_use_side_chain_context": {
                    "type": "boolean",
                    "title": "Use fixed side chains as context",
                    "description": "LigandMPNN only: use side-chain atoms of fixed residues as additional context. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "ligand_mpnn_cutoff_for_score": {
                    "type": "number",
                    "title": "Ligand score cutoff (\u00c5)",
                    "description": "Selects residues near context atoms for the reported ligand confidence. It does not set the model\u2019s atom-context neighborhood. A number, within the range given for the field.",
                    "minimum": 1e-06,
                    "default": 8.0
                  },
                  "transmembrane_buried": {
                    "type": "string",
                    "title": "Buried membrane residues",
                    "description": "Per-residue membrane model only: space-separated PDB residue IDs, e.g. C1 C2 C3 C11. Class 2 (hydrophobic). A single line of text."
                  },
                  "transmembrane_interface": {
                    "type": "string",
                    "title": "Membrane interface residues",
                    "description": "Per-residue membrane model only: e.g. C4 C5 C6 C22. Class 1 (polar); unlisted residues are class 0. Lists must not overlap. A single line of text."
                  },
                  "global_transmembrane_label": {
                    "type": "string",
                    "title": "Global membrane label",
                    "description": "Global membrane model only: 0 = soluble, 1 = transmembrane. One of the field's option values.",
                    "enum": [
                      "0",
                      "1"
                    ],
                    "default": "0"
                  },
                  "pack_side_chains": {
                    "type": "boolean",
                    "title": "Pack designed side chains",
                    "description": "Run the official side-chain packing model after sequence design. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "number_of_packs_per_design": {
                    "type": "number",
                    "title": "Packs per sequence",
                    "description": "Independent packed structures per generated sequence. Use 1 for one pack; upstream run.py produces no packed files at 0 despite the README\u2019s fast-example text. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 32,
                    "default": 4
                  },
                  "sc_num_denoising_steps": {
                    "type": "number",
                    "title": "Packing denoising steps",
                    "description": "Number of recycling/denoising steps per pack. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 3
                  },
                  "sc_num_samples": {
                    "type": "number",
                    "title": "Packing mixture samples",
                    "description": "Samples drawn from each mixture distribution; the highest-likelihood sample is used. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 16
                  },
                  "pack_with_ligand_context": {
                    "type": "boolean",
                    "title": "Pack with ligand context",
                    "description": "Consider ligand, DNA and other context atoms during packing. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "repack_everything": {
                    "type": "boolean",
                    "title": "Repack fixed residues too",
                    "description": "Off preserves side chains at fixed positions and uses them as packing context. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "force_hetatm": {
                    "type": "boolean",
                    "title": "Write packed context atoms as HETATM",
                    "description": "Force context atoms in packed output PDBs to use HETATM records. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "packed_suffix": {
                    "type": "string",
                    "title": "Packed PDB suffix",
                    "description": "Suffix appended to packed PDB filenames; letters, digits, underscores, dots and hyphens only. A single line of text.",
                    "default": "_packed"
                  },
                  "save_stats": {
                    "type": "boolean",
                    "title": "Save design statistics",
                    "description": "Write .pt statistics including sequences, probabilities, decoding order, masks, seed and temperature. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "fasta_seq_separation": {
                    "type": "string",
                    "title": "FASTA chain separator",
                    "description": "Separator between chains in output FASTA. PDB output preserves chain IDs and residue numbering. A single line of text.",
                    "maxLength": 10,
                    "default": ":"
                  },
                  "file_ending": {
                    "type": "string",
                    "title": "Output filename ending",
                    "description": "Optional ending such as _xyz; letters, digits, underscores, dots and hyphens only. A single line of text."
                  },
                  "zero_indexed": {
                    "type": "boolean",
                    "title": "Number output designs from zero",
                    "description": "Start designed PDB file numbering at 0 instead of 1. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "verbose": {
                    "type": "boolean",
                    "title": "Print progress",
                    "description": "Include upstream progress messages in the run log. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "default",
                      "temperature",
                      "random_seed",
                      "verbose",
                      "save_stats",
                      "fix_residues",
                      "redesign_residues",
                      "batch_size",
                      "global_bias",
                      "per_residue_bias",
                      "global_omit",
                      "per_residue_omit",
                      "symmetry",
                      "homooligomer",
                      "file_ending",
                      "zero_indexed",
                      "chains_to_design",
                      "parse_these_chains_only",
                      "ligandmpnn_default",
                      "ligandmpnn_v_32_005_25",
                      "ligandmpnn_no_context",
                      "ligandmpnn_use_side_chain_atoms",
                      "soluble_mpnn_default",
                      "global_label_membrane_mpnn_0",
                      "per_residue_label_membrane_mpnn_default",
                      "fasta_seq_separation",
                      "pdb_path_multi",
                      "fixed_residues_multi",
                      "redesigned_residues_multi",
                      "omit_AA_per_residue_multi",
                      "bias_AA_per_residue_multi",
                      "ligand_mpnn_cutoff_for_score",
                      "insertion_code",
                      "parse_atoms_with_zero_occupancy",
                      "autoregressive_score_w_seq",
                      "autoregressive_score_wo_seq",
                      "single_aa_score_w_seq",
                      "single_aa_score_wo_seq",
                      "sc_default_fast",
                      "sc_default",
                      "sc_fixed_residues",
                      "sc_fixed_residues_full_repack",
                      "sc_no_context"
                    ]
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "design",
                      "autoregressive_score",
                      "single_aa_score"
                    ],
                    "default": "design"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "task": "design",
                  "job_name": "ligandmpnn-demo",
                  "pdb_path": "",
                  "pdb_path_multi": "",
                  "chains_to_design": "",
                  "parse_these_chains_only": "",
                  "parse_atoms_with_zero_occupancy": false,
                  "model_type": "protein_mpnn",
                  "checkpoint_protein_mpnn": "proteinmpnn_v_48_020.pt",
                  "checkpoint_ligand_mpnn": "ligandmpnn_v_32_010_25.pt",
                  "checkpoint_soluble_mpnn": "solublempnn_v_48_020.pt",
                  "checkpoint_per_residue_label_membrane_mpnn": "per_residue_label_membrane_mpnn_v_48_020.pt",
                  "checkpoint_global_label_membrane_mpnn": "global_label_membrane_mpnn_v_48_020.pt",
                  "batch_size": 1,
                  "number_of_batches": 1,
                  "temperature": 0.1,
                  "seed": 0,
                  "fixed_residues": "",
                  "fixed_residues_multi": "",
                  "redesigned_residues": "",
                  "redesigned_residues_multi": "",
                  "symmetry_residues": "",
                  "symmetry_weights": "",
                  "homo_oligomer": false,
                  "bias_AA": "",
                  "omit_AA": "",
                  "bias_AA_per_residue": "",
                  "bias_AA_per_residue_multi": "",
                  "omit_AA_per_residue": "",
                  "omit_AA_per_residue_multi": "",
                  "ligand_mpnn_use_atom_context": true,
                  "ligand_mpnn_use_side_chain_context": false,
                  "ligand_mpnn_cutoff_for_score": 8.0,
                  "transmembrane_buried": "",
                  "transmembrane_interface": "",
                  "global_transmembrane_label": "0",
                  "pack_side_chains": false,
                  "number_of_packs_per_design": 4,
                  "sc_num_denoising_steps": 3,
                  "sc_num_samples": 16,
                  "pack_with_ligand_context": true,
                  "repack_everything": false,
                  "force_hetatm": false,
                  "packed_suffix": "_packed",
                  "save_stats": false,
                  "fasta_seq_separation": ":",
                  "file_ending": "",
                  "zero_indexed": false,
                  "verbose": true
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A label for this run and its results. A single line of text.",
                    "default": "ligandmpnn-demo"
                  },
                  "pdb_path": {
                    "type": "string",
                    "title": "Structure (PDB)",
                    "description": "Upload a protein or protein\u2013ligand PDB, or choose a bundled official example. Required unless multiple structures are supplied. PDB contents are mapped to --pdb_path. Preserve HETATM records for ligand, nucleotide and metal context. This upstream parser reads PDB, not mmCIF. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "pdb_path_multi": {
                    "type": "string",
                    "title": "Multiple structures (JSON)",
                    "description": "Object mapping unique names to PDB contents or bundled references. Leave the single-structure field blank. Example: {\"first\": \"bio-tools://ligandmpnn/inputs/1BC8.pdb\", \"second\": \"bio-tools://ligandmpnn/inputs/4GYT.pdb\"}. The service creates a native --pdb_path_multi file with job-local paths; server paths are not accepted. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "chains_to_design": {
                    "type": "string",
                    "title": "Chains to design or score",
                    "description": "Comma-separated chain IDs, e.g. A,B. Other chains remain fixed context. Blank selects all parsed protein chains. A single line of text."
                  },
                  "parse_these_chains_only": {
                    "type": "string",
                    "title": "Parse only these chains",
                    "description": "Comma-separated chain IDs. Excludes every other chain, including its ligand atoms, from parsing and output; blank keeps all chains. A single line of text."
                  },
                  "parse_atoms_with_zero_occupancy": {
                    "type": "boolean",
                    "title": "Include atoms with zero occupancy",
                    "description": "Upstream normally discards atoms whose occupancy is zero. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "model_type": {
                    "type": "string",
                    "title": "Model",
                    "description": "The upstream default is ProteinMPNN. Select LigandMPNN to condition sequence design or scoring on non-protein atoms. One of the field's option values.",
                    "enum": [
                      "protein_mpnn",
                      "ligand_mpnn",
                      "soluble_mpnn",
                      "per_residue_label_membrane_mpnn",
                      "global_label_membrane_mpnn"
                    ],
                    "default": "protein_mpnn"
                  },
                  "checkpoint_protein_mpnn": {
                    "type": "string",
                    "title": "ProteinMPNN checkpoint",
                    "description": "Official checkpoint filename in the configured model directory. Noise is the training backbone noise in angstroms. One of the field's option values.",
                    "enum": [
                      "proteinmpnn_v_48_002.pt",
                      "proteinmpnn_v_48_010.pt",
                      "proteinmpnn_v_48_020.pt",
                      "proteinmpnn_v_48_030.pt"
                    ],
                    "default": "proteinmpnn_v_48_020.pt"
                  },
                  "checkpoint_ligand_mpnn": {
                    "type": "string",
                    "title": "LigandMPNN checkpoint",
                    "description": "Official checkpoint filename in the configured model directory. Noise is the training backbone noise in angstroms. One of the field's option values.",
                    "enum": [
                      "ligandmpnn_v_32_005_25.pt",
                      "ligandmpnn_v_32_010_25.pt",
                      "ligandmpnn_v_32_020_25.pt",
                      "ligandmpnn_v_32_030_25.pt"
                    ],
                    "default": "ligandmpnn_v_32_010_25.pt"
                  },
                  "checkpoint_soluble_mpnn": {
                    "type": "string",
                    "title": "SolubleMPNN checkpoint",
                    "description": "Official checkpoint filename in the configured model directory. Noise is the training backbone noise in angstroms. One of the field's option values.",
                    "enum": [
                      "solublempnn_v_48_002.pt",
                      "solublempnn_v_48_010.pt",
                      "solublempnn_v_48_020.pt",
                      "solublempnn_v_48_030.pt"
                    ],
                    "default": "solublempnn_v_48_020.pt"
                  },
                  "checkpoint_per_residue_label_membrane_mpnn": {
                    "type": "string",
                    "title": "Membrane: per-residue labels checkpoint",
                    "description": "Official checkpoint filename in the configured model directory. Noise is the training backbone noise in angstroms. One of the field's option values.",
                    "enum": [
                      "per_residue_label_membrane_mpnn_v_48_020.pt"
                    ],
                    "default": "per_residue_label_membrane_mpnn_v_48_020.pt"
                  },
                  "checkpoint_global_label_membrane_mpnn": {
                    "type": "string",
                    "title": "Membrane: global label checkpoint",
                    "description": "Official checkpoint filename in the configured model directory. Noise is the training backbone noise in angstroms. One of the field's option values.",
                    "enum": [
                      "global_label_membrane_mpnn_v_48_020.pt"
                    ],
                    "default": "global_label_membrane_mpnn_v_48_020.pt"
                  },
                  "batch_size": {
                    "type": "number",
                    "title": "Batch size",
                    "description": "Samples evaluated together; reduce to 1 for a small CPU run. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "number_of_batches": {
                    "type": "number",
                    "title": "Number of batches",
                    "description": "Total samples = batch size \u00d7 number of batches. For scoring, upstream recommends at least 10 batches to average decoding-order effects. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 1
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "Positive temperature; higher values give more sequence diversity. A number, within the range given for the field.",
                    "minimum": 1e-06,
                    "default": 0.1
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "Zero chooses a random seed. A nonzero seed is reproducible within the same runtime. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "use_sequence": {
                    "type": "boolean",
                    "title": "Condition scores on sequence",
                    "description": "Use the sequence in the PDB as well as the backbone. Disable for backbone-only probabilities. Scoring writes a .pt dictionary of per-residue probabilities and statistics. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "fixed_residues": {
                    "type": "string",
                    "title": "Fixed residues",
                    "description": "Space-separated PDB residue IDs, e.g. C1 C2 C3. These residues retain their input amino acids. Uses chain + author residue number + optional insertion code, e.g. B82A. Unlike original ProteinMPNN, numbering gaps are not filled with X. A single line of text."
                  },
                  "fixed_residues_multi": {
                    "type": "string",
                    "title": "Fixed residues per structure (JSON)",
                    "description": "Object keyed by the names in pdb_path_multi, with a space-separated residue list per structure. Overrides the common list for that structure. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "redesigned_residues": {
                    "type": "string",
                    "title": "Redesign only these residues",
                    "description": "Space-separated PDB residue IDs; every other residue is fixed. Choose this or fixed_residues. Uses chain + author residue number + optional insertion code, e.g. B82A. Unlike original ProteinMPNN, numbering gaps are not filled with X. A single line of text."
                  },
                  "redesigned_residues_multi": {
                    "type": "string",
                    "title": "Redesign only these residues per structure (JSON)",
                    "description": "Object keyed by the names in pdb_path_multi, with a space-separated residue list per structure. Overrides the common list for that structure. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "symmetry_residues": {
                    "type": "string",
                    "title": "Tied residue groups",
                    "description": "Comma-separated residues within each group, | between groups: C1,C2,C3|C4,C5|C6,C7. Groups cannot overlap. A single line of text."
                  },
                  "symmetry_weights": {
                    "type": "string",
                    "title": "Tied residue weights",
                    "description": "Matching weights for every group: 0.33,0.33,0.33|0.5,0.5|0.5,0.5. Required with explicit design symmetry; finite negative weights are supported. A single line of text."
                  },
                  "homo_oligomer": {
                    "type": "boolean",
                    "title": "Tie all parsed protein chains",
                    "description": "Upstream ties matching PDB residue numbers and insertion codes across ALL parsed chains with equal weights. Chains must have identical residue IDs. Use parse-only chains to restrict the assembly. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "bias_AA": {
                    "type": "string",
                    "title": "Global amino-acid bias",
                    "description": "Comma-separated AA:value pairs, e.g. W:3.0,P:3.0,C:3.0,A:-3.0. Positive values favor an amino acid. A single line of text."
                  },
                  "omit_AA": {
                    "type": "string",
                    "title": "Globally omitted amino acids",
                    "description": "One-letter codes to exclude, e.g. CDFGHILMNPQRSTVWY leaves A, E and K. LigandMPNN samples the 20 standard amino acids. A single line of text."
                  },
                  "bias_AA_per_residue": {
                    "type": "string",
                    "title": "Per-residue amino-acid bias",
                    "description": "JSON keyed by PDB residue IDs, e.g. {\"C1\": {\"G\": -0.3, \"P\": 10.8}}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "bias_AA_per_residue_multi": {
                    "type": "string",
                    "title": "Per-residue amino-acid bias per structure",
                    "description": "JSON keyed by pdb_path_multi names; each value is a per-residue object. Overrides common guidance for that structure. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "omit_AA_per_residue": {
                    "type": "string",
                    "title": "Per-residue amino-acid exclusions",
                    "description": "JSON keyed by PDB residue IDs, e.g. {\"C1\": \"ACDEFGHIKLMNPQRSTVW\"} leaves Y at C1. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "omit_AA_per_residue_multi": {
                    "type": "string",
                    "title": "Per-residue amino-acid exclusions per structure",
                    "description": "JSON keyed by pdb_path_multi names; each value is a per-residue object. Overrides common guidance for that structure. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "ligand_mpnn_use_atom_context": {
                    "type": "boolean",
                    "title": "Use ligand atom context",
                    "description": "LigandMPNN only: condition on nearby non-protein atoms, including small molecules, nucleotides and metals. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "ligand_mpnn_use_side_chain_context": {
                    "type": "boolean",
                    "title": "Use fixed side chains as context",
                    "description": "LigandMPNN only: use side-chain atoms of fixed residues as additional context. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "ligand_mpnn_cutoff_for_score": {
                    "type": "number",
                    "title": "Ligand score cutoff (\u00c5)",
                    "description": "Selects residues near context atoms for the reported ligand confidence. It does not set the model\u2019s atom-context neighborhood. A number, within the range given for the field.",
                    "minimum": 1e-06,
                    "default": 8.0
                  },
                  "transmembrane_buried": {
                    "type": "string",
                    "title": "Buried membrane residues",
                    "description": "Per-residue membrane model only: space-separated PDB residue IDs, e.g. C1 C2 C3 C11. Class 2 (hydrophobic). A single line of text."
                  },
                  "transmembrane_interface": {
                    "type": "string",
                    "title": "Membrane interface residues",
                    "description": "Per-residue membrane model only: e.g. C4 C5 C6 C22. Class 1 (polar); unlisted residues are class 0. Lists must not overlap. A single line of text."
                  },
                  "global_transmembrane_label": {
                    "type": "string",
                    "title": "Global membrane label",
                    "description": "Global membrane model only: 0 = soluble, 1 = transmembrane. One of the field's option values.",
                    "enum": [
                      "0",
                      "1"
                    ],
                    "default": "0"
                  },
                  "pack_side_chains": {
                    "type": "boolean",
                    "title": "Pack designed side chains",
                    "description": "Run the official side-chain packing model after sequence design. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "number_of_packs_per_design": {
                    "type": "number",
                    "title": "Packs per sequence",
                    "description": "Independent packed structures per generated sequence. Use 1 for one pack; upstream run.py produces no packed files at 0 despite the README\u2019s fast-example text. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 32,
                    "default": 4
                  },
                  "sc_num_denoising_steps": {
                    "type": "number",
                    "title": "Packing denoising steps",
                    "description": "Number of recycling/denoising steps per pack. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 3
                  },
                  "sc_num_samples": {
                    "type": "number",
                    "title": "Packing mixture samples",
                    "description": "Samples drawn from each mixture distribution; the highest-likelihood sample is used. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 16
                  },
                  "pack_with_ligand_context": {
                    "type": "boolean",
                    "title": "Pack with ligand context",
                    "description": "Consider ligand, DNA and other context atoms during packing. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "repack_everything": {
                    "type": "boolean",
                    "title": "Repack fixed residues too",
                    "description": "Off preserves side chains at fixed positions and uses them as packing context. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "force_hetatm": {
                    "type": "boolean",
                    "title": "Write packed context atoms as HETATM",
                    "description": "Force context atoms in packed output PDBs to use HETATM records. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "packed_suffix": {
                    "type": "string",
                    "title": "Packed PDB suffix",
                    "description": "Suffix appended to packed PDB filenames; letters, digits, underscores, dots and hyphens only. A single line of text.",
                    "default": "_packed"
                  },
                  "save_stats": {
                    "type": "boolean",
                    "title": "Save design statistics",
                    "description": "Write .pt statistics including sequences, probabilities, decoding order, masks, seed and temperature. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "fasta_seq_separation": {
                    "type": "string",
                    "title": "FASTA chain separator",
                    "description": "Separator between chains in output FASTA. PDB output preserves chain IDs and residue numbering. A single line of text.",
                    "maxLength": 10,
                    "default": ":"
                  },
                  "file_ending": {
                    "type": "string",
                    "title": "Output filename ending",
                    "description": "Optional ending such as _xyz; letters, digits, underscores, dots and hyphens only. A single line of text."
                  },
                  "zero_indexed": {
                    "type": "boolean",
                    "title": "Number output designs from zero",
                    "description": "Start designed PDB file numbering at 0 instead of 1. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "verbose": {
                    "type": "boolean",
                    "title": "Print progress",
                    "description": "Include upstream progress messages in the run log. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "default",
                      "temperature",
                      "random_seed",
                      "verbose",
                      "save_stats",
                      "fix_residues",
                      "redesign_residues",
                      "batch_size",
                      "global_bias",
                      "per_residue_bias",
                      "global_omit",
                      "per_residue_omit",
                      "symmetry",
                      "homooligomer",
                      "file_ending",
                      "zero_indexed",
                      "chains_to_design",
                      "parse_these_chains_only",
                      "ligandmpnn_default",
                      "ligandmpnn_v_32_005_25",
                      "ligandmpnn_no_context",
                      "ligandmpnn_use_side_chain_atoms",
                      "soluble_mpnn_default",
                      "global_label_membrane_mpnn_0",
                      "per_residue_label_membrane_mpnn_default",
                      "fasta_seq_separation",
                      "pdb_path_multi",
                      "fixed_residues_multi",
                      "redesigned_residues_multi",
                      "omit_AA_per_residue_multi",
                      "bias_AA_per_residue_multi",
                      "ligand_mpnn_cutoff_for_score",
                      "insertion_code",
                      "parse_atoms_with_zero_occupancy",
                      "autoregressive_score_w_seq",
                      "autoregressive_score_wo_seq",
                      "single_aa_score_w_seq",
                      "single_aa_score_wo_seq",
                      "sc_default_fast",
                      "sc_default",
                      "sc_fixed_residues",
                      "sc_fixed_residues_full_repack",
                      "sc_no_context"
                    ]
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "design",
                      "autoregressive_score",
                      "single_aa_score"
                    ],
                    "default": "design"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "task": "design",
                  "job_name": "ligandmpnn-demo",
                  "pdb_path": "",
                  "pdb_path_multi": "",
                  "chains_to_design": "",
                  "parse_these_chains_only": "",
                  "parse_atoms_with_zero_occupancy": false,
                  "model_type": "protein_mpnn",
                  "checkpoint_protein_mpnn": "proteinmpnn_v_48_020.pt",
                  "checkpoint_ligand_mpnn": "ligandmpnn_v_32_010_25.pt",
                  "checkpoint_soluble_mpnn": "solublempnn_v_48_020.pt",
                  "checkpoint_per_residue_label_membrane_mpnn": "per_residue_label_membrane_mpnn_v_48_020.pt",
                  "checkpoint_global_label_membrane_mpnn": "global_label_membrane_mpnn_v_48_020.pt",
                  "batch_size": 1,
                  "number_of_batches": 1,
                  "temperature": 0.1,
                  "seed": 0,
                  "fixed_residues": "",
                  "fixed_residues_multi": "",
                  "redesigned_residues": "",
                  "redesigned_residues_multi": "",
                  "symmetry_residues": "",
                  "symmetry_weights": "",
                  "homo_oligomer": false,
                  "bias_AA": "",
                  "omit_AA": "",
                  "bias_AA_per_residue": "",
                  "bias_AA_per_residue_multi": "",
                  "omit_AA_per_residue": "",
                  "omit_AA_per_residue_multi": "",
                  "ligand_mpnn_use_atom_context": true,
                  "ligand_mpnn_use_side_chain_context": false,
                  "ligand_mpnn_cutoff_for_score": 8.0,
                  "transmembrane_buried": "",
                  "transmembrane_interface": "",
                  "global_transmembrane_label": "0",
                  "pack_side_chains": false,
                  "number_of_packs_per_design": 4,
                  "sc_num_denoising_steps": 3,
                  "sc_num_samples": 16,
                  "pack_with_ligand_context": true,
                  "repack_everything": false,
                  "force_hetatm": false,
                  "packed_suffix": "_packed",
                  "save_stats": false,
                  "fasta_seq_separation": ":",
                  "file_ending": "",
                  "zero_indexed": false,
                  "verbose": true
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/proteinmpnn_ddg/": {
      "get": {
        "summary": "ProteinMPNN-ddG field schema",
        "description": "Estimate changes in protein stability upon point mutation",
        "operationId": "proteinmpnn_ddg_schema",
        "tags": [
          "ProteinMPNN-ddG"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a ProteinMPNN-ddG job",
        "description": "Estimate changes in protein stability upon point mutation A modification of ProteinMPNN to use full sequence context. It introduces a decoding scheme to improve computational efficiency and enable saturation mutagenesis studies at scale.",
        "operationId": "proteinmpnn_ddg_submit",
        "tags": [
          "ProteinMPNN-ddG"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A label for this run and its results. A single line of text.",
                    "maxLength": 80,
                    "default": "proteinmpnn-ddg-demo"
                  },
                  "pdb_path": {
                    "type": "string",
                    "title": "Protein structure",
                    "description": "PDB structure whose point mutations will be scored. Upload PDB text or choose the preset containing the official AlphaFold example structure. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "chains": {
                    "type": "string",
                    "title": "Chains to load",
                    "description": "Comma-separated PDB chains used as structural and sequence context, e.g. A,B,C. By default, substitutions are predicted for the first chain. A single line of text.",
                    "maxLength": 100,
                    "default": "A"
                  },
                  "chain_to_predict": {
                    "type": "string",
                    "title": "Chain to predict",
                    "description": "Optional chain whose substitutions are predicted. It is moved to the front of the loaded chain list; blank uses the first chain above. A single line of text.",
                    "maxLength": 1
                  },
                  "model_name": {
                    "type": "string",
                    "title": "ProteinMPNN model",
                    "description": "48-neighbor ProteinMPNN checkpoint trained with the indicated backbone noise. One of the field's option values.",
                    "enum": [
                      "v_48_002",
                      "v_48_010",
                      "v_48_020",
                      "v_48_030"
                    ],
                    "default": "v_48_020"
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "Seed used to split the per-repeat JAX random keys. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 42
                  },
                  "nrepeats": {
                    "type": "number",
                    "title": "Model repeats",
                    "description": "Run with this many keys split from the input seed and average the resulting predictions. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 1
                  },
                  "without_ddG_correction": {
                    "type": "boolean",
                    "title": "Disable the ddG correction",
                    "description": "Write raw logit differences without the paper's single-residue ddG correction. The correction is defined only for v_48_020, so this must be enabled with every other model. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "readme/AF-A0A7L5GP87"
                    ]
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "pdb_path"
                ],
                "example": {
                  "job_name": "proteinmpnn-ddg-demo",
                  "pdb_path": "",
                  "chains": "A",
                  "chain_to_predict": "",
                  "model_name": "v_48_020",
                  "seed": 42,
                  "nrepeats": 1,
                  "without_ddG_correction": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A label for this run and its results. A single line of text.",
                    "maxLength": 80,
                    "default": "proteinmpnn-ddg-demo"
                  },
                  "pdb_path": {
                    "type": "string",
                    "title": "Protein structure",
                    "description": "PDB structure whose point mutations will be scored. Upload PDB text or choose the preset containing the official AlphaFold example structure. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "chains": {
                    "type": "string",
                    "title": "Chains to load",
                    "description": "Comma-separated PDB chains used as structural and sequence context, e.g. A,B,C. By default, substitutions are predicted for the first chain. A single line of text.",
                    "maxLength": 100,
                    "default": "A"
                  },
                  "chain_to_predict": {
                    "type": "string",
                    "title": "Chain to predict",
                    "description": "Optional chain whose substitutions are predicted. It is moved to the front of the loaded chain list; blank uses the first chain above. A single line of text.",
                    "maxLength": 1
                  },
                  "model_name": {
                    "type": "string",
                    "title": "ProteinMPNN model",
                    "description": "48-neighbor ProteinMPNN checkpoint trained with the indicated backbone noise. One of the field's option values.",
                    "enum": [
                      "v_48_002",
                      "v_48_010",
                      "v_48_020",
                      "v_48_030"
                    ],
                    "default": "v_48_020"
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "Seed used to split the per-repeat JAX random keys. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 42
                  },
                  "nrepeats": {
                    "type": "number",
                    "title": "Model repeats",
                    "description": "Run with this many keys split from the input seed and average the resulting predictions. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 1
                  },
                  "without_ddG_correction": {
                    "type": "boolean",
                    "title": "Disable the ddG correction",
                    "description": "Write raw logit differences without the paper's single-residue ddG correction. The correction is defined only for v_48_020, so this must be enabled with every other model. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "readme/AF-A0A7L5GP87"
                    ]
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "pdb_path"
                ],
                "example": {
                  "job_name": "proteinmpnn-ddg-demo",
                  "pdb_path": "",
                  "chains": "A",
                  "chain_to_predict": "",
                  "model_name": "v_48_020",
                  "seed": 42,
                  "nrepeats": 1,
                  "without_ddG_correction": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/rfd3/": {
      "get": {
        "summary": "RFdiffusion3 field schema",
        "description": "Generates protein backbone coordinates around proteins, small molecules, nucleic acids, and metals. Given geometric and other constraints, specifies backbone geometry. A useful first step in a protein design pipeline. Very well documented!",
        "operationId": "rfd3_schema",
        "tags": [
          "RFdiffusion3"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a RFdiffusion3 job",
        "description": "Generates protein backbone coordinates around proteins, small molecules, nucleic acids, and metals. Given geometric and other constraints, specifies backbone geometry. A useful first step in a protein design pipeline. Very well documented! RFdiffusion3 is a practical first step in protein design workflows: It generates coordinates of the backbone atoms for a protein based on contraints (For example, to spacially deconflict with specific molecules). Its output can be fed into ProteinMPNN or LigandMPNN to generate an amino acid sequence.",
        "operationId": "rfd3_submit",
        "tags": [
          "RFdiffusion3"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "inputs": {
                    "type": "string",
                    "title": "Inputs (JSON or YAML)",
                    "description": "The path and file name of the JSON or YAML file where you have defined your inference constraints. Enter the JSON or YAML contents here. Use \"input\": \"uploaded\" to reference the structure upload. Presets may use a bundled bio-tools://rfd3/ reference or an official ../input_pdbs/ example path. Enter null with specification overrides for an override-only design. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "{\n  \"design\": {\n    \"length\": \"150-150\",\n    \"is_non_loopy\": true\n  }\n}"
                  },
                  "spec_input_file": {
                    "type": "string",
                    "title": "Input structure (uploaded)",
                    "description": "Optional PDB or mmCIF for configurations with \"input\": \"uploaded\". The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Inputs file (JSON or YAML)",
                    "description": "The path and file name of the JSON or YAML file where you have defined your inference constraints. Choose a JSON or YAML file. Use \"input\": \"uploaded\" to reference the structure upload, or keep a bundled bio-tools://rfd3/ reference from a preset. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "input": {
                    "type": "string",
                    "title": "Input structure",
                    "description": "Path to and file name of PDB/CIF. Required if you provide contig+length. Choose a PDB or mmCIF file. Presets include their input structures; a new upload replaces the included file. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "contig": {
                    "type": "string",
                    "title": "Contig",
                    "description": "(Can only pass a contig string.) Indexed motif specification, e.g., \"A1-80,10,/0,B5-12\". Residues whose position/order in the final sequence is specified. A single line of text."
                  },
                  "unindex": {
                    "type": "string",
                    "title": "Unindex",
                    "description": "(Can only pass a contig string or dictionary.) Unindexed motif components, the specified residues can be anywhere in the final sequence. See Unindexing Specifics for more information. Which residues should have their index be inferred by the model instead of prespecified Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "length": {
                    "type": "string",
                    "title": "Length",
                    "description": "Total design length constraint; \"min-max\" or int for specified length. A single line of text.",
                    "default": "150"
                  },
                  "ligand": {
                    "type": "string",
                    "title": "Ligand",
                    "description": "Ligand(s) by chemical component name (from RSCB PDB) or index. These are ligands built in to the source mmCIF file, using the identifiers specified there A single line of text."
                  },
                  "cif_parser_args": {
                    "type": "string",
                    "title": "CIF parser args",
                    "description": "Optional args to CIF loader. See CIF parser options for more information. Enter a JSON object. The local cache_dir option is not available, and extra_fields is accepted only alongside an mmCIF structure because the PDB reader ignores it. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "{}"
                  },
                  "extra": {
                    "type": "string",
                    "title": "Extra",
                    "description": "Extra metadata (e.g., logs). Current options include sampled_contig. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "{}"
                  },
                  "dialect": {
                    "type": "string",
                    "title": "Dialect",
                    "description": "2=new (default), 1=legacy, Learn more about the legacy parsing system by looking at input_parsing.py. One of the field's option values.",
                    "enum": [
                      "2",
                      "1"
                    ],
                    "default": "2"
                  },
                  "select_fixed_atoms": {
                    "type": "string",
                    "title": "Select fixed atoms",
                    "description": "Atoms with fixed coordinates. See the Select Fixed Atoms subsection for more information. Dictionary that indicated which atoms should be fixed (can use ALL, BKBN, or TIP for all atoms in the residue, backbone atoms only and tip atoms only  Name a ligand by its chemical component code, such as NAI, rather than by chain and residue number. A ligand written into a chain that also holds polymer residues is moved onto a chain of its own while the structure is parsed, so a chain-and-number reference to it no longer matches. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_unfixed_sequence": {
                    "type": "string",
                    "title": "Select unfixed sequence",
                    "description": "Where sequence can change. Default is True - all input regions have fixed sequences. Contig string input specifies components to unfix the sequence for. Dictionary inputs are allowed but not recommended. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_buried": {
                    "type": "string",
                    "title": "Select buried",
                    "description": "Selection of RASA (Relatively Accessible Surface Area) for buried, partially buried, and exposed conditioning, respectively. Only contig string and dictionary are acceptable inputs. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_partially_buried": {
                    "type": "string",
                    "title": "Select partially buried",
                    "description": "Selection of RASA (Relatively Accessible Surface Area) for buried, partially buried, and exposed conditioning, respectively. Only contig string and dictionary are acceptable inputs. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_exposed": {
                    "type": "string",
                    "title": "Select exposed",
                    "description": "Selection of RASA (Relatively Accessible Surface Area) for buried, partially buried, and exposed conditioning, respectively. Only contig string and dictionary are acceptable inputs. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_hbond_donor": {
                    "type": "string",
                    "title": "Select hbond donor",
                    "description": "Atom-wise donor/acceptor flags. Atom-wise selection of hydrogen bond donors and acceptors, respectively. Only dictionary inputs allowed. See RFdiffusion3 \u2014 Nucleic acid binder design examples for an example. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_hbond_acceptor": {
                    "type": "string",
                    "title": "Select hbond acceptor",
                    "description": "Atom-wise donor/acceptor flags. Atom-wise selection of hydrogen bond donors and acceptors, respectively. Only dictionary inputs allowed. See RFdiffusion3 \u2014 Nucleic acid binder design examples for an example. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_hotspots": {
                    "type": "string",
                    "title": "Select hotspots",
                    "description": "Atom-level or residue-level hotspots. Hotspots will typically be at most 4.5 \u00c5 to any heavy atom in the designed structure. Typically used for designing binders. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "redesign_motif_sidechains": {
                    "type": "boolean",
                    "title": "Redesign motif sidechains",
                    "description": "Fixed backbone, redesigned sidechains for motifs (input structures). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "symmetry": {
                    "type": "string",
                    "title": "Symmetry",
                    "description": "See Overview of Symmetry in RFD3. Enter SymmetryConfig as JSON, for example {\"id\": \"C3\", \"is_symmetric_motif\": true}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "ori_token": {
                    "type": "string",
                    "title": "Ori token",
                    "description": "[x,y,z] origin override to control COM (center of mass) placement of designed structure. A single line of text."
                  },
                  "infer_ori_strategy": {
                    "type": "string",
                    "title": "Infer ori strategy",
                    "description": "\"com\" or \"hotspots\". The center of mass of the diffused region will typically be within 5\u00c5 of the ORI token. Using hotspots will place the ORI token 10\u00c5 outward from the center of mass of the specified hotspots. Using com will place the token at the center of mass of the input structure. One of the field's option values.",
                    "enum": [
                      "",
                      "com",
                      "hotspots"
                    ]
                  },
                  "plddt_enhanced": {
                    "type": "boolean",
                    "title": "pLDDT enhanced",
                    "description": "Default True. Enables pLDDT (predicted Local Distance Difference Test) enhancement. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "is_non_loopy": {
                    "type": "string",
                    "title": "Is non loopy",
                    "description": "Default None. If True/False, produces output structures with fewer/more loops. One of the field's option values.",
                    "enum": [
                      "",
                      "true",
                      "false"
                    ]
                  },
                  "partial_t": {
                    "type": "number",
                    "title": "Partial t (angstroms)",
                    "description": "Noise (\u00c5) for partial diffusion, enables partial diffusion (sets the noise level.) Recommended values are 5.0-15.0 \u00c5. See Partial Diffusion for more information. A number, within the range given for the field.",
                    "minimum": 0
                  },
                  "allow_ligand_on_existing_chain": {
                    "type": "boolean",
                    "title": "Allow ligand on existing chain",
                    "description": "Allow the shared ligand chains used by some official input structures. This is enabled in presets that require it. Accepting such a structure logs a warning that the shared chain is being separated, which is expected. The ligands end up on a chain of their own, so select them by chemical component code. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "rfd3-demo"
                  },
                  "n_batches": {
                    "type": "number",
                    "title": "Batches",
                    "description": "number of batches to generate per input key (default: 1). A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 1
                  },
                  "diffusion_batch_size": {
                    "type": "number",
                    "title": "Designs per batch",
                    "description": "number of diffusion samples (designs) per batch (default: 8). If n_batches=1 and diffusion_batch_size=8 then 8 designs will be generated from the inference run. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 64,
                    "default": 8
                  },
                  "inference_sampler.num_timesteps": {
                    "type": "number",
                    "title": "inference_sampler.num_timesteps",
                    "description": "diffusion timesteps for sampling (default: 200). A number, within the range given for the field.",
                    "minimum": 20,
                    "maximum": 1000,
                    "default": 200
                  },
                  "inference_sampler.step_scale": {
                    "type": "number",
                    "title": "inference_sampler.step_scale",
                    "description": "scales diffusion step size; higher \u2192 less diverse, more designable (default: 1.5). A number, within the range given for the field.",
                    "minimum": 0.1,
                    "maximum": 10,
                    "default": 1.5
                  },
                  "low_memory_mode": {
                    "type": "boolean",
                    "title": "Low-memory mode",
                    "description": "memory-efficient tokenization mode; set True if GPU RAM is tight (default: False). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "dump_trajectories": {
                    "type": "boolean",
                    "title": "Save trajectories",
                    "description": "If True, the trajectory files are also saved to the specified output directory (default: False). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "specification": {
                    "type": "string",
                    "title": "Specification overrides (JSON)",
                    "description": "JSON overrides for the per-example InputSpecification (default: {}). For example, you can run rfd3 design inputs=null specification.length=200 for a quick debug of creating a 200-length protein. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "{}"
                  },
                  "global_prefix": {
                    "type": "string",
                    "title": "Global prefix",
                    "description": "This setting allows you to change the beginning of the name of the output files from the name of the input JSON or YAML file to your own string (default: null). Leave blank for the default. Enter \"\" to omit the prefix. Use letters, digits, dots, underscores or hyphens. A single line of text."
                  },
                  "prevalidate_inputs": {
                    "type": "boolean",
                    "title": "Prevalidate inputs",
                    "description": "Check that your inputs (JSON or YAML file) are valid before running inference (default: False). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "inference_sampler.gamma_0": {
                    "type": "number",
                    "title": "inference_sampler.gamma_0",
                    "description": "This value (default: 0.6) influences the diversity of the designs from RFD3. A lower value increases designability but decreases diversity. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.6
                  },
                  "json_keys_subset": {
                    "type": "string",
                    "title": "JSON keys subset",
                    "description": "Allows the user to extract only a subset of the JSON keys provided in the inputs file (default: null). Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "inference_sampler.n_recycle": {
                    "type": "number",
                    "title": "inference_sampler.n_recycle",
                    "description": "Number of recycling iterations per diffusion step (default: null, uses the model checkpoint default of 2). Recycling allows the network to refine its predictions iteratively within each denoising step. A number, within the range given for the field.",
                    "minimum": 0
                  },
                  "inference_sampler.kind": {
                    "type": "string",
                    "title": "inference_sampler.kind",
                    "description": "Change this value to symmetry (default: default) to turn on symmetry mode for the inference sampler. Automatic selects the sampler from the input specification. One of the field's option values.",
                    "enum": [
                      "auto",
                      "default",
                      "symmetry"
                    ],
                    "default": "auto"
                  },
                  "inference_sampler.cfg_features": {
                    "type": "string",
                    "title": "inference_sampler.cfg_features",
                    "description": "The values specified (options are active_donor, active_acceptor, or ref_atomwise_rasa) are set to 0 for classifier-free guidance. Classifier-free guidance is how the diffusion model can steer the calculation towards a condition without training a separate classifier. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "active_donor, active_acceptor, ref_atomwise_rasa"
                  },
                  "inference_sampler.use_classifier_free_guidance": {
                    "type": "boolean",
                    "title": "inference_sampler.use_classifier_free_guidance",
                    "description": "If set to True, RFD3 can use classifier-free guidance to guide the system towards a condition without training a separate classifier (default: False). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "inference_sampler.cfg_t_max": {
                    "type": "number",
                    "title": "inference_sampler.cfg_t_max",
                    "description": "The maximum time to apply classifier-free guidance to the inference run (default: null). A number, within the range given for the field.",
                    "minimum": 0
                  },
                  "inference_sampler.cfg_scale": {
                    "type": "number",
                    "title": "inference_sampler.cfg_scale",
                    "description": "Controls the influence of the classifier-free guidance adjustment (default: 1.5). A number, within the range given for the field.",
                    "minimum": 0,
                    "default": 1.5
                  },
                  "inference_sampler.center_option": {
                    "type": "string",
                    "title": "inference_sampler.center_option",
                    "description": "Specifies how to center the coordinates during the inference run to ensure that structures are alined around a specific point. Options include: all \u2014 (default) Uses the center of mass (COM) of all atoms motif \u2014 Uses the COM of the motif atoms with fixed coordinates diffuse \u2014 Uses the COM of all fixed coordinates that are not part of motif atoms One of the field's option values.",
                    "enum": [
                      "all",
                      "motif",
                      "diffuse"
                    ],
                    "default": "all"
                  },
                  "inference_sampler.s_trans": {
                    "type": "number",
                    "title": "inference_sampler.s_trans",
                    "description": "Translational noise scale for augmentation during inference (default: 1.0). A number, within the range given for the field.",
                    "minimum": 0,
                    "default": 1.0
                  },
                  "inference_sampler.allow_realignment": {
                    "type": "boolean",
                    "title": "inference_sampler.allow_realignment",
                    "description": "If set to True (default: False) then the noised structure can be realigned during inference based on the location of a given motif. From Issue #154: It is generally not needed to include this option, there are fewer \u2018weird\u2019 interactions with motif scaffolding when it\u2019s set to False. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "inference_sampler.noise_scale": {
                    "type": "number",
                    "title": "inference_sampler.noise_scale",
                    "description": "This parameter sets the scaling for the noise during inference (default 1.003). A smaller value will lead to less noise in your system leading to less diversity in the outputs. A number, within the range given for the field.",
                    "minimum": 0,
                    "default": 1.003
                  },
                  "inference_sampler.p": {
                    "type": "number",
                    "title": "inference_sampler.p",
                    "description": "Determines the \u2018shape\u2019 of the noise schedule (default: 7). A number, within the range given for the field.",
                    "minimum": 0.001,
                    "default": 7
                  },
                  "inference_sampler.gamma_min": {
                    "type": "number",
                    "title": "inference_sampler.gamma_min",
                    "description": "Controls when gamma_0 is used, if t>gamma_min, gamma_0 is used as the value of gamma, which influences the diversity of the designs from RFD3. A number, within the range given for the field.",
                    "minimum": 0,
                    "default": 1.0
                  },
                  "inference_sampler.s_jitter_origin": {
                    "type": "number",
                    "title": "inference_sampler.s_jitter_origin",
                    "description": "Controls the standard deviation of the Gaussian distribution that is used to \u2018jitter\u2019 the motif offset (default: 0.0, no jitter). A number, within the range given for the field.",
                    "minimum": 0,
                    "default": 0.0
                  },
                  "cleanup_guideposts": {
                    "type": "boolean",
                    "title": "Cleanup guideposts",
                    "description": "Set to False (default: True) to save the guideposts used during inference, see Debugging recommendations for more information. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "cleanup_virtual_atoms": {
                    "type": "boolean",
                    "title": "Cleanup virtual atoms",
                    "description": "Set to False (default: True) to save information about the diffused virtual atoms used during inference. RFD3 uses virtual atoms to account for the different number of atoms in side chains during the design process. RFD3 is atom based, however the number of atoms in a residue will differ based on its side chain, which is only determined after some diffusion steps have occurred, meaning virtual atoms are necessary for those steps. See Debugging recommendations for more information. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "read_sequence_from_sequence_head": {
                    "type": "boolean",
                    "title": "Read sequence from sequence head",
                    "description": "Used during training, it is not recommended to change this setting (default: True). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "output_full_json": {
                    "type": "boolean",
                    "title": "Output full JSON",
                    "description": "Output all specification information to the JSON file that gets created for each design (default: True). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "dump_prediction_metadata_json": {
                    "type": "boolean",
                    "title": "Dump prediction metadata JSON",
                    "description": "If True, the metadata for the inference run will be included in the output JSON file (default: True). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "align_trajectory_structures": {
                    "type": "boolean",
                    "title": "Align trajectory structures",
                    "description": "Aligns the structures in the output trajectories (default: False). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "unconditional_monomer",
                      "demo",
                      "demo/M0255_1mg5_unfixed",
                      "demo/partial_diffusion",
                      "demo/dsDNA_basic",
                      "enzyme_design",
                      "enzyme_design/M0255_1mg5_unfixed",
                      "na_binder_design",
                      "na_binder_design/dsDNA_basic",
                      "na_binder_design/ssDNA_basic",
                      "na_binder_design/ssDNA_diffused_from_dsDNA_pdb",
                      "na_binder_design/RNA_basic",
                      "na_binder_design/dsDNA_complex",
                      "protein_binder_design",
                      "protein_binder_design/insulinr",
                      "protein_binder_design/pdl1",
                      "sm_binder_design",
                      "sm_binder_design/buried",
                      "sm_binder_design/partial",
                      "symmetry",
                      "symmetry/uncond_C5",
                      "symmetry/uncond_D4",
                      "symmetry/unindexed_C2_1j79",
                      "symmetry/unindexed_C2_1e3v",
                      "symmetry/indexed_unsym_C2_1bfr",
                      "symmetry/unsym_C3_6t8h"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "upload",
                      "text",
                      "parameters"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "input_mode": "parameters",
                  "input": "",
                  "contig": "",
                  "unindex": "",
                  "length": "150",
                  "ligand": "",
                  "cif_parser_args": "{}",
                  "extra": "{}",
                  "dialect": "2",
                  "select_fixed_atoms": "",
                  "select_unfixed_sequence": "",
                  "select_buried": "",
                  "select_partially_buried": "",
                  "select_exposed": "",
                  "select_hbond_donor": "",
                  "select_hbond_acceptor": "",
                  "select_hotspots": "",
                  "redesign_motif_sidechains": false,
                  "symmetry": "",
                  "ori_token": "",
                  "infer_ori_strategy": "",
                  "plddt_enhanced": true,
                  "is_non_loopy": "",
                  "partial_t": "",
                  "allow_ligand_on_existing_chain": false,
                  "job_name": "rfd3-demo",
                  "n_batches": 1,
                  "diffusion_batch_size": 8,
                  "inference_sampler.num_timesteps": 200,
                  "inference_sampler.step_scale": 1.5,
                  "low_memory_mode": false,
                  "dump_trajectories": false,
                  "specification": "{}",
                  "global_prefix": "",
                  "prevalidate_inputs": false,
                  "inference_sampler.gamma_0": 0.6,
                  "json_keys_subset": "",
                  "inference_sampler.n_recycle": "",
                  "inference_sampler.kind": "auto",
                  "inference_sampler.cfg_features": "active_donor, active_acceptor, ref_atomwise_rasa",
                  "inference_sampler.use_classifier_free_guidance": false,
                  "inference_sampler.cfg_t_max": "",
                  "inference_sampler.cfg_scale": 1.5,
                  "inference_sampler.center_option": "all",
                  "inference_sampler.s_trans": 1.0,
                  "inference_sampler.allow_realignment": false,
                  "inference_sampler.noise_scale": 1.003,
                  "inference_sampler.p": 7,
                  "inference_sampler.gamma_min": 1.0,
                  "inference_sampler.s_jitter_origin": 0.0,
                  "cleanup_guideposts": true,
                  "cleanup_virtual_atoms": true,
                  "read_sequence_from_sequence_head": true,
                  "output_full_json": true,
                  "dump_prediction_metadata_json": true,
                  "align_trajectory_structures": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "inputs": {
                    "type": "string",
                    "title": "Inputs (JSON or YAML)",
                    "description": "The path and file name of the JSON or YAML file where you have defined your inference constraints. Enter the JSON or YAML contents here. Use \"input\": \"uploaded\" to reference the structure upload. Presets may use a bundled bio-tools://rfd3/ reference or an official ../input_pdbs/ example path. Enter null with specification overrides for an override-only design. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "{\n  \"design\": {\n    \"length\": \"150-150\",\n    \"is_non_loopy\": true\n  }\n}"
                  },
                  "spec_input_file": {
                    "type": "string",
                    "title": "Input structure (uploaded)",
                    "description": "Optional PDB or mmCIF for configurations with \"input\": \"uploaded\". The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Inputs file (JSON or YAML)",
                    "description": "The path and file name of the JSON or YAML file where you have defined your inference constraints. Choose a JSON or YAML file. Use \"input\": \"uploaded\" to reference the structure upload, or keep a bundled bio-tools://rfd3/ reference from a preset. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "input": {
                    "type": "string",
                    "title": "Input structure",
                    "description": "Path to and file name of PDB/CIF. Required if you provide contig+length. Choose a PDB or mmCIF file. Presets include their input structures; a new upload replaces the included file. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "contig": {
                    "type": "string",
                    "title": "Contig",
                    "description": "(Can only pass a contig string.) Indexed motif specification, e.g., \"A1-80,10,/0,B5-12\". Residues whose position/order in the final sequence is specified. A single line of text."
                  },
                  "unindex": {
                    "type": "string",
                    "title": "Unindex",
                    "description": "(Can only pass a contig string or dictionary.) Unindexed motif components, the specified residues can be anywhere in the final sequence. See Unindexing Specifics for more information. Which residues should have their index be inferred by the model instead of prespecified Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "length": {
                    "type": "string",
                    "title": "Length",
                    "description": "Total design length constraint; \"min-max\" or int for specified length. A single line of text.",
                    "default": "150"
                  },
                  "ligand": {
                    "type": "string",
                    "title": "Ligand",
                    "description": "Ligand(s) by chemical component name (from RSCB PDB) or index. These are ligands built in to the source mmCIF file, using the identifiers specified there A single line of text."
                  },
                  "cif_parser_args": {
                    "type": "string",
                    "title": "CIF parser args",
                    "description": "Optional args to CIF loader. See CIF parser options for more information. Enter a JSON object. The local cache_dir option is not available, and extra_fields is accepted only alongside an mmCIF structure because the PDB reader ignores it. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "{}"
                  },
                  "extra": {
                    "type": "string",
                    "title": "Extra",
                    "description": "Extra metadata (e.g., logs). Current options include sampled_contig. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "{}"
                  },
                  "dialect": {
                    "type": "string",
                    "title": "Dialect",
                    "description": "2=new (default), 1=legacy, Learn more about the legacy parsing system by looking at input_parsing.py. One of the field's option values.",
                    "enum": [
                      "2",
                      "1"
                    ],
                    "default": "2"
                  },
                  "select_fixed_atoms": {
                    "type": "string",
                    "title": "Select fixed atoms",
                    "description": "Atoms with fixed coordinates. See the Select Fixed Atoms subsection for more information. Dictionary that indicated which atoms should be fixed (can use ALL, BKBN, or TIP for all atoms in the residue, backbone atoms only and tip atoms only  Name a ligand by its chemical component code, such as NAI, rather than by chain and residue number. A ligand written into a chain that also holds polymer residues is moved onto a chain of its own while the structure is parsed, so a chain-and-number reference to it no longer matches. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_unfixed_sequence": {
                    "type": "string",
                    "title": "Select unfixed sequence",
                    "description": "Where sequence can change. Default is True - all input regions have fixed sequences. Contig string input specifies components to unfix the sequence for. Dictionary inputs are allowed but not recommended. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_buried": {
                    "type": "string",
                    "title": "Select buried",
                    "description": "Selection of RASA (Relatively Accessible Surface Area) for buried, partially buried, and exposed conditioning, respectively. Only contig string and dictionary are acceptable inputs. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_partially_buried": {
                    "type": "string",
                    "title": "Select partially buried",
                    "description": "Selection of RASA (Relatively Accessible Surface Area) for buried, partially buried, and exposed conditioning, respectively. Only contig string and dictionary are acceptable inputs. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_exposed": {
                    "type": "string",
                    "title": "Select exposed",
                    "description": "Selection of RASA (Relatively Accessible Surface Area) for buried, partially buried, and exposed conditioning, respectively. Only contig string and dictionary are acceptable inputs. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_hbond_donor": {
                    "type": "string",
                    "title": "Select hbond donor",
                    "description": "Atom-wise donor/acceptor flags. Atom-wise selection of hydrogen bond donors and acceptors, respectively. Only dictionary inputs allowed. See RFdiffusion3 \u2014 Nucleic acid binder design examples for an example. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_hbond_acceptor": {
                    "type": "string",
                    "title": "Select hbond acceptor",
                    "description": "Atom-wise donor/acceptor flags. Atom-wise selection of hydrogen bond donors and acceptors, respectively. Only dictionary inputs allowed. See RFdiffusion3 \u2014 Nucleic acid binder design examples for an example. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "select_hotspots": {
                    "type": "string",
                    "title": "Select hotspots",
                    "description": "Atom-level or residue-level hotspots. Hotspots will typically be at most 4.5 \u00c5 to any heavy atom in the designed structure. Typically used for designing binders. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "redesign_motif_sidechains": {
                    "type": "boolean",
                    "title": "Redesign motif sidechains",
                    "description": "Fixed backbone, redesigned sidechains for motifs (input structures). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "symmetry": {
                    "type": "string",
                    "title": "Symmetry",
                    "description": "See Overview of Symmetry in RFD3. Enter SymmetryConfig as JSON, for example {\"id\": \"C3\", \"is_symmetric_motif\": true}. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "ori_token": {
                    "type": "string",
                    "title": "Ori token",
                    "description": "[x,y,z] origin override to control COM (center of mass) placement of designed structure. A single line of text."
                  },
                  "infer_ori_strategy": {
                    "type": "string",
                    "title": "Infer ori strategy",
                    "description": "\"com\" or \"hotspots\". The center of mass of the diffused region will typically be within 5\u00c5 of the ORI token. Using hotspots will place the ORI token 10\u00c5 outward from the center of mass of the specified hotspots. Using com will place the token at the center of mass of the input structure. One of the field's option values.",
                    "enum": [
                      "",
                      "com",
                      "hotspots"
                    ]
                  },
                  "plddt_enhanced": {
                    "type": "boolean",
                    "title": "pLDDT enhanced",
                    "description": "Default True. Enables pLDDT (predicted Local Distance Difference Test) enhancement. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "is_non_loopy": {
                    "type": "string",
                    "title": "Is non loopy",
                    "description": "Default None. If True/False, produces output structures with fewer/more loops. One of the field's option values.",
                    "enum": [
                      "",
                      "true",
                      "false"
                    ]
                  },
                  "partial_t": {
                    "type": "number",
                    "title": "Partial t (angstroms)",
                    "description": "Noise (\u00c5) for partial diffusion, enables partial diffusion (sets the noise level.) Recommended values are 5.0-15.0 \u00c5. See Partial Diffusion for more information. A number, within the range given for the field.",
                    "minimum": 0
                  },
                  "allow_ligand_on_existing_chain": {
                    "type": "boolean",
                    "title": "Allow ligand on existing chain",
                    "description": "Allow the shared ligand chains used by some official input structures. This is enabled in presets that require it. Accepting such a structure logs a warning that the shared chain is being separated, which is expected. The ligands end up on a chain of their own, so select them by chemical component code. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "rfd3-demo"
                  },
                  "n_batches": {
                    "type": "number",
                    "title": "Batches",
                    "description": "number of batches to generate per input key (default: 1). A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 1
                  },
                  "diffusion_batch_size": {
                    "type": "number",
                    "title": "Designs per batch",
                    "description": "number of diffusion samples (designs) per batch (default: 8). If n_batches=1 and diffusion_batch_size=8 then 8 designs will be generated from the inference run. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 64,
                    "default": 8
                  },
                  "inference_sampler.num_timesteps": {
                    "type": "number",
                    "title": "inference_sampler.num_timesteps",
                    "description": "diffusion timesteps for sampling (default: 200). A number, within the range given for the field.",
                    "minimum": 20,
                    "maximum": 1000,
                    "default": 200
                  },
                  "inference_sampler.step_scale": {
                    "type": "number",
                    "title": "inference_sampler.step_scale",
                    "description": "scales diffusion step size; higher \u2192 less diverse, more designable (default: 1.5). A number, within the range given for the field.",
                    "minimum": 0.1,
                    "maximum": 10,
                    "default": 1.5
                  },
                  "low_memory_mode": {
                    "type": "boolean",
                    "title": "Low-memory mode",
                    "description": "memory-efficient tokenization mode; set True if GPU RAM is tight (default: False). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "dump_trajectories": {
                    "type": "boolean",
                    "title": "Save trajectories",
                    "description": "If True, the trajectory files are also saved to the specified output directory (default: False). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "specification": {
                    "type": "string",
                    "title": "Specification overrides (JSON)",
                    "description": "JSON overrides for the per-example InputSpecification (default: {}). For example, you can run rfd3 design inputs=null specification.length=200 for a quick debug of creating a 200-length protein. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "{}"
                  },
                  "global_prefix": {
                    "type": "string",
                    "title": "Global prefix",
                    "description": "This setting allows you to change the beginning of the name of the output files from the name of the input JSON or YAML file to your own string (default: null). Leave blank for the default. Enter \"\" to omit the prefix. Use letters, digits, dots, underscores or hyphens. A single line of text."
                  },
                  "prevalidate_inputs": {
                    "type": "boolean",
                    "title": "Prevalidate inputs",
                    "description": "Check that your inputs (JSON or YAML file) are valid before running inference (default: False). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "inference_sampler.gamma_0": {
                    "type": "number",
                    "title": "inference_sampler.gamma_0",
                    "description": "This value (default: 0.6) influences the diversity of the designs from RFD3. A lower value increases designability but decreases diversity. A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 1,
                    "default": 0.6
                  },
                  "json_keys_subset": {
                    "type": "string",
                    "title": "JSON keys subset",
                    "description": "Allows the user to extract only a subset of the JSON keys provided in the inputs file (default: null). Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "inference_sampler.n_recycle": {
                    "type": "number",
                    "title": "inference_sampler.n_recycle",
                    "description": "Number of recycling iterations per diffusion step (default: null, uses the model checkpoint default of 2). Recycling allows the network to refine its predictions iteratively within each denoising step. A number, within the range given for the field.",
                    "minimum": 0
                  },
                  "inference_sampler.kind": {
                    "type": "string",
                    "title": "inference_sampler.kind",
                    "description": "Change this value to symmetry (default: default) to turn on symmetry mode for the inference sampler. Automatic selects the sampler from the input specification. One of the field's option values.",
                    "enum": [
                      "auto",
                      "default",
                      "symmetry"
                    ],
                    "default": "auto"
                  },
                  "inference_sampler.cfg_features": {
                    "type": "string",
                    "title": "inference_sampler.cfg_features",
                    "description": "The values specified (options are active_donor, active_acceptor, or ref_atomwise_rasa) are set to 0 for classifier-free guidance. Classifier-free guidance is how the diffusion model can steer the calculation towards a condition without training a separate classifier. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "active_donor, active_acceptor, ref_atomwise_rasa"
                  },
                  "inference_sampler.use_classifier_free_guidance": {
                    "type": "boolean",
                    "title": "inference_sampler.use_classifier_free_guidance",
                    "description": "If set to True, RFD3 can use classifier-free guidance to guide the system towards a condition without training a separate classifier (default: False). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "inference_sampler.cfg_t_max": {
                    "type": "number",
                    "title": "inference_sampler.cfg_t_max",
                    "description": "The maximum time to apply classifier-free guidance to the inference run (default: null). A number, within the range given for the field.",
                    "minimum": 0
                  },
                  "inference_sampler.cfg_scale": {
                    "type": "number",
                    "title": "inference_sampler.cfg_scale",
                    "description": "Controls the influence of the classifier-free guidance adjustment (default: 1.5). A number, within the range given for the field.",
                    "minimum": 0,
                    "default": 1.5
                  },
                  "inference_sampler.center_option": {
                    "type": "string",
                    "title": "inference_sampler.center_option",
                    "description": "Specifies how to center the coordinates during the inference run to ensure that structures are alined around a specific point. Options include: all \u2014 (default) Uses the center of mass (COM) of all atoms motif \u2014 Uses the COM of the motif atoms with fixed coordinates diffuse \u2014 Uses the COM of all fixed coordinates that are not part of motif atoms One of the field's option values.",
                    "enum": [
                      "all",
                      "motif",
                      "diffuse"
                    ],
                    "default": "all"
                  },
                  "inference_sampler.s_trans": {
                    "type": "number",
                    "title": "inference_sampler.s_trans",
                    "description": "Translational noise scale for augmentation during inference (default: 1.0). A number, within the range given for the field.",
                    "minimum": 0,
                    "default": 1.0
                  },
                  "inference_sampler.allow_realignment": {
                    "type": "boolean",
                    "title": "inference_sampler.allow_realignment",
                    "description": "If set to True (default: False) then the noised structure can be realigned during inference based on the location of a given motif. From Issue #154: It is generally not needed to include this option, there are fewer \u2018weird\u2019 interactions with motif scaffolding when it\u2019s set to False. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "inference_sampler.noise_scale": {
                    "type": "number",
                    "title": "inference_sampler.noise_scale",
                    "description": "This parameter sets the scaling for the noise during inference (default 1.003). A smaller value will lead to less noise in your system leading to less diversity in the outputs. A number, within the range given for the field.",
                    "minimum": 0,
                    "default": 1.003
                  },
                  "inference_sampler.p": {
                    "type": "number",
                    "title": "inference_sampler.p",
                    "description": "Determines the \u2018shape\u2019 of the noise schedule (default: 7). A number, within the range given for the field.",
                    "minimum": 0.001,
                    "default": 7
                  },
                  "inference_sampler.gamma_min": {
                    "type": "number",
                    "title": "inference_sampler.gamma_min",
                    "description": "Controls when gamma_0 is used, if t>gamma_min, gamma_0 is used as the value of gamma, which influences the diversity of the designs from RFD3. A number, within the range given for the field.",
                    "minimum": 0,
                    "default": 1.0
                  },
                  "inference_sampler.s_jitter_origin": {
                    "type": "number",
                    "title": "inference_sampler.s_jitter_origin",
                    "description": "Controls the standard deviation of the Gaussian distribution that is used to \u2018jitter\u2019 the motif offset (default: 0.0, no jitter). A number, within the range given for the field.",
                    "minimum": 0,
                    "default": 0.0
                  },
                  "cleanup_guideposts": {
                    "type": "boolean",
                    "title": "Cleanup guideposts",
                    "description": "Set to False (default: True) to save the guideposts used during inference, see Debugging recommendations for more information. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "cleanup_virtual_atoms": {
                    "type": "boolean",
                    "title": "Cleanup virtual atoms",
                    "description": "Set to False (default: True) to save information about the diffused virtual atoms used during inference. RFD3 uses virtual atoms to account for the different number of atoms in side chains during the design process. RFD3 is atom based, however the number of atoms in a residue will differ based on its side chain, which is only determined after some diffusion steps have occurred, meaning virtual atoms are necessary for those steps. See Debugging recommendations for more information. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "read_sequence_from_sequence_head": {
                    "type": "boolean",
                    "title": "Read sequence from sequence head",
                    "description": "Used during training, it is not recommended to change this setting (default: True). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "output_full_json": {
                    "type": "boolean",
                    "title": "Output full JSON",
                    "description": "Output all specification information to the JSON file that gets created for each design (default: True). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "dump_prediction_metadata_json": {
                    "type": "boolean",
                    "title": "Dump prediction metadata JSON",
                    "description": "If True, the metadata for the inference run will be included in the output JSON file (default: True). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "align_trajectory_structures": {
                    "type": "boolean",
                    "title": "Align trajectory structures",
                    "description": "Aligns the structures in the output trajectories (default: False). Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "unconditional_monomer",
                      "demo",
                      "demo/M0255_1mg5_unfixed",
                      "demo/partial_diffusion",
                      "demo/dsDNA_basic",
                      "enzyme_design",
                      "enzyme_design/M0255_1mg5_unfixed",
                      "na_binder_design",
                      "na_binder_design/dsDNA_basic",
                      "na_binder_design/ssDNA_basic",
                      "na_binder_design/ssDNA_diffused_from_dsDNA_pdb",
                      "na_binder_design/RNA_basic",
                      "na_binder_design/dsDNA_complex",
                      "protein_binder_design",
                      "protein_binder_design/insulinr",
                      "protein_binder_design/pdl1",
                      "sm_binder_design",
                      "sm_binder_design/buried",
                      "sm_binder_design/partial",
                      "symmetry",
                      "symmetry/uncond_C5",
                      "symmetry/uncond_D4",
                      "symmetry/unindexed_C2_1j79",
                      "symmetry/unindexed_C2_1e3v",
                      "symmetry/indexed_unsym_C2_1bfr",
                      "symmetry/unsym_C3_6t8h"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "upload",
                      "text",
                      "parameters"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "input_mode": "parameters",
                  "input": "",
                  "contig": "",
                  "unindex": "",
                  "length": "150",
                  "ligand": "",
                  "cif_parser_args": "{}",
                  "extra": "{}",
                  "dialect": "2",
                  "select_fixed_atoms": "",
                  "select_unfixed_sequence": "",
                  "select_buried": "",
                  "select_partially_buried": "",
                  "select_exposed": "",
                  "select_hbond_donor": "",
                  "select_hbond_acceptor": "",
                  "select_hotspots": "",
                  "redesign_motif_sidechains": false,
                  "symmetry": "",
                  "ori_token": "",
                  "infer_ori_strategy": "",
                  "plddt_enhanced": true,
                  "is_non_loopy": "",
                  "partial_t": "",
                  "allow_ligand_on_existing_chain": false,
                  "job_name": "rfd3-demo",
                  "n_batches": 1,
                  "diffusion_batch_size": 8,
                  "inference_sampler.num_timesteps": 200,
                  "inference_sampler.step_scale": 1.5,
                  "low_memory_mode": false,
                  "dump_trajectories": false,
                  "specification": "{}",
                  "global_prefix": "",
                  "prevalidate_inputs": false,
                  "inference_sampler.gamma_0": 0.6,
                  "json_keys_subset": "",
                  "inference_sampler.n_recycle": "",
                  "inference_sampler.kind": "auto",
                  "inference_sampler.cfg_features": "active_donor, active_acceptor, ref_atomwise_rasa",
                  "inference_sampler.use_classifier_free_guidance": false,
                  "inference_sampler.cfg_t_max": "",
                  "inference_sampler.cfg_scale": 1.5,
                  "inference_sampler.center_option": "all",
                  "inference_sampler.s_trans": 1.0,
                  "inference_sampler.allow_realignment": false,
                  "inference_sampler.noise_scale": 1.003,
                  "inference_sampler.p": 7,
                  "inference_sampler.gamma_min": 1.0,
                  "inference_sampler.s_jitter_origin": 0.0,
                  "cleanup_guideposts": true,
                  "cleanup_virtual_atoms": true,
                  "read_sequence_from_sequence_head": true,
                  "output_full_json": true,
                  "dump_prediction_metadata_json": true,
                  "align_trajectory_structures": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/rfantibody/": {
      "get": {
        "summary": "RFantibody field schema",
        "description": "Design antibody or nanobody binders against a target structure.",
        "operationId": "rfantibody_schema",
        "tags": [
          "RFantibody"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a RFantibody job",
        "description": "Design antibody or nanobody binders against a target structure. Runs the whole RFantibody pipeline against a target and an HLT framework: antibody-finetuned RFdiffusion docks a backbone and rebuilds the chosen CDR loops, ProteinMPNN designs their sequences, and antibody-finetuned RF2 predicts the complex for filtering. The Antibody task designs a paired heavy/light framework; Nanobody designs a VHH.",
        "operationId": "rfantibody_submit",
        "tags": [
          "RFantibody"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "rfantibody-demo"
                  },
                  "framework": {
                    "type": "string",
                    "title": "Framework",
                    "description": "The HLT-formatted scaffold whose CDR loops and dock are designed. The two bundled frameworks are the ones used in the RFantibody preprint; pick the one that matches the task. \"Custom\" converts the Chothia-numbered antibody PDB below into HLT format instead. One of the field's option values.",
                    "enum": [
                      "hu-4D5-8_Fv",
                      "h-NbBCII10",
                      "custom"
                    ],
                    "default": "hu-4D5-8_Fv"
                  },
                  "target_file": {
                    "type": "string",
                    "title": "Target antigen PDB",
                    "description": "The antigen structure. Crop it to the region around the epitope: RFdiffusion and RF2 both scale as O(N^2) in residue count. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE A TARGET ANTIGEN PDB HERE"
                  },
                  "antigen_chains": {
                    "type": "string",
                    "title": "Antigen chains",
                    "description": "Comma-separated chain IDs to keep from the target PDB, for example A or A,B. Everything else in the file is dropped before the run. A single line of text.",
                    "maxLength": 60,
                    "default": "A"
                  },
                  "antibody_file": {
                    "type": "string",
                    "title": "Antibody PDB",
                    "description": "Read only when the framework is \"Custom\": a Chothia-numbered antibody structure, such as one downloaded from SAbDab. It is converted to HLT format using the chain IDs below. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "heavy_chain": {
                    "type": "string",
                    "title": "Heavy chain",
                    "description": "Chain ID of the heavy chain in the antibody PDB. A single line of text.",
                    "maxLength": 4,
                    "default": "H"
                  },
                  "light_chain": {
                    "type": "string",
                    "title": "Light chain",
                    "description": "Chain ID of the light chain in the antibody PDB. A single line of text.",
                    "maxLength": 4,
                    "default": "L"
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Epitope hotspots",
                    "description": "Comma-separated target residues that define the epitope, written as a chain ID then a residue number: A305,A456. These use the target PDB's own chain IDs and numbering. RFantibody is sensitive to the choice; pilot a few designs first. A single line of text.",
                    "maxLength": 500,
                    "default": "A305,A456"
                  },
                  "regions": {
                    "type": "string",
                    "title": "CDR loops to design",
                    "description": "Comma-separated loops: hcdr1, hcdr2, hcdr3, and in the Antibody task lcdr1, lcdr2, lcdr3. A loop left out keeps the framework's own sequence and structure through both the diffusion and the sequence-design stages. A single line of text.",
                    "maxLength": 60,
                    "default": "hcdr1,hcdr2,hcdr3"
                  },
                  "hcdr1_length": {
                    "type": "string",
                    "title": "HCDR1 length",
                    "description": "\"auto\" lets the model keep the framework loop's own length, or give a fixed length (7) or a range sampled per design (5-13). A single line of text.",
                    "maxLength": 20,
                    "default": "auto"
                  },
                  "hcdr2_length": {
                    "type": "string",
                    "title": "HCDR2 length",
                    "description": "\"auto\" lets the model keep the framework loop's own length, or give a fixed length (7) or a range sampled per design (5-13). A single line of text.",
                    "maxLength": 20,
                    "default": "auto"
                  },
                  "hcdr3_length": {
                    "type": "string",
                    "title": "HCDR3 length",
                    "description": "\"auto\" lets the model keep the framework loop's own length, or give a fixed length (7) or a range sampled per design (5-13). A single line of text.",
                    "maxLength": 20,
                    "default": "auto"
                  },
                  "lcdr1_length": {
                    "type": "string",
                    "title": "LCDR1 length",
                    "description": "\"auto\" lets the model keep the framework loop's own length, or give a fixed length (7) or a range sampled per design (5-13). A single line of text.",
                    "maxLength": 20,
                    "default": "auto"
                  },
                  "lcdr2_length": {
                    "type": "string",
                    "title": "LCDR2 length",
                    "description": "\"auto\" lets the model keep the framework loop's own length, or give a fixed length (7) or a range sampled per design (5-13). A single line of text.",
                    "maxLength": 20,
                    "default": "auto"
                  },
                  "lcdr3_length": {
                    "type": "string",
                    "title": "LCDR3 length",
                    "description": "\"auto\" lets the model keep the framework loop's own length, or give a fixed length (7) or a range sampled per design (5-13). A single line of text.",
                    "maxLength": 20,
                    "default": "auto"
                  },
                  "select_cdr_indices": {
                    "type": "boolean",
                    "title": "Select CDR indices",
                    "description": "Replace the framework's own CDR annotations with the residue indices below, rather than trusting the Chothia ranges it was labelled with. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "hcdr1_residues": {
                    "type": "string",
                    "title": "HCDR1 residues",
                    "description": "1-indexed absolute residue numbers in the HLT framework (heavy chain first, then light), as 26-32 or 26,27,28. Used only when \"Select CDR indices\" is on; an empty box leaves that loop's existing annotation alone. A single line of text.",
                    "maxLength": 200
                  },
                  "hcdr2_residues": {
                    "type": "string",
                    "title": "HCDR2 residues",
                    "description": "1-indexed absolute residue numbers in the HLT framework (heavy chain first, then light), as 26-32 or 26,27,28. Used only when \"Select CDR indices\" is on; an empty box leaves that loop's existing annotation alone. A single line of text.",
                    "maxLength": 200
                  },
                  "hcdr3_residues": {
                    "type": "string",
                    "title": "HCDR3 residues",
                    "description": "1-indexed absolute residue numbers in the HLT framework (heavy chain first, then light), as 26-32 or 26,27,28. Used only when \"Select CDR indices\" is on; an empty box leaves that loop's existing annotation alone. A single line of text.",
                    "maxLength": 200
                  },
                  "lcdr1_residues": {
                    "type": "string",
                    "title": "LCDR1 residues",
                    "description": "1-indexed absolute residue numbers in the HLT framework (heavy chain first, then light), as 26-32 or 26,27,28. Used only when \"Select CDR indices\" is on; an empty box leaves that loop's existing annotation alone. A single line of text.",
                    "maxLength": 200
                  },
                  "lcdr2_residues": {
                    "type": "string",
                    "title": "LCDR2 residues",
                    "description": "1-indexed absolute residue numbers in the HLT framework (heavy chain first, then light), as 26-32 or 26,27,28. Used only when \"Select CDR indices\" is on; an empty box leaves that loop's existing annotation alone. A single line of text.",
                    "maxLength": 200
                  },
                  "lcdr3_residues": {
                    "type": "string",
                    "title": "LCDR3 residues",
                    "description": "1-indexed absolute residue numbers in the HLT framework (heavy chain first, then light), as 26-32 or 26,27,28. Used only when \"Select CDR indices\" is on; an empty box leaves that loop's existing annotation alone. A single line of text.",
                    "maxLength": 200
                  },
                  "abmpnn_weights": {
                    "type": "boolean",
                    "title": "Use AbMPNN weights",
                    "description": "Run the sequence-design stage against antibody-specific AbMPNN weights instead of the ProteinMPNN checkpoint RFantibody ships. Requires ABMPNN_MODEL_PATH to be configured on the host. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "calculate_epitope_distance": {
                    "type": "boolean",
                    "title": "Report epitope distance",
                    "description": "Include RFdiffusion's per-design C-beta distance from each hotspot to the nearest designed CDR residue, as the closest and the mean over hotspots. Needs hotspots to be set. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "num_designs": {
                    "type": "number",
                    "title": "Backbone designs",
                    "description": "How many docked backbones the diffusion stage generates. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "ProteinMPNN sampling temperature; higher is more diverse and less confident. A number, within the range given for the field.",
                    "minimum": 0.0001,
                    "maximum": 1.0,
                    "default": 0.1
                  },
                  "seqs_per_struct": {
                    "type": "number",
                    "title": "Sequences per backbone",
                    "description": "How many CDR sequences ProteinMPNN designs onto each backbone. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 1
                  },
                  "omit_AAs": {
                    "type": "string",
                    "title": "Omitted amino acids",
                    "description": "One-letter codes ProteinMPNN may not place. X is always omitted; C is omitted by default to avoid unpaired cysteines. A single line of text.",
                    "maxLength": 21,
                    "default": "CX"
                  },
                  "augment_eps": {
                    "type": "number",
                    "title": "Backbone noise",
                    "description": "Gaussian noise added to backbone coordinates before sequence design. A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.05
                  },
                  "num_connections": {
                    "type": "number",
                    "title": "Neighbours per residue",
                    "description": "Size of ProteinMPNN's k-nearest-neighbour graph. A number, within the range given for the field.",
                    "minimum": 8,
                    "maximum": 64,
                    "default": 48
                  },
                  "n_recycles": {
                    "type": "number",
                    "title": "RF2 recycles",
                    "description": "Recycling iterations in the RF2 filtering stage. RFantibody's own examples use 10; fewer is faster and less confident. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 20,
                    "default": 3
                  },
                  "hotspot_percentage": {
                    "type": "number",
                    "title": "Hotspots shown to RF2",
                    "description": "Proportion of the hotspot residues revealed to RF2 when it predicts the designed complex. Showing all of them makes the prediction less independent of the design. A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.1
                  },
                  "save_trajectories": {
                    "type": "boolean",
                    "title": "Keep diffusion trajectories",
                    "description": "Write RFdiffusion's per-step trajectory PDBs alongside the designs. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "antibody",
                      "nanobody"
                    ],
                    "default": "antibody"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "target_file",
                  "antigen_chains",
                  "regions"
                ],
                "example": {
                  "task": "antibody",
                  "job_name": "rfantibody-demo",
                  "framework": "hu-4D5-8_Fv",
                  "target_file": "HEADER    PASTE A TARGET ANTIGEN PDB HERE",
                  "antigen_chains": "A",
                  "antibody_file": "",
                  "heavy_chain": "H",
                  "light_chain": "L",
                  "hotspots": "A305,A456",
                  "regions": "hcdr1,hcdr2,hcdr3",
                  "hcdr1_length": "auto",
                  "hcdr2_length": "auto",
                  "hcdr3_length": "auto",
                  "lcdr1_length": "auto",
                  "lcdr2_length": "auto",
                  "lcdr3_length": "auto",
                  "select_cdr_indices": false,
                  "hcdr1_residues": "",
                  "hcdr2_residues": "",
                  "hcdr3_residues": "",
                  "lcdr1_residues": "",
                  "lcdr2_residues": "",
                  "lcdr3_residues": "",
                  "abmpnn_weights": false,
                  "calculate_epitope_distance": true,
                  "num_designs": 1,
                  "temperature": 0.1,
                  "seqs_per_struct": 1,
                  "omit_AAs": "CX",
                  "augment_eps": 0.05,
                  "num_connections": 48,
                  "n_recycles": 3,
                  "hotspot_percentage": 0.1,
                  "save_trajectories": false
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "rfantibody-demo"
                  },
                  "framework": {
                    "type": "string",
                    "title": "Framework",
                    "description": "The HLT-formatted scaffold whose CDR loops and dock are designed. The two bundled frameworks are the ones used in the RFantibody preprint; pick the one that matches the task. \"Custom\" converts the Chothia-numbered antibody PDB below into HLT format instead. One of the field's option values.",
                    "enum": [
                      "hu-4D5-8_Fv",
                      "h-NbBCII10",
                      "custom"
                    ],
                    "default": "hu-4D5-8_Fv"
                  },
                  "target_file": {
                    "type": "string",
                    "title": "Target antigen PDB",
                    "description": "The antigen structure. Crop it to the region around the epitope: RFdiffusion and RF2 both scale as O(N^2) in residue count. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE A TARGET ANTIGEN PDB HERE"
                  },
                  "antigen_chains": {
                    "type": "string",
                    "title": "Antigen chains",
                    "description": "Comma-separated chain IDs to keep from the target PDB, for example A or A,B. Everything else in the file is dropped before the run. A single line of text.",
                    "maxLength": 60,
                    "default": "A"
                  },
                  "antibody_file": {
                    "type": "string",
                    "title": "Antibody PDB",
                    "description": "Read only when the framework is \"Custom\": a Chothia-numbered antibody structure, such as one downloaded from SAbDab. It is converted to HLT format using the chain IDs below. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "heavy_chain": {
                    "type": "string",
                    "title": "Heavy chain",
                    "description": "Chain ID of the heavy chain in the antibody PDB. A single line of text.",
                    "maxLength": 4,
                    "default": "H"
                  },
                  "light_chain": {
                    "type": "string",
                    "title": "Light chain",
                    "description": "Chain ID of the light chain in the antibody PDB. A single line of text.",
                    "maxLength": 4,
                    "default": "L"
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Epitope hotspots",
                    "description": "Comma-separated target residues that define the epitope, written as a chain ID then a residue number: A305,A456. These use the target PDB's own chain IDs and numbering. RFantibody is sensitive to the choice; pilot a few designs first. A single line of text.",
                    "maxLength": 500,
                    "default": "A305,A456"
                  },
                  "regions": {
                    "type": "string",
                    "title": "CDR loops to design",
                    "description": "Comma-separated loops: hcdr1, hcdr2, hcdr3, and in the Antibody task lcdr1, lcdr2, lcdr3. A loop left out keeps the framework's own sequence and structure through both the diffusion and the sequence-design stages. A single line of text.",
                    "maxLength": 60,
                    "default": "hcdr1,hcdr2,hcdr3"
                  },
                  "hcdr1_length": {
                    "type": "string",
                    "title": "HCDR1 length",
                    "description": "\"auto\" lets the model keep the framework loop's own length, or give a fixed length (7) or a range sampled per design (5-13). A single line of text.",
                    "maxLength": 20,
                    "default": "auto"
                  },
                  "hcdr2_length": {
                    "type": "string",
                    "title": "HCDR2 length",
                    "description": "\"auto\" lets the model keep the framework loop's own length, or give a fixed length (7) or a range sampled per design (5-13). A single line of text.",
                    "maxLength": 20,
                    "default": "auto"
                  },
                  "hcdr3_length": {
                    "type": "string",
                    "title": "HCDR3 length",
                    "description": "\"auto\" lets the model keep the framework loop's own length, or give a fixed length (7) or a range sampled per design (5-13). A single line of text.",
                    "maxLength": 20,
                    "default": "auto"
                  },
                  "lcdr1_length": {
                    "type": "string",
                    "title": "LCDR1 length",
                    "description": "\"auto\" lets the model keep the framework loop's own length, or give a fixed length (7) or a range sampled per design (5-13). A single line of text.",
                    "maxLength": 20,
                    "default": "auto"
                  },
                  "lcdr2_length": {
                    "type": "string",
                    "title": "LCDR2 length",
                    "description": "\"auto\" lets the model keep the framework loop's own length, or give a fixed length (7) or a range sampled per design (5-13). A single line of text.",
                    "maxLength": 20,
                    "default": "auto"
                  },
                  "lcdr3_length": {
                    "type": "string",
                    "title": "LCDR3 length",
                    "description": "\"auto\" lets the model keep the framework loop's own length, or give a fixed length (7) or a range sampled per design (5-13). A single line of text.",
                    "maxLength": 20,
                    "default": "auto"
                  },
                  "select_cdr_indices": {
                    "type": "boolean",
                    "title": "Select CDR indices",
                    "description": "Replace the framework's own CDR annotations with the residue indices below, rather than trusting the Chothia ranges it was labelled with. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "hcdr1_residues": {
                    "type": "string",
                    "title": "HCDR1 residues",
                    "description": "1-indexed absolute residue numbers in the HLT framework (heavy chain first, then light), as 26-32 or 26,27,28. Used only when \"Select CDR indices\" is on; an empty box leaves that loop's existing annotation alone. A single line of text.",
                    "maxLength": 200
                  },
                  "hcdr2_residues": {
                    "type": "string",
                    "title": "HCDR2 residues",
                    "description": "1-indexed absolute residue numbers in the HLT framework (heavy chain first, then light), as 26-32 or 26,27,28. Used only when \"Select CDR indices\" is on; an empty box leaves that loop's existing annotation alone. A single line of text.",
                    "maxLength": 200
                  },
                  "hcdr3_residues": {
                    "type": "string",
                    "title": "HCDR3 residues",
                    "description": "1-indexed absolute residue numbers in the HLT framework (heavy chain first, then light), as 26-32 or 26,27,28. Used only when \"Select CDR indices\" is on; an empty box leaves that loop's existing annotation alone. A single line of text.",
                    "maxLength": 200
                  },
                  "lcdr1_residues": {
                    "type": "string",
                    "title": "LCDR1 residues",
                    "description": "1-indexed absolute residue numbers in the HLT framework (heavy chain first, then light), as 26-32 or 26,27,28. Used only when \"Select CDR indices\" is on; an empty box leaves that loop's existing annotation alone. A single line of text.",
                    "maxLength": 200
                  },
                  "lcdr2_residues": {
                    "type": "string",
                    "title": "LCDR2 residues",
                    "description": "1-indexed absolute residue numbers in the HLT framework (heavy chain first, then light), as 26-32 or 26,27,28. Used only when \"Select CDR indices\" is on; an empty box leaves that loop's existing annotation alone. A single line of text.",
                    "maxLength": 200
                  },
                  "lcdr3_residues": {
                    "type": "string",
                    "title": "LCDR3 residues",
                    "description": "1-indexed absolute residue numbers in the HLT framework (heavy chain first, then light), as 26-32 or 26,27,28. Used only when \"Select CDR indices\" is on; an empty box leaves that loop's existing annotation alone. A single line of text.",
                    "maxLength": 200
                  },
                  "abmpnn_weights": {
                    "type": "boolean",
                    "title": "Use AbMPNN weights",
                    "description": "Run the sequence-design stage against antibody-specific AbMPNN weights instead of the ProteinMPNN checkpoint RFantibody ships. Requires ABMPNN_MODEL_PATH to be configured on the host. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "calculate_epitope_distance": {
                    "type": "boolean",
                    "title": "Report epitope distance",
                    "description": "Include RFdiffusion's per-design C-beta distance from each hotspot to the nearest designed CDR residue, as the closest and the mean over hotspots. Needs hotspots to be set. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "num_designs": {
                    "type": "number",
                    "title": "Backbone designs",
                    "description": "How many docked backbones the diffusion stage generates. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "ProteinMPNN sampling temperature; higher is more diverse and less confident. A number, within the range given for the field.",
                    "minimum": 0.0001,
                    "maximum": 1.0,
                    "default": 0.1
                  },
                  "seqs_per_struct": {
                    "type": "number",
                    "title": "Sequences per backbone",
                    "description": "How many CDR sequences ProteinMPNN designs onto each backbone. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 1
                  },
                  "omit_AAs": {
                    "type": "string",
                    "title": "Omitted amino acids",
                    "description": "One-letter codes ProteinMPNN may not place. X is always omitted; C is omitted by default to avoid unpaired cysteines. A single line of text.",
                    "maxLength": 21,
                    "default": "CX"
                  },
                  "augment_eps": {
                    "type": "number",
                    "title": "Backbone noise",
                    "description": "Gaussian noise added to backbone coordinates before sequence design. A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.05
                  },
                  "num_connections": {
                    "type": "number",
                    "title": "Neighbours per residue",
                    "description": "Size of ProteinMPNN's k-nearest-neighbour graph. A number, within the range given for the field.",
                    "minimum": 8,
                    "maximum": 64,
                    "default": 48
                  },
                  "n_recycles": {
                    "type": "number",
                    "title": "RF2 recycles",
                    "description": "Recycling iterations in the RF2 filtering stage. RFantibody's own examples use 10; fewer is faster and less confident. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 20,
                    "default": 3
                  },
                  "hotspot_percentage": {
                    "type": "number",
                    "title": "Hotspots shown to RF2",
                    "description": "Proportion of the hotspot residues revealed to RF2 when it predicts the designed complex. Showing all of them makes the prediction less independent of the design. A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.1
                  },
                  "save_trajectories": {
                    "type": "boolean",
                    "title": "Keep diffusion trajectories",
                    "description": "Write RFdiffusion's per-step trajectory PDBs alongside the designs. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "antibody",
                      "nanobody"
                    ],
                    "default": "antibody"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "target_file",
                  "antigen_chains",
                  "regions"
                ],
                "example": {
                  "task": "antibody",
                  "job_name": "rfantibody-demo",
                  "framework": "hu-4D5-8_Fv",
                  "target_file": "HEADER    PASTE A TARGET ANTIGEN PDB HERE",
                  "antigen_chains": "A",
                  "antibody_file": "",
                  "heavy_chain": "H",
                  "light_chain": "L",
                  "hotspots": "A305,A456",
                  "regions": "hcdr1,hcdr2,hcdr3",
                  "hcdr1_length": "auto",
                  "hcdr2_length": "auto",
                  "hcdr3_length": "auto",
                  "lcdr1_length": "auto",
                  "lcdr2_length": "auto",
                  "lcdr3_length": "auto",
                  "select_cdr_indices": false,
                  "hcdr1_residues": "",
                  "hcdr2_residues": "",
                  "hcdr3_residues": "",
                  "lcdr1_residues": "",
                  "lcdr2_residues": "",
                  "lcdr3_residues": "",
                  "abmpnn_weights": false,
                  "calculate_epitope_distance": true,
                  "num_designs": 1,
                  "temperature": 0.1,
                  "seqs_per_struct": 1,
                  "omit_AAs": "CX",
                  "augment_eps": 0.05,
                  "num_connections": 48,
                  "n_recycles": 3,
                  "hotspot_percentage": 0.1,
                  "save_trajectories": false
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/germinal/": {
      "get": {
        "summary": "Germinal field schema",
        "description": "Efficient generation of epitope-targeted de novo antibodies",
        "operationId": "germinal_schema",
        "tags": [
          "Germinal"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Germinal job",
        "description": "Efficient generation of epitope-targeted de novo antibodies Germinal is a pipeline for designing de novo antibodies against specified epitopes on target proteins. The pipeline follows a 3-step process: hallucination based on ColabDesign, selective sequence redesign with AbMPNN, and cofolding with a structure prediction model. Germinal is capable of designing both nanobodies and scFvs against user-specified residues on target proteins.",
        "operationId": "germinal_submit",
        "tags": [
          "Germinal"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "germinal-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target antigen PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE A TARGET ANTIGEN PDB HERE"
                  },
                  "target_chain": {
                    "type": "string",
                    "title": "Target chain",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "A"
                  },
                  "target_hotspots": {
                    "type": "string",
                    "title": "Epitope hotspots",
                    "description": "Comma-separated target residues that define the epitope, for example A56,A57,A58. A single line of text.",
                    "default": "A56,A57,A58"
                  },
                  "binder_format": {
                    "type": "string",
                    "title": "Binder format",
                    "description": "One of the field's option values.",
                    "enum": [
                      "vhh",
                      "scfv"
                    ],
                    "default": "vhh"
                  },
                  "max_trajectories": {
                    "type": "number",
                    "title": "Trajectories to run",
                    "description": "Hallucination trajectories attempted; most are discarded by the filters. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10000,
                    "default": 10
                  },
                  "max_passing_designs": {
                    "type": "number",
                    "title": "Designs to keep",
                    "description": "The run stops once this many designs have passed every filter. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 2
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "target_pdb",
                  "target_chain",
                  "target_hotspots"
                ],
                "example": {
                  "job_name": "germinal-demo",
                  "target_pdb": "HEADER    PASTE A TARGET ANTIGEN PDB HERE",
                  "target_chain": "A",
                  "target_hotspots": "A56,A57,A58",
                  "binder_format": "vhh",
                  "max_trajectories": 10,
                  "max_passing_designs": 2
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "germinal-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target antigen PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE A TARGET ANTIGEN PDB HERE"
                  },
                  "target_chain": {
                    "type": "string",
                    "title": "Target chain",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "A"
                  },
                  "target_hotspots": {
                    "type": "string",
                    "title": "Epitope hotspots",
                    "description": "Comma-separated target residues that define the epitope, for example A56,A57,A58. A single line of text.",
                    "default": "A56,A57,A58"
                  },
                  "binder_format": {
                    "type": "string",
                    "title": "Binder format",
                    "description": "One of the field's option values.",
                    "enum": [
                      "vhh",
                      "scfv"
                    ],
                    "default": "vhh"
                  },
                  "max_trajectories": {
                    "type": "number",
                    "title": "Trajectories to run",
                    "description": "Hallucination trajectories attempted; most are discarded by the filters. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 10000,
                    "default": 10
                  },
                  "max_passing_designs": {
                    "type": "number",
                    "title": "Designs to keep",
                    "description": "The run stops once this many designs have passed every filter. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 2
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "target_pdb",
                  "target_chain",
                  "target_hotspots"
                ],
                "example": {
                  "job_name": "germinal-demo",
                  "target_pdb": "HEADER    PASTE A TARGET ANTIGEN PDB HERE",
                  "target_chain": "A",
                  "target_hotspots": "A56,A57,A58",
                  "binder_format": "vhh",
                  "max_trajectories": 10,
                  "max_passing_designs": 2
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/mber/": {
      "get": {
        "summary": "mBER field schema",
        "description": "A protein design framework for antibody binder design",
        "operationId": "mber_schema",
        "tags": [
          "mBER"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a mBER job",
        "description": "A protein design framework for antibody binder design Controllable de novo antibody design with million-scale experimental screening. mBER enables format specific binder design by leveraging structure templates and sequence conditioning in backprop design through AlphaFold-Multimer.",
        "operationId": "mber_submit",
        "tags": [
          "mBER"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "mber-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target antigen PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE A TARGET ANTIGEN PDB HERE"
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chains",
                    "description": "Comma-separated if the target is bound across more than one chain, for example A,B. A single line of text.",
                    "maxLength": 20,
                    "default": "A"
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Epitope hotspots (optional)",
                    "description": "Comma-separated target residues, for example A56,A57. Empty lets mBER bind anywhere on the target. A single line of text.",
                    "default": "A56"
                  },
                  "num_accepted": {
                    "type": "number",
                    "title": "Designs to keep",
                    "description": "The run stops once this many trajectories have passed the iPTM/pLDDT filters. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 10
                  },
                  "max_trajectories": {
                    "type": "number",
                    "title": "Trajectories to attempt",
                    "description": "Upper bound on attempts if num_accepted is never reached. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100000,
                    "default": 1000
                  },
                  "min_iptm": {
                    "type": "number",
                    "title": "Minimum iPTM",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.75
                  },
                  "min_plddt": {
                    "type": "number",
                    "title": "Minimum pLDDT",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.7
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "target_pdb",
                  "target_chains"
                ],
                "example": {
                  "job_name": "mber-demo",
                  "target_pdb": "HEADER    PASTE A TARGET ANTIGEN PDB HERE",
                  "target_chains": "A",
                  "hotspots": "A56",
                  "num_accepted": 10,
                  "max_trajectories": 1000,
                  "min_iptm": 0.75,
                  "min_plddt": 0.7
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "mber-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target antigen PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE A TARGET ANTIGEN PDB HERE"
                  },
                  "target_chains": {
                    "type": "string",
                    "title": "Target chains",
                    "description": "Comma-separated if the target is bound across more than one chain, for example A,B. A single line of text.",
                    "maxLength": 20,
                    "default": "A"
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Epitope hotspots (optional)",
                    "description": "Comma-separated target residues, for example A56,A57. Empty lets mBER bind anywhere on the target. A single line of text.",
                    "default": "A56"
                  },
                  "num_accepted": {
                    "type": "number",
                    "title": "Designs to keep",
                    "description": "The run stops once this many trajectories have passed the iPTM/pLDDT filters. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 10
                  },
                  "max_trajectories": {
                    "type": "number",
                    "title": "Trajectories to attempt",
                    "description": "Upper bound on attempts if num_accepted is never reached. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 100000,
                    "default": 1000
                  },
                  "min_iptm": {
                    "type": "number",
                    "title": "Minimum iPTM",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.75
                  },
                  "min_plddt": {
                    "type": "number",
                    "title": "Minimum pLDDT",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.0,
                    "maximum": 1.0,
                    "default": 0.7
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "target_pdb",
                  "target_chains"
                ],
                "example": {
                  "job_name": "mber-demo",
                  "target_pdb": "HEADER    PASTE A TARGET ANTIGEN PDB HERE",
                  "target_chains": "A",
                  "hotspots": "A56",
                  "num_accepted": 10,
                  "max_trajectories": 1000,
                  "min_iptm": 0.75,
                  "min_plddt": 0.7
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/igdesign/": {
      "get": {
        "summary": "IgDesign field schema",
        "description": "Design antibody CDRs against a target antigen by inverse folding.",
        "operationId": "igdesign_schema",
        "tags": [
          "IgDesign"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a IgDesign job",
        "description": "Design antibody CDRs against a target antigen by inverse folding. Runs IgDesign, which conditions on an antigen-antibody complex structure plus the antibody framework sequence and samples new sequences for the CDRs it is given explicit position ranges for. IgDesign's own configuration format takes those ranges directly rather than a numbering scheme, so this does too.",
        "operationId": "igdesign_submit",
        "tags": [
          "IgDesign"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "igdesign-demo"
                  },
                  "complex_pdb": {
                    "type": "string",
                    "title": "Antigen-antibody complex PDB",
                    "description": "The framework and antigen are read from this structure; the designed loops are resampled. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE AN ANTIGEN-ANTIBODY COMPLEX PDB HERE"
                  },
                  "antigen_chain": {
                    "type": "string",
                    "title": "Antigen chain",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "A"
                  },
                  "heavy_chain": {
                    "type": "string",
                    "title": "Heavy-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "H"
                  },
                  "light_chain": {
                    "type": "string",
                    "title": "Light-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "L"
                  },
                  "regions": {
                    "type": "string",
                    "title": "Regions to design",
                    "description": "One per line, as region:chain:start-end using 1-indexed positions within that chain, for example hcdr3:heavy:96-108. Designed in the order listed. IgDesign's own example configs are the reference for picking these ranges. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "hcdr3:heavy:96-108"
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Sequences to sample",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 10
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 2.0,
                    "default": 0.5
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "complex_pdb",
                  "antigen_chain",
                  "heavy_chain",
                  "light_chain",
                  "regions"
                ],
                "example": {
                  "job_name": "igdesign-demo",
                  "complex_pdb": "HEADER    PASTE AN ANTIGEN-ANTIBODY COMPLEX PDB HERE",
                  "antigen_chain": "A",
                  "heavy_chain": "H",
                  "light_chain": "L",
                  "regions": "hcdr3:heavy:96-108",
                  "num_sequences": 10,
                  "temperature": 0.5,
                  "seed": 0
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "igdesign-demo"
                  },
                  "complex_pdb": {
                    "type": "string",
                    "title": "Antigen-antibody complex PDB",
                    "description": "The framework and antigen are read from this structure; the designed loops are resampled. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE AN ANTIGEN-ANTIBODY COMPLEX PDB HERE"
                  },
                  "antigen_chain": {
                    "type": "string",
                    "title": "Antigen chain",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "A"
                  },
                  "heavy_chain": {
                    "type": "string",
                    "title": "Heavy-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "H"
                  },
                  "light_chain": {
                    "type": "string",
                    "title": "Light-chain ID",
                    "description": "A single line of text.",
                    "maxLength": 4,
                    "default": "L"
                  },
                  "regions": {
                    "type": "string",
                    "title": "Regions to design",
                    "description": "One per line, as region:chain:start-end using 1-indexed positions within that chain, for example hcdr3:heavy:96-108. Designed in the order listed. IgDesign's own example configs are the reference for picking these ranges. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "hcdr3:heavy:96-108"
                  },
                  "num_sequences": {
                    "type": "number",
                    "title": "Sequences to sample",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 10
                  },
                  "temperature": {
                    "type": "number",
                    "title": "Sampling temperature",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0.01,
                    "maximum": 2.0,
                    "default": 0.5
                  },
                  "seed": {
                    "type": "number",
                    "title": "Random seed",
                    "description": "A number, within the range given for the field.",
                    "minimum": 0,
                    "maximum": 2147483647,
                    "default": 0
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "complex_pdb",
                  "antigen_chain",
                  "heavy_chain",
                  "light_chain",
                  "regions"
                ],
                "example": {
                  "job_name": "igdesign-demo",
                  "complex_pdb": "HEADER    PASTE AN ANTIGEN-ANTIBODY COMPLEX PDB HERE",
                  "antigen_chain": "A",
                  "heavy_chain": "H",
                  "light_chain": "L",
                  "regions": "hcdr3:heavy:96-108",
                  "num_sequences": 10,
                  "temperature": 0.5,
                  "seed": 0
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/thermompnn/": {
      "get": {
        "summary": "ThermoMPNN field schema",
        "description": "A graph neural network (GNN) trained using transfer learning to predict changes in stability for protein point mutants",
        "operationId": "thermompnn_schema",
        "tags": [
          "ThermoMPNN"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a ThermoMPNN job",
        "description": "A graph neural network (GNN) trained using transfer learning to predict changes in stability for protein point mutants A deep learning\u2013based method for predicting thermostability changes quickly and accurately given only an initial protein structure.",
        "operationId": "thermompnn_submit",
        "tags": [
          "ThermoMPNN"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A label for this run and its results. A single line of text.",
                    "maxLength": 80,
                    "default": "thermompnn-demo"
                  },
                  "pdb": {
                    "type": "string",
                    "title": "Protein structure",
                    "description": "PDB structure used for ThermoMPNN site-saturation mutagenesis. Upload PDB text or choose a preset with the official 2OCJ example. ThermoMPNN writes one CSV containing every standard amino-acid substitution for the selected chain. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "chain": {
                    "type": "string",
                    "title": "Chain to scan",
                    "description": "Single PDB chain to score. The upstream default is A; leave blank to use the first chain in the structure. A single line of text.",
                    "maxLength": 1,
                    "default": "A"
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "custom_inference/2OCJ"
                    ]
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "pdb"
                ],
                "example": {
                  "job_name": "thermompnn-demo",
                  "pdb": "",
                  "chain": "A"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A label for this run and its results. A single line of text.",
                    "maxLength": 80,
                    "default": "thermompnn-demo"
                  },
                  "pdb": {
                    "type": "string",
                    "title": "Protein structure",
                    "description": "PDB structure used for ThermoMPNN site-saturation mutagenesis. Upload PDB text or choose a preset with the official 2OCJ example. ThermoMPNN writes one CSV containing every standard amino-acid substitution for the selected chain. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "chain": {
                    "type": "string",
                    "title": "Chain to scan",
                    "description": "Single PDB chain to score. The upstream default is A; leave blank to use the first chain in the structure. A single line of text.",
                    "maxLength": 1,
                    "default": "A"
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "custom_inference/2OCJ"
                    ]
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "pdb"
                ],
                "example": {
                  "job_name": "thermompnn-demo",
                  "pdb": "",
                  "chain": "A"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/boltz_adme/": {
      "get": {
        "summary": "Boltz ADME field schema",
        "description": "Predict Tier-1 ADME summary properties (lipophilicity, permeability, and solubility) for a batch of small molecules by SMILES.",
        "operationId": "boltz_adme_schema",
        "tags": [
          "Boltz ADME"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Boltz ADME job",
        "description": "Predict Tier-1 ADME summary properties (lipophilicity, permeability, and solubility) for a batch of small molecules by SMILES. ADME prediction scores a batch of small molecules for Tier-1 ADME summary properties (lipophilicity, permeability, and solubility) directly from SMILES. You submit a list of molecules and get back one result object with a per-molecule summary, returned in the same order you submitted them. It runs to completion and cannot be paused or stopped.",
        "operationId": "boltz_adme_submit",
        "tags": [
          "Boltz ADME"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "smiles": {
                    "type": "string",
                    "title": "Molecules as SMILES",
                    "description": "One SMILES string per line; 1 to 128 molecules. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "CC(=O)OC1=CC=CC=C1C(=O)O\nCC(C)Cc1ccc(cc1)C(C)C(=O)O"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "smiles"
                ],
                "example": {
                  "smiles": "CC(=O)OC1=CC=CC=C1C(=O)O\nCC(C)Cc1ccc(cc1)C(C)C(=O)O"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "smiles": {
                    "type": "string",
                    "title": "Molecules as SMILES",
                    "description": "One SMILES string per line; 1 to 128 molecules. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "CC(=O)OC1=CC=CC=C1C(=O)O\nCC(C)Cc1ccc(cc1)C(C)C(=O)O"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "smiles"
                ],
                "example": {
                  "smiles": "CC(=O)OC1=CC=CC=C1C(=O)O\nCC(C)Cc1ccc(cc1)C(C)C(=O)O"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/genie3/": {
      "get": {
        "summary": "Genie 3 field schema",
        "description": "Fast protein design through all-atom SE(3)-equivariance",
        "operationId": "genie3_schema",
        "tags": [
          "Genie 3"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Genie 3 job",
        "description": "Fast protein design through all-atom SE(3)-equivariance A fast, all-atom SE(3)-equivariant diffusion model for protein design. It achieves state-of-the-art performance on unconditional generation, motif scaffolding, and binder design while retaining the computational efficiency of equivariant architectures.",
        "operationId": "genie3_submit",
        "tags": [
          "Genie 3"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "genie3-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE A TARGET PDB HERE"
                  },
                  "target_sequence": {
                    "type": "string",
                    "title": "Target sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP"
                  },
                  "target_selection": {
                    "type": "string",
                    "title": "Target chain and residues",
                    "description": "Comma-separated PDB selections such as A1-40 or A2-158,B4-90. A single line of text.",
                    "default": "A1-40"
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Interface hotspots",
                    "description": "Comma-separated target chain/residue identifiers. A single line of text.",
                    "default": "A10,A20,A30"
                  },
                  "minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 20,
                    "maximum": 500,
                    "default": 80
                  },
                  "maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 20,
                    "maximum": 500,
                    "default": 120
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Binder candidates",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "target_pdb",
                  "target_sequence",
                  "target_selection",
                  "hotspots"
                ],
                "example": {
                  "job_name": "genie3-demo",
                  "target_pdb": "HEADER    PASTE A TARGET PDB HERE",
                  "target_sequence": "MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP",
                  "target_selection": "A1-40",
                  "hotspots": "A10,A20,A30",
                  "minimum_length": 80,
                  "maximum_length": 120,
                  "num_samples": 1
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "genie3-demo"
                  },
                  "target_pdb": {
                    "type": "string",
                    "title": "Target PDB",
                    "description": "The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE A TARGET PDB HERE"
                  },
                  "target_sequence": {
                    "type": "string",
                    "title": "Target sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP"
                  },
                  "target_selection": {
                    "type": "string",
                    "title": "Target chain and residues",
                    "description": "Comma-separated PDB selections such as A1-40 or A2-158,B4-90. A single line of text.",
                    "default": "A1-40"
                  },
                  "hotspots": {
                    "type": "string",
                    "title": "Interface hotspots",
                    "description": "Comma-separated target chain/residue identifiers. A single line of text.",
                    "default": "A10,A20,A30"
                  },
                  "minimum_length": {
                    "type": "number",
                    "title": "Minimum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 20,
                    "maximum": 500,
                    "default": 80
                  },
                  "maximum_length": {
                    "type": "number",
                    "title": "Maximum binder length",
                    "description": "A number, within the range given for the field.",
                    "minimum": 20,
                    "maximum": 500,
                    "default": 120
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Binder candidates",
                    "description": "A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 1000,
                    "default": 1
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "target_pdb",
                  "target_sequence",
                  "target_selection",
                  "hotspots"
                ],
                "example": {
                  "job_name": "genie3-demo",
                  "target_pdb": "HEADER    PASTE A TARGET PDB HERE",
                  "target_sequence": "MVTAYIAKQRQISFVKSHFSRQDILDLWIYHTQGYFP",
                  "target_selection": "A1-40",
                  "hotspots": "A10,A20,A30",
                  "minimum_length": 80,
                  "maximum_length": 120,
                  "num_samples": 1
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/deepsp/": {
      "get": {
        "summary": "DeepSP field schema",
        "description": "Predict 30 spatial developability descriptors for an antibody from sequence alone.",
        "operationId": "deepsp_schema",
        "tags": [
          "DeepSP"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a DeepSP job",
        "description": "Predict 30 spatial developability descriptors for an antibody from sequence alone. Runs DeepSP, a surrogate CNN that reproduces the spatial aggregation propensity and spatial charge map scores normally obtained from a molecular dynamics run, in each region of the variable domains, from the heavy and light chain sequences alone.",
        "operationId": "deepsp_submit",
        "tags": [
          "DeepSP"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "deepsp-demo"
                  },
                  "heavy_sequence": {
                    "type": "string",
                    "title": "Heavy-chain variable domain",
                    "description": "Variable domain only. DeepSP was trained on Fv sequences. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"
                  },
                  "light_sequence": {
                    "type": "string",
                    "title": "Light-chain variable domain",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "heavy_sequence",
                  "light_sequence"
                ],
                "example": {
                  "job_name": "deepsp-demo",
                  "heavy_sequence": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS",
                  "light_sequence": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "deepsp-demo"
                  },
                  "heavy_sequence": {
                    "type": "string",
                    "title": "Heavy-chain variable domain",
                    "description": "Variable domain only. DeepSP was trained on Fv sequences. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"
                  },
                  "light_sequence": {
                    "type": "string",
                    "title": "Light-chain variable domain",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "heavy_sequence",
                  "light_sequence"
                ],
                "example": {
                  "job_name": "deepsp-demo",
                  "heavy_sequence": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS",
                  "light_sequence": "DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/deepimmuno/": {
      "get": {
        "summary": "DeepImmuno field schema",
        "description": "Score how likely a peptide-MHC class I pair is to provoke a CD8 T-cell response.",
        "operationId": "deepimmuno_schema",
        "tags": [
          "DeepImmuno"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a DeepImmuno job",
        "description": "Score how likely a peptide-MHC class I pair is to provoke a CD8 T-cell response. Runs the DeepImmuno convolutional model over 9- or 10-mer epitopes paired with an HLA class I allele, returning an immunogenicity score per pair. Binding prediction is a separate question: this scores whether a presented peptide is recognised, not whether it is presented.",
        "operationId": "deepimmuno_submit",
        "tags": [
          "DeepImmuno"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "deepimmuno-demo"
                  },
                  "epitope": {
                    "type": "string",
                    "title": "Epitope",
                    "description": "A 9-mer or 10-mer peptide. A single line of text.",
                    "maxLength": 10,
                    "default": "AAGIGILTV"
                  },
                  "hla": {
                    "type": "string",
                    "title": "HLA allele",
                    "description": "A single line of text.",
                    "maxLength": 20,
                    "default": "HLA-A*0201"
                  },
                  "pairs": {
                    "type": "string",
                    "title": "Epitope and allele pairs",
                    "description": "One pair per line, as epitope,allele. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "AAGIGILTV,HLA-A*0201\nSLYNTVATL,HLA-A*0201\nGILGFVFTL,HLA-A*0201"
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "single",
                      "batch"
                    ],
                    "default": "single"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "task": "single",
                  "job_name": "deepimmuno-demo",
                  "epitope": "AAGIGILTV",
                  "hla": "HLA-A*0201"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "deepimmuno-demo"
                  },
                  "epitope": {
                    "type": "string",
                    "title": "Epitope",
                    "description": "A 9-mer or 10-mer peptide. A single line of text.",
                    "maxLength": 10,
                    "default": "AAGIGILTV"
                  },
                  "hla": {
                    "type": "string",
                    "title": "HLA allele",
                    "description": "A single line of text.",
                    "maxLength": 20,
                    "default": "HLA-A*0201"
                  },
                  "pairs": {
                    "type": "string",
                    "title": "Epitope and allele pairs",
                    "description": "One pair per line, as epitope,allele. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "AAGIGILTV,HLA-A*0201\nSLYNTVATL,HLA-A*0201\nGILGFVFTL,HLA-A*0201"
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "single",
                      "batch"
                    ],
                    "default": "single"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "task": "single",
                  "job_name": "deepimmuno-demo",
                  "epitope": "AAGIGILTV",
                  "hla": "HLA-A*0201"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/tlimmuno/": {
      "get": {
        "summary": "TLimmuno2 field schema",
        "description": "Score how likely a peptide-MHC class II pair is to provoke a CD4 T-cell response.",
        "operationId": "tlimmuno_schema",
        "tags": [
          "TLimmuno2"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a TLimmuno2 job",
        "description": "Score how likely a peptide-MHC class II pair is to provoke a CD4 T-cell response. Runs TLimmuno2, an LSTM model transferred from class II binding affinity data onto immunogenicity, over peptides paired with an MHC class II allele. Useful for anti-drug-response risk on a biologic as well as for vaccine epitope selection.",
        "operationId": "tlimmuno_submit",
        "tags": [
          "TLimmuno2"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "tlimmuno-demo"
                  },
                  "peptide": {
                    "type": "string",
                    "title": "Peptide",
                    "description": "13 to 21 residues, the range the class II model was trained on. A single line of text.",
                    "maxLength": 21,
                    "default": "AGFKGEQGPKGEPGPK"
                  },
                  "mhc_allele": {
                    "type": "string",
                    "title": "MHC class II allele",
                    "description": "A single line of text.",
                    "maxLength": 40,
                    "default": "DRB1_0101"
                  },
                  "pairs": {
                    "type": "string",
                    "title": "Peptide and allele pairs",
                    "description": "One pair per line, as peptide,allele. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "AGFKGEQGPKGEPGPK,DRB1_0101\nPKYVKQNTLKLATGMR,DRB1_0101\nGELIGTLNAAKVPADT,DRB1_0401"
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "single",
                      "batch"
                    ],
                    "default": "single"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "task": "single",
                  "job_name": "tlimmuno-demo",
                  "peptide": "AGFKGEQGPKGEPGPK",
                  "mhc_allele": "DRB1_0101"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "tlimmuno-demo"
                  },
                  "peptide": {
                    "type": "string",
                    "title": "Peptide",
                    "description": "13 to 21 residues, the range the class II model was trained on. A single line of text.",
                    "maxLength": 21,
                    "default": "AGFKGEQGPKGEPGPK"
                  },
                  "mhc_allele": {
                    "type": "string",
                    "title": "MHC class II allele",
                    "description": "A single line of text.",
                    "maxLength": 40,
                    "default": "DRB1_0101"
                  },
                  "pairs": {
                    "type": "string",
                    "title": "Peptide and allele pairs",
                    "description": "One pair per line, as peptide,allele. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "AGFKGEQGPKGEPGPK,DRB1_0101\nPKYVKQNTLKLATGMR,DRB1_0101\nGELIGTLNAAKVPADT,DRB1_0401"
                  },
                  "task": {
                    "type": "string",
                    "title": "Task",
                    "description": "Which mode of the tool to run. Fields belonging to another task are ignored.",
                    "enum": [
                      "single",
                      "batch"
                    ],
                    "default": "single"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [],
                "example": {
                  "task": "single",
                  "job_name": "tlimmuno-demo",
                  "peptide": "AGFKGEQGPKGEPGPK",
                  "mhc_allele": "DRB1_0101"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/netsolp/": {
      "get": {
        "summary": "NetSolP field schema",
        "description": "Predict whether a protein will be soluble and usable when expressed in E. coli.",
        "operationId": "netsolp_schema",
        "tags": [
          "NetSolP"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a NetSolP job",
        "description": "Predict whether a protein will be soluble and usable when expressed in E. coli. Runs NetSolP over a set of FASTA sequences, scoring each for solubility and for usability, which combines solubility with expressibility. The predictions come from a protein language model and need no structure.",
        "operationId": "netsolp_submit",
        "tags": [
          "NetSolP"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "netsolp-demo"
                  },
                  "fasta": {
                    "type": "string",
                    "title": "Sequences (FASTA)",
                    "description": "One or more records. Each is scored independently. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"
                  },
                  "model_type": {
                    "type": "string",
                    "title": "Model",
                    "description": "One of the field's option values.",
                    "enum": [
                      "ESM12",
                      "ESM1b",
                      "Distilled"
                    ],
                    "default": "ESM12"
                  },
                  "prediction_type": {
                    "type": "string",
                    "title": "Prediction",
                    "description": "One of the field's option values.",
                    "enum": [
                      "S",
                      "U",
                      "SU"
                    ],
                    "default": "SU"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "fasta"
                ],
                "example": {
                  "job_name": "netsolp-demo",
                  "fasta": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG",
                  "model_type": "ESM12",
                  "prediction_type": "SU"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "netsolp-demo"
                  },
                  "fasta": {
                    "type": "string",
                    "title": "Sequences (FASTA)",
                    "description": "One or more records. Each is scored independently. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"
                  },
                  "model_type": {
                    "type": "string",
                    "title": "Model",
                    "description": "One of the field's option values.",
                    "enum": [
                      "ESM12",
                      "ESM1b",
                      "Distilled"
                    ],
                    "default": "ESM12"
                  },
                  "prediction_type": {
                    "type": "string",
                    "title": "Prediction",
                    "description": "One of the field's option values.",
                    "enum": [
                      "S",
                      "U",
                      "SU"
                    ],
                    "default": "SU"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "fasta"
                ],
                "example": {
                  "job_name": "netsolp-demo",
                  "fasta": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG",
                  "model_type": "ESM12",
                  "prediction_type": "SU"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/deepstabp/": {
      "get": {
        "summary": "DeepSTABp field schema",
        "description": "Predict the melting temperature of a protein from its sequence.",
        "operationId": "deepstabp_schema",
        "tags": [
          "DeepSTABp"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a DeepSTABp job",
        "description": "Predict the melting temperature of a protein from its sequence. Runs DeepSTABp, which embeds each sequence with a protein language model and predicts the melting temperature it would show in a thermal proteome profiling experiment, conditioned on the growth temperature and on whether the measurement is on cells or lysate.",
        "operationId": "deepstabp_submit",
        "tags": [
          "DeepSTABp"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "deepstabp-demo"
                  },
                  "fasta": {
                    "type": "string",
                    "title": "Sequences (FASTA)",
                    "description": "One or more records. Each is predicted independently. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"
                  },
                  "growth_temperature": {
                    "type": "number",
                    "title": "Growth temperature (C)",
                    "description": "The temperature the organism was cultured at, which the model conditions on. A number, within the range given for the field.",
                    "minimum": -20.0,
                    "maximum": 110.0,
                    "default": 37.0
                  },
                  "measurement_condition": {
                    "type": "string",
                    "title": "Measurement condition",
                    "description": "One of the field's option values.",
                    "enum": [
                      "lysate",
                      "cell"
                    ],
                    "default": "lysate"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "fasta"
                ],
                "example": {
                  "job_name": "deepstabp-demo",
                  "fasta": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG",
                  "growth_temperature": 37.0,
                  "measurement_condition": "lysate"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "deepstabp-demo"
                  },
                  "fasta": {
                    "type": "string",
                    "title": "Sequences (FASTA)",
                    "description": "One or more records. Each is predicted independently. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"
                  },
                  "growth_temperature": {
                    "type": "number",
                    "title": "Growth temperature (C)",
                    "description": "The temperature the organism was cultured at, which the model conditions on. A number, within the range given for the field.",
                    "minimum": -20.0,
                    "maximum": 110.0,
                    "default": 37.0
                  },
                  "measurement_condition": {
                    "type": "string",
                    "title": "Measurement condition",
                    "description": "One of the field's option values.",
                    "enum": [
                      "lysate",
                      "cell"
                    ],
                    "default": "lysate"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "fasta"
                ],
                "example": {
                  "job_name": "deepstabp-demo",
                  "fasta": ">demo_protein\nMKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG",
                  "growth_temperature": 37.0,
                  "measurement_condition": "lysate"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/dlkcat/": {
      "get": {
        "summary": "DLKcat field schema",
        "description": "Predict an enzyme turnover number from its sequence and a substrate structure.",
        "operationId": "dlkcat_schema",
        "tags": [
          "DLKcat"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a DLKcat job",
        "description": "Predict an enzyme turnover number from its sequence and a substrate structure. Runs the deep-learning half of the DLKcat toolbox, which pairs a graph neural network over the substrate with a convolutional network over the enzyme sequence to predict kcat. It is trained on wild-type and mutant enzymes across many organisms, and is meant for parameterising models rather than for ranking closely related variants.",
        "operationId": "dlkcat_submit",
        "tags": [
          "DLKcat"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "dlkcat-demo"
                  },
                  "protein_sequence": {
                    "type": "string",
                    "title": "Enzyme sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MSEPAQKKQKVSNGGGSSNKRAADSLADQLYGKSAAAAHTPPAKKAKTETIAAPTFTTSGLDKLDLSNIDSSAWKQLAEEDLASLYGDLDSHRLDQPFPSAAAPVAKKRVSFTDSAAAA"
                  },
                  "substrate_smiles": {
                    "type": "string",
                    "title": "Substrate SMILES",
                    "description": "The substrate as a SMILES string; DLKcat builds its molecular graph from this. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "OCC1OC(O)C(O)C(O)C1O"
                  },
                  "substrate_name": {
                    "type": "string",
                    "title": "Substrate name",
                    "description": "Carried through to the output for readability; it does not affect the prediction. A single line of text.",
                    "default": "D-glucose"
                  },
                  "additional_entries": {
                    "type": "string",
                    "title": "Additional pairs (optional)",
                    "description": "More substrate/enzyme pairs to score in the same run, one per line, as name;SMILES;sequence. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "protein_sequence",
                  "substrate_smiles"
                ],
                "example": {
                  "job_name": "dlkcat-demo",
                  "protein_sequence": "MSEPAQKKQKVSNGGGSSNKRAADSLADQLYGKSAAAAHTPPAKKAKTETIAAPTFTTSGLDKLDLSNIDSSAWKQLAEEDLASLYGDLDSHRLDQPFPSAAAPVAKKRVSFTDSAAAA",
                  "substrate_smiles": "OCC1OC(O)C(O)C(O)C1O",
                  "substrate_name": "D-glucose",
                  "additional_entries": ""
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "dlkcat-demo"
                  },
                  "protein_sequence": {
                    "type": "string",
                    "title": "Enzyme sequence",
                    "description": "Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "MSEPAQKKQKVSNGGGSSNKRAADSLADQLYGKSAAAAHTPPAKKAKTETIAAPTFTTSGLDKLDLSNIDSSAWKQLAEEDLASLYGDLDSHRLDQPFPSAAAPVAKKRVSFTDSAAAA"
                  },
                  "substrate_smiles": {
                    "type": "string",
                    "title": "Substrate SMILES",
                    "description": "The substrate as a SMILES string; DLKcat builds its molecular graph from this. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "default": "OCC1OC(O)C(O)C(O)C1O"
                  },
                  "substrate_name": {
                    "type": "string",
                    "title": "Substrate name",
                    "description": "Carried through to the output for readability; it does not affect the prediction. A single line of text.",
                    "default": "D-glucose"
                  },
                  "additional_entries": {
                    "type": "string",
                    "title": "Additional pairs (optional)",
                    "description": "More substrate/enzyme pairs to score in the same run, one per line, as name;SMILES;sequence. Free text. Line breaks are significant to the tools that read this as a file's contents."
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "protein_sequence",
                  "substrate_smiles"
                ],
                "example": {
                  "job_name": "dlkcat-demo",
                  "protein_sequence": "MSEPAQKKQKVSNGGGSSNKRAADSLADQLYGKSAAAAHTPPAKKAKTETIAAPTFTTSGLDKLDLSNIDSSAWKQLAEEDLASLYGDLDSHRLDQPFPSAAAPVAKKRVSFTDSAAAA",
                  "substrate_smiles": "OCC1OC(O)C(O)C(O)C1O",
                  "substrate_name": "D-glucose",
                  "additional_entries": ""
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/catpred/": {
      "get": {
        "summary": "CatPred field schema",
        "description": "Predict kcat, Km or Ki for an enzyme and its substrate, with an uncertainty estimate.",
        "operationId": "catpred_schema",
        "tags": [
          "CatPred"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a CatPred job",
        "description": "Predict kcat, Km or Ki for an enzyme and its substrate, with an uncertainty estimate. CatPred combines an ESM-2 sequence embedding of the enzyme with a message-passing representation of the substrate, and predicts a distribution rather than a point value: each prediction carries total, aleatoric and epistemic standard deviations, and the epistemic part grows as the query moves away from the training data. One run scores one CSV of reactions -- enzyme sequence, substrate or inhibitor SMILES, and a sequence ID -- against one of the three parameters, using the ten-model production ensemble the authors predict with themselves.",
        "operationId": "catpred_submit",
        "tags": [
          "CatPred"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the output directory and the predictions CSV inside it. A single line of text.",
                    "maxLength": 80,
                    "default": "catpred-job"
                  },
                  "parameter": {
                    "type": "string",
                    "title": "Kinetic parameter",
                    "description": "One ensemble per parameter, each a separate model: a run predicts one of them. kcat is predicted for the reaction's whole substrate set, Km for a single substrate, and Ki for a single inhibitor. One of the field's option values.",
                    "enum": [
                      "kcat",
                      "km",
                      "ki"
                    ],
                    "default": "kcat"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Enzyme and substrates",
                    "description": "One enzyme box and one box per substrate, which is one reaction. The enzyme's ID names its sequence in the results and is what CatPred caches its embedding under; a substrate's ID is an optional label. For kcat the substrates are joined with \".\", as CatPred's own CSV writes a reaction; Km and Ki take a single ligand. Enter a CSV to score several reactions in one run. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"GCK_HUMAN\", \"sequence\": \"MLDDRARMEAAKKEKVEQILAEFQLQEEDLKKVMRRMQKEMDRGLRLETHEEASVKMLPTYVRSTPEGSEVGDFLSLDLGGTNFRVMLVKVGEGEEGQWSVKTKHQMYSIPEDAMTGTAEMLFDYISECISDFLDKHQMKHKKLPLGFTFSFPVRHEDIDKGILLNWTKGFKASGAEGNNVVGLLRDAIKRRGDFEMDVVAMVNDTVATMISCYYEDHQCEVGMIVGTGCNACYMEEMQNVELVEGDEGRMCVNTEWGAFGDSGELDEFLLEYDRLVDESSANPGQQLYEKLIGGKYMGELVRLVLLRLVDENLLFHGEASEQLRTRGAFETRFVSQVESDTGDRKQIYNILSTLGLRPSTTDCDIVRRACESVSTRAAHMCSAGLAGVINRMRESRSEDVMRITVGVDGSVYKLHPSFKERFHASVRRLTPSCEITFIESEEGSGRGAALVSAVACKKACMLGQ\"}, {\"type\": \"ligand\", \"id\": \"D-glucose\", \"ligand\": \"C(C1C(C(C(C(O1)O)O)O)O)O\"}, {\"type\": \"ligand\", \"id\": \"ATP\", \"ligand\": \"C1=NC(=C2C(=N1)N(C=N2)C3C(C(C(O3)COP(=O)(O)OP(=O)(O)OP(=O)(O)O)O)O)N\"}]"
                  },
                  "input_csv": {
                    "type": "string",
                    "title": "Reactions (CatPred CSV)",
                    "description": "CatPred's own input format: a header with SMILES, sequence and pdbpath, then one row per reaction (up to 200). pdbpath is an identifier, not a file, and must name exactly one sequence across the file; left blank, rows are numbered seq_001 onward. Any extra column, such as the demo files' Substrate, is carried through to the predictions. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 2000000,
                    "default": "SMILES,sequence,pdbpath,Substrate\nC(C1C(C(C(C(O1)O)O)O)O)O.C1=NC(=C2C(=N1)N(C=N2)C3C(C(C(O3)COP(=O)(O)OP(=O)(O)OP(=O)(O)O)O)O)N,MLDDRARMEAAKKEKVEQILAEFQLQEEDLKKVMRRMQKEMDRGLRLETHEEASVKMLPTYVRSTPEGSEVGDFLSLDLGGTNFRVMLVKVGEGEEGQWSVKTKHQMYSIPEDAMTGTAEMLFDYISECISDFLDKHQMKHKKLPLGFTFSFPVRHEDIDKGILLNWTKGFKASGAEGNNVVGLLRDAIKRRGDFEMDVVAMVNDTVATMISCYYEDHQCEVGMIVGTGCNACYMEEMQNVELVEGDEGRMCVNTEWGAFGDSGELDEFLLEYDRLVDESSANPGQQLYEKLIGGKYMGELVRLVLLRLVDENLLFHGEASEQLRTRGAFETRFVSQVESDTGDRKQIYNILSTLGLRPSTTDCDIVRRACESVSTRAAHMCSAGLAGVINRMRESRSEDVMRITVGVDGSVYKLHPSFKERFHASVRRLTPSCEITFIESEEGSGRGAALVSAVACKKACMLGQ,GCK_HUMAN,D-glucose + ATP\n"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Reactions file",
                    "description": "Upload a CatPred CSV with SMILES, sequence and pdbpath columns. The file contents are sent to the compute node. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "device": {
                    "type": "string",
                    "title": "Device",
                    "description": "Auto uses CUDA when available, otherwise CPU. An explicitly requested unavailable CUDA device fails clearly. Each row costs one ESM-2 embedding and ten model evaluations; CPU runs are slow but supported. One of the field's option values.",
                    "enum": [
                      "auto",
                      "cuda",
                      "cpu"
                    ],
                    "default": "auto"
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "glucokinase_kcat",
                      "glucokinase_km",
                      "ldha_kcat",
                      "pal_ki",
                      "batch_kcat_csv"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "input_csv"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "catpred-job",
                  "parameter": "kcat",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"GCK_HUMAN\", \"sequence\": \"MLDDRARMEAAKKEKVEQILAEFQLQEEDLKKVMRRMQKEMDRGLRLETHEEASVKMLPTYVRSTPEGSEVGDFLSLDLGGTNFRVMLVKVGEGEEGQWSVKTKHQMYSIPEDAMTGTAEMLFDYISECISDFLDKHQMKHKKLPLGFTFSFPVRHEDIDKGILLNWTKGFKASGAEGNNVVGLLRDAIKRRGDFEMDVVAMVNDTVATMISCYYEDHQCEVGMIVGTGCNACYMEEMQNVELVEGDEGRMCVNTEWGAFGDSGELDEFLLEYDRLVDESSANPGQQLYEKLIGGKYMGELVRLVLLRLVDENLLFHGEASEQLRTRGAFETRFVSQVESDTGDRKQIYNILSTLGLRPSTTDCDIVRRACESVSTRAAHMCSAGLAGVINRMRESRSEDVMRITVGVDGSVYKLHPSFKERFHASVRRLTPSCEITFIESEEGSGRGAALVSAVACKKACMLGQ\"}, {\"type\": \"ligand\", \"id\": \"D-glucose\", \"ligand\": \"C(C1C(C(C(C(O1)O)O)O)O)O\"}, {\"type\": \"ligand\", \"id\": \"ATP\", \"ligand\": \"C1=NC(=C2C(=N1)N(C=N2)C3C(C(C(O3)COP(=O)(O)OP(=O)(O)OP(=O)(O)O)O)O)N\"}]",
                  "device": "auto"
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "Names the output directory and the predictions CSV inside it. A single line of text.",
                    "maxLength": 80,
                    "default": "catpred-job"
                  },
                  "parameter": {
                    "type": "string",
                    "title": "Kinetic parameter",
                    "description": "One ensemble per parameter, each a separate model: a run predicts one of them. kcat is predicted for the reaction's whole substrate set, Km for a single substrate, and Ki for a single inhibitor. One of the field's option values.",
                    "enum": [
                      "kcat",
                      "km",
                      "ki"
                    ],
                    "default": "kcat"
                  },
                  "sequence_molecules": {
                    "type": "string",
                    "title": "Enzyme and substrates",
                    "description": "One enzyme box and one box per substrate, which is one reaction. The enzyme's ID names its sequence in the results and is what CatPred caches its embedding under; a substrate's ID is an optional label. For kcat the substrates are joined with \".\", as CatPred's own CSV writes a reaction; Km and Ki take a single ligand. Enter a CSV to score several reactions in one run. A JSON array of molecule objects, serialized to a string -- the value is parsed as JSON after being read as text, so a bare array is rejected.",
                    "default": "[{\"type\": \"protein\", \"id\": \"GCK_HUMAN\", \"sequence\": \"MLDDRARMEAAKKEKVEQILAEFQLQEEDLKKVMRRMQKEMDRGLRLETHEEASVKMLPTYVRSTPEGSEVGDFLSLDLGGTNFRVMLVKVGEGEEGQWSVKTKHQMYSIPEDAMTGTAEMLFDYISECISDFLDKHQMKHKKLPLGFTFSFPVRHEDIDKGILLNWTKGFKASGAEGNNVVGLLRDAIKRRGDFEMDVVAMVNDTVATMISCYYEDHQCEVGMIVGTGCNACYMEEMQNVELVEGDEGRMCVNTEWGAFGDSGELDEFLLEYDRLVDESSANPGQQLYEKLIGGKYMGELVRLVLLRLVDENLLFHGEASEQLRTRGAFETRFVSQVESDTGDRKQIYNILSTLGLRPSTTDCDIVRRACESVSTRAAHMCSAGLAGVINRMRESRSEDVMRITVGVDGSVYKLHPSFKERFHASVRRLTPSCEITFIESEEGSGRGAALVSAVACKKACMLGQ\"}, {\"type\": \"ligand\", \"id\": \"D-glucose\", \"ligand\": \"C(C1C(C(C(C(O1)O)O)O)O)O\"}, {\"type\": \"ligand\", \"id\": \"ATP\", \"ligand\": \"C1=NC(=C2C(=N1)N(C=N2)C3C(C(C(O3)COP(=O)(O)OP(=O)(O)OP(=O)(O)O)O)O)N\"}]"
                  },
                  "input_csv": {
                    "type": "string",
                    "title": "Reactions (CatPred CSV)",
                    "description": "CatPred's own input format: a header with SMILES, sequence and pdbpath, then one row per reaction (up to 200). pdbpath is an identifier, not a file, and must name exactly one sequence across the file; left blank, rows are numbered seq_001 onward. Any extra column, such as the demo files' Substrate, is carried through to the predictions. Free text. Line breaks are significant to the tools that read this as a file's contents.",
                    "maxLength": 2000000,
                    "default": "SMILES,sequence,pdbpath,Substrate\nC(C1C(C(C(C(O1)O)O)O)O)O.C1=NC(=C2C(=N1)N(C=N2)C3C(C(C(O3)COP(=O)(O)OP(=O)(O)OP(=O)(O)O)O)O)N,MLDDRARMEAAKKEKVEQILAEFQLQEEDLKKVMRRMQKEMDRGLRLETHEEASVKMLPTYVRSTPEGSEVGDFLSLDLGGTNFRVMLVKVGEGEEGQWSVKTKHQMYSIPEDAMTGTAEMLFDYISECISDFLDKHQMKHKKLPLGFTFSFPVRHEDIDKGILLNWTKGFKASGAEGNNVVGLLRDAIKRRGDFEMDVVAMVNDTVATMISCYYEDHQCEVGMIVGTGCNACYMEEMQNVELVEGDEGRMCVNTEWGAFGDSGELDEFLLEYDRLVDESSANPGQQLYEKLIGGKYMGELVRLVLLRLVDENLLFHGEASEQLRTRGAFETRFVSQVESDTGDRKQIYNILSTLGLRPSTTDCDIVRRACESVSTRAAHMCSAGLAGVINRMRESRSEDVMRITVGVDGSVYKLHPSFKERFHASVRRLTPSCEITFIESEEGSGRGAALVSAVACKKACMLGQ,GCK_HUMAN,D-glucose + ATP\n"
                  },
                  "inputs_file": {
                    "type": "string",
                    "title": "Reactions file",
                    "description": "Upload a CatPred CSV with SMILES, sequence and pdbpath columns. The file contents are sent to the compute node. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets."
                  },
                  "device": {
                    "type": "string",
                    "title": "Device",
                    "description": "Auto uses CUDA when available, otherwise CPU. An explicitly requested unavailable CUDA device fails clearly. Each row costs one ESM-2 embedding and ten model evaluations; CPU runs are slow but supported. One of the field's option values.",
                    "enum": [
                      "auto",
                      "cuda",
                      "cpu"
                    ],
                    "default": "auto"
                  },
                  "preset": {
                    "type": "string",
                    "title": "Example preset",
                    "description": "Load the named preset and its bundled inputs. Explicit request fields override preset values.",
                    "enum": [
                      "glucokinase_kcat",
                      "glucokinase_km",
                      "ldha_kcat",
                      "pal_ki",
                      "batch_kcat_csv"
                    ]
                  },
                  "input_mode": {
                    "type": "string",
                    "title": "Input mode",
                    "description": "Choose an uploaded input document, entered input text, or individual parameters. Fields from other input modes are ignored.",
                    "enum": [
                      "parameters",
                      "text",
                      "upload"
                    ],
                    "default": "parameters"
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "sequence_molecules",
                  "input_csv"
                ],
                "example": {
                  "input_mode": "parameters",
                  "job_name": "catpred-job",
                  "parameter": "kcat",
                  "sequence_molecules": "[{\"type\": \"protein\", \"id\": \"GCK_HUMAN\", \"sequence\": \"MLDDRARMEAAKKEKVEQILAEFQLQEEDLKKVMRRMQKEMDRGLRLETHEEASVKMLPTYVRSTPEGSEVGDFLSLDLGGTNFRVMLVKVGEGEEGQWSVKTKHQMYSIPEDAMTGTAEMLFDYISECISDFLDKHQMKHKKLPLGFTFSFPVRHEDIDKGILLNWTKGFKASGAEGNNVVGLLRDAIKRRGDFEMDVVAMVNDTVATMISCYYEDHQCEVGMIVGTGCNACYMEEMQNVELVEGDEGRMCVNTEWGAFGDSGELDEFLLEYDRLVDESSANPGQQLYEKLIGGKYMGELVRLVLLRLVDENLLFHGEASEQLRTRGAFETRFVSQVESDTGDRKQIYNILSTLGLRPSTTDCDIVRRACESVSTRAAHMCSAGLAGVINRMRESRSEDVMRITVGVDGSVYKLHPSFKERFHASVRRLTPSCEITFIESEEGSGRGAALVSAVACKKACMLGQ\"}, {\"type\": \"ligand\", \"id\": \"D-glucose\", \"ligand\": \"C(C1C(C(C(C(O1)O)O)O)O)O\"}, {\"type\": \"ligand\", \"id\": \"ATP\", \"ligand\": \"C1=NC(=C2C(=N1)N(C=N2)C3C(C(C(O3)COP(=O)(O)OP(=O)(O)OP(=O)(O)O)O)O)N\"}]",
                  "device": "auto"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/antibody_annotator/": {
      "get": {
        "summary": "Antibody Annotator field schema",
        "description": "Number an antibody or TCR sequence and report its regions and liabilities.",
        "operationId": "antibody_annotator_schema",
        "tags": [
          "Antibody Annotator"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a Antibody Annotator job",
        "description": "Number an antibody or TCR sequence and report its regions and liabilities. Numbers each variable domain with the chosen scheme, reports the framework and CDR boundaries that follow from it, and flags the sequence motifs associated with glycosylation, deamidation, isomerisation, and oxidation in each region.",
        "operationId": "antibody_annotator_submit",
        "tags": [
          "Antibody Annotator"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "annotator-demo"
                  },
                  "fasta": {
                    "type": "string",
                    "title": "Sequences (FASTA)",
                    "description": "One record per chain. Variable domains only; constant regions are not numbered. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": ">heavy\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS\n>light\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                  },
                  "numbering_scheme": {
                    "type": "string",
                    "title": "Numbering scheme",
                    "description": "One of the field's option values.",
                    "enum": [
                      "imgt",
                      "kabat",
                      "chothia",
                      "martin",
                      "aho"
                    ],
                    "default": "imgt"
                  },
                  "receptor_type": {
                    "type": "string",
                    "title": "Receptor type",
                    "description": "One of the field's option values.",
                    "enum": [
                      "antibody",
                      "tcr",
                      "shark",
                      "unknown"
                    ],
                    "default": "antibody"
                  },
                  "report_liabilities": {
                    "type": "boolean",
                    "title": "Report sequence liabilities",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "fasta"
                ],
                "example": {
                  "job_name": "annotator-demo",
                  "fasta": ">heavy\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS\n>light\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK",
                  "numbering_scheme": "imgt",
                  "receptor_type": "antibody",
                  "report_liabilities": true
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "annotator-demo"
                  },
                  "fasta": {
                    "type": "string",
                    "title": "Sequences (FASTA)",
                    "description": "One record per chain. Variable domains only; constant regions are not numbered. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": ">heavy\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS\n>light\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK"
                  },
                  "numbering_scheme": {
                    "type": "string",
                    "title": "Numbering scheme",
                    "description": "One of the field's option values.",
                    "enum": [
                      "imgt",
                      "kabat",
                      "chothia",
                      "martin",
                      "aho"
                    ],
                    "default": "imgt"
                  },
                  "receptor_type": {
                    "type": "string",
                    "title": "Receptor type",
                    "description": "One of the field's option values.",
                    "enum": [
                      "antibody",
                      "tcr",
                      "shark",
                      "unknown"
                    ],
                    "default": "antibody"
                  },
                  "report_liabilities": {
                    "type": "boolean",
                    "title": "Report sequence liabilities",
                    "description": "Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "fasta"
                ],
                "example": {
                  "job_name": "annotator-demo",
                  "fasta": ">heavy\nEVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS\n>light\nDIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIK",
                  "numbering_scheme": "imgt",
                  "receptor_type": "antibody",
                  "report_liabilities": true
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/placer/": {
      "get": {
        "summary": "PLACER field schema",
        "description": "Generate an ensemble of protein-ligand poses and side-chain conformations. Given a protein pocket and ligand, estimates how the ligand and sidechains will arrange themselves.",
        "operationId": "placer_schema",
        "tags": [
          "PLACER"
        ],
        "responses": {
          "200": {
            "description": "The tool's metadata and its input fields.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Queue a PLACER job",
        "description": "Generate an ensemble of protein-ligand poses and side-chain conformations. Given a protein pocket and ligand, estimates how the ligand and sidechains will arrange themselves. Runs PLACER (Protein-Ligand Atomistic Conformational Ensemble Resolver), a graph network that denoises corrupted atomic coordinates back to plausible ones. Given a structure and approximate knowledge of the binding site, it samples an ensemble of ligand poses and side-chain conformations rather than a single answer, with a predicted uncertainty (prmsd) per sample.",
        "operationId": "placer_submit",
        "tags": [
          "PLACER"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "placer-demo"
                  },
                  "structure_file": {
                    "type": "string",
                    "title": "Structure (PDB or mmCIF)",
                    "description": "Only mmCIF files from RCSB are correctly parsed; PDB is the safer choice otherwise. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE A PROTEIN-LIGAND STRUCTURE HERE"
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Samples",
                    "description": "50-100 is a good number for docking; fewer is fine for side-chain conformations alone. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 500,
                    "default": 10
                  },
                  "predict_ligand": {
                    "type": "string",
                    "title": "Ligands to predict (optional)",
                    "description": "Comma-separated ligand IDs, as name3, name3-resno, or chain-name3-resno. Empty predicts every ligand present. A single line of text."
                  },
                  "fixed_ligand": {
                    "type": "string",
                    "title": "Ligands to hold fixed (optional)",
                    "description": "Comma-separated ligand IDs kept at their input coordinates instead of being predicted. A single line of text."
                  },
                  "target_res": {
                    "type": "string",
                    "title": "Crop-center residue (optional)",
                    "description": "A protein residue, as chain-resno. Required when the input has no ligand at all. A single line of text.",
                    "maxLength": 40
                  },
                  "exclude_common_ligands": {
                    "type": "boolean",
                    "title": "Exclude common crystallography additives",
                    "description": "Drops solvents and crystallography additives (AlphaFold 3's exclusion list) before predicting. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "predict_multi": {
                    "type": "boolean",
                    "title": "Predict every allowed ligand",
                    "description": "Scores every eligible ligand rather than only the ones named in predict_ligand. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "rerank": {
                    "type": "string",
                    "title": "Rank output by",
                    "description": "One of the field's option values.",
                    "enum": [
                      "prmsd",
                      "plddt",
                      "plddt_pde",
                      "none"
                    ],
                    "default": "prmsd"
                  },
                  "use_small_molecule": {
                    "type": "boolean",
                    "title": "Include the small molecule",
                    "description": "Off predicts side chains only (apo), ignoring any ligand in the input. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "structure_file"
                ],
                "example": {
                  "job_name": "placer-demo",
                  "structure_file": "HEADER    PASTE A PROTEIN-LIGAND STRUCTURE HERE",
                  "num_samples": 10,
                  "predict_ligand": "",
                  "fixed_ligand": "",
                  "target_res": "",
                  "exclude_common_ligands": false,
                  "predict_multi": false,
                  "rerank": "prmsd",
                  "use_small_molecule": true
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_name": {
                    "type": "string",
                    "title": "Job name",
                    "description": "A single line of text.",
                    "default": "placer-demo"
                  },
                  "structure_file": {
                    "type": "string",
                    "title": "Structure (PDB or mmCIF)",
                    "description": "Only mmCIF files from RCSB are correctly parsed; PDB is the safer choice otherwise. The file's text, not a path and not a multipart upload. The web form reads the chosen file in the browser and posts its contents under this name; an API client sends the same text directly. Some tool presets also supply bio-tools:// references to their bundled input assets.",
                    "default": "HEADER    PASTE A PROTEIN-LIGAND STRUCTURE HERE"
                  },
                  "num_samples": {
                    "type": "number",
                    "title": "Samples",
                    "description": "50-100 is a good number for docking; fewer is fine for side-chain conformations alone. A number, within the range given for the field.",
                    "minimum": 1,
                    "maximum": 500,
                    "default": 10
                  },
                  "predict_ligand": {
                    "type": "string",
                    "title": "Ligands to predict (optional)",
                    "description": "Comma-separated ligand IDs, as name3, name3-resno, or chain-name3-resno. Empty predicts every ligand present. A single line of text."
                  },
                  "fixed_ligand": {
                    "type": "string",
                    "title": "Ligands to hold fixed (optional)",
                    "description": "Comma-separated ligand IDs kept at their input coordinates instead of being predicted. A single line of text."
                  },
                  "target_res": {
                    "type": "string",
                    "title": "Crop-center residue (optional)",
                    "description": "A protein residue, as chain-resno. Required when the input has no ligand at all. A single line of text.",
                    "maxLength": 40
                  },
                  "exclude_common_ligands": {
                    "type": "boolean",
                    "title": "Exclude common crystallography additives",
                    "description": "Drops solvents and crystallography additives (AlphaFold 3's exclusion list) before predicting. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "predict_multi": {
                    "type": "boolean",
                    "title": "Predict every allowed ligand",
                    "description": "Scores every eligible ligand rather than only the ones named in predict_ligand. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": false
                  },
                  "rerank": {
                    "type": "string",
                    "title": "Rank output by",
                    "description": "One of the field's option values.",
                    "enum": [
                      "prmsd",
                      "plddt",
                      "plddt_pde",
                      "none"
                    ],
                    "default": "prmsd"
                  },
                  "use_small_molecule": {
                    "type": "boolean",
                    "title": "Include the small molecule",
                    "description": "Off predicts side chains only (apo), ignoring any ligand in the input. Either a JSON boolean, or one of the strings \"1\", \"true\", \"yes\", or \"on\" for true; anything else reads as false.",
                    "default": true
                  },
                  "notify_email": {
                    "type": "string",
                    "format": "email",
                    "title": "Notify by email",
                    "description": "Mail this address the moment the run finishes, with a link to its results. Omit it, or send an empty string, to be told nothing."
                  }
                },
                "required": [
                  "structure_file"
                ],
                "example": {
                  "job_name": "placer-demo",
                  "structure_file": "HEADER    PASTE A PROTEIN-LIGAND STRUCTURE HERE",
                  "num_samples": 10,
                  "predict_ligand": "",
                  "fixed_ligand": "",
                  "target_res": "",
                  "exclude_common_ligands": false,
                  "predict_multi": false,
                  "rerank": "prmsd",
                  "use_small_molecule": true
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Queued. Poll the job for the result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be read.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/jobs/%7Bjob_id%7D/": {
      "get": {
        "summary": "Poll a queued job",
        "operationId": "job_status",
        "tags": [
          "Jobs"
        ],
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The id returned when the job was submitted."
          }
        ],
        "responses": {
          "200": {
            "description": "The job as it stands now.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "404": {
            "description": "No job has that id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/jobs/%7Bjob_id%7D/abort/": {
      "post": {
        "summary": "Give up on a queued or running job",
        "description": "A job that has not started never runs. One already running is abandoned rather than killed: its result is discarded and it settles as `cancelled`, but the tool's process finishes on its own. Only the submitter may abort a job.",
        "operationId": "job_abort",
        "tags": [
          "Jobs"
        ],
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The id returned when the job was submitted."
          }
        ],
        "responses": {
          "200": {
            "description": "The job, as it was when it was given up on.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "404": {
            "description": "No job has that id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "That job had already finished.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Job": {
        "type": "object",
        "required": [
          "id",
          "tool",
          "status",
          "status_url",
          "submitted_at"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "tool": {
            "type": "string",
            "description": "The slug of the tool that runs it."
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "running",
              "succeeded",
              "failed",
              "cancelled"
            ]
          },
          "status_url": {
            "type": "string"
          },
          "abort_url": {
            "type": "string",
            "description": "Where to POST to give up on it; present only while there is still something to give up on."
          },
          "cancel_requested": {
            "type": "boolean",
            "description": "Set once it has been aborted but is still executing: the result will be discarded."
          },
          "submitted_at": {
            "type": "string",
            "format": "date-time"
          },
          "started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "position": {
            "type": "integer",
            "description": "Jobs ahead of this one; queued jobs only."
          },
          "result": {
            "type": "object",
            "description": "The tool's output; succeeded jobs only.",
            "additionalProperties": true
          },
          "license": {
            "type": "object",
            "description": "Terms the result came under; succeeded jobs only.",
            "properties": {
              "type": {
                "type": "string"
              },
              "details": {
                "type": "string"
              }
            }
          },
          "error": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Error"
              }
            ],
            "description": "Why it failed; failed jobs only."
          }
        }
      },
      "JobResponse": {
        "type": "object",
        "required": [
          "ok",
          "job"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "job": {
            "$ref": "#/components/schemas/Job"
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "invalid_input",
              "tool_unavailable",
              "execution_failed",
              "internal_error",
              "not_found"
            ]
          },
          "message": {
            "type": "string"
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "required": [
          "ok",
          "error"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}