pk

ADC-PK

HIC-Augmented Chemprop v2 Model for ADC Pharmacokinetic Prediction

investigators T2X Programme · Kask R&D
type ML · drug discovery
status design
Data Intake

Standard Chemprop models learn structure–property relationships from SMILES alone. For antibody–drug conjugates (ADCs), this misses a critical variable: the hydrophobic load presented by the intact conjugate, not just the payload. ADC-PK extends Chemprop v2 with experimental developability features — principally HIC retention time — to bridge the gap between linker-payload chemistry and systemic PK.

Dataset strategy follows a tiered approach: Tier 1 — a developability dataset of ~40–80 linker-payload variants covering HIC, SEC, plasma stability, solubility, enzymatic cleavage, and cell potency. Tier 2 — a PK anchor panel of ~12–15 ADCs spanning chemical diversity, providing clearance, t½, and AUC. The Tier 1 developability screen is the highest-value early ML capability; direct PK prediction follows once the anchor panel is established.

ADC chemprop GNN PK HIC drug-discovery T2X multi-task open-science rust XAI
design artifact

HIC–PK Causal Bridge

HIC retention time measures the exposed hydrophobic surface of the intact ADC under high-salt conditions — a functional property that SMILES alone cannot encode. It acts as a bridge between linker-payload chemistry and in vivo clearance, capturing the hydrophobic load that drives FcRn competition, accelerated clearance, and off-target tissue uptake. Including HIC as a model feature, rather than a secondary endpoint, is the core architectural innovation of ADC-PK.

Format: Design spec Phase: 1 Date: 2026-03
ER Schema
System Flow
Module Spec
Data Schema
Economics
Roadmap
Open Science
ABW Agent

Data Schema — Entity Relationship

The schema is designed blank-slate and follows the tiered dataset strategy. Tier 1 tables (HIC, SEC, plasma stability, solubility, enzymatic cleavage, cell potency) target the ~40–80 variant developability screen. Tier 2 (ASSAY_PK) holds the ~12–15 anchor compounds that connect developability to PK. Tables are decoupled so any assay can be ingested independently and joined at training time. The PREDICTION table stores every inference call with uncertainty bounds and ABW credits charged.

