Boltz Protein Design
OpenAIOfficialCreated by BoltzDistributed by OpenAI
- Skill
- Tool integration
- Science and research
- MIT
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured workflow for designing new protein binders. It guides users through target normalization, binder specification selection, and campaign sizing. The process includes a mandatory cost estimation step and requires explicit user authorization before initiating any design run. It supports multiple design modalities, including curated antibody/nanobody scaffolds, structure-templated redesigns, and sequence-based generation.
What it does
- Designs de novo protein, peptide, antibody, and nanobody candidates.
- Supports target exploration for unknown or complex binding sites.
- Provides cost estimation for design campaigns based on target and binder parameters.
- Manages the submission and background download of generated design results.
- Ranks generated binders based on binding confidence and interaction metrics.
When to use it
- When you need to generate novel protein binders for a specific target.
- When you require antibody or nanobody candidates.
- When you have a well-characterized binding site and want to design directly.
- When you need to explore potential binding sites on a new or large target.
Advantages
- Integrates directly with the Boltz API for end-to-end design workflows.
- Enforces a mandatory spending gate to prevent unauthorized costs.
- Provides standardized ranking metrics for evaluating generated binder candidates.
- Supports flexible design specifications from curated scaffolds to custom motifs.
Usage examples
- “I need to design a nanobody for this target protein structure.”
- The agent will initiate the target exploration or direct design workflow, confirm the use of curated nanobody scaffolds, and guide you through cost estimation before submission.
- “Design a peptide binder for this specific epitope.”
- The agent will normalize the target, configure the peptide design parameters, and prepare the payload for cost estimation.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/openai/boltz-protein-design/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip boltz-protein-design.zip -d .agents/skills
Documentation by Boltz
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, 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 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## Costin api.md.)startto submit. Capture the ID.Launch
download-resultswith the agent runtime's background/non-blocking command facility. In Claude Code, use Bash withrun_in_background: true. In Codex, rundownload-resultsas a foreground shell command withyield_time_ms: 1000; if Codex returns asession_id, keep it for optional same-thread polling, but treatdownload-statusplus the run directory as the durable source of truth. In Codex app/desktop runtimes that expose same-thread heartbeat automations, create a heartbeat that checksdownload-statusperiodically and posts a concise completion or failure update when the download reaches a terminal state. After launching the downloader, always report the job ID, run name, and output directory. Include the next check cadence if the heartbeat was created; 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 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:
| Tier | num_proteins | When |
|---|---|---|
| Small screen | 20,000 | Quick look / tight budget |
| Medium (recommended) | 50,000 | Default for a real campaign |
| Large | 100,000 | Hard target / maximal coverage |
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 pass first.
Command Pattern
# Replace placeholders with concrete absolute paths before running.
# Use a short descriptive run name, for example: protein-design-<modality>-<target>-v1
boltz-api protein:design estimate-cost \
--input @yaml:///absolute/path/payload.yaml
boltz-api protein:design start \
--idempotency-key "<run-name>" \
--input @yaml:///absolute/path/payload.yaml \
--raw-output --transform id
# Copy the printed job ID into this command, then launch it in the agent
# runtime's background/non-blocking mode.
# Claude Code: Bash with run_in_background=true.
# Codex: foreground shell command with yield_time_ms=1000; keep the returned session_id if one is provided.
# Do not append "&" or use nohup in Codex.
boltz-api download-results \
--id "<job-id-from-start>" --name "<run-name>" \
--root-dir "/absolute/path/boltz-experiments" \
--poll-interval-seconds 60Payload 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:## Costin 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 agents such as Claude Code, 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.Prefer the agent runtime's background/non-blocking command mode for
download-results. In Codex specifically, keepdownload-resultsin the foreground and set the shell tool yield to 1000 ms; Codex will return asession_idif the command is still running. Do not append&or usenohupin Codex because the tool runner may clean up shell-backgrounded descendants before.boltz-run.jsonis fully written.After the background/session 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.In Codex app/desktop runtimes with same-thread heartbeat automation support, schedule a heartbeat after launching
download-results. The heartbeat should runboltz-api --format json download-status --name "<run-name>" --root-dir "/absolute/path/boltz-experiments"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. Post only material status changes or terminal completion/failure. Poll the savedsession_idwith an emptywrite_stdinonly for interactive, user-requested progress checks. Never run a manual poll loop in the current turn.If the current host has no heartbeat automation support, do not claim an automatic next check. Report the job ID, run name, output directory, and the command needed to check
download-status.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 for all binder_specification variants, motif shapes, sequence DSL, rules, modalities, and target variants. Read references/results.md after download when ranking designed binders or explaining outputs.
Outputs
Rank from results/index.jsonl after download-results; use references/results.md for local file layout, metric meanings, and the designed-binder entity type gotcha.
Files
- ATTRIBUTION.mdAdded by AutoGineer918 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md13.9 KiB
- agents/openai.yaml223 B
- references/api.md12.0 KiB
- references/results.md1.1 KiB
- references/target-exploration.md16.1 KiB
- scripts/_common.pyScript2.7 KiB
- scripts/analyze_results.pyScript2.4 KiB
- scripts/crop_radius.pyScript2.8 KiB
- scripts/detect_disorder.pyScript3.2 KiB
- scripts/requirements.txt227 B
- scripts/scan_sites.pyScript6.3 KiB
- scripts/terminus.pyScript1.6 KiB
references/target-exploration.md
Target Exploration — pre-design scouting
Read this when the user opts into the target-exploration pass from
boltz-protein-design. It selects different generations configs with respect to the target before
committing compute to a full design run, then hands back a chosen configuration
(crop + optional binding site) and a recommended num_proteins for the full
run. If the user already knows their target, site, and crop, do not run this
— go straight back to authoring the full payload.
These framing axes apply to every binder modality — peptide, miniprotein, nanobody, and antibody. The axes frame the target, so they are independent of what kind of binder you design.
Contents
Mental model: a grid we sample, not a full grid
Bundled scripts and dependency probe
Indexing contract (read before cropping)
Step 0 — what is the binder for?
Step 1 — trim unresolved N/C termini (always)
Step 2 — choose which axes to scout
Step 3 — scout: 50 designs per config
Step 4 — pick the winning config by max binding_confidence
Step 5 — size and submit the full run
Step 6 — post-run yield readout
Mental model
The exploration procedure is best thought of a set of axes that can be varied in the input configuration to the generation endpoint that modify the underlying models view of the target. Each axis changes which target residues the model sees and whether or not we condition on a specified binding site. This process should be conducted as an interactive discussion with the user, who may have their own domain knowledge or preferences about how to design binders against a target.
Don't start by immediately using the full Cartesian product of the axes, as this will cause a combinatorial blowup of screening runs. For categorial axes, the entire axis should be explored in one set of exploration runs, for example, every domain should be designed against unless the user actively modifies this. For multi-valued axes like crop radius, only select a couple of values (not all five) to avoid combinatorial blowup, unless the user actively requests it. Before any exploration, the irrelevant residues at the termini should be trimmed. Scouting runs ask for 50 designs, and the best configuration is ultimately selected for the full size design run.
The axes:
| Axis | What it varies | How |
|---|---|---|
| Termini (always) | Drop floppy unmodeled N/C overhang | First/last resolved residue |
| Disorder cutout | Remove internal loopy/disordered stretches | detect_disorder.py |
| Crop radius | Keep only residues near the site | crop_radius.py (10/15/25/30/35 Å) |
| Site specified or not | Specify the epitope, or let the binder find its own site | include/omit epitope_residues |
| Domain | Full target vs one domain at a time | fetch CATH/Pfam annotations online |
| Scan (>300 aa and unknown site) | Discover where binders actually land | scan_sites.py |
Why bother: unmodeled terminal residues add floppy overhang that hurts designs; binders frequently dock off-site and crop/epitope indices are easy to misread, so testing a different configurations cheaply reveals which one yields good binders before spending on a large run.
Bundled scripts and dependency probe
The geometry/analysis scripts live in scripts/ next to this skill and need
Python 3.9 or newer with gemmi and numpy. Probe the active interpreter
first; only install if it fails — many users already have a suitable env.
# Probe (run from the skill directory; adjust the path to scripts/ as needed)
python3 -c "import gemmi, numpy" && echo DEPS_OKIf that prints DEPS_OK, run the scripts with python3 directly. If it errors,
explain that the next command downloads and installs the exact gemmi and
numpy versions pinned in requirements.txt from PyPI, then obtain the user's
explicit approval before the network install. After approval, install them into
a throwaway venv and use that interpreter:
python3 -m venv /tmp/boltz-explore-venv
/tmp/boltz-explore-venv/bin/pip install -r scripts/requirements.txt
# then call /tmp/boltz-explore-venv/bin/python instead of python3 belowIndexing contract
Every script emits and consumes 0-based API residue indices — the same
indices crop_residues, epitope_residues, and flexible_residues use in the
payload. The mapping is API index = canonical label_seq_id − 1. The scripts
read label_seq from the CIF (not author numbering) so crop lists drop straight
into the payload with no offset arithmetic — do not reintroduce auth-number
offsets. When in doubt, spot-check one or two mapped indices against the target
sequence before submitting; viz confirmation is deferred to a later skill, so
this sanity check is your guardrail.
Step 0 — what is the binder for?
The user has engaged exploration, so first briefly establish what they want the binder to do — block a specific interaction/function, serve as a research or diagnostic tool, or just be any tractable binder against the target. This is a quick discussion (they may have domain knowledge about the target or other priors), and it shapes the whole pass: which sites/domains are worth scouting, whether to specify a site, and how to weigh the winner later (a highly designable but off-purpose site may not be what they want). Carry that goal through to the winner discussion.
Step 1 — trim unresolved N/C termini (always)
Never include leading or trailing residues that are unresolved in the structure — drop any unmodeled residues at each end so the crop starts and ends at the first and last resolved residue. This applies to the baseline and to every crop variant below. (Internal unresolved residues — disordered loops — are handled separately in the disorder axis, not here.)
Determine the bounds by reading the CIF: the crop starts at the first resolved
label_seq and ends at the last resolved label_seq. Express the kept range as
0-based API indices in crop_residues. For a large structure you may use
scripts/terminus.py <target.cif> --chain A to print the first/last resolved
API index, but reading the CIF directly is fine.
Step 2 — choose which axes to scout
Cover each axis that applies — don't pre-judge which configuration will win. The only places to hold back: sample ~2 crop radii rather than all five, and don't multiply axes together into the full cross-product. Otherwise explore each axis fully — e.g. every domain, and with/without the site. This is an interactive discussion with the user. Sensible defaults:
Baseline — full target, termini trimmed, design spec as given.
Disorder cutout — if the target has internal disordered/loopy regions, add a configuration that crops them away:
# predicted target (pLDDT in the B-factor column) — default mode: python3 scripts/detect_disorder.py <target.cif> --chain A --min-loop 10 # experimental target (real B-factors): high B = mobile python3 scripts/detect_disorder.py <target.cif> --chain A --mode bfactorIt flags internal low-confidence/high-mobility runs longer than
--min-loop(default 10) and prints the keptcrop_residues(0-based) with those runs removed; terminal runs are left to terminus trimming. This is the weakest axis — it is a confidence/mobility heuristic, not a true disorder detector — so treat the suggestion as a hint and confirm it looks reasonable.Binding-site crop radius — if a binding site is known, crop to residues within a radius of the site (all-atom). Scout a couple of radii rather than all five:
python3 scripts/crop_radius.py <target.cif> --chain A \ --site 42,43,44 --radii 15,25,35--sitetakes 0-based API indices. For each radius it prints the keptcrop_residues. Run each radius twice as separate configs: once with the site inepitope_residues, once without — specifying the site is not always better, so let the scout decide.Domain — if there is no known site and the target is multi-domain, scout every annotated domain in parallel, each isolated as its own target config (50 designs). Do not pre-pick the "known functional" domain or scout just a couple, and do not let a whole-ectodomain scan stand in for this — a big multi-domain crop buries each domain's signal, so domains must be compared head-to-head in isolation. Fetch domain boundaries online (CATH / Pfam / InterPro / UniProt by id). If none are found, skip this axis unless the user asks.
Scan — only if the target is > 300 residues and the binding site is unknown. See scan below.
Cover each applicable axis, but don't multiply axes into the full cross-product. Each config is 50 designs, but cost depends on the
combined target+binder length and can differ per config as the crop changes
size — estimate-cost each config, sum the totals, and apply the spending
gate (main skill) before submitting the batch.
scan
For a large target (> 300 residues) with an unknown binding site, discover where binders naturally dock:
On a multi-domain target the scan is complementary to the per-domain sweep, not a replacement: it shows where binders dock across the whole ectodomain, but designability is still compared by scouting each domain in isolation (axis 4). Run both — don't let the scan stand in for the per-domain comparison.
Submit one 100-design run with no
epitope_residues(termini trimmed). The scan uses 100 (not the 50 of a normal scout) because its job is to find where binders dock and cluster those footprints reliably — too few designs gives noisy clusters. A no-site full-target run is also the unbiased baseline, so let this run serve both roles rather than paying for a separate 50-design baseline.After download, cluster the top designs' contact footprints into candidate sites:
python3 scripts/scan_sites.py <run-dir> --target-chain A --binder-chain B \ --top 20 --cutoff 6 --jaccard 0.25It computes each top design's all-atom footprint on
--target-chain(defaultA) using only the generated binder chains selected by repeatable--binder-chainflags, clusters footprints by single-linkage at Jaccard > 0.25, and prints a consensus site (0-based API indices) per cluster — the residues contacted by ≥2 designs in the cluster. Read the generated binder entity'schain_idsfrom a result record and pass each ID separately. If the structure has exactly one non-target chain, the script can infer it when the flag is omitted; it fails closed when multiple non-target chains are ambiguous so native target chains are never silently treated as binder.For each discovered site, scout two configs in parallel: (a) site specified + target cropped to ~35 Å around it, and (b) the same crop without the site specified. Feed each consensus site back through
crop_radius.py.
Step 3 — scout: 50 designs per config
Each chosen config is a normal protein:design submission with
num_proteins: 50 and that config's crop_residues (and epitope_residues
when the config specifies the site). Author each payload, estimate-cost, confirm
the summed cost, then submit and download per the main skill's Command
Pattern. Give each scout run a descriptive name, e.g.
scout-<target>-<axis>-<variant> (scout-PD1-r25-site, scout-PD1-r25-nosite,
scout-PD1-disorder, scout-PD1-baseline), so the configs live together and
are easy to compare.
Exploration spends in separate phases — round-1 scouts, the scan, the post-scan scouts, the full run. Apply the main skill's spending gate per phase: an outlined plan or an earlier phase's approval is not authorization for the next.
Launch the scout configs in parallel — do not finish one before starting the
next. Submit each (start), then immediately background its download-results
(per the main skill's Command Pattern) so every config runs on Boltz at the same
time, and do not block waiting on any of them.
The only ordering constraint is the scan: configs derived from scan_sites.py
need the 100-design scan run's results first. So launch every independent config
up front together — baseline, disorder cutout, radius crops, and the scan run
itself — and once the scan downloads, launch its per-site configs in parallel
too. Never run scouts one at a time.
Step 4 — pick the winning config
Once the scout runs finish, score each config and choose the configuration to scale
up. The selection metric is the maximum binding_confidence across the 50
designs in that config — the best single design a configuration can produce is the
signal that the configuration is promising.
python3 scripts/analyze_results.py <scout-run-dir> # one per configFor each config it prints: max binding_confidence, the 10th-highest binding_confidence, and the fraction of designs with bc > 0.01 and > 0.05. Compare configs by max bc; report the others as supporting context. The winning config's crop (and site, if it had one) becomes the config for the full run.
binding_confidence is a soft signal, not a pass/fail score —
there is no cutoff to gate on. Read it qualitatively and bring the judgement to
the user. A near-zero max bc is a weak configuration: iterate with the user or pull in more domain
knowledge the user has. A clearly strong score is a good candidate to scale. In
between is a real judgement call requiring user input — often worth a shot, especially if it's the
best configuration you found and the site fits what the user wants — so lay out the
trade-off rather than deciding for them.
Compare configs relative to each other (the best configuration vs. the rest), not against any fixed mark. Whatever the numbers, scaling is a collaborative call: recommend a direction and let the user steer.
Max binding_confidence is purely related to binding: where the model most easily gets a binder to stick, may not be where the user wants one to stick. Which site matters depends on why they want a binder (to block a specific interaction/function, a research or diagnostic tool, or just any tractable binder against the target). When configs hit different sites and the most designable one isn't clearly the right one, treat the pick as a discussion: lay out which site each config hits and its yield, confirm what the binder needs to do, and let the user's goal drive the choice — they know their biology. Don't crown a site on max bc alone.
If every config lands weak, say so honestly — but don't unilaterally call the target off. Like the site choice, binder modality (peptide / miniprotein / nanobody / antibody) is a discussion the user drives, not a switch you make yourself: suggest one if you have a view, but the call is theirs. Lay out what you found and the choices — try a different site or modality, scale anyway, or stop — and let the user steer.
Step 5 — size and submit the full run
Carry the winning config's crop_residues/epitope_residues into a full-run
payload, then size it per the main skill's Run sizing (tiers as counts;
estimate-cost the chosen tier — don't extrapolate across tiers) and apply the
spending gate before start. Then submit and download per the main skill.
Step 6 — post-run yield readout
After the full run downloads, give the standard yield readout with the same script:
python3 scripts/analyze_results.py <full-run-dir>Report: max binding_confidence, 10th-highest binding_confidence, and the fraction of designs with bc > 0.01 and > 0.05. These are the numbers a designer expects after every run. Then rank and present top designs per the main skill's Outputs section. (Histograms and structure visualization are intentionally out of scope here — a later visualization skill will add them.)
Requirements and compatibility
Written for: OpenAI Codex
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Python
Security
What our scanner noticed· Low risk
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Boltz
- Publisher
- OpenAI (Official)
- Distributed by
- OpenAI
- Source
- openai/plugins · plugins/boltz-api-cli/skills/boltz-protein-design · commit d420d13
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from plugins/boltz-api-cli/LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Boltz or OpenAI.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download boltz-protein-design.zip