---
title: Chai-1 inputs and parameters
description: 'Chain entries are chain_id, sequence_type and sequence; protein only. Three sampling parameters are not read — the run is fixed at 3 recycles, 200 steps.'
---

A Chai-1 job is a list of chain entries. There is no receptor-structure input and no pocket definition: the chains go in as sequences and the model folds them together.

## Chain entries

`sequences` is required. Each entry carries three fields.

- `chain_id` (string) —
  Chain identifier, for example `A`, `B`, `L`.

- `sequence_type` ("protein" | "dna" | "rna" | "ligand") —
  The declared entity type.

- `sequence` (string) —
  The sequence for that chain.

> `sequence_type` decides how the entry is folded. An entry typed `protein`, or one that declares no type, becomes a protein record, in the order supplied, with chain IDs assigned `A`, `B`, `C`… An entry typed `ligand` is folded as a small molecule from its SMILES, and a job carries at most one of those. An entry typed `dna`, `rna` or `glycan` is **refused** rather than folded: there is no record for those entities here, and folding one as a protein chain would return a scored structure of a different molecule. Use [Boltz-2](/docs/boltz2) for a complex containing DNA or RNA.

A job with nothing to fold is rejected at parameter-parse time rather than returning a confidently scored structure of some default — one chain entry is the minimum.

## Sampling parameters

- `num_trunk_recycles` (integer) —
  Range 1–20. More recycles generally sharpen the prediction and cost proportionally more GPU time.

- `num_diffusion_steps` (integer) —
  Range 10–500. Fewer steps trade accuracy for speed; more steps cost proportionally more GPU time.

- `output_format` ("pdb" | "mmcif") —
  **Not applied:** the structure always comes back as mmCIF text, whichever value you send.

Both sampling parameters are applied, and the result reports the values the run used alongside the scores, so two runs of the same complex can be compared. They also both scale runtime: a request near the top of both ranges on a large complex can exhaust the job's time budget and fail terminally rather than returning a slower answer. The run also uses a fixed seed and ESM embeddings, and folds in single-sequence mode — no MSA and no templates, so nothing leaves the platform.

## Example chain list

```json
{
  "sequences": [
    { "chain_id": "A", "sequence_type": "protein", "sequence": "MKWVTFISLLLLFSSAYSRGVFRR" },
    { "chain_id": "B", "sequence_type": "protein", "sequence": "GAMGSEFDLMRYWLQAGLSGIHTFCRGKPAGKYV" }
  ]
}
```

A protein–ligand complex adds one entry typed `ligand`, whose `sequence` is the SMILES:

```json
{
  "sequences": [
    { "chain_id": "A", "sequence_type": "protein", "sequence": "MKWVTFISLLLLFSSAYSRGVFRR" },
    { "chain_id": "B", "sequence_type": "ligand", "sequence": "CC(=O)Oc1ccccc1C(=O)O" }
  ]
}
```

## Read next
