Skip to main content

RENKIN — Retrosynthesis Engine for Knowledge-Informed Navigation

Computer-Aided Synthesis Planning (CASP) · Pure Rust · WebAssembly · Python
Named after 錬金 (れんきん, renkin) — Japanese for alchemy: just as alchemists transformed base metals into gold, RENKIN transforms target molecules back into cheap starting materials.

CI Docs

Crates.io docs.rs PyPI Python npm License: MIT

日本語版 README · 中文版 README · Documentation · Live Demo →


What is RENKIN?

RENKIN is an open-source retrosynthesis engine for computer-aided synthesis planning (CASP) that automatically discovers optimal chemical reaction routes from a target molecule back to cheap, commercially available starting materials.

Built entirely in Rust with the chematic cheminformatics crate — zero C/C++ dependencies, #![forbid(unsafe_code)] throughout. One codebase compiles to a native CLI, a Rust library, Python wheels (PyO3), and a WebAssembly module that runs entirely client-side in the browser.

Use RENKIN as an independent audit layer for retrosynthesis routes generated by RENKIN or AiZynthFinder — see RENKIN Bridge / audit-route below.


Installation

pip install renkin          # Python
cargo add renkin            # Rust
npm install renkin          # JavaScript / Node.js

Live Playground

→ Try it now — runs entirely in WebAssembly: no installation, no server, no network calls.


Quick Start

import json
import renkin

result = json.loads(
    renkin.find_routes(
        target="CC(=O)Oc1ccccc1C(=O)O",  # Aspirin
        depth=5,
        max_routes=3,
    )
)

for route in result["routes"]:
    for step in route["steps"]:
        print(f"  {step['target']}{' + '.join(step['precursors'])}  [{step['rule']}]")
import init, { find_routes } from './pkg/renkin.js';
await init();
const result = JSON.parse(find_routes("CC(=O)Oc1ccccc1C(=O)O", 5, 3, 0));
./target/release/renkin --target "CC(=O)Oc1ccccc1C(=O)O" --depth 5 \
    --templates data/templates_extracted_5000.smi --format tree
Target: CC(=O)Oc1ccccc1C(=O)O
Routes found: 3

Route 1  [score=1.02, depth=1]
OC(=O)c1ccccc1OC(=O)C
└── [extracted_169]
    ├── OC(=O)C  ✓ BB
    └── [OH]c1ccccc1C(=O)O  ✓ BB

Route 2  [score=1.02, depth=1]
OC(=O)c1ccccc1OC(=O)C
└── [extracted_145]
    ├── CC(=O)Cl  ✓ BB
    └── [OH]c1ccccc1C(=O)O  ✓ BB

Route 3  [score=1.03, depth=1]
OC(=O)c1ccccc1OC(=O)C
└── [extracted_238]
    ├── c1cccc(c1O)C(O)=O  ✓ BB
    └── C([OH])(=O)C  ✓ BB

Use --format mermaid for GitHub/Notion-compatible flowcharts.

Open In Colab


Current Limitations

⚠️ Benchmark numbers are under active re-measurement after a validator-accuracy fix — historical 78.0%/95.9%/81.8%(ChEMBL) figures elsewhere in this repo predate that fix and are invalidated. RENKIN does not predict yields, calibrated experimental success probabilities, or side reactions, and does not search the literature automatically (success_probability is a template-frequency search-ranking score, not a calibrated prediction — see Benchmark for the current corrected numbers, full methodology, and known limitations).


Why RENKIN?

RENKIN is designed as a Rust-native synthesis planning stack:

Fast A* / AND-OR tree search with beam search and template frequency weighting
Portable Native CLI · Python wheels · npm/WASM · browser playground — one codebase
Explainable Per-step confidence, atom_economy, route_cost, and procedure_hint
Verifiable renkin-forward validates each retrosynthetic step by forward-applying templates
Benchmarkable USPTO-50k, PaRoutes-style evaluation, route diversity, and atom balance checks
Agent-ready MCP server exposes routes and validation to Claude Desktop and AI agents

Constraint-based Search

Restrict routes by the element composition of their building blocks.

Default search — all 5 routes for biphenyl:

renkin --target "c1ccc(-c2ccccc2)cc1" --templates data/templates_extracted_5000.smi --format tree
Routes found: 5
Route 1  [score=1.00, depth=1]  c1ccccc1Br + c1c(B(O)O)cccc1
Route 2  [score=1.03, depth=1]  c1ccccc1Br + c1c(B(O)O)cccc1
Route 3  [score=1.06, depth=1]  c1cc(Cl)ccc1 + c1c(B(O)O)cccc1
Route 4  [score=1.08, depth=1]  c1(I)ccccc1  + c1c(B(O)O)cccc1
Route 5  [score=1.08, depth=1]  c1ccccc1Br  + c1(B2OC(C(C)(C)O2)(C)C)ccccc1

Constrained search — boronic-acid coupling, no Br or I starting materials:

renkin --target "c1ccc(-c2ccccc2)cc1" --templates data/templates_extracted_5000.smi \
    --require-elements "B" --avoid-elements "Br,I" --format tree
Routes found: 1

Route 1  [score=1.06, depth=1]
c1ccccc1-c2ccccc2
└── [extracted_398]
    ├── c1cc(Cl)ccc1  ✓ BB
    └── c1c(B(O)O)cccc1  ✓ BB

Constraints compose freely and are enforced in two layers:

  • --avoid-elements prunes expansions during search when a BB precursor contains a forbidden element (no dead-end nodes added to the heap).
  • A final route-level post-filter is still applied for correctness.
  • --require-elements is a route-level post-filter only.

Add --verbose to print search statistics (nodes expanded, elapsed time) to stderr. Performance counters are available in native builds only; disabled in WASM.

