Molfeat
K-Dense-AI/scientific-agent-skills
Featurizes small molecules with Molfeat for QSAR/QSPR, chemical similarity, virtual screening, and molecular ML.
Write code that calls the installed nvMolKit Python API for GPU-accelerated, batched RDKit-style operations - Morgan fingerprints, Tanimoto/cosine similarity, ETKDG conformer embedding, MMFF/UFF…
$ npx skills add NVIDIA-BioNeMo/bionemo-agent-toolkit --skill nvmolkit-usage -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install NVIDIA-BioNeMo/bionemo-agent-toolkit nvmolkit-usage --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/library-skills/nvmolkit-usage .claude/skills/nvmolkit-usage && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "nvmolkit-usage" agent skill from https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit/tree/main/library-skills/nvmolkit-usage into .claude/skills/nvmolkit-usage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nvmolkit-usage", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit/tree/main/library-skills/nvmolkit-usageType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add NVIDIA-BioNeMo/bionemo-agent-toolkit --skill nvmolkit-usage -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install NVIDIA-BioNeMo/bionemo-agent-toolkit nvmolkit-usage --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit.git skills-src && mkdir -p .agents/skills && cp -r skills-src/library-skills/nvmolkit-usage .agents/skills/nvmolkit-usage && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "nvmolkit-usage" agent skill from https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit/tree/main/library-skills/nvmolkit-usage into .agents/skills/nvmolkit-usage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nvmolkit-usage", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add NVIDIA-BioNeMo/bionemo-agent-toolkit --skill nvmolkit-usage -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install NVIDIA-BioNeMo/bionemo-agent-toolkit nvmolkit-usage --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/library-skills/nvmolkit-usage .cursor/skills/nvmolkit-usage && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "nvmolkit-usage" agent skill from https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit/tree/main/library-skills/nvmolkit-usage into .cursor/skills/nvmolkit-usage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nvmolkit-usage", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit.git --path library-skills/nvmolkit-usage--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add NVIDIA-BioNeMo/bionemo-agent-toolkit --skill nvmolkit-usage -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install NVIDIA-BioNeMo/bionemo-agent-toolkit nvmolkit-usage --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/library-skills/nvmolkit-usage .gemini/skills/nvmolkit-usage && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "nvmolkit-usage" agent skill from https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit/tree/main/library-skills/nvmolkit-usage into .gemini/skills/nvmolkit-usage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nvmolkit-usage", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install NVIDIA-BioNeMo/bionemo-agent-toolkit nvmolkit-usageInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add NVIDIA-BioNeMo/bionemo-agent-toolkit --skill nvmolkit-usage -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit.git skills-src && mkdir -p .github/skills && cp -r skills-src/library-skills/nvmolkit-usage .github/skills/nvmolkit-usage && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "nvmolkit-usage" agent skill from https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit/tree/main/library-skills/nvmolkit-usage into .github/skills/nvmolkit-usage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nvmolkit-usage", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add NVIDIA-BioNeMo/bionemo-agent-toolkit --skill nvmolkit-usage -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install NVIDIA-BioNeMo/bionemo-agent-toolkit nvmolkit-usage --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/library-skills/nvmolkit-usage .opencode/skills/nvmolkit-usage && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "nvmolkit-usage" agent skill from https://github.com/NVIDIA-BioNeMo/bionemo-agent-toolkit/tree/main/library-skills/nvmolkit-usage into .opencode/skills/nvmolkit-usage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nvmolkit-usage", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
nvmolkit-usageWrite code that calls the installed nvMolKit Python API for GPU-accelerated, batched RDKit-style operations - Morgan fingerprints, Tanimoto/cosine similarity, ETKDG conformer embedding, MMFF/UFF…
Nvmolkit Usage is an agent skill from NVIDIA-BioNeMo/bionemo-agent-toolkit. Write code that calls the installed nvMolKit Python API for GPU-accelerated, batched RDKit-style operations - Morgan fingerprints, Tanimoto/cosine similarity, ETKDG conformer embedding, MMFF/UFF optimization, TFD, conformer RMSD, Butina clustering, and substructure search. Use when the user is importing nvmolkit., debugging an nvmolkit call, choosing between nvMolKit and RDKit for a batched cheminformatics workflow, or wiring nvMolKit results into a torch/numpy pipeline. Out of scope: building nvMolKit from source.
Its SKILL.md is about 4.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files (for example `evals/evals.json` and `evals/trigger_evals.json`).
It sits in Research & Science, covering Drug discovery and cheminformatics and Embeddings. It works with RDKit, Python, NumPy and CUDA. The repository describes itself as: Turn any agent into a life science expert with NVIDIA BioNeMo skills. The licence is Apache-2.0.
Read from SKILL.md and the folder at commit 2113472. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
uvFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
pytorch.orgAlso links to:
nvidia-bionemo.github.ioFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Nvmolkit Usage loads about 4.4k tokens when it runs. Until then it costs about 135 tokens; SKILL.md has 1,444 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from NVIDIA-BioNeMo/bionemo-agent-toolkit at commit 2113472, republished under its Apache-2.0 licence (© NVIDIA-BioNeMo). 1,444 words, ~4,423 tokens.
.claude/skills/nvmolkit-usage/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.GPU-accelerated, batched implementations of common RDKit operations. APIs mirror RDKit where possible but are batch-oriented: they take lists of rdkit.Chem.Mol (or lists of fingerprints) and process them in parallel on one or more GPUs. nvMolKit links against RDKit at build time; inputs and outputs are real RDKit Mol objects.
Reach for nvMolKit when:
Plain RDKit is usually the better choice for single-molecule one-offs or workflows that can't be expressed as a batch. nvMolKit is not meant to replace RDKit for those cases.
torch install with CUDA support (nvMolKit returns GPU tensors via torch's CUDA array interface).If CUDA is unavailable, nvMolKit calls raise. There is no CPU fallback - if the user needs one, use RDKit directly for that path.
When helping with installation, make the user choose a PyTorch CUDA backend that the host driver supports before installing nvMolKit. nvMolKit's PyPI wheels are built with CUDA Toolkit 12.9 and depend on CUDA 12 runtime packages, but pip/uv can still select a CUDA 13 PyTorch wheel unless the install command says otherwise.
pytorch-gpu; pin cuda-version=12.6 or another CUDA version supported by the driver.https://pytorch.org/get-started/locally/) or previous-versions page (https://pytorch.org/get-started/previous-versions/) to install torch for a CUDA 12.x backend before installing nvMolKit.uv pip install --torch-backend=cu128 nvmolkit.Run this once to confirm nvMolKit is importable and a GPU op works end to end:
import nvmolkit
import torch
from rdkit import Chem
from nvmolkit.fingerprints import MorganFingerprintGenerator
print("nvmolkit:", nvmolkit.__version__)
print("cuda available:", torch.cuda.is_available())
print("device count:", torch.cuda.device_count())
mols = [Chem.MolFromSmiles(smi) for smi in ["CCO", "c1ccccc1", "CC(=O)O"]]
fpgen = MorganFingerprintGenerator(radius=2, fpSize=1024)
result = fpgen.GetFingerprints(mols)
torch.cuda.synchronize()
fps = result.torch()
print("fps shape:", tuple(fps.shape), "dtype:", fps.dtype)
# Expected: shape (3, 32), dtype torch.int32 (1024 bits packed into 32 int32s per row)If this fails, point the user at the install guide on the docs site rather than guessing - see "Going deeper" below.
| Task | Module | Primary entry point |
|---|---|---|
| Morgan fingerprints | nvmolkit.fingerprints | MorganFingerprintGenerator(radius, fpSize).GetFingerprints(mols) |
| Bulk Tanimoto / cosine similarity | nvmolkit.similarity | crossTanimotoSimilarity(...), crossCosineSimilarity(...), plus *MemoryConstrained variants for results too large to fit in GPU memory |
| ETKDG conformer embedding | nvmolkit.embedMolecules | EmbedMolecules(molecules, params, confsPerMolecule, ...) |
| MMFF94 optimization (one-shot) | nvmolkit.mmffOptimization | MMFFOptimizeMoleculesConfs(molecules, ...) |
| UFF optimization (one-shot) | nvmolkit.uffOptimization | UFFOptimizeMoleculesConfs(molecules, ...) |
| Forcefield with custom options + constraints | nvmolkit.batchedForcefield | MMFFBatchedForcefield(mols, properties=..., nonBondedThreshold=..., ignoreInterfragInteractions=..., hardwareOptions=...), UFFBatchedForcefield(mols, vdwThreshold=..., ...). Per-molecule view ff[i] exposes add_distance_constraint, add_position_constraint, add_angle_constraint, add_torsion_constraint. Methods: .compute_energy(), .compute_gradients(), .minimize(maxIters, forceTol) |
| Pairwise conformer RMSD | nvmolkit.conformerRmsd | GetConformerRMSMatrix(mol), GetConformerRMSMatrixBatch(mols) |
| Torsion Fingerprint Deviation (TFD) | nvmolkit.tfd | GetTFDMatrix(mol), GetTFDMatrices(mols) |
| Butina clustering | nvmolkit.clustering | butina(distance_matrix, cutoff) (precomputed matrix), fused_butina(fingerprints, cutoff) (memory-efficient, on-the-fly) |
| Substructure search | nvmolkit.substructure | hasSubstructMatch, countSubstructMatches, getSubstructMatches |
| Hardware tuning (batch size, GPU IDs) | nvmolkit.types | HardwareOptions(...) passed to ETKDG / MMFF / UFF |
Optional autotuning of HardwareOptions | nvmolkit.autotune | tune_embed_molecules, tune_mmff_optimize, tune_uff_optimize, tune_batched_forcefield. Requires the optuna package |
Two return shapes carry GPU-resident output, depending on what the operation produces.
AsyncGpuResultUsed by operations that return a single flat tensor (fingerprints, similarity matrices, RMSD/TFD vectors, Butina inputs). Key behaviors:
result.torch() returns a zero-copy torch.Tensor on the GPU. Caller is responsible for synchronizing before reading values on the host.result.numpy() synchronizes and returns a CPU numpy array.__cuda_array_interface__, so it can be passed directly into other nvMolKit functions (e.g. fingerprints → similarity) with no host round-trip.A subset of the AsyncGpuResult-returning APIs accept an optional stream: torch.cuda.Stream | None = None argument so callers can submit nvMolKit work to a non-default stream and overlap it with their own kernels. When omitted, the call uses the current torch stream.
APIs that take a stream argument:
MorganFingerprintGenerator.GetFingerprintscrossTanimotoSimilarity, crossCosineSimilarity, and their *MemoryConstrained variantsbutina, fused_butinaGetConformerRMSMatrix, GetConformerRMSMatrixBatchOther APIs (ETKDG, MMFF/UFF optimization, TFD, substructure search) are synchronous to the caller — no stream plumbing needed.
Typical pattern:
import torch
from rdkit import Chem
from nvmolkit.fingerprints import MorganFingerprintGenerator
from nvmolkit.similarity import crossTanimotoSimilarity
stream = torch.cuda.Stream()
fpgen = MorganFingerprintGenerator(radius=2, fpSize=1024)
mols = [Chem.MolFromSmiles(smi) for smi in ["CCO", "c1ccccc1", "CC(=O)O"]]
with torch.cuda.stream(stream):
fps = fpgen.GetFingerprints(mols, stream=stream)
sim = crossTanimotoSimilarity(fps, stream=stream)
stream.synchronize()
print(sim.torch())Device3DResultUsed by ETKDG embedding and MMFF/UFF optimization (one-shot and BatchedForcefield) when called with output=CoordinateOutput.DEVICE. The GPU-resident equivalent of writing conformers back to Mol objects. Fields:
values: AsyncGpuResult of shape (total_atoms, 3) float64. Concatenated conformer coordinates in CSR-style layout.atom_starts, mol_indices, conf_indices: AsyncGpuResult int32 buffers describing the layout (values[atom_starts[i]:atom_starts[i+1]] is conformer i's atoms).energies, converged: AsyncGpuResult buffers populated only for MMFF/UFF minimization (not for plain ETKDG).gpu_id: device the buffers live on. The targetGpu argument on each API picks this; targetGpu=-1 uses the default consolidation device..per_molecule() returns nested list[list[torch.Tensor]] of per-conformer views; .dense(pad_value=nan) materializes a padded (n_mols, max_confs, max_atoms, 3) tensor.The default mode (CoordinateOutput.RDKIT_CONFORMERS) still writes optimized coordinates back into each Mol and returns Python lists of energies/convergence flags. Reach for CoordinateOutput.DEVICE when chaining downstream GPU work (e.g. ETKDG → MMFF → similarity scoring) without host round-trips.
Two configuration objects expose the GPU/CPU knobs.
HardwareOptions (ETKDG, MMFF, UFF)from nvmolkit.types import HardwareOptions. Passed via hardwareOptions= to EmbedMolecules, MMFFOptimizeMoleculesConfs, UFFOptimizeMoleculesConfs, and the BatchedForcefield constructors. Every field has an "auto" sentinel; the defaults are usually fine.
| Field | Type | Default | Meaning |
|---|---|---|---|
preprocessingThreads | int | -1 (all visible CPUs) | CPU threads for preprocessing |
batchSize | int | -1 (auto-tuned) | Number of conformers per GPU batch |
batchesPerGpu | int | -1 (auto) | Concurrent batches per GPU; must be >0 or -1 |
gpuIds | list[int] | [] (all visible GPUs) | Specific device ordinals to target |
Passing a gpuIds entry for a device that isn't visible raises RuntimeError: invalid device ordinal. For finding good values automatically across a representative sample, see nvmolkit.autotune (requires the optuna extra); each tune_* function returns a TuneResult whose best_config is a fully-populated HardwareOptions ready to pass back into the real call.
HardwareOptions round-trips through to_dict() / from_dict() for persisting tuned configs to disk.
SubstructSearchConfig (substructure search)from nvmolkit.substructure import SubstructSearchConfig. Passed via config= to hasSubstructMatch, countSubstructMatches, and getSubstructMatches.
| Field | Type | Default | Meaning |
|---|---|---|---|
batchSize | int | 1024 | (target, query) pairs per GPU batch |
workerThreads | int | -1 (auto) | GPU runner threads per GPU |
preprocessingThreads | int | -1 (auto) | CPU threads for preprocessing |
maxMatches | int | 0 (unlimited) | Max matches returned per (target, query) pair |
uniquify | bool | False | Drop duplicate matches that differ only in atom enumeration order |
gpuIds | list[int] | None | None (current device only) | Specific device ordinals to target |
Substructure search currently does not support chirality-aware matching, enhanced stereochemistry, or other advanced RDKit SubstructMatchParameters options.
import torch
from rdkit import Chem
from nvmolkit.fingerprints import MorganFingerprintGenerator
from nvmolkit.similarity import crossTanimotoSimilarity
smiles = ["CCO", "CCN", "c1ccccc1", "CC(=O)O", "CCOCC"]
mols = [Chem.MolFromSmiles(smi) for smi in smiles]
fpgen = MorganFingerprintGenerator(radius=2, fpSize=1024)
fps = fpgen.GetFingerprints(mols)
sim = crossTanimotoSimilarity(fps)
torch.cuda.synchronize()
print(sim.torch())Inputs are list[Mol]. Output of GetFingerprints is an AsyncGpuResult wrapping an (n_mols, fpSize / 32) int32 tensor of packed bits. Pass it straight into crossTanimotoSimilarity for an (n, n) similarity matrix; pass two fingerprint sets for an (n, m) cross-matrix. For sets too large to materialize on the GPU, use crossTanimotoSimilarityMemoryConstrained (chunked compute, returns numpy on CPU).
from rdkit.Chem import AddHs, MolFromSmiles
from rdkit.Chem.rdDistGeom import ETKDGv3
from nvmolkit.embedMolecules import EmbedMolecules
mols = [AddHs(MolFromSmiles(smi)) for smi in ["C1CCCCC1", "C1CCCCC2CCCCC12", "COO"]]
params = ETKDGv3()
params.useRandomCoords = True
EmbedMolecules(mols, params, confsPerMolecule=10, maxIterations=-1)
for mol in mols:
print(mol.GetNumConformers())Inputs are list[Mol], sanitized and with hydrogens added (AddHs). Conformers are added in-place. params.useRandomCoords must be True - nvMolKit's ETKDG only supports random-coord initialization. A handful of niche EmbedParameters options are not supported (bounds matrices, custom CPCI, coord maps, separate-fragment embedding); the Features section of the docs site lists the full restrictions.
from rdkit.Chem import AddHs, MolFromSmiles
from rdkit.Chem.rdDistGeom import ETKDGv3
from nvmolkit.embedMolecules import EmbedMolecules
from nvmolkit.mmffOptimization import MMFFOptimizeMoleculesConfs
mols = [AddHs(MolFromSmiles(smi)) for smi in ["CCO", "CCN", "c1ccccc1"]]
params = ETKDGv3(); params.useRandomCoords = True
EmbedMolecules(mols, params, confsPerMolecule=5)
energies = MMFFOptimizeMoleculesConfs(mols, maxIters=500)
for mol, mol_energies in zip(mols, energies):
print(mol.GetNumConformers(), mol_energies)Inputs are list[Mol] with conformers already populated (typically by ETKDG, RDKit's EmbedMultipleConfs, or a prior nvMolKit call). Coordinates are updated in place; the return is list[list[float]] of optimized energies aligned with the input molecule order and conformer index. UFF is identical in shape: swap in from nvmolkit.uffOptimization import UFFOptimizeMoleculesConfs.
If any input molecule is None or lacks MMFF/UFF atom types, the call raises ValueError. The exception's args[1] is a dict with keys "none" and "no_params" listing the offending indices - useful for filtering a noisy input set.
import torch
from rdkit import Chem
from rdkit.Chem.rdDistGeom import EmbedMultipleConfs
from nvmolkit.clustering import butina
from nvmolkit.conformerRmsd import GetConformerRMSMatrixBatch
mols = [Chem.AddHs(Chem.MolFromSmiles(smi)) for smi in ["CCCCCC", "c1ccccc1"]]
for mol in mols:
EmbedMultipleConfs(mol, numConfs=10)
# Remove hydrogens after embedding for heavy-atom RMSD.
heavy_mols = [Chem.RemoveHs(mol) for mol in mols]
# Default RMSD output is RDKit-compatible condensed lower-triangle form.
condensed = GetConformerRMSMatrixBatch(heavy_mols)
# Butina expects a square distance matrix, so request square GPU tensors.
square = GetConformerRMSMatrixBatch(heavy_mols, output_format="square")
clusters = [butina(distance_matrix, cutoff=0.5).torch() for distance_matrix in square]
torch.cuda.synchronize()
for mol_clusters in clusters:
print(mol_clusters.cpu().tolist())GetConformerRMSMatrix(mol) and GetConformerRMSMatrixBatch(mols) default to output_format="condensed", returning AsyncGpuResult objects that wrap RDKit-style flat vectors of length N * (N - 1) // 2. Use output_format="square" when chaining into butina() or any other API that expects an N x N distance matrix. Both forms live on the GPU; call .numpy() on condensed results or synchronize before moving square tensors to the CPU.
BatchedForcefield)Reach for MMFFBatchedForcefield / UFFBatchedForcefield instead of the one-shot MMFFOptimizeMoleculesConfs / UFFOptimizeMoleculesConfs when you need any of:
maxIters / forceTol per callnonBondedThreshold (MMFF) or vdwThreshold (UFF), or per-molecule ignoreInterfragInteractionsMMFFMolProperties objects (e.g. MMFF94s vs MMFF94)compute_energy() / compute_gradients() without minimizationfrom rdkit.Chem import AddHs, MolFromSmiles
from rdkit.Chem.rdDistGeom import EmbedMultipleConfs
from nvmolkit.batchedForcefield import MMFFBatchedForcefield
mols = [AddHs(MolFromSmiles(smi)) for smi in ["CCO", "CCCCCC"]]
for mol in mols:
EmbedMultipleConfs(mol, numConfs=5)
ff = MMFFBatchedForcefield(
mols,
nonBondedThreshold=[100.0, 20.0],
ignoreInterfragInteractions=True,
)
ff[0].add_position_constraint(0, max_displ=0.1, force_constant=50.0)
ff[1].add_distance_constraint(0, 4, relative=False, min_len=1.8, max_len=2.2, force_constant=25.0)
energies, converged = ff.minimize(maxIters=500, forceTol=1e-4)
for mol, mol_energies, mol_converged in zip(mols, energies, converged):
print(mol.GetNumConformers(), mol_energies, mol_converged)All conformers of each input molecule are minimized in one batch. Constraints attached via ff[i].add_*_constraint(...) apply to every conformer of molecule i; constraint setters mark the wrapper dirty and the native forcefield rebuilds on the next call. Pass output=CoordinateOutput.DEVICE to .minimize(...) to keep optimized coordinates on the GPU (Device3DResult) instead of writing them back into RDKit conformers. UFF is the same shape: UFFBatchedForcefield(mols, vdwThreshold=..., ...).
examples/ directory in the GitHub repo© NVIDIA-BioNeMo, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files in library-skills/nvmolkit-usage of NVIDIA-BioNeMo/bionemo-agent-toolkit.
Open the folder on GitHubat commit 2113472
Nvmolkit Usage next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Nvmolkit Usage this skillNVIDIA-BioNeMo/bionemo-agent-toolkit | 478 | — | ~4.4k | Automated safety check: Pass | Apache-2.0 | |
| MolfeatK-Dense-AI/scientific-agent-skills | 48k | 1 repos | ~2.4k | Automated safety check: Notes | Apache-2.0 | |
| Nvmolkit UsageNVIDIA/skills | 3.5k | 1 repos | ~4.8k | Automated safety check: Pass | Apache-2.0 | |
| DiffDock Molecular DockingK-Dense-AI/scientific-agent-skills | 48k | 1 repos | ~3k | Automated safety check: Notes | MIT | |
| TorchdrugK-Dense-AI/scientific-agent-skills | 48k | 1 repos | ~3k | Automated safety check: Notes | Apache-2.0 | |
| RDKit Descriptors and Fingerprintsjinzhezenggroup/computational-chemistry-agent-skills | 148 | 1 repos | ~2.3k | Automated safety check: Pass | LGPL-3.0 |
K-Dense-AI/scientific-agent-skills
Featurizes small molecules with Molfeat for QSAR/QSPR, chemical similarity, virtual screening, and molecular ML.
NVIDIA/skills
A skill your agent uses when writing or debugging nvMolKit Python code for GPU-accelerated RDKit fingerprints, similarity, conformers, clustering, and molecular searches.
K-Dense-AI/scientific-agent-skills
Predicts how small molecules bind to a protein with DiffDock, covering batch docking, pose ranking by confidence and checks on the results; not for binding affinity.
K-Dense-AI/scientific-agent-skills
Builds and troubleshoots TorchDrug 0.2.1 workflows for molecular graphs, property prediction, self-supervised pretraining, molecule generation, retrosynthesis, protein representation learning, and…
jinzhezenggroup/computational-chemistry-agent-skills
Computes RDKit physicochemical descriptors and molecular fingerprints from SMILES through a uv-run CLI script that skips and logs invalid molecules.
xuzhougeng/wisp-science
A skill your agent uses when creating, migrating, or debugging pixi environments, especially for scientific Python, bioinformatics, single-cell analysis, CUDA/PyTorch, Jupyter/VS Code kernels…
NVIDIA-BioNeMo/bionemo-agent-toolkit
Run a complete protein binder design campaign with NVIDIA Proteina-Complexa: resolve a target structure and hotspots from a name/sequence/PDB, co-design binder sequence+structure with reward-guided…
NVIDIA-BioNeMo/bionemo-agent-toolkit
Route NVIDIA Parabricks pbrun tools, assess GPU/runtime readiness, and provide version-aware command guidance for FASTQ/BAM processing, RNA-seq, variant calling, BAM QC, and GVCF workflows.
NVIDIA-BioNeMo/bionemo-agent-toolkit
Orchestrate an end-to-end de novo protein binder design campaign against a protein target by composing BioNeMo NIM skills.
NVIDIA-BioNeMo/bionemo-agent-toolkit
Build and debug cuEquivariance irreps, custom Irrep subclasses, Clebsch-Gordan tensor products, and equivariant or segmented polynomials.
NVIDIA-BioNeMo/bionemo-agent-toolkit
A skill your agent uses when accelerating existing genomics workflows with NVIDIA Parabricks, improving runtime or price/performance, converting pipeline steps to GPUs, or comparing CPU and GPU…
NVIDIA-BioNeMo/bionemo-agent-toolkit
End-to-end Proteina-Complexa design pipeline driver. An agent skill from NVIDIA-BioNeMo/bionemo-agent-toolkit.
Categories
Write code that calls the installed nvMolKit Python API for GPU-accelerated, batched RDKit-style operations - Morgan fingerprints, Tanimoto/cosine similarity, ETKDG conformer embedding, MMFF/UFF…. Nvmolkit Usage is an agent skill from NVIDIA-BioNeMo/bionemo-agent-toolkit. Write code that calls the installed nvMolKit Python API for GPU-accelerated, batched RDKit-style operations - Morgan fingerprints, Tanimoto/cosine similarity, ETKDG conformer embedding, MMFF/UFF optimization, TFD, conformer RMSD, Butina clustering, and substructure search.
Nvmolkit Usage fits situations like: the user is importing nvmolkit; debugging an nvmolkit call; choosing between nvMolKit and RDKit for a batched cheminformatics workflow; wiring nvMolKit results into a torch/numpy pipeline.
Run `npx skills add NVIDIA-BioNeMo/bionemo-agent-toolkit --skill nvmolkit-usage -a claude-code`. Or copy the skill folder (library-skills/nvmolkit-usage in NVIDIA-BioNeMo/bionemo-agent-toolkit) into .claude/skills/nvmolkit-usage in your project. Claude Code loads it when a task matches its description.
Run `npx skills add NVIDIA-BioNeMo/bionemo-agent-toolkit --skill nvmolkit-usage -a codex`. Or copy the skill folder (library-skills/nvmolkit-usage in NVIDIA-BioNeMo/bionemo-agent-toolkit) into .agents/skills/nvmolkit-usage in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add NVIDIA-BioNeMo/bionemo-agent-toolkit --skill nvmolkit-usage -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/nvmolkit-usage, .gemini/skills/nvmolkit-usage, .github/skills/nvmolkit-usage and .opencode/skills/nvmolkit-usage in your project.
Going by SKILL.md and its folder, Nvmolkit Usage needs the command-line tools its instructions call (uv). Our summary lists: Python 3.
SKILL.md names 2 domains. In commands or code: pytorch.org; the agent is likely to contact it when it follows the instructions. As links in the text: nvidia-bionemo.github.io. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Nvmolkit Usage is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.4k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Nvmolkit Usage: Molfeat (K-Dense-AI/scientific-agent-skills, 48k stars), Nvmolkit Usage (NVIDIA/skills, 3.5k stars), DiffDock Molecular Docking (K-Dense-AI/scientific-agent-skills, 48k stars) and Torchdrug (K-Dense-AI/scientific-agent-skills, 48k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
NVIDIA-BioNeMo (a GitHub organization) maintains it in NVIDIA-BioNeMo/bionemo-agent-toolkit, which has 478 GitHub stars. The repository holds 14 skills in this directory. The repository was last updated on October 7, 2026.
Source: NVIDIA-BioNeMo/bionemo-agent-toolkit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.