Ryniant
Rebuilt a synthesis-planning product so that nothing reaches a chemist unless it has been computed or found in the literature.
The problem
Ryniant helps chemists find synthesis routes — the step-by-step recipe for building a target molecule. The original product used a language model to produce those routes. Language models are good at producing chemistry that reads correctly and is not real. For a chemist about to spend a week and a bench budget on a route, a plausible-looking wrong answer is worse than no answer.
What I built
I built a Python microservice combining AiZynthFinder's search with RDKit to plan and rank routes computationally rather than generatively. That moved planning from hours of manual chemist work down to minutes, and it made the output something you could trace rather than trust.
Then I re-architected the pipeline to be evidence-only. Every reaction is checked against PubChem and Open Reaction Database records using FAISS similarity search, enforced by an automated regression test rather than a review step someone could skip. If a reaction has no support, it does not render.
The language model did not disappear — it moved. I built an agent on Claude using LangGraph that proposes novel routes and then fact-checks each one against real reaction data before it surfaces. The model generates candidates; the verifier decides what counts.
The decision I would defend
Putting the model behind the verifier rather than in front of it costs you coverage. There are almost certainly real routes that exist in a chemist's head, and in the model's weights, that our evidence layer throws away because it cannot find a citation.
I took that trade because the failure modes are not symmetric. A missed route costs a chemist a suggestion. A hallucinated route costs them a week. The agent recovered a good part of the lost coverage — routes went up 25% with no validity loss — but the ordering was the point: verify first, expand second.
Shipping it
I built the product end to end: a React and TypeScript frontend on a distributed FastAPI, Redis, and PostgreSQL backend on Cloud Run. Results return in seconds, and a seven-day tenant cache takes repeat queries close to zero.