Generated banner for Boltz Protein Design
Generated logo for Boltz Protein Design

Boltz Protein Design

OpenAIOfficialCreated by BoltzDistributed by OpenAI

  • Skill
  • Tool integration
  • Science and research
  • MIT
  • Low risk
  • Has scripts

From the author

Design new protein binders with Boltz. Use when generating protein, peptide, antibody, nanobody, or custom binder candidates for a target. Not for screening existing proteins or small molecules.
— the description by Boltz

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

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/openai/boltz-protein-design/download
  2. Unzip 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.

  1. 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.

  2. Normalize the target (same shape as protein-screen): structure_template if a CIF/PDB is available, else no_template.

  3. Pick the binder_specification variant. Supported variants include:

    • boltz_curated — recommended default for antibody and nanobody design. Boltz selects from maintained scaffold/template lists (binder: boltz_antibody or boltz_nanobody).

    • structure_template — redesign motifs in an existing binder scaffold (CIF + design_motifs with replacement / insertion segments).

    • no_template — generate from the sequence DSL (fixed residues + designed segments like 5..10 or 8).

  4. 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, use type: structure_template.

  5. Pick modality: peptide, antibody, nanobody, or custom_protein for structure_template and no_template (use custom_protein for a "miniprotein" or generic "protein binder"). If the user already named the modality, take it as given — don't ask again. Do not include modality on boltz_curated; use binder instead.

  6. 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.

  7. Supported optional features include rules such as excluded amino acids, excluded sequence motifs with X wildcards, and max hydrophobic fraction. Add rules only on request; read references/api.md for exact shapes and examples.

  8. Author the payload YAML or JSON, then run estimate-cost and apply the spending gate (Always Do This) before start. (Cost model — tiered by total complex length, estimate-cost is the only source: see ## Cost in api.md.)

  9. start to submit. Capture the ID.

  10. Launch download-results with the agent runtime's background/non-blocking command facility. In Claude Code, use Bash with run_in_background: true. In Codex, run download-results as a foreground shell command with yield_time_ms: 1000; if Codex returns a session_id, keep it for optional same-thread polling, but treat download-status plus the run directory as the durable source of truth. In Codex app/desktop runtimes that expose same-thread heartbeat automations, create a heartbeat that checks download-status periodically 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 the download-status command.

  11. Rank from <output-root>/<run-name>/results/index.jsonl by binding_confidence descending. Use iptm and min_interaction_pae as tiebreakers. optimization_score is 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:

Tiernum_proteinsWhen
Small screen20,000Quick look / tight budget
Medium (recommended)50,000Default for a real campaign
Large100,000Hard 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 60

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,000 before calling estimate-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. start spends 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. Run estimate-cost, show the estimated_cost_usd it 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 from estimate-cost (cost model: ## Cost in api.md).

  • For antibody or nanobody design, recommend binder_specification.type: boltz_curated and ask the user to confirm they do not want custom scaffold/CDR control before building the payload. Use binder: boltz_antibody for antibody/Fab requests and binder: boltz_nanobody for 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.cif inside structure.data. Don't use bare @path.

  • Sequence DSL for designed_protein.value: uppercase letters = fixed residues; integer N = exactly N designed 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 cd into the run directory for follow-up commands; pass the same --root-dir and use absolute paths so later relative paths do not drift.

  • Prefer one merged top-level payload via --input @yaml:///absolute/path/payload.yaml or @json:///absolute/path/payload.json for estimate-cost and start. Keep --idempotency-key and --workspace-id top-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.yaml or --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-key and --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 over sh -c, inline environment assignments, aliases, wrapper scripts, loops, or pipelines around the boltz-api invocation 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 next download-results command.

  • Prefer the agent runtime's background/non-blocking command mode for download-results. In Codex specifically, keep download-results in the foreground and set the shell tool yield to 1000 ms; Codex will return a session_id if the command is still running. Do not append & or use nohup in Codex because the tool runner may clean up shell-backgrounded descendants before .boltz-run.json is 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 60 is a sensible downloader default. download-results emits JSONL progress on stderr by default; add --progress-format text --verbose only 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 run boltz-api --format json download-status --name "<run-name>" --root-dir "/absolute/path/boltz-experiments" and stop once terminal. Choose cadence by num_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 saved session_id with an empty write_stdin only 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-results with the same --name "<run-name>" and the same --root-dir.

  • Only add rules on explicit user request.

Escape Hatch

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

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:

AxisWhat it variesHow
Termini (always)Drop floppy unmodeled N/C overhangFirst/last resolved residue
Disorder cutoutRemove internal loopy/disordered stretchesdetect_disorder.py
Crop radiusKeep only residues near the sitecrop_radius.py (10/15/25/30/35 Å)
Site specified or notSpecify the epitope, or let the binder find its own siteinclude/omit epitope_residues
DomainFull target vs one domain at a timefetch CATH/Pfam annotations online
Scan (>300 aa and unknown site)Discover where binders actually landscan_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_OK

If 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 below

Indexing 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:

  1. Baseline — full target, termini trimmed, design spec as given.

  2. 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 bfactor

    It flags internal low-confidence/high-mobility runs longer than --min-loop (default 10) and prints the kept crop_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.

  3. 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

    --site takes 0-based API indices. For each radius it prints the kept crop_residues. Run each radius twice as separate configs: once with the site in epitope_residues, once without — specifying the site is not always better, so let the scout decide.

  4. 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.

  5. 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.

  1. 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.

  2. 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.25

    It computes each top design's all-atom footprint on --target-chain (default A) using only the generated binder chains selected by repeatable --binder-chain flags, 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's chain_ids from 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.

  3. 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 config

For 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