🥘 Hotpot (火锅)
A cheminformatics harness for coordination chemistry
HOTPOT — a Human- and LLM-Oriented Toolkit with chemical Priors for Open-ended cheminformatics Tasks.
In Hotpot, every ingredient is cookable. 什么都能涮 In data-driven chemistry, every problem is computable. 什么都能算
Hotpot presents chemistry through two equally important conceptual entry
points: Molecule for molecular systems and Crystal for periodic systems.
Molecule is the mature working interface today; Crystal defines an equal
part of the long-term public model and remains under active development.
Hotpot is designed around four layers:
- a frontend that chemists can read and use directly;
- a structured CLI that language models and automation agents can call reliably;
- a silent cheminformatics layer that applies domain rules without burdening the caller with implementation details; and
- AI backends exposed as chemistry operations rather than training code.
The public documentation therefore focuses on observable behavior, scientific scope, and stable interfaces. Internal chemical decision policies and model implementation details are intentionally kept outside the user-facing API. The preceding project description is preserved as README.2026.md for historical reference; this document is the description of the current checkout.
Contents
- Command-line interface
- Installation
- Python interface
- Chemistry capabilities
- Geometry and force-field validation
- Validation evidence
- Scientific boundaries
- References
- Roadmap
- Development
Command-line interface
The CLI is the preferred interface for shell workflows, language-model tool
use, and reproducible pipelines. Each command accepts --help; the chemistry
commands also provide extended examples through --doc.
| Command | Purpose | Typical output | Detailed guide |
|---|---|---|---|
hotpot mca |
Predict site-resolved methyl cation affinity (MCA) | Atom table in kJ/mol | MCA CLI |
hotpot cbond |
Predict and construct metal–ligand coordination bonds | Complex SMILES or ranked structures | CBond CLI |
hotpot ff |
Build or optimize 3D molecular structures and report quality | Molecular structure file and optional JSON report | Force-field CLI |
MCA prediction
$ hotpot mca 'c1ccccc1CN' --device cpu
No. Atom MCA(kJ/mol) is_Nuc_site
1 C 319.00 False
2 C 304.00 False
3 C 329.25 False
4 C 303.50 False
5 C 318.75 False
6 C 324.00 False
7 C 314.50 False
8 N 489.50 True
MCA is reported for every heavy atom. is_Nuc_site marks the sites selected
by the supported nucleophilic-site definition.
Coordination-bond construction
$ hotpot cbond Eu \
'O=C(N(C)CCC)C(C=C1)=NC2=C1C=CC3=C2N=C(C4=NC(C(C)(C)CCC5(C)C)=C5N=N4)C=C3' \
--device cpu --bond-detail
CCCN(C1=[O][Eu@]23n4c1ccc1c4c4n3c(-[c]3n2nc2c(n3)C(C)(C)CCC2(C)C)ccc4cc1)C
Cbond Detail:
AtomIdx Atom Score
10 N 4.04834
17 N 7.02889
0 O 6.10205
32 N 4.98739
-- End --
This is the (CyMe4)Pyz-PrMe-DIPhen extractant used in Hotpot's coordination
chemistry examples. The result is not a decorative single-bond demonstration:
the model selects four donor atoms across a chemically complex ligand,
constructs the Eu coordination graph, and reports the score associated with
each selected metal–donor bond. The ligand may also be supplied as a molecular
file. Use --all-structures when ranked alternative coordination structures
are required. By default, the first coordination bond uses a raw-score
threshold of -0.5; subsequent bonds use -0.125.
Force-field optimization
$ hotpot ff CC --epochs 1 --steps-per-epoch 20 --quality standard \
--seed 2026 --report ethane.json -o ethane.mol2
This writes a parseable, hydrogen-complete 3D structure to ethane.mol2 and
a machine-readable validation report to ethane.json. A successful report
contains "status": "ok".
Commands compose through standard input and output, which makes the public surface convenient for both people and LLM-driven tools:
$ hotpot cbond Eu \
'O=C(N(C)CCC)C(C=C1)=NC2=C1C=CC3=C2N=C(C4=NC(C(C)(C)CCC5(C)C)=C5N=N4)C=C3' \
--device cpu \
| hotpot ff - --input-format smi --epochs 1 --steps-per-epoch 20 \
--quality off --seed 2026 -o eu-extractant.mol2
Installation
Hotpot supports Python 3.9–3.14 for its chemical kernel, search layer, and ONNX inference path. Python 3.10 or newer is recommended.
Install from PyPI
$ conda create -n hp python=3.11 pip -y
$ conda activate hp
$ python -m pip install --upgrade pip
$ python -m pip install hotpot-zzy
Install the current source
$ git clone https://github.com/Zhang-Zhiyuan-zzy/hotpot.git
$ cd hotpot
$ conda create -n hp python=3.11 pip -y
$ conda activate hp
$ python -m pip install --upgrade pip
$ python -m pip install -e .
The source tree can contain interfaces newer than the latest PyPI release.
Install with Docker
Build the Conda-based Hotpot image from the repository root. The image build installs Hotpot and its compiled extensions, then checks the installed package before completing:
$ docker build --build-arg PYTHON_VERSION=3.13 \
--tag hotpot-test:py313-conda \
--file docker/test/Dockerfile .
Run a Hotpot command in the isolated environment:
$ docker run --rm hotpot-test:py313-conda hotpot --help
Running the image without an additional command executes the complete test and coverage suite:
$ docker run --rm hotpot-test:py313-conda
Python 3.9 through 3.14 images and host-source test containers can also be managed with the repository scripts. See the Docker guide for version selection, interactive use, and image export.
Optional dependency profiles
| Extra | Installation | Scope |
|---|---|---|
pymol |
python -m pip install 'hotpot-zzy[pymol]' |
NumPy profile compatible with PyMOL 3.1; PyMOL itself is not installed |
optimize |
python -m pip install 'hotpot-zzy[optimize]' |
Classical optimization and machine-learning workflows |
datasets |
python -m pip install 'hotpot-zzy[datasets]' |
Dataset download, HDF5, and PyG support |
complexformer |
python -m pip install 'hotpot-zzy[complexformer]' |
ComplexFormer training and LoRA dependencies |
onnx-export |
python -m pip install 'hotpot-zzy[onnx-export]' |
ONNX export and inspection tools |
dev |
python -m pip install -e '.[dev]' |
Tests, linting, coverage, and package builds |
PyMOL 3.1 requires numpy>=1.26.4,<2. Use the pymol profile in an isolated
environment if PyMOL is required.
ONNX inference uses CPU by default and automatically selects an available GPU
provider. GPU users must install an onnxruntime-gpu build compatible with
the machine's CUDA and cuDNN libraries; the newest runtime is not necessarily
compatible with every installed CUDA version.
Python interface
The Python API expresses the same operations through native chemical objects.
Site-resolved MCA
from hotpot import read_mol
from hotpot.calculator import mca
mol = read_mol("c1ccccc1CN")
mca(mol, device="cpu")
for atom, value in mol.mca_sites.items():
print(atom.label, f"{value:.2f}")
N7 489.50
atom.mca is a read-only result. Accessing it before prediction raises an
error that directs the caller to the calculator.
Molecular objects, rings, and aromaticity
import hotpot as hp
mol = hp.read_mol("c1ccccc1O")
print(len(mol.atoms))
print([len(ring.atoms) for ring in mol.rings])
print([ring.is_aromatic for ring in mol.rings])
7
[6]
[True]
Hotpot exposes molecular rings and performs aromaticity perception. More detail about graph-level ring APIs is available in the graph package guide.
Interoperability
import hotpot as hp
mol = hp.read_mol("CCN")
print(len(hp.to_hotpot_mol(mol.to_rdmol()).atoms))
print(len(hp.to_hotpot_mol(mol.to_obmol()).atoms))
3
3
to_hotpot_mol is the shared conversion entry point for Hotpot, RDKit, and
Open Babel molecular objects.
Thermodynamic and graph representations
import hotpot as hp
mol = hp.read_mol("c1ccc(O)cc1", "smi")
thermo = mol.get_thermo(temp=298.15, pressure=101325)
print(thermo.Tc)
print(thermo.Psat)
694.2
80.20201686
import hotpot as hp
phenol = hp.read_mol("c1ccc(O)cc1", "smi").graph_spectral()
benzoic_acid = hp.read_mol("c1ccccc1C(=O)O", "smi").graph_spectral()
reordered_phenol = hp.read_mol("c1ccccc1O", "smi").graph_spectral()
print(phenol.vectors.shape)
print(benzoic_acid.vectors.shape)
print(phenol | benzoic_acid)
print(phenol | reordered_phenol)
(6, 13)
(6, 15)
0.907590226292854
1.0
Chemistry capabilities
Native chemical objects
Molecule,Atom,Bond, andRingrepresent molecular structure and expose chemistry-oriented operations.Crystalis the co-equal periodic-system concept in Hotpot's public model; its mature workflow remains on the roadmap.- Common molecular formats can be read and written through a single object model.
Search and SMARTS
Hotpot provides a NetworkX-based SMARTS and substructure search system while preserving metal-aware matching. See the SMARTS guide for its public syntax and examples.
Molecular assembly
The assembly API supports fragment joining and ring-based construction.
RingWedge is part of the public interface for explicitly describing a ring
wedge used in assembly. See the
assembly guide.
AI-backed chemistry
The inference capabilities include site-resolved MCA and metal–ligand coordination-bond prediction. Versioned weights are downloaded from the public Hotpot model repository on first use, pinned to an immutable revision, cached locally, and verified by SHA-256. They can also be installed before an offline run:
$ hotpot models install --all
Users do not need the training implementation to call the stable chemistry-facing interfaces.
Geometry and force-field validation
Geometry provides mathematical measurements and spatial relationships; force-field code decides how those facts affect a chemical workflow. Public geometry concepts and relation functions are documented in the geometry package guide.
The public force-field validation interface can assess a structure independently of the optimizer that produced it:
import hotpot as hp
from hotpot.cheminfo import forcefields as ff
mol = hp.read_mol("CC")
mol.build3d(
forcefield="UFF",
epochs=1,
steps_per_epoch=20,
quality_level="standard",
seed=2026,
)
report = ff.evaluate_structure_acceptance(mol, level="standard")
print(report.passed)
True
This common report makes native Open Babel, native RDKit, Hotpot, or external optimization results comparable under the same public geometry-quality gate.
Validation evidence
Ligand and Am–ligand benchmark
Four independently launched workflows were evaluated on the same 187 isolated
ligands and the same 182 CBond-eligible Am–ligand complexes. Hotpot uses its
default FAST convergence policy. Times are median construction-plus-optimize
durations among completed workflows in a 16-worker run; CBond inference,
serialization, rendering, and any external post-validation are excluded.
Hotpot optimize_complex uses internal acceptance checks to select its route;
their cost therefore remains inside its reported duration.
| Workflow | Ligand geometry pass | Ligand median time | Am–ligand geometry pass | Am–ligand median time |
|---|---|---|---|---|
| RDKit | 186/187 (99.5%) | 0.314 s | 30/182 (16.5%) | 0.457 s |
| Open Babel | 181/187 (96.8%) | 1.159 s | 162/182 (89.0%) | 2.134 s |
Hotpot obWrappers (FAST) |
183/187 (97.9%) | 1.759 s | 164/182 (90.1%) | 2.919 s |
Hotpot optimize_complex |
182/187 (97.3%) | 3.372 s | 182/182 (100.0%) | 3.732 s |
The independent launch commands and evidence files are documented with the benchmark:
For Am–ligand complexes, Hotpot optimize_complex accepted 164 native FAST
results directly and sent 18 rejected candidates through the complete complex
workflow. All four convergence policies remain selectable through the Python
API and hotpot ff --convergence-level; automatic fallback does not silently
upgrade the caller's selected policy to STRICT.
Am–ligand construction gallery
The same 187 extractant ligands were submitted to Hotpot's automatic complex
workflow with Am: native FAST optimization first, followed by the complete
complex workflow only when the preliminary structure was rejected. Hotpot
inferred at least one Am–donor coordination bond for 182/187 inputs;
5/187 inputs produced no Am CBond. All 182/182 optimized outputs
passed the current generic geometry gate; this does not establish that every
coordination environment is chemically definitive.
The galleries use explicit hydrogens and a white-background, orthographic, Materials Studio-inspired ball-and-stick style. Each structure is viewed along the maximum principal moment axis of its mass-weighted inertia tensor.
CBond-positive inputs. Each panel shows the workflow-selected final structure.
Inputs for which no Am CBond was inferred. These are visualization-only 3D ligand structures, not Am complexes.
The path-free gallery evidence records the exhaustive case partition, structure and report hashes, explicit-H and Am counts, rendering status, principal moments, and image hashes.
Scientific boundaries
- MCA values are model predictions in kJ/mol and are not Mayr nucleophilicity parameters.
- Ranked CBond path probabilities are model-relative weights, not calibrated experimental probabilities.
- A force-field quality pass means that the configured structural checks passed; it does not prove that the global minimum, oxidation state, ligand field, or experimentally dominant conformer is correct.
- Macroscopic observables generally describe ensembles and environments. A single optimized molecular structure should not be treated as a complete thermodynamic or experimental model.
References
If Hotpot contributes to published work, please cite the application paper relevant to the workflow:
- Z. Zhang, D. Yang, Y. Que, Y. Wu and C. Liu, “Coordination-informed machine learning enables virtual screening of phenanthroline ligands by predicting Am/Eu binding preferences,” Chemical Communications, 62 (2026), 17426–17430. https://doi.org/10.1039/D6CC03919G
Roadmap
- Mature
Crystalworkflows for periodic structures. - A stable
Molecule.descriptorsinterface. - Automatic fine-tuning of compatible models from private molecular datasets, with an explicit user-controlled workflow.
- Molecule-aware experimental optimization across mixed chemical and process variables.
- AI-assisted molecular generation and conditional design.
- Oxidation-state perception for coordination systems.
Roadmap entries are design intentions rather than currently supported APIs.
Development
README examples are executable regression tests. Run them with:
$ python -m pytest -q tests/readme
The benchmark launchers and evidence aggregation command are listed in the coordination-complex benchmark guide.
The complete test suite and coverage shortcut is:
$ ./tests/run_coverage.sh
License
Hotpot is released under the MIT License.
Metadata
Release files for hotpot-zzy 0.5.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| hotpot_zzy-0.5.4.0.tar.gz | 876.2 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| hotpot_zzy-0.5.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.14 | CPython 3.14 | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| hotpot_zzy-0.5.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| hotpot_zzy-0.5.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| hotpot_zzy-0.5.4.0-cp311-cp311-manylinux_2_31_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.31+ x86-64 | Details |
| hotpot_zzy-0.5.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| hotpot_zzy-0.5.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.10 | CPython 3.10 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| hotpot_zzy-0.5.4.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.9 | CPython 3.9 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
Total release size: 18.9 MB
Release files / hotpot_zzy-0.5.4.0.tar.gz
| Download URL | hotpot_zzy-0.5.4.0.tar.gz |
|---|---|
| Size | 876.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
28abebb0f1e3f3a6d5c21f963c0aba5e107193b9cd94040d87547c4bbce61a04
|
|
BLAKE2b-256 checksum How to use checksums |
87ac193bcd8146e919a70354c88a45079cac501b6d2eacc912b37cb745d9f98b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.16
|
Release files / hotpot_zzy-0.5.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | hotpot_zzy-0.5.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.14 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
29db46d69ea5d66e25524f65e021ea99d3450b8e8a8e3410fa89c8708d763332
|
|
BLAKE2b-256 checksum How to use checksums |
29d0430131d628d7d3f3b933214755765a315e67c312fb1d5af856b79fe223db
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.16
|
Release files / hotpot_zzy-0.5.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | hotpot_zzy-0.5.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
3f047701304e27b46206996e6857c222a2eda12c095a0fc54f7e131b4f9e6950
|
|
BLAKE2b-256 checksum How to use checksums |
5642d9b5f4416e2bf7a220c44694e15612be04090378e9886b6faa3e4380b507
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.16
|
Release files / hotpot_zzy-0.5.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | hotpot_zzy-0.5.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
23f39aa258b6440df22b4342dbf06cd0f2a4d143b7b3284cdf7b3eb46b4b635b
|
|
BLAKE2b-256 checksum How to use checksums |
5a3ecc287193c15c2c264d55a58bb6adf6cfafd3422e2a37b284016e15f1c1bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.16
|
Release files / hotpot_zzy-0.5.4.0-cp311-cp311-manylinux_2_31_x86_64.whl
| Download URL | hotpot_zzy-0.5.4.0-cp311-cp311-manylinux_2_31_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.11 Linux glibc 2.31+ x86-64 |
|
SHA-256 checksum How to use checksums |
646c9285280557b600c36206bab5f92c3159968ea6d002183492faca646ee31f
|
|
BLAKE2b-256 checksum How to use checksums |
eb6fed8aea219561b604c2b5c8c54b49efb25661b0e72b4329a94522dd857d25
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.16
|
Release files / hotpot_zzy-0.5.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | hotpot_zzy-0.5.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
20b75ec52c971d0dd103b343dcf8a5e2c425f2b46f27a6f468af7b809fbef762
|
|
BLAKE2b-256 checksum How to use checksums |
66f39692cfcff2db1505391cf35200531b2fecd78007be040e05d91cfa51cb60
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.16
|
Release files / hotpot_zzy-0.5.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | hotpot_zzy-0.5.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
fad3eb3de8ed83e46500fff211639ca7d9e1724aed5d5103ac2ff1abacea9274
|
|
BLAKE2b-256 checksum How to use checksums |
74416ef3ef06ba1d07ba8044214e2ff6b9835181830233527c48e3fdff4d43e0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.16
|
Release files / hotpot_zzy-0.5.4.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | hotpot_zzy-0.5.4.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.9 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
5f5e23db9f251ecb010e06b4215b8eab1a80b29f5244a0425cdacaefae91a190
|
|
BLAKE2b-256 checksum How to use checksums |
e39a4f809b1e2a92753b72d1bb1f8ba879b43bf1ee367d7dcbadc77f18ec2d89
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.16
|