mcpField
C
chai

chai

github.com/adaptyvbioOther17239 installsUpdated 20w ago
Repository

About chai

chai is a skill for running Chai-1 protein structure predictions from FASTA inputs. It covers protein complexes, ligands, and nucleic acids, and explains prediction outputs and confidence metrics for research workflows.

Key features

  1. 01Predict protein complexes
  2. 02Support protein-ligand and protein-DNA/RNA inputs
  3. 03Run via Modal, API, or local installation
  4. 04Export CIF models and confidence metrics
  5. 05Configure recycling and diffusion steps

Use cases

  1. 01Validating a binder-target complex
  2. 02Predicting protein-small molecule structures
  3. 03Running predictions on multiple FASTA files
  4. 04Reviewing model scores and confidence

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/adaptyvbio/protein-design-skills --skill chai

After installing, type/chaiin Claude Code to confirm it loaded.

Bundled filesreferences/api-reference.md

Details

From the project README

Chai-1 Structure Prediction

Prerequisites

RequirementMinimumRecommended
Python3.10+3.11
CUDA12.0+12.1+
GPU VRAM24GB40GB (A100)
RAM32GB64GB

How to run

First time? See Getting started to set up Modal and biomodals.

Option 1: Modal
cd biomodals
modal run modal_chai1.py \
  --input-faa complex.fasta \
  --out-dir predictions/

GPU: A100 (40GB) | Timeout: 30min default

Option 2: Chai API (recommended)
pip install chai_lab

python -c "
import chai_lab
from chai_lab.chai1 import run_inference

# Run prediction
run_inference(
    fasta_file='complex.fasta',
    output_dir='predictions/',
    num_trunk_recycles=3
)
"
Option 3: Local installation
git clone https://github.com/chaidiscovery/chai-lab.git
cd chai-lab
pip install -e .

chai-lab predict \
  --fasta complex.fasta \
  --output predictions/

FASTA Format

Protein complex
>binder
MKTAYIAKQRQISFVKSHFSRQLE...
>target
MVLSPADKTNVKAAWGKVGAHAGE...
Protein + ligand
>protein
MKTAYIAKQRQISFVKSHFSRQLE...
>ligand|smiles
CCO
Protein + DNA/RNA
>protein
MKTAYIAKQRQISFVKSHFSRQLE...
>dna
ATCGATCGATCG

Key parameters

ParameterDefaultRangeDescription
num_trunk_recycles31-10Recycles (more = better)
num_diffn_timesteps20050-500Diffusion steps
seed0intRandom seed

Output format

predictions/
├── pred.model_idx_0.cif    # Best model (CIF format)
├── pred.model_idx_1.cif    # Second model
├── scores.json             # Confidence scores
├── pae.npy                 # PAE matrix
└── plddt.npy               # pLDDT values

Note: Chai-1 outputs CIF format. Convert to PDB if needed:

from Bio.PDB import MMCIFParser, PDBIO
parser = MMCIFParser()
structure = parser.get_structure("pred", "pred.model_idx_0.cif")
io = PDBIO()
io.set_structure(structure)
io.save("pred.model_idx_0.pdb")
Extracting metrics
import numpy as np
import json

# Load scores
with open('predictions/scores.json') as f:
    scores = json.load(f)

plddt = np.load('predictions/plddt.npy')
pae = np.load('predictions/pae.npy')

print(f"pLDDT: {plddt.mean():.3f}")
print(f"pTM: {scores['ptm']:.3f}")
print(f"ipTM: {scores.get('iptm', 'N/A')}")

Use cases

Binder validation
# Predict complex with Chai
chai-lab predict --fasta binder_target.fasta --output val/

# Check ipTM > 0.5
scores = json.load(open('val/scores.json'))
if scores['iptm'] > 0.5:
    print("Design passes validation")
Protein-ligand complex
# FASTA with SMILES
fasta = """
>protein
MKTA...
>ligand|smiles
CCO
"""

# Chai handles both protein and small molecules
Batch prediction
# Multiple sequences
for fasta in sequences/*.fasta; do
    chai-lab predict \
        --fasta "$fasta" \
        --output "predictions/$(basename $fasta .fasta)"
done

Comparison with AF2

AspectChai-1AlphaFold2
MSA requiredNoYes
Small moleculesYesNo
DNA/RNAYesLimited
SpeedFasterSlower
AccuracyComparableReference

Sample output

Successful run
$ chai-lab predict --fasta complex.fasta --output predictions/
[INFO] Loading Chai-1 model...
[INFO] Running inference...
[INFO] Saved 5 models to predictions/

predictions/scores.json:
{
  "ptm": 0.82,
  "iptm": 0.71,
  "ranking_score": 0.76
}

What good output looks like:

  • pTM: > 0.7 (confident global structure)
  • ipTM: > 0.5 (confident interface, > 0.7 for high confidence)
  • CIF files with reasonable atom positions

Decision tree

Should I use Chai?
│
├─ What are you predicting?
│  ├─ Protein-protein complex → Chai ✓ or ColabFold
│  ├─ Protein + small molecule → Chai ✓
│  ├─ Protein + DNA/RNA → Chai ✓
│  └─ Single protein only → Use ESMFold (faster)
│
├─ Need MSA?
│  ├─ No / want speed → Chai ✓
│  └─ Yes / want accuracy → ColabFold
│
└─ Priority?
   ├─ Highest accuracy → ColabFold with MSA
   ├─ Speed / no MSA → Chai ✓
   └─ Ligand binding → Chai ✓

Typical performance

Campaign SizeTime (A100)Cost (Modal)Notes
100 complexes30-60 min~$10Standard validation
500 complexes2-4h~$45Large campaign
1000 complexes5-8h~$90Comprehensive

Per-complex: ~20-40s for typical binder-target complex.


Verify

find predictions -name "*.cif" | wc -l  # Should match input count

Troubleshooting

Low pLDDT: Increase num_trunk_recycles Low ipTM: Check chain order, interface region OOM errors: Use A100-80GB or reduce batch Slow prediction: Reduce num_diffn_timesteps

Error interpretation
ErrorCauseFix
RuntimeError: CUDA out of memoryComplex too largeUse A100-80GB or split prediction
KeyError: 'iptm'Single chain predictedEnsure FASTA has multiple chains
ValueError: invalid SMILESMalformed ligandValidate SMILES with RDKit
torch.cuda.OutOfMemoryErrorGPU exhaustedReduce num_diffn_timesteps to 100

Next: protein-qc for filtering and ranking.

Comments

Markdown supported