{"id":17580,"plugin_id":"plugins_6a76572d8f8081918362aa7ff90947fb","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T23:14:16.260Z","digest":"ac3978d8ea837eebb046b94c9292160c63bb0dafdb8a0f26175d9cc115ff7eac","against":null,"payload":{"name":"diffdock-nim","description":"Run DiffDock molecular docking via NVIDIA NIM to predict small-molecule binding poses against protein targets. Use for DiffDock, molecular docking, ligand docking, blind docking, SMILES or SDF ligands, ranked poses, confidence scores, hosted NVIDIA API, or local Docker deployment.","included_files":[{"relative_path":"references/api.md","size_in_bytes":4636},{"relative_path":"references/examples.md","size_in_bytes":2092},{"relative_path":"references/parameters.md","size_in_bytes":1738},{"relative_path":"references/science.md","size_in_bytes":1974},{"relative_path":"references/validation.md","size_in_bytes":1793}],"skill_md_contents":"---\nname: diffdock-nim\ndescription: >\n  Run DiffDock molecular docking via NVIDIA NIM to predict small-molecule binding poses against protein targets. Use for DiffDock, molecular docking, ligand docking, blind docking, SMILES or SDF ligands, ranked poses, confidence scores, hosted NVIDIA API, or local Docker deployment.\nlicense: Apache-2.0 AND CC-BY-4.0\ncompatibility: \"requests>=2.28\"\nallowed-tools: Bash, Read, Write, AskUserQuestion\n---\n\n# DiffDock NIM\n\nPredict protein-ligand binding poses with blind docking. Use this `SKILL.md` for\nfirst-pass hosted/local usage; load supplemental files only when needed:\n\n- `references/api.md`: exact hosted/local endpoints, schemas, Docker flags.\n- `references/science.md`: docking use cases, limits, and handoffs.\n- `references/parameters.md`: ligand formats, pose counts, diffusion controls.\n- `references/validation.md`: receptor, ligand, pose, and confidence checks.\n- `references/examples.md`: compact hosted/local and pose-saving patterns.\n\n## Choose Mode\n\nAsk only when context is unclear:\n\n> Hosted NVIDIA API or local Docker NIM?\n\n- Hosted: `https://health.api.nvidia.com/v1/biology/mit/diffdock`\n- Local: `http://localhost:8000/molecular-docking/diffdock/generate`\n\nThe hosted and local paths differ. Local has no `/v1/` prefix and uses the\n`/molecular-docking/` route. Hosted requests use `Authorization: Bearer $NGC_API_KEY`. Supported local Docker\nstartup uses `NGC_API_KEY` (or `NVIDIA_API_KEY` via the preflight) for\nregistry login, entitlement checks, and first-run model downloads; pass it\ninto the container with `-e NGC_API_KEY`. Local inference requests use no\nauth header after readiness. Warm-cache key-free startup varies by\nimage/version and should not be assumed.\n\n## Local Docker\n\nFor local setup answers, copy the preflight below exactly. Keep the optional\n`.env` load, `NVIDIA_API_KEY` fallback, `LOCAL_NIM_CACHE`,\n`NVIDIA_VISIBLE_DEVICES=0` default, `--shm-size=2G`, and both `--ulimit` flags.\n\n```bash\nset -a\n[ -f .env ] && . ./.env\nset +a\n\nif [ -z \"${NGC_API_KEY:-}\" ] && [ -n \"${NVIDIA_API_KEY:-}\" ]; then\n  export NGC_API_KEY=\"$NVIDIA_API_KEY\"\nfi\n: \"${NGC_API_KEY:?Set NGC_API_KEY or NVIDIA_API_KEY}\"\n: \"${LOCAL_NIM_CACHE:?Set LOCAL_NIM_CACHE}\"\n\necho \"$NGC_API_KEY\" | docker login nvcr.io --username '$oauthtoken' --password-stdin\n\nexport NIM_TEST_GPU=\"${NIM_TEST_GPU:-0}\"\nmkdir -p \"${LOCAL_NIM_CACHE}\"\nchmod 777 \"${LOCAL_NIM_CACHE}\"\n\ndocker run --rm -it --name diffdock-nim \\\n  --runtime=nvidia \\\n  -e NVIDIA_VISIBLE_DEVICES=\"${NIM_TEST_GPU}\" \\\n  --shm-size=2G \\\n  --ulimit memlock=-1 \\\n  --ulimit stack=67108864 \\\n  -e NGC_API_KEY \\\n  -v \"${LOCAL_NIM_CACHE}:/opt/nim/.cache\" \\\n  -p 8000:8000 \\\n  nvcr.io/nim/mit/diffdock:2.2.0\n```\n\nReadiness:\n\n```bash\nuntil curl -sf http://localhost:8000/v1/health/ready; do sleep 5; done\n```\n\n## Prepare Inputs\n\nProtein receptor must be ATOM records only. Strip headers, water, and HETATM.\n\n```python\nfrom pathlib import Path\nraw_pdb = Path(\"protein.pdb\").read_text()\nprotein = \"\\n\".join(line for line in raw_pdb.splitlines() if line.startswith(\"ATOM\"))\nif not protein:\n    raise ValueError(\"protein.pdb has no ATOM records\")\n```\n\nLigand options:\n\n- SMILES: `ligand = \"CC(=O)OC1=CC=CC=C1C(=O)O\"`; `ligand_file_type = \"txt\"`.\n- SDF: `ligand = Path(\"ligand.sdf\").read_text()`; `ligand_file_type = \"sdf\"`.\n- MOL2: `ligand_file_type = \"mol2\"`.\n\nDo not use `\"smiles\"` as `ligand_file_type`; SMILES is `\"txt\"`.\n\n## Request Pattern\n\n```python\nimport os\nimport requests\n\nHOSTED = True\nurl = (\n    \"https://health.api.nvidia.com/v1/biology/mit/diffdock\"\n    if HOSTED else \"http://localhost:8000/molecular-docking/diffdock/generate\"\n)\nheaders = {\"Content-Type\": \"application/json\"}\nif HOSTED:\n    headers[\"Authorization\"] = f\"Bearer {os.environ['NGC_API_KEY']}\"\n\npayload = {\n    \"protein\": protein,\n    \"ligand\": ligand,\n    \"ligand_file_type\": ligand_file_type,\n    \"num_poses\": 10,\n    \"time_divisions\": 20,\n    \"steps\": 18,\n    \"save_trajectory\": False,\n}\nresponse = requests.post(url, headers=headers, json=payload, timeout=300)\nresponse.raise_for_status()\nresult = response.json()\n```\n\n## Save And Report Output\n\n`ligand_positions` and `position_confidence` are parallel ranked lists.\n`position_confidence[0]` is the rank-1 pose confidence.\n\n```python\nposes = result[\"ligand_positions\"]\nscores = result[\"position_confidence\"]\nfor rank, (pose_sdf, score) in enumerate(zip(poses, scores), start=1):\n    filename = f\"pose_{rank}_conf{score:.3f}.sdf\"\n    with open(filename, \"w\", encoding=\"utf-8\") as handle:\n        handle.write(pose_sdf)\n    print(f\"pose {rank}: confidence={score:.4f} saved={filename}\")\nprint(f\"best pose confidence: {scores[0]:.4f}\")\n```\n\nView pose SDF files with the receptor in PyMOL, ChimeraX, or UCSF Chimera. For\npose sanity checks and confidence caveats, read `references/validation.md`.\n\n## Limits And Troubleshooting\n\n- Max `num_poses`: 100. Max `time_divisions`: 20. Max `steps`: 18.\n- Single GPU; local minimum is about 24 GB VRAM.\n- `422`: invalid `ligand_file_type`, invalid SMILES/SDF, or no ATOM records.\n- Empty poses: validate receptor ATOM records and ligand parseability.\n- Local URL 404 usually means the wrong hosted path or an accidental `/v1/`.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}