정보
Rowan은 pKa 예측, 도킹, 분자 동역학을 포함한 분자 모델링 워크플로우를 위한 클라우드 네이티브 Python API를 제공합니다. 로컬 HPC/GPU 인프라가 필요하지 않아, 프로그래밍 방식의 배치 스크리닝과 다단계 화학 파이프라인에 이상적입니다. 컨포머 생성, 단백질-리간드 공동 접힘, 디스크립터 계산과 같은 작업에 사용하세요.
빠른 설치
Claude Code
추천npx skills add K-Dense-AI/claude-scientific-skills -a claude-code/plugin add https://github.com/K-Dense-AI/claude-scientific-skillsgit clone https://github.com/K-Dense-AI/claude-scientific-skills.git ~/.claude/skills/rowanClaude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요
문서
Rowan: Cloud-Native Molecular-Modeling and Drug-Design Workflows
Overview
Rowan is a cloud-native workflow platform for molecular simulation, medicinal chemistry, and structure-based design. Its Python API exposes a unified interface for small-molecule modeling, property prediction, docking, molecular dynamics, and AI structure workflows.
Use Rowan when you want to run medicinal-chemistry or molecular-design workflows programmatically without maintaining local HPC infrastructure, GPU provisioning, or a collection of separate modeling tools. The service manages hosted compute and results; available workflows depend on the account.
When to use Rowan
Rowan is a good fit for:
- Quantum chemistry, semiempirical methods, or neural network potentials
- Batch property prediction (pKa, descriptors, permeability, solubility)
- Conformer and tautomer ensemble generation
- Docking workflows (single-ligand, analogue series, pose refinement)
- Protein-ligand cofolding and MSA generation
- Multi-step chemistry pipelines (e.g., tautomer search → docking → pose analysis)
- Batch medicinal-chemistry campaigns where you need consistent, scalable infrastructure
Rowan is not the right fit for:
- Simple molecular I/O (use RDKit directly)
- Methods or element/charge regimes outside the selected engine's documented support
Quick start
uv pip install "rowan-python==3.2.0"
import rowan
# Reads ROWAN_API_KEY from the environment.
# Descriptors require a 3D Molecule, not a bare SMILES string.
mol = rowan.Molecule.from_smiles("CC(=O)Oc1ccccc1C(=O)O")
wf = rowan.submit_descriptors_workflow(mol, name="aspirin")
result = wf.result()
print(result.descriptors["MW"]) # exact/monoisotopic mass
print(result.descriptors["SLogP"])
print(result.descriptors["TopoPSA"]) # topological PSA
This submits a hosted calculation and consumes credits. Examples target
rowan-python 3.2.0, reviewed
2026-09-30 against the released SDK and official reference.
Local schema/serialization smoke tests used stjames 0.0.279. Hosted examples
are illustrative: no authenticated workflows were run for this refresh. Lock
both package versions for a reproducible campaign.
Installation
uv pip install "rowan-python==3.2.0"
# Lock dependencies in your own environment; do not install the unrelated "rowan" package.
Authentication and account access
Authentication
Set an API key via environment variable (recommended):
export ROWAN_API_KEY="your_api_key_here"
Or set directly in Python:
import rowan
rowan.api_key = "your_api_key_here"
Verify authentication:
import rowan
user = rowan.whoami() # Returns user info if authenticated
print(f"User: {user.email}")
print(f"Credits available: {user.credits_available_string()}")
print(user.enabled_workflows) # Account-specific backend workflow slugs
Molecule input formats
Use SMILES for topology-based methods and real 3D structures for geometry-based methods. SMARTS is a substructure-query language, not a general workflow molecule input; convert InChI with a chemistry toolkit before passing a supported input. Record stereochemistry, charge, protonation state, and the original identifier. Canonicalization alone does not resolve these scientific choices.
SMILES strings versus molecule objects
- pKa:
starlingandchemprop_nevolianis2025require a SMILES string;gxtb_wagen2026(default) andaimnet2_wagen2024require coordinates. - Conformer search: SMILES works with OpenConf (default) or ETKDG; CREST/MCMM require a 3D molecule.
- Membrane permeability:
gnn-mtlrequires SMILES;pypermmrequires a 3D molecule. - ADMET, LogP, macropKa, and solubility are SMILES-based; pose-analysis MD needs ligand SMILES and a protein complex containing its bound pose.
- Descriptors, tautomers, docking, analogue docking, BDE, NMR, and Fukui need a
rowan.Molecule,stjames.Molecule, or RDKit molecule with a conformer.Chem.MolFromSmiles()alone has no coordinates. Generate them explicitly withrowan.Molecule.from_smiles()or import an existing geometry. For analogue docking, preserve the reference pose in the receptor's coordinate frame.
Tip: Use RDKit to validate SMILES before submission:
from rdkit import Chem
smiles = "CCO"
mol = Chem.MolFromSmiles(smiles)
if mol is None:
raise ValueError(f"Invalid SMILES: {smiles}")
Core usage pattern
Most Rowan tasks follow the same three-step pattern:
- Submit a workflow
- Wait for completion (with optional streaming)
- Retrieve typed results with convenience properties
import rowan
# 1. Submit — named functions build and validate workflow-specific payloads
workflow = rowan.submit_descriptors_workflow(
rowan.Molecule.from_smiles("CC(=O)Oc1ccccc1C(=O)O"),
name="aspirin descriptors",
)
# 2. & 3. Wait and retrieve
result = workflow.result() # Blocks until done (default: wait=True, poll_interval=5)
print(result.data) # Raw dict
print(result.descriptors["MW"]) # exact mass; no result.molecular_weight property
For long-running workflows, use streaming:
for partial in workflow.stream_result(poll_interval=5):
print(f"Complete: {partial.complete}") # bool, not a percentage
print(partial.data)
result() vs. stream_result()
| Pattern | Use when |
|---|---|
result() | The process can block for completion |
stream_result() | Polling snapshots are useful while the job runs |
stream_result() polls; it is not a server-pushed event stream. Partial typed
properties may be unavailable, so inspect .data until .complete is true.
result(wait=False) can return partial data or raise WorkflowError if no data
exists yet. done() includes failed and stopped runs, not only successes.
Working with results
Rowan's API includes typed workflow result objects with convenience properties.
Using typed properties and .data
Results have two access patterns:
- Convenience properties (recommended first):
result.descriptors,result.best_pose,result.scores. Result classes differ: conformer search usesget_energies()andget_conformers()methods. - Raw fallback:
result.data— raw dictionary from the API
Example:
result = rowan.submit_descriptors_workflow(
rowan.Molecule.from_smiles("CCO"),
name="ethanol",
).result()
# Convenience property (returns all descriptors):
print(result.descriptors["MW"]) # exact/monoisotopic mass
print(result.descriptors["SLogP"])
print(result.descriptors["TopoPSA"]) # usual topological PSA
# Raw data fallback:
print(result.data["descriptors"])
Note: DescriptorsResult does not have a molecular_weight property.
MW is exact/monoisotopic mass, not average molecular weight. TPSA is a 3D
charged-surface descriptor; use TopoPSA for the usual topological polar
surface area used in drug-likeness rules.
Cache invalidation
Some result properties are lazily loaded (e.g., conformer geometries, protein structures). To refresh:
result.clear_cache()
new_structures = result.get_conformers() # Refetched for ConformerSearchResult
Projects, folders, and organization
For nontrivial campaigns, use projects and folders to keep work organized.
Projects
Rowan 3.2.0 has an unresolved Folder.created_at type annotation; initialize
the model once as below before folder operations (see troubleshooting).
import rowan
from datetime import datetime
rowan.Folder.model_rebuild(_types_namespace={"datetime": datetime})
# Create a project
project = rowan.create_project(name="CDK2 lead optimization")
rowan.project_uuid = project.uuid
folder = rowan.create_folder(name="descriptors", parent_uuid=project.root_folder_uuid)
# Pass the destination folder explicitly on submissions
wf = rowan.submit_descriptors_workflow(
rowan.Molecule.from_smiles("CCO"), name="test compound", folder=folder
)
# parent_uuid is a folder UUID, not a project UUID.
project = rowan.retrieve_project(project.uuid)
workflows = rowan.list_workflows(parent_uuid=project.root_folder_uuid, page=0, size=50)
# This lists only workflows directly in the root folder. List folder.uuid for the above job.
Folders
Illustrative: protein, pocket, and the 3D ligand must be prepared first.
Run the Folder.model_rebuild initialization above first. get_folder() creates
missing path segments; create_folder() creates one folder.
# Create a hierarchical folder structure
folder = rowan.get_folder("docking/batch_1/screening")
wf = rowan.submit_docking_workflow(
protein=protein, pocket=pocket, initial_molecule=ligand,
folder=folder,
name="compound_001",
)
# List workflows in a folder
results = rowan.list_workflows(parent_uuid=folder.uuid, page=0, size=50)
List helpers return one page. Increment the zero-based page until an empty
page; size is page size, not a promise to return every match. Folder listing
is not recursive: walk child folders separately when inventorying a campaign.
Workflow decision trees
pKa vs. MacropKa
Use microscopic pKa when:
- You need the pKa of a single ionizable group
- You're interested in acid–base transitions and protonation thermodynamics
- The molecule has one or two ionizable sites
- A specific microscopic transition is the scientific question
Use macropKa when:
- You need pH-dependent behavior across a physiologically relevant range (e.g., 0–14)
- You want aggregated charge and protonation-state populations across pH
- The molecule has multiple ionizable groups with coupled protonation
- You need downstream properties like aqueous solubility at different pH
Example decision:
Phenol (pKa ~10): Use microscopic pKa
Amine (pKa ~9–10): Use microscopic pKa
Multi-ionizable drug (N, O, acidic group): Use macropKa
ADME assessment across GI pH: Use macropKa
Conformer search vs. tautomer search
Use conformer search when:
- A single tautomeric form is known
- You need a diverse 3D ensemble for docking, MD, or SAR analysis
- Rotatable bonds dominate the chemical space
Use tautomer search when:
- Tautomeric equilibrium is uncertain (e.g., heterocycles, keto–enol systems)
- You need same-formula proton-shift isomers; enumerate charge/protonation states separately
- Downstream calculations (docking, pKa) depend on tautomeric form
Combined workflow:
# Step 1: Find best tautomer
taut_wf = rowan.submit_tautomer_search_workflow(
initial_molecule=rowan.Molecule.from_smiles("O=c1cccc[nH]1"),
name="2-pyridone tautomers",
)
best_taut = taut_wf.result().best_tautomer # Molecule or None, not SMILES
if best_taut is None:
raise RuntimeError("No weighted tautomer structure was returned")
# Step 2: Generate conformers from best tautomer
conf_wf = rowan.submit_conformer_search_workflow(
initial_molecule=best_taut,
name="2-pyridone conformers",
)
Docking vs. analogue docking vs. cofolding
| Workflow | Use When | Input | Output |
|---|---|---|---|
| Docking | Single ligand, known pocket | Protein + 3D ligand + pocket coords | Poses and scoring records |
| Analogue docking | Related compounds sharing a scaffold | Protein + SMILES list + bound reference pose | Poses and scores keyed by SMILES |
| Protein-ligand cofolding | Sequence + ligand, no crystal structure | Protein sequence + SMILES | ML-predicted bound complex |
Protein utilities
Upload proteins
Illustrative API calls below require an authenticated account and the named local file; they have not been re-run against the service for this documentation correction. Verify each PDB accession against its target before building a docking campaign: 1M17 is EGFR bound to erlotinib.
# From local PDB file
protein = rowan.upload_protein(
name="egfr_kinase_domain",
file_path="egfr_kinase.pdb",
)
# From PDB database
protein_from_pdb = rowan.create_protein_from_pdb_id(
name="EGFR (1M17)",
code="1M17",
)
# Retrieve previously uploaded protein
protein = rowan.retrieve_protein("protein-uuid")
# List the first page of proteins
my_proteins = rowan.list_proteins(page=0, size=20)
Protein preparation guidance
- File format:
upload_proteinselects mmCIF for.cif/.mmcif, PDB otherwise. - Preparation: Upload/import stores a structure; it does not establish docking readiness. Inspect chain selection, alternate locations, missing atoms/residues, protonation, waters, metals, cofactors, and retained ligands for the chosen workflow.
- Multi-chain structures: Select the intended chains explicitly when appropriate.
- Preparation workflow:
submit_protein_preparation_workflowexposes pH, missing-atom completion, and non-polymer retention; inspect those settings before using its defaults. - Pocket: Derive coordinates from the prepared receptor or its bound ligand. Arbitrary example coordinates are not transferable between structures. Validate docking by redocking a known ligand and inspecting geometry; scores are not measured binding free energies.
Workflow catalog
Nine common workflow categories — descriptors, microscopic pKa, MacropKa, conformer search, tautomer search, docking, analogue docking, MSA generation, and protein-ligand cofolding — each with submission code and result shapes, plus a directory of workflow functions (core modeling, structure-based design, advanced computational chemistry, reaction chemistry, advanced properties, binding free energy, and sequence and structural biology) are in references/workflow_catalog.md.
Batch submission, webhooks, and asynchronous work
Batch submit/poll/retrieve, the non-blocking fire-and-check pattern, webhook setup, secret creation and rotation, signature verification (with a FastAPI handler), and the limits of the published payload contract are in references/batch_and_webhooks.md.
Access, pricing, and credits
Account access, dated published credit rates, and campaign budget guidance are in references/access_and_pricing.md.
Worked example and troubleshooting
A full lead-optimization campaign — project setup, tautomers, pKa across an analogue series, result collection, and a docking follow-up — is in references/end_to_end_example.md.
Common errors with their fixes, and debugging tips, are in references/troubleshooting.md.
Recommended usage patterns
- Prefer Rowan-native workflows over low-level assembly when they exist
- Use projects and folders for any nontrivial campaign (>5 workflows)
- Use
result()to block until complete (default:wait=True, poll_interval=5) - Use typed result properties first, fall back to
.datafor unmapped fields - Use batch submission for compound libraries or analogue series
- Chain workflows for multi-step chemistry campaigns:
pKa → macropKa → permeability(ADME assessment)tautomer search → docking → pose-analysis MD(pose refinement)MSA generation → protein-ligand cofolding(AI structure prediction)
- Use webhooks for long-running campaigns (>50 workflows) or asynchronous pipelines
- Use streaming for interactive feedback on large conformer/docking searches
Summary
Use Rowan when your workflow requires cloud execution for molecular-design tasks, especially when you want one unified API and consistent result handling across small-molecule modeling, proteins, docking, ADME prediction, and ML structure generation.
Rowan is a molecular-design workflow platform, not just a remote chemistry engine. It handles infrastructure scaling, result persistence, and multi-step pipeline orchestration so you can focus on science.
GitHub 저장소
자주 묻는 질문
rowan Skill이란 무엇인가요?
rowan은(는) K-Dense-AI이(가) 만든 Claude Skill입니다. Skill은 Claude가 필요할 때 불러오는 지침과 리소스를 묶어 추가 프롬프트 없이 rowan 관련 작업을 수행할 수 있게 합니다.
rowan은(는) 어떻게 설치하나요?
이 페이지의 설치 명령을 사용하세요. rowan을(를) Claude Code 플러그인으로 추가하거나 저장소를 skills 디렉터리에 복제한 다음 Claude를 다시 시작해 Skill을 불러옵니다.
rowan은(는) 어떤 카테고리에 속하나요?
rowan은(는) 메타 카테고리에 속합니다.
rowan은(는) 무료로 사용할 수 있나요?
네. rowan은(는) AIMCP에 등록되어 있으며 무료로 설치할 수 있습니다.
연관 스킬
이 스킬은 콘텐츠 콜렉션(Content Collections)을 위한 프로덕션 검증된 설정을 제공합니다. 콘텐츠 콜렉션은 Markdown/MDX 파일을 Zod 검증이 포함된 타입 안전한 데이터 콜렉션으로 변환해주는 TypeScript 최우선 도구입니다. 블로그, 문서 사이트 또는 콘텐츠 중심의 Vite + React 애플리케이션을 구축할 때 타입 안전성과 자동 콘텐츠 검증을 보장하기 위해 사용하세요. Vite 플러그인 구성과 MDX 컴파일부터 배포 최적화 및 스키마 검증에 이르기까지 모든 것을 다룹니다.
이 스킬은 개발자들이 Polymarket 예측 시장 플랫폼을 활용한 애플리케이션을 구축할 수 있도록 지원하며, 거래 및 시장 데이터를 위한 API 통합 기능을 포함합니다. 또한 WebSocket을 통한 실시간 데이터 스트리밍을 제공하여 실시간 거래와 시장 활동을 모니터링할 수 있습니다. 이를 통해 거래 전략을 구현하거나 실시간 시장 업데이트를 처리하는 도구를 생성하는 데 활용할 수 있습니다.
이 스킬은 개발자들이 명령어, 파일, LSP 작업 등 25개 이상의 이벤트 유형에 연결되는 OpenCode 플러그인을 만들 수 있도록 돕습니다. JavaScript/TypeScript 모듈을 위한 플러그인 구조, 이벤트 API 명세, 구현 패턴을 제공합니다. OpenCode AI 어시스턴트의 라이프사이클을 사용자 정의 이벤트 기반 로직으로 가로채거나, 모니터링하거나, 확장해야 할 때 사용하세요.
SGLang은 RadixAttention 프리픽스 캐싱을 활용하여 JSON, 정규식, 에이전트 워크플로우를 위한 고속 구조화 생성에 특화된 고성능 LLM 서빙 프레임워크입니다. 특히 반복되는 프리픽스가 있는 작업에서 상당히 빠른 추론 속도를 제공하여 복잡한 구조화 출력 및 다중 턴 대화에 이상적입니다. 제약 디코딩이 필요하거나 광범위한 프리픽스 공유가 있는 애플리케이션을 구축할 때는 vLLM과 같은 대안보다 SGLang을 선택하십시오.