Add --search-diagnostics to add a search_diagnostics block to JSON output (beam eviction counts/scores, cross-template duplicate precursor signatures, rule-application attempts, stock-terminal/non-stock candidate counts, depth-wise branching factor, hypothetical dedup-strategy counts) — diagnostics-only bookkeeping, off by default, does not affect search behavior (Issue #101). Add --candidate-trace-limit <N> (implies --search-diagnostics) to also collect up to N per-candidate trace records (precursor signature, template provenance, beam rank/survival, whether it fed a returned route) — offline diagnostic use only, gated at collection time so the default no-trace path allocates nothing extra.


Template Evidence Metadata

Extracted templates only have a positional display name (extracted_{i}) that changes whenever the source .smi file is reordered or re-extracted, so external knowledge (a DOI, a reported yield, a known side reaction) can't be durably attached to one. Every template — hand-crafted and extracted — now has a stable template_id instead:

  • Hand-crafted rules: rule:<rule_name> (e.g. rule:suzuki_retro).
  • Extracted templates: smirks-sha256:<hex> — the SHA-256 hex digest of the trimmed SMIRKS string. Independent of file position, load order, and count; purely syntactic (no SMIRKS canonicalization — a semantically equivalent SMIRKS written differently gets a different ID).

Run renkin template ids <file.smi> to list every template's template_id, display name, SMIRKS, and weight (TSV by default, --format json for JSON) — use this to look up the IDs you need when authoring a sidecar file.

Attach curated evidence with --template-metadata sidecar.json (also available in Python as find_routes(..., template_metadata_path=...)), keyed by template_id:

{
  "schema_version": 1,
  "templates": {
    "smirks-sha256:ef8778a2888469d619c52cce7e74f6848e101049050dd1b765b78f32e3c94498": {
      "references": [
        { "id": "ref-1", "kind": "doi", "identifier": "10.xxxx/example" }
      ],
      "condition_candidates": [
        {
          "catalysts": ["Pd(PPh3)4"],
          "bases": ["K2CO3"],
          "solvents": ["EtOH", "water"],
          "temperature_c": { "min": 75.0, "max": 85.0 },
          "source": "literature",
          "scope": "template",
          "reference_ids": ["ref-1"]
        }
      ],
      "reported_yields": [
        {
          "percentage": { "min": 72.0, "max": 81.0 },
          "basis": "isolated",
          "source": "literature",
          "scope": "template",
          "reference_ids": ["ref-1"]
        }
      ],
      "warnings": [
        {
          "code": "possible_protodeboronation",
          "severity": "medium",
          "message": "Protodeboronation has been reported under prolonged aqueous heating.",
          "source": "literature",
          "scope": "template",
          "reference_ids": ["ref-1"]
        }
      ]
    }
  }
}

A matching step gets an evidence field with condition_candidates, reported_yields, references, and warnings; steps whose template has no sidecar entry get no evidence key at all. The sidecar is loaded and validated (schema version, duplicate/dangling reference IDs, yield range, range min <= max, non-empty DOI/patent identifiers) before search starts — malformed metadata is a hard error, and a template_id in the sidecar that matches no loaded rule prints a warning rather than failing silently.

What this is not:

  • reported_yields is a curated record of what was reported externally — not a RENKIN prediction. step_confidence/success_probability are unaffected and keep meaning template-frequency-derived search-ranking scores, not experimental success rates.
  • warnings reflects only what's explicitly present in the sidecar you supply — not automatic side-reaction detection.
  • Templates without a matching sidecar entry get no fabricated evidence. Nothing is invented for missing data.

Yield/success prediction and automatic literature search are explicitly out of scope for this phase — tracked as future work in #41.

Substrate-specific examples (schema_version: 2)

Everything above is template-level: it applies to every step using that template, regardless of the actual molecule. schema_version: 2 adds examples — a per-template array where each entry is one curated record of this exact reaction, keyed by target_smiles/precursor_smiles:

{
  "schema_version": 2,
  "templates": {
    "smirks-sha256:...": {
      "references": [{ "id": "ref-1", "kind": "doi", "identifier": "10.xxxx/example" }],
      "examples": [{
        "id": "ex-1",
        "target_smiles": "c1ccc(-c2ccccc2)cc1",
        "precursor_smiles": ["Brc1ccccc1", "c1ccccc1"],
        "conditions": { "catalysts": ["Pd(PPh3)4"], "solvents": ["EtOH"], "source": "literature", "scope": "substrate_specific", "reference_ids": ["ref-1"] },
        "reported_yield": { "percentage": 78.0, "basis": "isolated", "source": "literature", "scope": "substrate_specific", "reference_ids": ["ref-1"] },
        "reference_ids": ["ref-1"]
      }]
    }
  }
}

examples requires schema_version: 2 (a hard error under 1); under schema_version: 2, reported yields must live under examples[].reported_yield too — a non-empty template-level reported_yields is a hard error there (it stays allowed under schema_version: 1), so a substrate-specific number can't leak onto every step using that template. Every condition/yield/warning nested inside an example must be scoped substrate_specific.

A route step's evidence.examples are resolved, not just copied from the sidecar: matched against that step by canonical target SMILES plus the canonical, order-independent precursor set (reordering precursor_smiles in the sidecar changes nothing), with every exact-substrate match kept and same-template-different-substrate precedents capped at 3. Each resolved entry carries a match_kind (exact_substrate/template_only) in the JSON itself, plus a template_examples_total count — so JSON/Python consumers, not just --format explain, can tell "evidence for this exact reaction" apart from "literature precedent for a different substrate." --format explain shows exact-substrate matches first, each labeled either Exact substrate example: or "different substrate; not a prediction", with conditions/ reported_yield/warnings each showing their own cited references directly underneath (deduplicated when the same reference backs more than one part of an example). See Reaction Evidence guide for full matching/validation semantics.

Importing evidence from ORD. renkin evidence match (exact-set batch template matching, no fuzzy/similarity matching) and scripts/ord_evidence_audit.py (offline, network-free) turn a locally-downloaded Open Reaction Database corpus into a schema_version: 2 sidecar — every accepted record is independently re-validated by RENKIN's own loader, and anything not uniquely matched, unambiguous, and provenanced is excluded and counted in an audit report rather than guessed at. RENKIN itself never fetches or searches the literature; reported yields are citations, not predictions. ORD's reaction data is CC-BY-SA-4.0, a different license from RENKIN's own MIT code — see Reaction Evidence guide for the full acceptance criteria and licensing split.


Key Features

Feature Detail
Pure Safe Rust #![forbid(unsafe_code)] on all crates — compiler-enforced, zero C/C++ dependencies
Search engine A*/AND-OR tree search (Retro*-equivalent, pluggable MoleculeValueEstimator/ReactionPrior) with --beam-width N for memory-bounded exploration and rayon parallel rule application (sequential fallback on wasm32)
Up to 50k reaction templates Auto-extracted from USPTO-50k/MIT via rdchiral; frequency-weighted priority (optional pure-Rust tract-onnx NN scorer via --scorer); --templates for custom sets
Template quality tools renkin template stats|validate|dedup|explain|coverage|ids — frequency distribution, validity, duplicates, per-template lookup, coverage rate, stable IDs
Stable template IDs + evidence sidecar Every template gets a stable template_id (rule:<name> / smirks-sha256:<hex>, independent of file order). Attach curated DOIs/patents, conditions, yields, and side-reaction warnings via a --template-metadata sidecar.json; matching steps get an evidence field — see Template evidence metadata below. schema_version: 2 sidecars can also attach examples (curated exact-substrate records, surfaced first in --format explain). Automatic yield/success prediction and literature search remain out of scope (#41)
Ring-context safety guard --ring-context-policy conservative --ring-context-sidecar <path> — opt-in match-level filter that rejects an extracted template's ring-opening/closing disconnection when its historical training data never observed that bond as ring-forming/-breaking; default disabled (unchanged legacy behavior) — see Issue #72
LightGBM candidate reranker --reranker-model/--reranker-freq-table (CLI) or reranker_model_path/reranker_freq_table_path (Python) — opt-in, ordering-only re-ranking via a frozen LightGBM model; never changes which candidates are generated, only their order, and reproduces legacy ordering byte-for-byte when off. Paired 100-target route-search gate: route_to_configured_stock 16→20 (+4/-0). python3 scripts/fetch_reranker_model.py fetches the frozen model (SHA-256-verified, not bundled in any package — see Roadmap)
Coverage mode (opt-in) --search-mode coverage --coverage-templates <path> (CLI) or search_mode="coverage", coverage_templates_path=... (Python) — if the default template set finds no route, automatically escalates to a larger, separately loaded template set, cooperatively cancellable via --coverage-timeout-secs. Standard-mode output is byte-for-byte unchanged when not used. python3 scripts/fetch_coverage_templates.py fetches the frozen 2,000-template Stage-2 set (SHA-256-verified, not bundled in any package, same reasoning as the reranker model — see Roadmap)
RENKIN Bridge / audit-route renkin audit-route route.json [--format auto|renkin|aizynthfinder] [--stock stock.smi] [--output human|json] — tool-neutral route audit: structural integrity, stock, and declared-reaction forward-replay validation, each reported independently as pass/fail/not_evaluable, rolled up into a route-level pass/fail/partial verdict. Reads RENKIN-native route JSON (v0.25.0) and real AiZynthFinder route JSON — single-target and gzip-compressed batch output, verified against AiZynthFinder v4.4.1 specifically, not claimed for every version (v0.26.0); --format auto detects the input shape and hard-errors rather than guessing on anything ambiguous
Route scoring confidence, step_confidence, success_probability (Retro-prob style), convergency, atom_economy, route_cost (Σ BB cost + steps×0.5, or actual prices via --bb-prices/--stock) per step/route — see caveat below the table
Step metadata provenance Each step reports metadata_source/metadata_scope so it's machine-readable whether conditions/reaction_family came from a rule-author default vs. something more grounded; absent (not fabricated) for extracted templates
Pareto multi-objective search --format pareto returns a Pareto front across route_cost/success_probability/steps; objectives configurable via --objectives
Constraint DSL --constraints constraints.json — element filters, step limits, confidence thresholds, preferred reaction families; enables LLM → RENKIN pipelines
Output formats & diagnostics --format json|tree|mermaid|explain|compare|compare-json|pareto; zero-route JSON includes a diagnostics block with likely_causes/suggestions
renkin-forward toolkit predict (rank forward products), enumerate (bounded products from one reactant + partner library), hints (partner-free retrieval hints, no concrete product), validate (forward-verify each retro step) — see the Forward guides
renkin-bench USPTO-50k/PaRoutes evaluation with --plausibility (forward-validated composite score), --failure-taxonomy, atom-balance checks (target_MW > Σ precursor_MW), and multi-stage cascade re-runs on unsolved targets — see Benchmark
Stock CSV management renkin stock stats|validate|coverage — SMILES, name, vendor, price, hazard fields
MCP server renkin-mcp exposes 6 tools: find_routes, validate_route, explain_route, find_pareto_routes, plan_with_constraints, estimate_diversity
renkin-doctor Environment diagnostic binary — templates, building blocks, Python import, tool versions, data integrity
renkin-kg Reaction knowledge graph builder — bipartite mol↔reaction graphs from routes, GraphML/Cypher export
Multi-target pip install renkin (pre-built wheels, Linux/macOS/Windows) · npm install renkin (~500 KB WASM, near-native browser speed)
Building blocks + stereo 402 unique compounds loaded from data/building_blocks.smi (aryl halides, boronic acids, heterocycles, amines, acids, amino acids — see Benchmark); full tetrahedral @/@@ and E/Z stereochemistry; building_blocks field in every route JSON (leaf starting-material SMILES, no manual parsing)

step_confidence/success_probability are not yields or measured success rates. They're template-frequency-derived search-ranking scores (rule_weight / max_rule_weight, multiplied across a route's steps) used to order candidate disconnections during search — not a calibrated probability of experimental success, and not an expected isolated yield. Route-level experimental yield/success-rate reporting is not implemented.


Pipeline Examples

# Route cost scoring with commercial prices
renkin -t "Cc1ccc(-c2ccccc2)cc1" --bb-prices data/prices.csv --format json

# Standalone forward prediction — no route search involved
renkin-forward predict --reactants "Oc1ccccc1C(=O)O" "CCO" --report --max-results 5

# Forward validation — pipe find_routes output directly
renkin -t "CC(=O)Oc1ccccc1C(=O)O" --format json | renkin-forward validate

# Faster template retrieval with bond-center index (~24% speedup)
renkin -t "c1ccc(NC(=O)c2ccccc2)cc1" --templates data/templates_extracted_5000.smi --bond-index

# Audit a real AiZynthFinder route export with RENKIN
renkin audit-route trees.json \
  --format aizynthfinder \
  --stock building_blocks.smi \
  --output human

# Same audit pipeline, either source — --format auto also detects this correctly
renkin audit-route renkin-routes.json --format renkin
renkin audit-route aizynthfinder-trees.json --format aizynthfinder

Benchmark

USPTO-50k test set (4,907 molecules, full evaluation):

Evaluation definition: A molecule is solved if find_routes returns at least one route whose leaf precursors are all in the building block set, within depth=5 and beam=100. Ground-truth reactants from USPTO-50k are not checked — any commercially accessible route counts.

Corrected baseline (commit e20dc8c, 2026-07-22)

Public label Internal metric Value
Search-to-stock rate raw_solved_rate 20.09% (986/4,907)
Atom-balance-filtered rate atom_balanced_solved_rate 15.41% (756/4,907) — subset of search-to-stock
Current-validator-confirmed rate provenance_validated_solved_rate 0.88% (43/4,907) — subset of atom-balance-filtered

402 building blocks (unique compounds actually loaded from data/building_blocks.smi — see below), 5,000 extracted templates, 28 handcrafted rules, depth=5, beam=100. These three rates are a nested series over the same 4,907 targets, not independent numbers, and none is an experimentally-verified synthesis success rate or a human-chemist-reviewed route-accuracy figure. provenance_validated_solved_rate is not a measured chemical-accuracy rate and not a proven lower bound on correctness — it only counts routes the current validator can positively confirm, and an unknown fraction of "invalid" verdicts may be validator false negatives rather than real chemistry or route errors (the split is unmeasured). Full methodology, per-rule breakdown, and reproduction command: tasks/phase31_final_remeasurement_run.md · Full benchmark details →

Historical progression (pre-fix, invalidated — see notice above)

⚠️ The figures in this subsection (78.0% single-pass, 95.9% cascade, 81.8% ChEMBL OOD) predate the 31.11/31.12 fixes, are invalidated, and have not been re-measured. Kept for continuity only — do not cite as current performance.

Evaluation note: All numbers use the standard USPTO-50k train/test split (same corpus). Templates are extracted from the training set and evaluated on the test set. Numbers reflect performance within the USPTO-50k domain; out-of-distribution generalization was separately evaluated via ChEMBL approved drugs (81.8%, 409/500, also not re-measured).

Config Solved Rate BBs Templates depth beam ms/mol
v0.1.0 initial 366/4907 7.5% 463 31 3 50
+ auto templates (top-300) 1363/4907 27.8% 463 222 3 50
+ depth=5, top-500 templates 2315/4907 47.2% 463 314 5 50
+ beam=100 2688/4907 54.8%* 463 314 5 100
+ Phase A (template freq. weighting) 3540/4907 72.1%† 463 314 5 100
+ 5,000 templates, 480 BBs 3826/4907 78.0% 480 5,000 5 100 2,775
Phase A unlimited (beam=0) 3832/4907 78.1% 480 5,000 5 0
Phase B (NN scorer, tract-onnx) 3826/4907 78.0% 480 5,000 5 100 3,394
+ diaryl sulfone rule, 509 BBs 3826/4907 78.0% 509 5,000 5 100 ≈2,800
Cascade (stage2: depth=7, beam=300 on unsolved) 4705/4907 95.9% 509 5,000 7 300

* 29/50 chunks, previous binary
† 50/50 chunks — 72.1% (3,540/4,907) confirmed
BB counts in this historical table (463/480/509) are as originally documented at each point in time — legacy documentation values, not re-verified against ChemEnv::bb_count(). The corrected-baseline section above uses the actually-loaded count (402) for the current data/building_blocks.smi.

Note: LocalRetro (53.4%) and GLG (58.0%) report single-step top-1 prediction accuracy — a different metric, not directly comparable.

Benchmark scope note: USPTO-50k is used here as a standardized sanity benchmark, not as proof of broad real-world synthesis performance. The corpus covers a narrow slice of reaction space (primarily C–C and C–N bond formations common in pharmaceutical synthesis), and reaction types with sparse USPTO representation are systematically underserved. Out-of-distribution performance on ChEMBL approved drugs (81.8%, 409/500, pre-fix, not re-measured) suggested the rule set generalizes beyond the test corpus, but neither historical number should be interpreted as a guarantee of route quality on arbitrary targets.

PaRoutes compatibility

RENKIN is compatible with the PaRoutes multi-step benchmark. Download their stock compounds and target molecules, then pass them directly:

renkin-bench \
  --input paroutes_n1_targets.smi \
  --building-blocks paroutes_stock.smi \
  --templates data/templates_extracted_5000.smi \
  --depth 5 --beam-width 100

The JSON output includes avg_nodes_expanded, avg_confidence, avg_convergency, and avg_success_prob (Retro-prob style) alongside the standard solved/success_rate metrics.


Competitive Landscape

⚠️ RENKIN's row below uses the corrected raw_solved_rate (20.09%, see notice near the top of this README) — the 95.9% cascade figure some earlier versions of this table cited is invalidated and not re-measured; it is not included here.

Tool Language License WASM Zero-dep Algorithm Template source Stock
ASKCOS Python CC BY-NC No No (Docker, 64 GB) MCTS + A* USPTO (ML) ZINC
AiZynthFinder Python MIT No No (conda + model) MCTS USPTO (ML, ~50k) eMolecules (~6M)
SYNTHIA Closed Proprietary No No SMARTS + AND/OR Manual curated Sigma-Aldrich
IBM RXN Closed Cloud SaaS No No Transformer USPTO
Retro* Python MIT No No (unmaintained) A* + AND/OR USPTO (ML) eMolecules
★ RENKIN Rust MIT Yes Yes A* + AND/OR Hand-curated + rdchiral (5k default; 50k via --templates) 402+

raw_solved_rate is the closest available RENKIN metric to the published route-finding success rates of the other planners above, but the figures are not directly comparable — stock size, template library, target set, search budget, and route-quality checks all differ across systems, and this table does not establish RENKIN as better or worse than the alternatives.

RENKIN's goal: match state-of-the-art accuracy using only curated rules and auto-extracted SMIRKS templates — no GPU, no training data, no black boxes. Under RENKIN's benchmark setting (corrected baseline, commit e20dc8c, 2026-07-22), it reaches 20.09% raw_solved_rate (986/4,907) single-pass — see the Benchmark section above for the full nested-metric series and why the stricter provenance_validated_solved_rate (0.88%) is not RENKIN's measured or bounded correctness rate. RENKIN runs anywhere: browser, CLI, Python — single cargo build.

⚠️ The table above lists tools under different evaluation conditions. No matched-condition experiment against other tools has been performed.


MCP Server

renkin-mcp exposes retrosynthesis as an MCP tool so AI agents (Claude, etc.) can call it directly.

Setup — add to claude_desktop_config.json:

{
  "mcpServers": {
    "renkin": { "command": "/path/to/renkin-mcp" }
  }
}

Tools (6):

Tool Description
find_routes Retrosynthesis: SMILES → routes with scoring
validate_route Forward-validate a retrosynthetic route
explain_route Human-readable strengths/weaknesses per route
find_pareto_routes Pareto-front multi-objective route search
plan_with_constraints Constraint-DSL planning (element filters, step limits, confidence thresholds)
estimate_diversity Route diversity and coverage metrics

The server auto-detects data/building_blocks.smi and data/templates_extracted_5000.smi in the working directory. Falls back to the embedded DEFAULT_BUILDING_BLOCKS / default_rules() defaults if not found (152 unique building blocks per ChemEnv::bb_count(), 28 handcrafted rules — verified 2026-07-22; a "509-BB / 20-rule" figure was previously documented here without verification).

cargo build --release
# binary: target/release/renkin-mcp

Architecture

Workspace scope

┌──────────────────────────────────────────────────────────────────┐
│ renkin workspace (this repository)                               │
│                                                                  │
│  renkin  (retrosynthesis)         renkin-forward                  │
│  ──────────────────────           ─────────────────────────────  │
│  target → precursors              reactants → products           │
│  A* / AND-OR search               template-based forward         │
│  route scoring & constraints      (validates retro routes)       │
│        │                                    │                    │
│        └──────────────────┬─────────────────┘                    │
│                           ▼                                      │
│               chematic  (molecular representation,               │
│               SMILES, substructure matching, reaction SMARTS)    │
└──────────────────────────────────────────────────────────────────┘

Internal data flow (renkin crate)

Target SMILES
     │
     ▼
┌─────────────────────────┐
│     chem_env.rs         │  ← chematic wrapper
│  - SMILES parse         │     canonical-SMILES FxHashSet BB lookup (O(1))
│  - 20 built-in + up to 50k via --templates  │     fragment sanitization + ring-leak filter
│  - Building block check │     apply_retro memoization cache
└────────────┬────────────┘
             │  par_iter (rayon / sequential on WASM)
             ▼
┌─────────────────────────┐
│      search.rs          │  ← A* / AND-OR Tree Search
│  - Priority queue       │     SA Score heuristic + memoization
│  - Closed list          │     beam search (SmallVec frontier)
│  - Arc<PathNode> paths  │     O(1) path sharing per child
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│      score.rs           │  ← Heuristic / Cost Function
│  - SA Score (chematic)  │     h = Σ(1 + 0.5·(sa−1)/9)
│  - MW step cost         │     g = Σ(1 + total_mw/2000)
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐   (optional)
│      scorer.rs          │  ← Phase B: NN Template Scorer
│  - tract-onnx           │     Pure Rust ONNX inference
│  - --scorer flag        │     molecule-specific template ranking
└────────────┬────────────┘
             │
             ▼
  JSON  ←  CLI / Python / WASM

Project Structure

renkin/                          ← Cargo workspace root
├── Cargo.toml
├── src/                         ← renkin crate (retrosynthesis)
│   ├── lib.rs                   # public library
│   ├── main.rs                  # CLI binary (--templates, --template-metadata, --scorer, --constraints, --objectives flags)
│   ├── bin/benchmark.rs         # renkin-bench binary (--plausibility flag)
│   ├── bin/doctor.rs            # renkin-doctor diagnostic binary
│   ├── bin/fp.rs                # renkin-fp ECFP4 fingerprint (nn-scoring feature)
│   ├── bin/mcp.rs               # renkin-mcp MCP server (6 tools)
│   ├── chem_env.rs              # retro rules + BB lookup + template loader
│   ├── score.rs                 # SA Score heuristic + step cost
│   ├── search.rs                # A* / AND-OR tree engine + beam pruning
│   ├── scorer.rs                # Phase B: tract-onnx NN template scorer
│   ├── candidate.rs             # one-step candidate proposal (offline reranking foundation, not wired into search)
│   ├── pool_export.rs           # candidate-pool JSONL + reproducibility-manifest export
│   ├── python.rs                # PyO3 bindings (--features python)
│   └── wasm.rs                  # wasm-bindgen bindings (cfg = wasm32)
├── crates/                      ← sibling crates
│   ├── renkin-forward/          # forward reaction prediction (reactants → products)
│   └── renkin-kg/               # reaction knowledge graph builder (GraphML / Cypher export)
├── data/
│   ├── building_blocks.smi              # 402 curated commercial starting materials (loaded/deduplicated count)
│   ├── templates_extracted_5000.smi     # 5,000 auto-extracted SMIRKS templates
│   ├── benchmark_targets.smi            # internal benchmark set
│   └── bench_chunks/                    # USPTO-50k per-chunk results
├── scripts/
│   ├── extract_templates.py         # rdchiral template extraction pipeline
│   ├── run_benchmark_chunks.sh      # resumable chunked benchmark runner
│   ├── train_reranker.py            # candidate reranker training/evaluation (dev tool, offline only — see docs/guides/reranker-candidate-pools.md)
│   └── tests/                       # unittest suite for train_reranker.py
├── docs/                # MkDocs source → kent-tokyo.github.io/renkin/
└── mkdocs.yml

Roadmap

Full shipped history (every release, in order): CHANGELOG.md. This section only tracks the current headline items and what's next — see "Earlier milestones" below for older shipped work.

Recently shipped

  • RENKIN Bridge — Cross-Tool Route Audit (renkin audit-route, RENKIN-native adapter shipped v0.25.0, AiZynthFinder adapter shipped v0.26.0) — Keep AiZynthFinder. Audit its routes with RENKIN. A tool-neutral route audit model: structural-integrity, stock, and declared-reaction forward-replay validation, each reported independently as pass/fail/not_evaluable, rolled up into a route-level pass/fail/partial verdict — never a silently force-passed boolean. v0.26.0 adds a real AiZynthFinder adapter (single-target and gzip batch JSON, verified against captured v4.4.1 output — see PROVENANCE.md) plus --format auto detection, so both tools' routes run through the exact same audit pipeline; auditing the real fixtures also surfaced and fixed a shared forward-replay bug where precursor ordering, not just chemistry, affected the verdict. renkin audit-route route.json --stock stock.smi --output json audits every route in a file and aggregates the results into one machine-readable report, regardless of which tool produced it.
  • Coverage mode (--search-mode coverage, #101, shipped v0.24.0) — opt-in Stage-1/Stage-2 template-count escalation, addressing the candidate-generation coverage gap below. Confirmed by a one-shot 500-target formal-TEST (data/coverage_mode_formal_test/protocol_v2.md): coverage +6.0pp, net gain +30, zero regressions, zero reranker failures, Stage-2 timeout rate 0.25% — all against pre-registered thresholds. See the Key Features table above for the shipped surface
  • Reranker made actually usable: Python exposure (find_routes()'s reranker_model_path/reranker_freq_table_path) and batteries-included model distribution (scripts/fetch_reranker_model.py, SHA-256-verified fetch from the v0.22.0 GitHub Release's canonical assets) (#101, shipped v0.23.0) — v0.22.0 proved the reranker works; v0.23.0 is the usability/distribution unlock, not a new accuracy claim
  • LightGBM candidate reranker, trained/gated offline and wired into route search (#101 Task 35, CLI shipped v0.22.0) — LambdaMART model trained on real USPTO-50k labels, passed its VAL screening gate (top1 +11.7pp, MRR +11.3pp, top10 +9.3pp, bootstrap-CI-confirmed) and a formal 4,903-target TEST evaluation against the frozen model exactly once (top1 +12.7pp, MRR +11.9pp, top10 +9.1pp — consistent magnitude with VAL, no overfitting signal), then wired into find_routes as an ordering-only rank bonus and confirmed with a paired 100-target route-search gate: route_to_configured_stock 16→20/100 (+4/-0). See the Key Features table above
  • Formal 500-target RENKIN vs AiZynthFinder comparison (#66) — under a fixed 500-target sample, shared 393-compound stock, and each tool's configured policy/budget, RENKIN Conservative's route_to_shared_stock outcome was 9.8 percentage points higher than AiZynthFinder's (73/500 vs 24/500, 95% CI [7.0, 12.8], exact McNemar p≈1.9e-11) — a statistically significant paired difference under this protocol, not a general search-capability superiority claim. Native-mode configurations (each tool's own stock) diverge in the opposite direction, dominated by unmatched conditions including a large stock-size gap. See the comparison guide for the full, deliberately scoped interpretation.
  • Ring-context safety guard for extracted templates (#72/#242) — opt-in --ring-context-policy/--ring-context-sidecar, catches extracted templates silently misapplying a ring-opening/closing disconnection their training data never saw; default remains disabled (unchanged legacy behavior)
  • atom_economy no longer silently clamped to 100% when a route's represented precursor set can't account for the target's full mass (#79) — a new atom_economy_status field (normal/above_expected_range/not_evaluable) reports this explicitly instead

In progress

  • Candidate-generation coverage gap — 33.0% (1,618/4,903) of the formal TEST corpus has zero positive candidates in-pool, a ceiling reranking cannot fix by construction; template-diversity-scaling confirmed as a strong mechanism (Phase A.5/B.2, see coverage mode above), higher-level-template research direction not yet started
  • Template retrieval index (element bitmask + bond-center prefilter) for the 50k template set
  • Calibrated route confidence (map success_probability to empirical solve rate)

Next

  • Graph rule expansion — sulfonamide / carbamate / urea cleavage (one PR per family, each with benchmark delta)
  • Stock-aware planning (price / hazard / availability re-ranking)
Earlier milestones

Percentage figures below are historical milestones at the time each was shipped, not current performance — several predate the validator-accuracy fix noted in Current Limitations and are invalidated; see Benchmark for the current corrected numbers.

  • Reranker made actually usable: Python exposure + batteries-included model distribution (#101, v0.23.0) — see "Recently shipped" above for the current-cycle summary; full detail in CHANGELOG.md
  • Stable template_id (rule:<name> / smirks-sha256:<hex>) + --template-metadata evidence sidecar + renkin template ids (#41 phase 1)
  • Substrate-specific examples (schema_version: 2) — per-step exact-substrate vs. same-template-different-substrate resolution, surfaced in --format explain and as match_kind in JSON (#41 phase 2)
  • Deterministic ORD (Open Reaction Database) evidence import — offline renkin evidence match exact-set batch template matcher + scripts/ord_evidence_audit.py audit/converter into schema_version: 2 sidecars (#41 phase 3A)
  • RETROSPECT-inspired offline candidate-reranking foundation — candidate proposal/selection separation, feature schema v1, manifest v2, leakage-safe train/val/test splitting, baseline arms + trained-ranker arm, paired bootstrap + offline gate tooling (#59)
  • renkin-forward enumerate — bounded, template-guided forward enumeration from a single known reactant plus an explicit partner library (#64)
  • renkin-forward hints — partner-free retrieval hints (matched template slots, missing-partner SMARTS, bond deltas) for patent/database search, no concrete product predicted (#64 phase 2)
  • renkin-forward CLI hardening — versioned ForwardPredictionReport, deterministic candidate IDs/merge/provenance, reactant-order-independent matching, strict CLI/route-JSON validation
  • apply_retro/run_reactants performance regression resolved — chematic moved to the published 0.8.0 release (upstream automorphism-orbit-pruned canonicalization, chematic#193); zero correctness change
  • renkin-bench cascade — multi-stage search (fast defaults → hard cases re-run deeper); only unsolved targets propagate to later stages
  • renkin-bench --failure-taxonomy — classify unsolved targets by cause (beam limit / depth limit / template gap / stock near-miss)
  • Graph-based ester cleavage — BFS-leakage-free R-C(=O)-O-R' → RCOOH + R'OH
  • --top-templates N — frequency-rank filter: use the top-N most frequent templates for speed / less noise
  • raw / validated / practical solved-rate metrics (--plausibility --practical-max-steps N)
  • Retro cache hit-rate in SearchStats + --verbose
  • Route cost scoring — route_cost field + --bb-prices path.csv / --stock stock.csv
  • Cargo workspace — crates/renkin-forward/ + crates/renkin-kg/
  • renkin-forward predict / validate — forward prediction + route validation (stdin-pipe friendly)
  • renkin-doctor — environment diagnostic binary (templates, BBs, Python, binaries)
  • Failure diagnostics — zero-route output includes likely_causes + suggestions JSON block
  • --format explain|compare|compare-json — human-readable and tabular route output
  • renkin stock stats|validate|coverage — stock CSV management subcommand
  • Pareto multi-objective search — --format pareto, --objectives, find_pareto_routes MCP
  • Constraint DSL — --constraints JSON, plan_with_constraints MCP tool
  • renkin template stats|validate|dedup|explain|coverage — template quality tools
  • renkin-kg — reaction knowledge graph (bipartite mol↔reaction, GraphML/Cypher export)
  • MCP server (renkin-mcp) — expanded to 6 tools (explain_route, find_pareto_routes, plan_with_constraints, ...)
  • Core search engine foundation — SMIRKS retro-reaction rules + fragment sanitization, A*/AND-OR tree search with closed list + degenerate-route filter, SA Score heuristic + beam search, rayon parallel rule application (sequential fallback on WASM), FxHashMap/SmallVec beam frontier/SA-Score-memoization/Arc<PathNode> path-sharing perf work
  • Multi-target packaging — Python bindings (PyO3 + maturin, pip install renkin), WASM build (npm install renkin), published to crates.io/PyPI/npm with GitHub Actions CI/CD, WASM browser playground + i18n (EN/JA/ZH)
  • Benchmark CLI (renkin-bench) + USPTO-50k evaluation, --format tree|mermaid visualization, MkDocs documentation site + GitHub Pages playground
  • Graph-based biaryl cleavage · O(1) canonical-SMILES BB index
  • Tetrahedral stereo @/@@ + E/Z double-bond stereo
  • NN template scorer via --scorer flag (tract-onnx, Pure Rust ONNX)
  • Constraint-based search (--avoid-elements, --require-elements) + --verbose search statistics
  • #![forbid(unsafe_code)] — compiler-enforced Pure Safe Rust from the start

Citation

If you use RENKIN in academic work, please cite it — see CITATION.cff for the canonical, version-tracked citation record. GitHub's "Cite this repository" button (top of the repo page) reads it directly and can export APA or BibTeX on demand.


Security

Report vulnerabilities via GitHub Private vulnerability reporting. See SECURITY.md.


License

MIT


GitHub Topics: retrosynthesis cheminformatics wasm rust drug-discovery casp synthesis-planning computational-chemistry


If RENKIN saves you time, a GitHub star helps others discover it.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

renkin-0.26.0.tar.gz (1.5 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

renkin-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

renkin-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

renkin-0.26.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ x86-64

renkin-0.26.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ x86-64

renkin-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

renkin-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

renkin-0.26.0-cp314-cp314-win_amd64.whl (965.4 kB view details)

Uploaded CPython 3.14Windows x86-64

renkin-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

renkin-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

renkin-0.26.0-cp314-cp314-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

renkin-0.26.0-cp313-cp313-win_amd64.whl (965.1 kB view details)

Uploaded CPython 3.13Windows x86-64

renkin-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

renkin-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

renkin-0.26.0-cp313-cp313-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

renkin-0.26.0-cp312-cp312-win_amd64.whl (965.6 kB view details)

Uploaded CPython 3.12Windows x86-64

renkin-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

renkin-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

renkin-0.26.0-cp312-cp312-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

renkin-0.26.0-cp311-cp311-win_amd64.whl (967.4 kB view details)

Uploaded CPython 3.11Windows x86-64

renkin-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

renkin-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

renkin-0.26.0-cp311-cp311-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

renkin-0.26.0-cp310-cp310-win_amd64.whl (967.3 kB view details)

Uploaded CPython 3.10Windows x86-64

renkin-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

renkin-0.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

renkin-0.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

renkin-0.26.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

renkin-0.26.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

File details

Details for the file renkin-0.26.0.tar.gz.

File metadata

  • Download URL: renkin-0.26.0.tar.gz
  • Upload date:
  • Size: 1.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for renkin-0.26.0.tar.gz
Algorithm Hash digest
SHA256 0442920b6dd9ee2cc57565bcc2709b162dd7649eb18ee6c60399178b8ca7463b
MD5 b61af2bfe03f53ce41f51a0b6480fc86
BLAKE2b-256 ffa0ed97cba2c9dae2cf29367cd45fdaa90a36eab237af485e4501f5937e68e0

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 664d7e332439b40b2e45c1fefcbed3312990417001daaeb2f25c39e08e59d991
MD5 e8787d4a46691f2530a893ca1781f872
BLAKE2b-256 7297d81d78b84864b5e1371c8a3dc1ecbde823002172810f00a26cc3a62b1b54

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e80d0f9cbda122948eb50c796780c2d9bf93094737116e4491a81de4898e9230
MD5 8ab82ddaebb7e0a3d9f15e6e72c35f4a
BLAKE2b-256 bf2f0d716e2a1e46085e2ccb206bbd8a4783cee5be6ed050618a2718aba4fbe4

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3f74491a7f5c6183c72cf5d9e5b95128ea4787ed7e0e7396abbd9de16fbb45c3
MD5 cce12e96a41b9d6e7dfb98bc84cf6343
BLAKE2b-256 f21f7fe31e2e0347bd1593027b036b4f2ed07cee176526fdc3a66a327340886e

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b57d3f0db93d05b1ac802d2f3156415540a6f082a9e376709f26e7c4cf3bbc52
MD5 169c2dec683a5e34674db7600036592f
BLAKE2b-256 368e524c0e10052d6a89f4607ca7ca233cf199f74f508fe3b5bd7ef710a36693

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fe1009bf64627c5c7eb4af96182450c8e02804169da244b5ac0357438359dc95
MD5 3cef33d9e4a07cd557d7a503ee55f8ba
BLAKE2b-256 9a57d92ac486ef4066bfe871c9d67da045e4550ab7176ec20f21462805cae48f

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 fab0d33325bad3019538b34fc1cccde00f33cad2f6411627e0dc4d46cfac3247
MD5 13785028e66f1e2faaf3e807a124fe74
BLAKE2b-256 de42de8077b43f81b737a0cc068627ba9ed0e84e8866663ea03ae07dce6b7df3

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: renkin-0.26.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 965.4 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for renkin-0.26.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 9ee51cdfea6cba8a9982934d8aca86d8b202a98f599555d496f4b19051b8923a
MD5 70c5b4103c57fe09e44cbb41cfc3fe3f
BLAKE2b-256 e11f855dfc5ce7be37c4688eb89a80287c023d93895b1abb08819fe0a2350197

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9ee7f9ac2a0340c6e01143790c67de4253a13314356db347d20cb9f6e239c72d
MD5 66620c08255b8bf402b88a227a990b06
BLAKE2b-256 3e39400962342b7bf184b0041c692e2b2dd8e211e555d97566df98ea4ba5be51

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 453f1eae1f5dad36974d7c8ed6757e6f2e3f22aa5df44b71b5e7c629dd36876d
MD5 ecefd0ceb34a88444c859bb36c7414ea
BLAKE2b-256 59313b8b212a3fcb0c3415a89f6041a26dba473d8728e90b7a3a217a4cd2491e

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e5503dfaf9a61b4a469ab4248ec0f70537ce640a2031f9519b05514a6e7b1934
MD5 03b0bd0782384892e6bb399b28bec5eb
BLAKE2b-256 6d8fc82036a8c8f8225a7194122ccc8634c11d4054466c5a36d560af07c63072

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: renkin-0.26.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 965.1 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for renkin-0.26.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 69b48879f23a98c36c5df4c6f5b366f02bdc0c1583cc5c1f335767dee73c45b5
MD5 7638e899619378628263eadfbf1f2767
BLAKE2b-256 3c9d2e455feb026326aa82cc80dda417a8ed3cb6ed416fff86b21c78248e1524

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d9785ae559670c043967b864987a1729d77db530df75672fcc33747c5dbaa739
MD5 874a1276b26ef5bb44ab8ccf2112e211
BLAKE2b-256 d1559c58e02d45fb4dfb87ce8a7b5e413bfcbbcec140d627a84488e19c6f02e8

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 39fb8d52a5d961aeca1e70b324b2ec87f6fef5e43c03e33a0ad65d8019143dce
MD5 7ef1d47466ba3b51805262b512a4983e
BLAKE2b-256 99f3edb53faf838f92e6918954e5f20b3bbc64752175a9bc2602ab175122d138

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d30766e7c832f9d7260e8dd996546790bddec5794fc69555064132c57e187b1a
MD5 7d471ba4f5a0c76693206ed9b01a55fe
BLAKE2b-256 da9ea67939920b7cd17d3c60112b3d2e1a23a425f59d7f8f3f1a755e24aedcfd

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: renkin-0.26.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 965.6 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for renkin-0.26.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 49484a326f3be9e0134b85a07731371f502d9029a01654efc933c4a5a9039dfc
MD5 1223d3ff15cdeb39a14757120a678d59
BLAKE2b-256 e6350dcf6eb28479ba51d7ddf63f2d0ba4732f18461778d13a790cb61881817b

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 53be503badf6c88530aa66119041be51b76f1dddcfd5baabec4b9f02d0558c2e
MD5 2a10e2dbd0d150e1feb6dda99cfa150f
BLAKE2b-256 fb0d7a36c2744c4c3d6d4987e8a141932a7bdeb374118184fa3719cebdb82784

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 458a45f1ee3e109cc9dffd83d9b7452fe69f89a0802847e400daf69e46379ad6
MD5 ea0021760f9f1c4b4fd1715b01cb3553
BLAKE2b-256 fee211b4b096396dfabad140c3a9cbc9d487c45f0f497b12c43ed0987abbd2a1

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7531342a00760dbb8f2a1696c074770ed5c2b5ed57a0fb61596c84b8ded4aba8
MD5 71d11de69faad7f9f3f0efceae7b00ec
BLAKE2b-256 55f33f1c45c8c90c35221af26e4762f5841d0b22a1ad0da560710fb1787a1e42

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: renkin-0.26.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 967.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for renkin-0.26.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f8180a64ec010201557fb7ef1e8ee69b56633015a1bd29516678cfe00e92490c
MD5 1307b156a2bf6fdaf886925cdaf35d85
BLAKE2b-256 712e7f531455d56ea634f6984284787ff2de0ceea472218cb18af109f8e9fa80

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0dcd893370c1a213f35b5beadc90191f10649ce6f0fb71927e71bb02bd3db4a4
MD5 b6208fc72e97f4c2f5cde95321b5ee70
BLAKE2b-256 5d4b6cd2e972282d1e2380a8a385b165ecb89375a20583aaac6a235eee5c8b5c

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6ec5728dd262e44a5bc4c86476159f80fbafb7c54940fa471f6892a4c16d5ec0
MD5 fccd28ee9537faefbda9c0934a3f9ff6
BLAKE2b-256 fe9cd402b65e5a59bd7483f625c79849f2de869ef4ae0e06816d94b7696ee4db

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0d1ae27741428cd1927ddedf959b5c65c39e0fbb203822bd51e4e8f70483cba5
MD5 c879640ee455596d3a801c033003e5ec
BLAKE2b-256 7d87861fbb6169a5091ef9a24a85eef656528fcdcd31fddf93f184cdb22bf567

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: renkin-0.26.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 967.3 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for renkin-0.26.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4e2c376f4c8bf41dc174c8136231c109b987550d6c805a189c013ace86ac36bd
MD5 cbae4948e4f8613b5f9971fdd8bdbdff
BLAKE2b-256 0ad27d2791b9b1f94d3a6cbcb100f27682d3d5d5ca4831147ebbdf6cf8aada41

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d3798df85d7bbe0c31b01d7a4948502480ef06dab96a3091f5176f8324a4ccbc
MD5 2568f9dd2c000bef29c811b44e1120ac
BLAKE2b-256 2f2b7fab0a126474363dedb1e6619e1147845e3fbf6ff419b867e5bdc1a3b07a

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a33cbd24ba2bb36e84079551e1c0adeb116704592d220580ec5986c30befa587
MD5 3b45e70bf51689278ffaeb819e61ab70
BLAKE2b-256 98bbcd2e52ea792dd70998e68f912ae7ad62fc8bc60280d82d8099315f5b4bf8

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a4008d65f88494cac93fa6425cf92e98e24b7d7c57c613f7ade10cef84187db2
MD5 4bc763f834250e5b08b5e9aa0e23a326
BLAKE2b-256 7301d16972bb07d9d894198a5f6ab69b6cd00ce1127240bf57ae0637da7ef7bd

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 af303e4e4c1778b57c8aa8bd88758d9a2d05cdc73b6731007fc6874d5478d3c8
MD5 03329e2a4e0bbb9090a7750cb27112d3
BLAKE2b-256 905b364bd592a1b6844f916577b8415599ec2a63b4df181d42ca610b7f7ba17c

See more details on using hashes here.

File details

Details for the file renkin-0.26.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for renkin-0.26.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1175d0a751e13710489561e7926c78fbdf7f416c9201292154dea17a766aab5d
MD5 a35339584a533818cfb76b1a4ae07bb5
BLAKE2b-256 805bf62bc49e64e33c93ee876d7cae9aca3394b2e52889dc84eba25a5088e828

See more details on using hashes here.

Release history Release notifications | RSS feed

0.35.0

29 files

0.34.0

29 files

0.33.0

29 files

0.32.0

29 files

0.31.0

29 files

0.30.0

29 files

0.29.0

29 files

0.28.0

29 files

0.27.0

29 files

This release

0.26.0 This release

29 files

0.25.0

29 files

0.24.0

29 files

0.23.0

29 files

0.22.0

29 files

0.21.1

29 files

0.21.0

29 files

0.20.0

29 files

0.19.0

29 files

0.18.0

29 files

0.17.0

29 files

0.16.0

29 files

0.15.4

29 files

0.15.3

29 files

0.15.2

29 files

0.15.1

29 files

0.15.0

29 files

0.1.0

29 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page