Install any skill in seconds. Free to start, no credit card required.
Get Started Free →PNNL cheminformatics LLM agent for molecular analysis
.claude/skills/brycewang-stanford-cactus-cheminformatics-guide/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -25% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -39% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -56% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -59% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -26% | 0% |
CACTUS is a cheminformatics LLM agent developed at Pacific Northwest National Laboratory (PNNL) that provides AI-assisted molecular analysis, property prediction, and chemical reasoning. It wraps RDKit, molecular databases, and ML models behind a conversational interface, enabling researchers to query molecular properties, perform similarity searches, and run cheminformatics workflows using natural language.
pythonfrom cactus import ChemAgent agent = ChemAgent(llm_provider="anthropic") # Natural language chemistry queries result = agent.ask( "What is the molecular weight and LogP of aspirin? " "Is it drug-like by Lipinski's rules?" ) print(result.answer) # Aspirin (CC(=O)Oc1ccccc1C(=O)O): # MW: 180.16, LogP: 1.24 # Lipinski: PASS (MW<500, LogP<5, HBD=1≤5, HBA=4≤10) # Molecular property calculation props = agent.calculate_properties( smiles="CC(=O)Oc1ccccc1C(=O)O", properties=["mw", "logp", "tpsa", "hbd", "hba", "rotatable"], ) print(props)
python# Find similar molecules similar = agent.similarity_search( query_smiles="CC(=O)Oc1ccccc1C(=O)O", # Aspirin database="chembl", threshold=0.7, # Tanimoto similarity max_results=10, ) for mol in similar: print(f"{mol.name}: {mol.smiles} " f"(similarity: {mol.tanimoto:.3f})")
python# Substructure search matches = agent.substructure_search( pattern="c1ccccc1C(=O)O", # Benzoic acid motif database="drugbank", max_results=20, ) # Functional group identification groups = agent.identify_functional_groups( smiles="CC(=O)Oc1ccccc1C(=O)O" ) # ["ester", "carboxylic_acid", "aromatic_ring"]
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 20,129 | 18,923 | -6% | 1 | 1 | 0% | 4,155 | 3,111 | -25% | 0 | 0 | — |
case-02 | fail→pass | 16,676 | 6,120 | -63% | 1 | 1 | 0% | 3,116 | 1,915 | -39% | 0 | 0 | — |
case-03 | fail→pass | 19,822 | 5,064 | -74% | 1 | 1 | 0% | 3,739 | 1,654 | -56% | 0 | 0 | — |
case-04 | pass→pass | 23,047 | 12,710 | -45% | 1 | 1 | 0% | 4,673 | 3,114 | -33% | 0 | 0 | — |
case-05 | pass→pass | 26,551 | 33,055 | +24% | 1 | 1 | 0% | 5,174 | 6,004 | +16% | 0 | 0 | — |
case-06 | pass→pass | 43,700 | 16,594 | -62% | 1 | 1 | 0% | 2,009 | 3,499 | +74% | 0 | 0 | — |
case-07 | fail→pass | 17,926 | 3,489 | -81% | 1 | 1 | 0% | 3,145 | 1,277 | -59% | 0 | 0 | — |
case-08 | fail→pass | 9,836 | 3,728 | -62% | 1 | 1 | 0% | 1,778 | 1,322 | -26% | 0 | 0 | — |
case-09 | fail→pass | 10,044 | 2,457 | -76% | 1 | 1 | 0% | 1,695 | 1,064 | -37% | 0 | 0 | — |
case-10 | pass→pass | 11,171 | 3,716 | -67% | 1 | 1 | 0% | 1,866 | 1,371 | -27% | 0 | 0 | — |
case-11 | fail→pass | 14,816 | 2,193 | -85% | 1 | 1 | 0% | 2,559 | 1,052 | -59% | 0 | 0 | — |
case-12 | pass→pass | 17,952 | 2,078 | -88% | 1 | 1 | 0% | 3,094 | 1,037 | -66% | 0 | 0 | — |
case-13 | fail→pass | 16,030 | 2,271 | -86% | 1 | 1 | 0% | 2,754 | 1,086 | -61% | 0 | 0 | — |
case-14 | pass→pass | 7,937 | 2,411 | -70% | 1 | 1 | 0% | 1,419 | 1,034 | -27% | 0 | 0 | — |
case-15 | fail→pass | 10,388 | 1,941 | -81% | 1 | 1 | 0% | 1,942 | 1,014 | -48% | 0 | 0 | — |
case-16 | fail→pass | 5,915 | 4,407 | -25% | 1 | 1 | 0% | 1,105 | 1,351 | +22% | 0 | 0 | — |
case-17 | fail→pass | 9,330 | 2,831 | -70% | 1 | 1 | 0% | 1,615 | 1,214 | -25% | 0 | 0 | — |
case-18 | pass→pass | 23,466 | 2,180 | -91% | 1 | 1 | 0% | 4,099 | 1,087 | -73% | 0 | 0 | — |
case-19 | fail→pass | 12,305 | 5,206 | -58% | 1 | 1 | 0% | 2,038 | 1,609 | -21% | 0 | 0 | — |
case-20 | fail→pass | 11,928 | 1,636 | -86% | 1 | 1 | 0% | 1,900 | 889 | -53% | 0 | 0 | — |
case-21 | pass→pass | 11,743 | 3,679 | -69% | 1 | 1 | 0% | 1,937 | 1,390 | -28% | 0 | 0 | — |
case-22 | fail→pass | 16,514 | 7,282 | -56% | 1 | 1 | 0% | 3,325 | 2,240 | -33% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +64 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.