Workflow
If boltz-api is missing from PATH, use boltz-cli-setup for install/update guidance before retrying.
If a command reports missing or expired authentication, use boltz-cli-setup to start boltz-api auth login --device-code before retrying; do not ask permission first.
If the agent host sandbox blocks boltz-api install/auth/API calls, use boltz-cli-setup to request the host sandbox bypass/escalation needed for user-wide CLI install, browser login, credential storage, temp files, or API access before retrying.
Use this skill when the user wants de novo protein / peptide / antibody / nanobody binders.
-
Decide on target exploration first (new targets). For a new target where the user hasn't already fixed the binding site and crop, your first action — before authoring a payload, normalizing the target, or running
estimate-cost— is to raise the choice between a target-exploration pass and designing directly, with a recommendation for this target:- Unknown site, or a multi-domain / large target → recommend exploration (it scouts different input configurations for generation, ≈50 designs each, and finds the best before a full run).
- A well-characterized site → it's fine to recommend going (mostly) direct, perhaps with a quick check of whether conditioning on the epitope beats letting the model find its own spot. State this plainly, as part of a conversation with the user about their target and goals, and let them choose.
Phrase it as a question that works with the user (they may know their target's biology), e.g.:
"This is a fresh target — I'd suggest a quick exploration pass that scouts a few framings and picks the best before a full run. Or, if you already know the site and crop, we can design directly. Which would you like?"
Do not mention a campaign size or tier here — not even folded into this opening approach question. The full-run size is settled later, after the scouting runs pick a winner (its yield informs the tier), so don't ask it up front when exploration is on the table. If the user opts into exploration — or has already said they want to explore / let the design find its own epitope — read references/target-exploration.md [blocked], follow it, then resume at step 8 with the chosen framing and recommended
num_proteins. If they want to design directly, continue below. -
Normalize the target (same shape as protein-screen):
structure_templateif a CIF/PDB is available, elseno_template. -
Pick the
binder_specificationvariant. Supported variants include:boltz_curated— recommended default for antibody and nanobody design. Boltz selects from maintained scaffold/template lists (binder: boltz_antibodyorboltz_nanobody).structure_template— redesign motifs in an existing binder scaffold (CIF +design_motifswithreplacement/insertionsegments).no_template— generate from the sequence DSL (fixed residues + designed segments like5..10or8).
-
For antibody or nanobody requests, ask before authoring the payload: "I recommend Boltz's curated antibody/nanobody scaffolds for this. Do you want the curated default, or do you have custom scaffold structures/CDR motifs to use?" If the user picks curated, use
type: boltz_curated; if they want custom scaffold control, usetype: structure_template. -
Pick
modality:peptide,antibody,nanobody, orcustom_proteinforstructure_templateandno_template(usecustom_proteinfor a "miniprotein" or generic "protein binder"). If the user already named the modality, take it as given — don't ask again. Do not includemodalityonboltz_curated; usebinderinstead. -
Pick
num_proteins— see Run sizing. Valid range is 10 to 1,000,000 (server rejects outside it); 10 is the hard floor but it is a test size, not a campaign. When the user has not given a count, propose a campaign tier (default 50,000), not the floor. -
Supported optional features include rules such as excluded amino acids, excluded sequence motifs with
Xwildcards, and max hydrophobic fraction. Addrulesonly on request; read references/api.md [blocked] for exact shapes and examples. -
Author the payload YAML or JSON, then run
estimate-costand apply the spending gate (Always Do This) beforestart. (Cost model — tiered by total complex length,estimate-costis the only source: see## Cost[blocked] in api.md.) -
startto submit. Capture the ID. -
Launch
download-resultsthrough the runtime's long-running or non-blocking command facility. Use the mechanism the runtime documents; consultboltz-cli-setupif unsure. After launching the downloader, always report the job ID, run name, and output directory. If the runtime can schedule follow-up checks, schedule adownload-statuscheck and state the cadence; otherwise include thedownload-statuscommand. -
Rank from
<output-root>/<run-name>/results/index.jsonlbybinding_confidencedescending. Useiptmandmin_interaction_paeas tiebreakers.optimization_scoreis not emitted for this endpoint. Read references/results.md [blocked] for output layout and metric details.
Run sizing
De novo design is a generate-and-filter campaign: you make many binders and keep the rare good ones, so a real run is large. Do not anchor on the num_proteins floor of 10 — that is only useful for a quick setup test. When the user names a count, honor it (≥10). When they do not, explain the tiers and propose one:
Present the tiers as design counts, not dollars: don't put a price next to a tier unless estimate-cost returned it — run estimate-cost on the tier the user leans toward and show that figure, and never extrapolate one estimate across the others. Then apply the spending gate (Always Do This) before submitting. If the setup is unproven, suggest a small test run (tens of designs) or the full target-exploration [blocked] pass first.
Command Pattern
Payload keys are num_proteins, target, binder_specification — API body field names.
Always Do This
- For a new target, your first move is the step-1 conversation — never jump straight to a payload. Establish what the binder is for and whether the user has already fixed the binding site/crop, then recommend a target-exploration pass vs. designing directly and let them choose (step 1). Only normalize the target and author a payload after that. If they've already fixed the site/crop or explicitly want to design directly, proceed.
- Enforce
10 <= num_proteins <= 1,000,000before callingestimate-cost(server rejects outside that range), but 10 is the floor, not a campaign — see Run sizing and propose a tier (default 50,000) when the user gives no count. - Spending gate — explicit go-ahead before every
start.startspends real money. A plan you already described, an earlier phase's approval, or a cost that looks "trivial" are not authorization — even a cheap run needs a fresh yes. Runestimate-cost, show theestimated_cost_usdit returns (summed for a batch), and wait for the user to say go. This holds even when tool calls are pre-approved (accept-edits / auto-accept / bypass modes) — there you are the only cost gate. Never quote or assume a dollar figure you didn't get fromestimate-cost(cost model:## Cost[blocked] in api.md). - For antibody or nanobody design, recommend
binder_specification.type: boltz_curatedand ask the user to confirm they do not want custom scaffold/CDR control before building the payload. Usebinder: boltz_antibodyfor antibody/Fab requests andbinder: boltz_nanobodyfor nanobody/VHH requests. - Residue indices are 0-based everywhere (
design_motifs.start_index/end_index,after_residue_index,epitope_residues,flexible_residues, bonds, constraints). - For CIF/PDB bytes, use
@data:///abs/path/file.cifinsidestructure.data. Don't use bare@path. - Sequence DSL for
designed_protein.value: uppercase letters = fixed residues; integerN= exactlyNdesigned residues;MIN..MAX= variable-length designed segment. Examples:"20","5..10","ACDE8GHI","MKTAYI5..10VKSHFSRQ". - Keep payload field names exactly as the API body names shown in
references/api.md. - Use absolute paths for the output root, payload files, and embedded target files. Do not
cdinto the run directory for follow-up commands; pass the same--root-dirand use absolute paths so later relative paths do not drift. - Prefer one merged top-level payload via
--input @yaml:///absolute/path/payload.yamlor@json:///absolute/path/payload.jsonforestimate-costandstart. Keep--idempotency-keyand--workspace-idtop-level; if they also appear inside--input, the top-level flags win. - Direct object flags still work as overrides, such as
--target @yaml:///absolute/path/target.yamlor--binder-specification @json:///absolute/path/binder.json. Piped YAML / JSON on stdin also works, but it must use API body field names. Use the same slug for both--idempotency-keyand--name. - In permission-gated runtimes, keep each Boltz call as a top-level command that starts with
boltz-api. Prefer concrete arguments oversh -c, inline environment assignments, aliases, wrapper scripts, loops, or pipelines around theboltz-apiinvocation unless the user already allowed that exact command form. Use--raw-output --transform id, read the printed ID, then paste that literal ID into the nextdownload-resultscommand. - Run
download-resultsthrough the runtime's long-running or non-blocking command facility, using the mechanism the runtime documents rather than tool arguments you assume exist. Do not detach it with shell&ornohupunless the runtime documents shell backgrounding as its supported mode; some tool runners reap shell-backgrounded children before.boltz-run.jsonis written. If unsure how this runtime handles long-running commands, consultboltz-cli-setup. - After the download starts, do not manually wait on it or run ad hoc polling loops. Wall-clock time scales roughly with
num_proteins: under 100 often finishes in a few minutes, 100-1,000 may take several minutes to tens of minutes, and larger runs can take longer or hours depending on inputs and system load. Don't quote a fixed duration.--poll-interval-seconds 60is a sensible downloader default.download-resultsemits JSONL progress on stderr by default; add--progress-format text --verboseonly when you explicitly want human-readable logs. - If the runtime can schedule follow-up checks (a heartbeat, scheduled task, or reminder), schedule one after launching
download-results. It should runboltz-api --format json download-status --name "<run-name>" --root-dir "/absolute/path/boltz-experiments", post only material status changes or terminal completion/failure, and stop once terminal. Choose cadence bynum_proteins: under 100 -> every 1-2 minutes; 100-1,000 -> every 5 minutes; over 1,000 -> every 15 minutes. If the runtime cannot schedule follow-ups, do not claim an automatic next check: report the job ID, run name, output directory, and thedownload-statuscommand. Poll a saved session handle only for interactive, user-requested progress checks; never run a manual poll loop in the current turn. - If detached download needs to be restarted, re-run
boltz-api download-resultswith the same--name "<run-name>"and the same--root-dir. - Only add
ruleson explicit user request.
Escape Hatch
- Payload reference: https://api.boltz.bio/docs/api/resources/protein/subresources/design/methods/start/
- CLI flag names:
boltz-api protein:design start --help
Read references/api.md [blocked] for all binder_specification variants, motif shapes, sequence DSL, rules, modalities, and target variants. Read references/results.md [blocked] after download when ranking designed binders or explaining outputs.
Outputs
Rank from results/index.jsonl after download-results; use references/results.md [blocked] for local file layout, metric meanings, and the designed-binder entity type gotcha.