erDiagram COMPOUND { string smiles PK string inchi_key float mol_weight float logp float logd_74 float tpsa int hbd int hba int rot_bonds } LINKER_PAYLOAD { uuid id PK string smiles FK string payload_class "gem|auristatin|maytansinoid|other" string linker_type "cleavable|non-cleavable" string cleavage_mechanism "val-cit|disulfide|pH|enzymatic" } ADC { uuid id PK uuid linker_payload_id FK string antibody_target "T2X|HER2|TROP2|other" float dar string conjugation_site "cys|lys|site-specific" string lot_id } ASSAY_HIC { uuid id PK uuid adc_id FK float retention_min string column string gradient date run_date } ASSAY_SEC { uuid id PK uuid adc_id FK float monomer_pct float dimer_pct float aggregate_pct date run_date } ASSAY_PLASMA_STABILITY { uuid id PK uuid adc_id FK float half_life_h string species "mouse|cynomolgus|human" date run_date } ASSAY_SOLUBILITY { uuid id PK uuid adc_id FK float solubility_mg_ml string buffer date run_date } ASSAY_ENZYMATIC { uuid id PK uuid adc_id FK float cleavage_rate_pct_h string enzyme "cathepsin-B|plasma-esterase" date run_date } ASSAY_CELL_POTENCY { uuid id PK uuid adc_id FK float ic50_nm string cell_line string antigen_target date run_date } ASSAY_PK { uuid id PK uuid adc_id FK string tier "anchor" string species "mouse|rat|cynomolgus" string route "IV" float clearance_ml_h_kg float half_life_h float auc_ng_h_ml float vd_l_kg float cmax_ng_ml date run_date } CHEMPROP_MODEL { uuid id PK string version string phase "T2X-gem-v1|cross-payload-v1" int training_n float val_rmse_clearance float val_rmse_halflife float val_rmse_auc float calibration_ece string workspace_path date trained_at } PREDICTION { uuid id PK uuid model_id FK uuid adc_id FK float pred_clearance float pred_halflife float pred_auc float unc_clearance float unc_halflife float unc_auc int abw_credits_charged date predicted_at } COMPOUND ||--o{ LINKER_PAYLOAD : "encoded as" LINKER_PAYLOAD ||--o{ ADC : "conjugated into" ADC ||--o{ ASSAY_HIC : "measured by" ADC ||--o{ ASSAY_SEC : "characterised by" ADC ||--o{ ASSAY_PLASMA_STABILITY : "tested in" ADC ||--o{ ASSAY_SOLUBILITY : "measured by" ADC ||--o{ ASSAY_ENZYMATIC : "tested in" ADC ||--o{ ASSAY_CELL_POTENCY : "tested in" ADC ||--o{ ASSAY_PK : "dosed in (Tier 2 anchor)" CHEMPROP_MODEL ||--o{ PREDICTION : "generates" ADC ||--o{ PREDICTION : "predicted for"

System Interaction — Training & Prediction Flows

Training flow

sequenceDiagram participant Sci as Scientist participant kask as kask UI participant WS as ABW Workspace participant CP as Chemprop Engine participant Reg as Model Registry Note over Sci,Reg: Phase 1 — data ingestion Sci->>kask: Upload CSV (SMILES + HIC + PK) kask->>WS: writeWorkspaceFile(training_data.csv) WS-->>kask: commit SHA Note over Sci,Reg: Phase 2 — training kask->>CP: train(features=[HIC, DAR, SEC, payload_class]) CP->>CP: MPNN graph encode SMILES CP->>CP: concat experimental features CP->>CP: multi-task FFN + evidential regression CP-->>kask: model.pt + metrics kask->>Reg: writeWorkspaceFile(model.pt) kask->>Reg: writeWorkspaceFile(config.yaml) Reg-->>kask: version tag kask-->>Sci: val RMSE + calibration plot

Prediction flow

sequenceDiagram participant Sci as Scientist participant kask as kask UI participant Agent as adc_pk_oracle participant Reg as Model Registry participant CP as Chemprop Engine Note over Sci,CP: Inference Sci->>kask: SMILES + HIC + DAR + SEC kask->>Agent: executeAgent(adc_pk_oracle, query) Agent->>Reg: load model.pt + config Reg-->>Agent: checkpoint Agent->>CP: predict(smiles, features) CP-->>Agent: {clearance, halflife, auc, uncertainty} Agent->>Agent: interpret + flag extrapolation Agent-->>kask: result + credits_charged kask-->>Sci: PK predictions + bounds Note over kask,Sci: writes result to workspace

Iterative Optimization Loop — X-DeepSARM Analog

Inspired by Yoshimori & Bajorath (AILSCI 2026): predict → explain (SHAP) → replace worst fragment → re-predict → iterate. The ADC-PK adaptation uses Rust MCP tools (M-09 + M-10) exposed to the adc_pk_oracle LLM, which acts as a ReAct planner. Fragment generation is constrained to a curated linker library rather than open LSTM generation — appropriate for the narrower ADC design space.

sequenceDiagram participant Sci as Scientist participant Agent as adc_pk_oracle (LLM) participant PK as M-04 PK Predictor (Rust) participant SHAP as M-09 SHAP Tool (Rust MCP) participant Frag as M-10 Fragment Oracle (Rust MCP) Sci->>Agent: optimise(smiles, target=low_clearance, max_iter=5) loop up to 5 iterations Agent->>PK: predict_pk(smiles, hic, dar, sec) PK-->>Agent: {clearance, halflife, auc, uncertainty} Agent->>SHAP: attribute(smiles, model_ckpt) SHAP-->>Agent: per-atom SHAP + worst_fragment_smiles Agent->>Frag: replace(core_smiles, worst_fragment, filters={mw_max:900, logp_max:5}) Frag-->>Agent: candidate_smiles[] Agent->>PK: predict_pk(candidates[]) PK-->>Agent: ranked candidates by clearance Note over Agent: select best candidate as next input end Agent-->>Sci: optimisation trajectory + recommended_smiles

Rust Runtime Architecture

Training (Python — unchanged)

  • Chemprop v2 + PyTorch — GPU training, K-fold CV, Optuna sweep
  • Output: model.pt + config.yaml committed to ABW workspace
  • Python stays here — Chemprop's D-MPNN training loop is Python-native

Inference & Tools (Rust)

  • candle loads model.pt weights, runs forward pass — no Python at inference
  • polars handles all data pipeline I/O (CSV validation, feature normalisation)
  • RDKit FFI for SMILES canonicalisation and 2D descriptor calculation
  • M-09 (SHAP) + M-10 (fragment oracle) compiled as Rust MCP servers
  • axum serves the inference API; tokio async runtime throughout

The boundary is clean: Python owns the training loop; Rust owns everything runtime — inference, data pipeline, MCP tools, and the iterative optimization loop. This eliminates Python startup overhead and memory fragmentation from repeated LLM-tool calls during multi-round optimization.

Module Specification

ID Module Technology Inputs Outputs Status
M-01 Data Intake
CSV/SDF ingestion with SMILES validation, unit normalisation, duplicate detection
Rust · polars · RDKit FFI Raw assay CSV, SDF Validated training dataframe prototype
M-02 Featuriser
SMILES → molecular graph (Chemprop D-MPNN); experimental features (HIC, DAR, SEC, etc.) normalised into xm vector — concatenated after D-MPNN aggregation, before FFN (h_m = cat(h'_m, x_m)). Payload class one-hot included in xm.
Rust · RDKit FFI · Chemprop v2 --features_path SMILES, assay values MolGraph + xm feature vector prototype
M-03 MPNN Backbone
D-MPNN message passing on molecular graph; T=3 message passing steps, hidden size h=300 (defaults). Graph readout by mean aggregation. Optional init from pretrained Chemprop checkpoint via parameter transfer.
Chemprop v2 · PyTorch (train) · Rust candle (infer) MolGraph Molecular embedding h′m design
M-04 Multi-task FFN
cat(h′m, xm) → 2 hidden layers (default 300) → 3 output heads (clearance, t½, AUC). Evidential regression loss for calibrated uncertainty. Calibration evaluated by ENCE (Expected Normalized Calibration Error). Dropout + early stopping as regularisation on small N. Adam optimiser with LR warmup 10−4→10−3 then decay.
Chemprop v2 · PyTorch (train) · Rust candle (infer) h′m + xm μ, σ per target (3×2) + ENCE design
M-05 Training Pipeline
K-fold CV stratified by payload class; hyperparameter sweep (LR, hidden size h, depth T, dropout) using Chemprop's built-in HPO (Tree-structured Parzen Estimator — no external Optuna). Calibration check via ENCE post-training. Dropout + early stopping essential for N<50.
Chemprop CLI · Chemprop HPO (TPE) Validated dataframe Best checkpoint + metrics YAML design
M-06 Model Registry
Versioned model artefacts in ABW workspace git; config.yaml + model.pt per version; SHA-tracked
ABW Workspace API · git model.pt, config.yaml Versioned workspace path prototype
M-07 adc_pk_oracle Agent
ABW LLM agent wrapping Chemprop inference; parses query, loads model, calls M-04, interprets results, flags OOD (out-of-distribution) predictions
ABW Agent SDK · Claude · Rust MCP server SMILES + assay query (JSON) PK predictions + narrative + credits prototype
M-08 Active Learning Loop
Model suggests next compound to synthesize based on uncertainty + expected information gain; closes the design–make–test cycle
Rust · Chemprop uncertainty · Claude Current model, candidate pool Ranked synthesis recommendations planned
M-09 SHAP Attribution
Atom-level SHAP values on trained Chemprop model via gradient attribution; projects feature importances back onto linker substructures; identifies fragments driving fast clearance. Upgrades LLM-reasoned key_drivers to model-derived attribution. Exposed as Rust MCP tool.
Rust · candle (grad) · captum FFI SMILES + model checkpoint Per-atom SHAP map + worst fragment SMILES planned
M-10 Fragment Replacement Oracle
Constrained generative step inspired by X-DeepSARM (Yoshimori & Bajorath 2026). Replaces worst fragment (by SHAP) with alternatives from a curated ADC linker fragment library. MW / LogP / TPSA filter enforced. Output candidates fed back to M-04 for PK re-prediction → iterates up to 5 rounds. Pure Rust — no generative ML; enumeration over known linker chemotypes.
Rust · SMARTS enumeration · linker library Core SMILES + worst fragment + property filters Candidate linker variants + SMILES list planned

Economics

Phase 1 — Wet Lab Data Generation

ItemNUnit costTotal
HIC analytical run (T2X-Gem compounds) 20 $200–400 $4k–8k
SEC analytical run 20 $100–200 $2k–4k
Plasma stability (mouse/human) 20 $150–300 $3k–6k
In vivo mouse PK (low/mid/high HIC) 3 $8k–15k $24k–45k
Phase 1 total $33k–63k

Compute & ABW Inference Costs

OperationComputeABW credits
Phase 1 model training (20 cmpds, CPU) ~$5–20
Hyperparameter sweep (Optuna, 50 trials) ~$20–50 GPU-hr
Single prediction (adc_pk_oracle) near-zero 15–30 cr
Batch prediction (10 candidates) near-zero 50–80 cr
Model file write (workspace git) standard gas
Active learning ranking (M-08) near-zero 30–60 cr

Dominant cost is wet lab data, not compute. The model itself is cheap to train and run — ABW credits cover the interpretive LLM layer, not the inference. Phase 2 (auristatin) requires 5–8 additional PK data points: ~$40k–120k incremental.

Roadmap

Phase 1now → 6 months
Tiered dataset build. Tier 1 (developability screen): Standardise assay conditions; generate HIC, SEC, plasma stability, solubility, enzymatic cleavage, and cell potency for ~40–80 T2X linker-payload variants. Train Chemprop models to predict developability endpoints — this is the highest-value early ML capability. Tier 2 (PK anchor panel): Run ~12–15 ADCs spanning chemical diversity through in vivo mouse PK. Use anchor panel to connect developability predictions to clearance, AUC, t½. Deploy adc_pk_oracle Phase 1 (prior-knowledge mode) on ABW; swap to Chemprop mode when Tier 2 data lands.
Phase 26–12 months
Cross-payload generalisation. Add 5–8 auristatin (MMAE/MMAF) data points. Transfer learning: freeze MPNN, fine-tune FFN. Validate that HIC still bridges payload classes. Introduce cynomolgus PK as secondary output target. Publish internal benchmark against literature ADC PK datasets (TDC).
Phase 312–18 months
SHAP-guided iterative optimization loop. Implement M-09 (SHAP attribution) and M-10 (fragment replacement oracle) as Rust MCP tools. Close the design cycle: predict PK → identify worst clearance-driving fragment by SHAP → replace with linker library variant → re-predict → iterate up to 5 rounds. Expose via adc_pk_oracle ReAct agent (per Yoshimori & Bajorath 2026 architecture). Build Rust inference server (candle) to eliminate Python startup latency during multi-round calls. Benchmark against known ADC linker series. Incorporate FcRn pKD and payload release kinetics as additional features.
Phase 418–24 months
Active learning + allometric scaling. Model proposes next compound to synthesize based on uncertainty + expected information gain. Extend to cynomolgus allometric scaling as secondary output. Explore OpenFold-derived antibody structure features for conjugation-site context. Evaluate ChemBERTa2 embeddings as additional xm features concatenated post-aggregation (ChemBERTa2 is a SMILES string transformer — it cannot replace the D-MPNN, but its learned embeddings can supplement it). Evaluate applicability to non-ADC drug–protein conjugates (PDCs, nanoparticle payloads). Open dataset publication via TDC.

Open Science & Collaborative Framework

ADC-PK is designed to be hybrid: proprietary T2X assay data trains the model, but the architecture, featurisation pipeline, and agent interface are built entirely on open foundations. The goal is a reproducible, extensible framework that can be contributed back to the community once T2X data is no longer competitive-sensitive. Claude-based agents handle interpretation and uncertainty communication; open models handle the molecular representation learning.

Chemprop v2
MIT · Apache 2.0
Core MPNN backbone. D-MPNN on molecular graphs, multi-task FFN, evidential regression. Primary model engine.
ChemBERTa2
Seyonec / HuggingFace · MIT
Pretrained SMILES transformer. Phase 4: its embeddings used as additional xm features (post-aggregation concat), not as D-MPNN replacement. String model — complementary to, not interchangeable with, graph-based D-MPNN.
MolFormer-XL
IBM Research · Apache 2.0
Large-scale pretrained molecular model (10B SMILES). Alternative backbone for transfer learning evaluation in Phase 3.
TDC (Therapeutics Data Commons)
Harvard · CC BY 4.0
Benchmark ADMET datasets for out-of-distribution validation. ADC clearance benchmark planned for Phase 2 publication.
ChEMBL
EMBL-EBI · CC BY-SA 3.0
Public bioactivity data. Used for MPNN pretraining augmentation and chemical space coverage analysis.
OpenFold
Columbia / Allen AI · Apache 2.0
Open AlphaFold implementation. Phase 3: antibody structure features for conjugation-site context encoding.
RDKit
Open Source · BSD
SMILES validation, 2D descriptor calculation, molecular featurisation. Foundation of the M-02 featuriser module.
Claude (Anthropic)
Anthropic · via ABW
Interpretive layer in adc_pk_oracle: OOD flagging, uncertainty communication, active learning rationale, synthesis suggestions.
ABW / Fermi
kask / agent-bestiary.world
Agent economics, model registry (workspace git), versioned predictions, multi-user access, credits billing.
candle
HuggingFace · Apache 2.0
Rust ML framework for loading PyTorch checkpoints and running inference. M-03/M-04 runtime engine — no Python at inference time.
polars
Ritchie Vink · MIT
Rust dataframe library. Replaces pandas in M-01/M-02 data pipeline — columnar memory, lazy evaluation, zero-copy SMILES validation.
axum + tokio
tokio-rs · MIT
Rust async web framework. Serves the inference API and MCP tool endpoints for M-09 (SHAP) and M-10 (fragment oracle).
rdkit-sys
Matta / community · BSD
Rust FFI bindings to RDKit C++ library. SMILES canonicalisation, molecular weight, LogP, TPSA — used in M-01, M-02, M-10.

Collaborative division of labour

  • Open models (Chemprop, ChemBERTa2) handle molecular representation learning — the structural pattern recognition that requires large pretraining corpora.
  • Experimental assay data (HIC, PK) provides the biological reality that no open model can infer from SMILES alone.
  • Claude agents handle the interpretive layer — communicating uncertainty, flagging extrapolation, translating model outputs into chemist-legible guidance.
  • Rust runtime (candle, polars, axum) handles inference, data pipeline, and MCP tools — Python is confined to the training loop.
  • kask provides the experimental workflow and data management interface; ABW provides the economic and versioning infrastructure.
  • The T2X training data will be published (with appropriate embargo) via TDC once competitive sensitivity has passed — contributing a novel ADC PK benchmark to the open community.