DiffDock Molecular Docking
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.
AiZynthFinder retrosynthetic route planning (CASP) from AstraZeneca Molecular AI.
$ npx skills add jaechang-hits/SciAgent-Skills --skill aizynthfinder-retrosynthesis -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills aizynthfinder-retrosynthesis --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/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis .claude/skills/aizynthfinder-retrosynthesis && 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 "aizynthfinder-retrosynthesis" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis into .claude/skills/aizynthfinder-retrosynthesis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aizynthfinder-retrosynthesis", 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/jaechang-hits/SciAgent-Skills/tree/main/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesisType 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 jaechang-hits/SciAgent-Skills --skill aizynthfinder-retrosynthesis -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills aizynthfinder-retrosynthesis --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis .agents/skills/aizynthfinder-retrosynthesis && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "aizynthfinder-retrosynthesis" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis into .agents/skills/aizynthfinder-retrosynthesis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aizynthfinder-retrosynthesis", 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 jaechang-hits/SciAgent-Skills --skill aizynthfinder-retrosynthesis -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills aizynthfinder-retrosynthesis --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis .cursor/skills/aizynthfinder-retrosynthesis && 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 "aizynthfinder-retrosynthesis" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis into .cursor/skills/aizynthfinder-retrosynthesis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aizynthfinder-retrosynthesis", 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/jaechang-hits/SciAgent-Skills.git --path skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis--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 jaechang-hits/SciAgent-Skills --skill aizynthfinder-retrosynthesis -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills aizynthfinder-retrosynthesis --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis .gemini/skills/aizynthfinder-retrosynthesis && 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 "aizynthfinder-retrosynthesis" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis into .gemini/skills/aizynthfinder-retrosynthesis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aizynthfinder-retrosynthesis", 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 jaechang-hits/SciAgent-Skills aizynthfinder-retrosynthesisInstalls 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 jaechang-hits/SciAgent-Skills --skill aizynthfinder-retrosynthesis -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis .github/skills/aizynthfinder-retrosynthesis && 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 "aizynthfinder-retrosynthesis" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis into .github/skills/aizynthfinder-retrosynthesis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aizynthfinder-retrosynthesis", 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 jaechang-hits/SciAgent-Skills --skill aizynthfinder-retrosynthesis -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills aizynthfinder-retrosynthesis --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis .opencode/skills/aizynthfinder-retrosynthesis && 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 "aizynthfinder-retrosynthesis" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis into .opencode/skills/aizynthfinder-retrosynthesis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aizynthfinder-retrosynthesis", 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.
aizynthfinder-retrosynthesisAiZynthFinder retrosynthetic route planning (CASP) from AstraZeneca Molecular AI.
Aizynthfinder Retrosynthesis is an agent skill from jaechang-hits/SciAgent-Skills. AiZynthFinder retrosynthetic route planning (CASP) from AstraZeneca Molecular AI. Monte Carlo tree search guided by a template-based neural expansion policy recursively disconnects a target SMILES until precursors are found in a purchasable stock. Covers config.yml (v4 format), aizynthcli batch screening, the AiZynthFinder/AiZynthExpander Python API, one-step disconnections, custom stocks via smiles2stock, scorers, Retro/breadth-first/DFPN search alternatives, and reading output.json.gz / trees.json. Use for…
Its SKILL.md is about 5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Research & Science, covering Drug discovery and cheminformatics. It works with Python and RDKit. The repository describes itself as: 197 bioinformatics & life science skills for Claude Code and AI agents — BixBench 92.0% accuracy. RNA-seq, single-cell, drug discovery, proteomics, and more. Powers OmicsHorizon. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 82c862c. 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:
condapythonFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
molecularai.github.iogithub.comdoi.orgpypi.orgFrom 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.
Aizynthfinder Retrosynthesis loads about 5k tokens when it runs. Until then it costs about 186 tokens; SKILL.md has 1,540 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 jaechang-hits/SciAgent-Skills at commit 82c862c, republished under its MIT licence (© jaechang-hits). 1,540 words, ~4,956 tokens.
.claude/skills/aizynthfinder-retrosynthesis/SKILL.md (or your agent's skills folder).AiZynthFinder performs computer-aided synthesis planning (CASP): a search algorithm — Monte Carlo tree search by default — recursively disconnects a target molecule into precursors, guided by a neural expansion policy that ranks known reaction templates. The search terminates when all precursors are found in a stock (a set of purchasable building blocks) or the maximum depth is reached. Output is a ranked set of reaction trees plus per-target statistics (is_solved, step count, precursors in/out of stock).
Version covered: 4.4.1 (Python 3.10–3.12). The v4 config format differs substantially from v2/v3 as described in the 2020 paper — never copy a config from an old blog post without translating it.
break_bonds) in a routetorchdrug instead when training a retrosynthesis model rather than running route searchneb-irc-activation-energy; for drawing the resulting scheme use rdkit-chemdraw-cdxmlaizynthfinder (4.4.x), rdkit, pandasonnxruntime; TensorFlow is not needed unless serving remote models or loading legacy .hdf5 Keras models.Check before installing — aizynthcli, download_public_data, and smiles2stock ship with the package and may already be on PATH inside a pixi/conda env. Inside a pixi project, invoke them as pixi run aizynthcli ....
command -v aizynthcli || {
conda create "python>=3.10,<3.13" -n aizynth-env -y
conda activate aizynth-env
python -m pip install "aizynthfinder[all]"
}[all] adds molbloom (bloom-filter stocks), pymongo, route-distances (route clustering), scipy, and timeout-decorator. Drop it for a lighter install; add [tf] only for TF-serving or .hdf5 models.
from aizynthfinder.aizynthfinder import AiZynthFinder
finder = AiZynthFinder(configfile="config.yml")
finder.stock.select("zinc")
finder.expansion_policy.select("uspto")
finder.target_smiles = "Cc1cccc(c1N(CC(=O)Nc2ccc(cc2)c3ncon3)C(=O)C4CCS(=O)(=O)CC4)C"
finder.tree_search()
finder.build_routes() # required before touching finder.routes
stats = finder.extract_statistics()
print(f"solved={stats['is_solved']} steps={stats['number_of_steps']} "
f"routes={stats['number_of_routes']} time={stats['search_time']:.1f}s")
finder.routes[0]["image"].save("route_top.png")download_public_data fetches the public USPTO models and the ZINC stock subset (several hundred MB, from zenodo.org and figshare.com) and writes a ready-to-use config.yml.
# Skip if the folder already holds the models — this is a large download.
test -f my_folder/config.yml || download_public_data my_folder
ls my_folder
# uspto_model.onnx uspto_templates.csv.gz
# uspto_ringbreaker_model.onnx uspto_ringbreaker_templates.csv.gz
# uspto_filter_model.onnx zinc_stock.hdf5
# config.ymlThe list short-cut means "template-based strategy, model first, templates second, defaults elsewhere". The same short-cut works for a single filter model path and a single stock file path.
# config.yml — minimal
expansion:
uspto:
- uspto_model.onnx
- uspto_templates.csv.gz
stock:
zinc: zinc_stock.hdf5# config.yml — explicit form, the settings that matter in practice
search:
algorithm: mcts
algorithm_config:
C: 1.4
use_prior: True
prune_cycles_in_search: True
search_rewards: ["state score"]
max_transforms: 6
iteration_limit: 100
time_limit: 120
return_first: false
exclude_target_from_stock: True
expansion:
uspto:
type: template-based
model: uspto_model.onnx
template: uspto_templates.csv.gz
template_column: retro_template
cutoff_cumulative: 0.995
cutoff_number: 50
use_rdchiral: True
filter:
uspto:
type: quick-filter
model: uspto_filter_model.onnx
filter_cutoff: 0.05
stock:
zinc:
type: inchiset
path: zinc_stock.hdf5
post_processing:
min_routes: 5
max_routes: 25
all_routes: FalseValues can be pulled from the environment: iteration_limit: ${ITERATION_LIMIT}.
An unparseable target burns the whole time limit before failing. Check first.
from rdkit import Chem
smiles = "Cc1cccc(c1N(CC(=O)Nc2ccc(cc2)c3ncon3)C(=O)C4CCS(=O)(=O)CC4)C"
mol = Chem.MolFromSmiles(smiles)
assert mol is not None, f"invalid SMILES: {smiles}"
smiles = Chem.MolToSmiles(mol) # canonicalize
print(f"{smiles} heavy_atoms={mol.GetNumHeavyAtoms()}")select() picks which loaded policies and stocks are active. AiZynthFinder also accepts configdict=<dict> instead of a file — the cleanest way to sweep parameters without writing YAML.
from aizynthfinder.aizynthfinder import AiZynthFinder
finder = AiZynthFinder(configfile="config.yml")
finder.stock.select("zinc")
finder.expansion_policy.select("uspto")
finder.filter_policy.select("uspto") # optional; prunes implausible reactions
finder.target_smiles = smiles
search_time = finder.tree_search()
print(f"search finished in {search_time:.1f}s")build_routes() extracts reaction trees from the search graph. Nothing in finder.routes exists until it is called.
finder.build_routes()
stats = finder.extract_statistics()
for key in ("is_solved", "number_of_steps", "number_of_routes",
"number_of_precursors", "number_of_precursors_in_stock",
"search_time", "first_solution_time"):
print(f"{key:32s} {stats[key]}")
print("not in stock:", stats["precursors_not_in_stock"])finder.routes is a RouteCollection. Show two or three distinct routes, not only the top-scored one.
routes = finder.routes
print(f"{len(routes)} routes, scores: {routes.scores}")
for i in range(min(3, len(routes))):
tree = routes.reaction_trees[i]
leafs = [m.smiles for m in tree.leafs()]
print(f"route {i}: solved={tree.is_solved} "
f"steps={len(list(tree.reactions()))} branched={tree.is_branched()}")
print(f" precursors: {leafs}")
routes.images[i].save(f"route_{i:02d}.png")
routes.jsons[0] # JSON string for the top routeFor hundreds or thousands of targets, use the CLI rather than a Python loop — --nproc splits the input across processes.
# One SMILES per line in smiles.txt
aizynthcli --config config.yml --smiles smiles.txt \
--policy uspto --stocks zinc \
--nproc 8 --checkpoint checkpoint.json.gz \
--output output.json.gz --log_to_fileimport pandas as pd
data = pd.read_json("output.json.gz", orient="table")
print(f"solve rate: {data.is_solved.mean():.1%} n={len(data)}")
print(data.loc[data.is_solved, "number_of_steps"].value_counts().sort_index())
print(data.loc[~data.is_solved, ["target", "precursors_not_in_stock"]].head())| Parameter | Default | Range / Options | Effect |
|---|---|---|---|
search.time_limit | 120 | 30–1800 (s) | Wall-clock budget per target. Raise this first when nothing solves. |
search.iteration_limit | 100 | 50–1000 | MCTS iterations per target; whichever of time/iterations hits first ends the search. |
search.max_transforms | 6 | 3–10 | Maximum tree depth (longest route). Deeper searches cost quadratically more. |
search.return_first | False | True/False | Stop at the first solved route — fast synthesizability yes/no, poor route quality. |
search.exclude_target_from_stock | True | True/False | Keep True or a purchasable target returns an empty route. |
search.algorithm_config.C | 1.4 | 0.5–3.0 | UCB exploration/exploitation balance; higher explores more disconnections. |
search.algorithm_config.search_rewards | ["state score"] | any scorer names | Scorers driving the search; pair with search_rewards_weights for multi-objective. |
expansion.cutoff_number | 50 | 10–100 | Templates applied per expansion. Widens branching and slows search — tune after the time limit. |
expansion.cutoff_cumulative | 0.995 | 0.95–0.999 | Cumulative policy probability retained before truncating the template list. |
expansion.template_column | retro_template | column name | Must match the template file; a mismatch yields silently empty expansions. |
filter.filter_cutoff | 0.05 | 0.0–0.5 | Feasibility threshold; raising it prunes harder and can make targets unsolvable. |
post_processing.max_routes | 25 | 5–100 | Routes extracted after the search; all_routes: True returns every solved route. |
The state score reflects the fraction of solved precursors and the route length. It was designed to guide the tree search and is largely indiscriminate about whether a route is chemically sensible. Solved routes score near 1.0, unsolved ones typically below 0.8. Never present top_score as a confidence or feasibility measure.
The public ZINC subset is far smaller than commercial catalogues; in the original comparison, adding Enamine building blocks found routes for 10 more compounds out of 100. Swapping USPTO for a Reaxys-derived policy changed which compounds solved rather than uniformly improving them. Findability tracks synthetic complexity — an unsolved target means "not found under this stock, this policy, and this budget", not "unsynthesizable".
Reference performance from the paper (100 random ChEMBL compounds, single CPU + single GPU): 55 solved, mean search time 38.7 s, mean time to first solution 7.1 s, mean 2.4 steps and 2.7 precursors.
Reagents, solvents, temperatures, and yields are outside scope. A predicted route is a hypothesis for a chemist to evaluate.
Loaded automatically: state score, number of reactions, number of pre-cursors, number of pre-cursors in stock. Also available in aizynthfinder.context.scoring: average template occurrence, sum of prices, route cost, max transform, broken bonds, fraction in stock, fraction in source, fraction of intermediates in <stock>, stock availability, reaction class membership, reaction class-rank score, delta-SC score, route similarity, plus CombinedScorer and DeepSetScorer. Scorers are addressed by their string name both in search.algorithm_config.search_rewards and in post_processing.route_scorer (which falls back to search_rewards when unset).
Set search.algorithm to a class path to replace MCTS: Retro* (aizynthfinder.search.retrostar.search_tree.SearchTree), breadth-first (aizynthfinder.search.breadth_first.search_tree.SearchTree), DFPN (aizynthfinder.search.dfpn.search_tree.SearchTree).
| User intent | Use |
|---|---|
| One or a few molecules, wants routes and images | Python API (AiZynthFinder) |
| Hundreds or thousands of molecules | aizynthcli with a SMILES file and --nproc |
| Interactive exploration by a chemist | aizynthapp (Jupyter GUI) |
| Only the first retro step | AiZynthExpander — far cheaper than a full tree search |
When to use: the user wants plausible first disconnections, not a full route to purchasable material.
import pandas as pd
from aizynthfinder.aizynthfinder import AiZynthExpander
expander = AiZynthExpander(configfile="config.yml")
expander.expansion_policy.select("uspto")
expander.filter_policy.select("uspto") # annotates feasibility only; does not prune
reactions = expander.do_expansion(smiles)
reactants = [[m.smiles for m in tup[0].reactants[0]] for tup in reactions]
metadata = pd.DataFrame([rxn.metadata for tup in reactions for rxn in tup])
print(f"{len(reactions)} disconnections; metadata fields: {list(metadata.columns)}")
print(metadata.head()) # template info, policy probability, filter feasibilityWhen to use: the ZINC subset is not the catalogue you actually buy from. Stock files must hold pre-computed InChIKeys, not SMILES — smiles2stock does the conversion.
# one SMILES per line
smiles2stock --files enamine_bb.smi inhouse.smi --output my_stock.hdf5
smiles2stock --files enamine_bb.smi --output my_db --target mongo # MongoDB targetstock:
enamine:
type: inchiset
path: my_stock.hdf5
stop_criteria:
price: 10
counts:
C: 10inchiset also reads a CSV with an inchi_key column or a plain single-column text file. For a rule-based stock, subclass StockQueryMixin and implement __contains__(self, mol) over a Molecule, then point stock: type: at the importable class path.
When to use: ring-forming disconnections are being missed (add RingBreaker), or a specific bond must be broken.
expansion:
uspto:
- uspto_model.onnx
- uspto_templates.csv.gz
ringbreaker:
- uspto_ringbreaker_model.onnx
- uspto_ringbreaker_templates.csv.gz
multi_expansion_strategy:
type: aizynthfinder.context.policy.MultiExpansionStrategy
expansion_strategies: [uspto, ringbreaker]
additive_expansion: True
search:
break_bonds: [[1, 2], [3, 4]] # atom-index pairs in the target
break_bonds_operator: and # "and" = all must break, "or" = any
algorithm_config:
search_rewards: ["state score", "broken bonds"]Select it with aizynthcli --policy multi_expansion_strategy .... Bond indices depend on the target's atom ordering — derive them from the canonical SMILES you actually pass in and confirm the atom map with the user.
When to use: the batch already ran, and you want a different ranking or images without re-searching.
import pandas as pd
from aizynthfinder.analysis import RouteSelectionArguments
from aizynthfinder.reactiontree import ReactionTree
# Widen route extraction, then re-rank by a different scorer
finder.build_routes(RouteSelectionArguments(nmin=5, nmax=50, return_all=True))
finder.routes.compute_scores(finder.scorers["number of reactions"])
finder.routes.rescore(finder.scorers["number of pre-cursors in stock"])
# Render routes stored in a batch output file
data = pd.read_json("output.json.gz", orient="table")
for i, tree in enumerate(data.trees.values[0]):
ReactionTree.from_dict(tree).to_image().save(f"target0_route{i:03d}.png")output.json.gz — batch results, one row per target; read with pd.read_json(..., orient="table"). Columns: target, search_time, first_solution_time, first_solution_iteration, number_of_nodes, max_transforms, max_children, number_of_routes, number_of_solved_routes, top_score, is_solved, number_of_steps, number_of_precursors, number_of_precursors_in_stock, precursors_in_stock, precursors_not_in_stock, precursors_availability, policy_used_counts, profiling, stock_info, top_scores, treestrees.json — route trees for a single-SMILES CLI run (statistics go to the terminal)checkpoint.json.gz — processed targets, so a crashed batch resumes; cat_aizynth_output concatenates several output filesroute_*.png — rendered reaction trees from RouteCollection.images or ReactionTree.to_image()Report is_solved, step count, and the precursors that fell outside stock. For a library screen report solve rate and the step-count distribution.
| Problem | Cause | Solution |
|---|---|---|
PolicyException: number of templates does not agree with the output dimensions of the model | Model and template file come from different releases | Re-pair them; the ringbreaker model needs ringbreaker templates |
| Templates load but every expansion is empty | Wrong template_column | Default is retro_template. CSV templates are read with sep="\t", index_col=0 — a comma-separated file parses silently wrong |
| Nothing is ever in stock | Stock file holds SMILES, not InChIKeys | Rebuild with smiles2stock --files x.smi --output stock.hdf5 |
| Target reported solved immediately with an empty route | The target itself is in stock | Set search.exclude_target_from_stock: True |
| Every search hits the time limit unsolved | Budget or branching too tight/wide | Raise time_limit/iteration_limit first; then lower cutoff_number or max_transforms; return_first: True if any solution suffices |
Config with top-level policy: / properties: keys fails | Pre-v4 format | Translate to expansion: / filter: / search: |
--nproc produces fewer output files than expected | One shard failed and aborted concatenation | Check the per-process aizynthcli*.log files |
finder.routes is empty or raises | build_routes() was not called | Always call build_routes() after tree_search() |
Clustering or distance_to unavailable | route-distances missing | Install the [all] extra |
ImportError on TensorFlow | Assuming the TF backend | Default runtime is onnxruntime; only use_remote_models or .hdf5 Keras models need [tf] |
plugins/ (Chemformer, disconnection-aware expansion)© jaechang-hits, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis of jaechang-hits/SciAgent-Skills.
Open the folder on GitHubat commit 82c862c
Aizynthfinder Retrosynthesis 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 |
|---|---|---|---|---|---|---|
| Aizynthfinder Retrosynthesis this skilljaechang-hits/SciAgent-Skills | 374 | — | ~5k | Automated safety check: Pass | MIT | |
| DiffDock Molecular DockingK-Dense-AI/scientific-agent-skills | 48k | 1 repos | ~3k | Automated safety check: Notes | MIT | |
| Edu Chem Reactionwy51ai/edulab | 1.4k | — | ~1.2k | Automated safety check: Pass | Apache-2.0 | |
| Rowanlamm-mit/scienceclaw | 246 | 4 repos | ~3.1k | Automated safety check: Warn | Proprietary | |
| Coot Rdkitpemsley/coot | 168 | — | ~981 | Automated safety check: Pass | GPL-3.0 | |
| RDKit Cheminformaticsdavila7/claude-code-templates | 33k | 14 repos | ~5k | Automated safety check: Pass | MIT |
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.
wy51ai/edulab
把一个化学反应做成自包含的微观 3D 交互演示网页:左/上为 Three.js 可交互分子动画 (拖滑块看断键·成键·原子重组,分步高亮),右为 KaTeX 反应方程 + 分步讲解 + 原子守恒计数 + 可选能量-反应进程曲线。支持三入口——给定文字反应/方程、随机出题、上传图片识别后演示。
lamm-mit/scienceclaw
Cloud-based quantum chemistry platform with Python API. An agent skill from lamm-mit/scienceclaw.
pemsley/coot
RDKit molecular manipulation and visualization within Coot's Python environment.
davila7/claude-code-templates
Guides molecular work with RDKit in Python: reading SMILES and SDF, sanitization, descriptors, fingerprints, substructure and similarity search, reactions and coordinates.
jinzhezenggroup/computational-chemistry-agent-skills
Generates 3D molecular conformers from SMILES strings or files with RDKit, keeps the lowest-energy one per molecule, and falls back to 2D coordinates when embedding fails.
jaechang-hits/SciAgent-Skills
NEB-IRC activation energy pipeline for reaction barriers using GFN2-xTB and pysisyphus.
jaechang-hits/SciAgent-Skills
3Dmol.js WebGL molecular visualization emitted as self-contained HTML.
jaechang-hits/SciAgent-Skills
Constraint-based (COBRA) analysis of genome-scale metabolic models: FBA, FVA, knockouts, flux sampling, production envelopes, gapfilling, media optimization.
jaechang-hits/SciAgent-Skills
Read, write, and edit ChemDraw CDX/CDXML files with RDKit's rdkit.Chem.rdChemDraw plus direct XML editing, always paired with a rendered PNG.
jaechang-hits/SciAgent-Skills
Programmatic PubMed access via NCBI E-utilities REST API. An agent skill from jaechang-hits/SciAgent-Skills.
jaechang-hits/SciAgent-Skills
Scaffold a new SciAgent-Skills entry. An agent skill from jaechang-hits/SciAgent-Skills.
Categories
AiZynthFinder retrosynthetic route planning (CASP) from AstraZeneca Molecular AI. Aizynthfinder Retrosynthesis is an agent skill from jaechang-hits/SciAgent-Skills. AiZynthFinder retrosynthetic route planning (CASP) from AstraZeneca Molecular AI.
Aizynthfinder Retrosynthesis fits situations like: synthesis route planning; synthesizability screening; building-block/precursor search.
Run `npx skills add jaechang-hits/SciAgent-Skills --skill aizynthfinder-retrosynthesis -a claude-code`. Or copy the skill folder (skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis in jaechang-hits/SciAgent-Skills) into .claude/skills/aizynthfinder-retrosynthesis in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jaechang-hits/SciAgent-Skills --skill aizynthfinder-retrosynthesis -a codex`. Or copy the skill folder (skills/structural-biology-drug-discovery/aizynthfinder-retrosynthesis in jaechang-hits/SciAgent-Skills) into .agents/skills/aizynthfinder-retrosynthesis 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 jaechang-hits/SciAgent-Skills --skill aizynthfinder-retrosynthesis -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/aizynthfinder-retrosynthesis, .gemini/skills/aizynthfinder-retrosynthesis, .github/skills/aizynthfinder-retrosynthesis and .opencode/skills/aizynthfinder-retrosynthesis in your project.
Going by SKILL.md and its folder, Aizynthfinder Retrosynthesis needs the command-line tools its instructions call (conda and python). Our summary lists: Python 3.
SKILL.md names 4 domains. As links in the text: molecularai.github.io, github.com, doi.org and pypi.org. 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.
Aizynthfinder Retrosynthesis is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5k tokens (SKILL.md is roughly 20k 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 Aizynthfinder Retrosynthesis: DiffDock Molecular Docking (K-Dense-AI/scientific-agent-skills, 48k stars), Edu Chem Reaction (wy51ai/edulab, 1.4k stars), Rowan (lamm-mit/scienceclaw, 246 stars) and Coot Rdkit (pemsley/coot, 168 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jaechang-hits (a GitHub user) maintains it in jaechang-hits/SciAgent-Skills, which has 374 GitHub stars. The repository holds 169 skills in this directory. The repository was last updated on September 29, 2026.
Source: jaechang-hits/SciAgent-Skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.