About the project (Project Story โ Markdown)
๐ผ What it is
ORChestra is a chat-native conductor for operations research. You describe a real-world problem in plain English; an AI orchestrator routes it to the right one of eight specialized OR optimizers โ each a genuine OR-Tools model exposed as an MCP tool โ solves it, and explains the answer. Six of the eight are exact models that report a 0% optimality gap โ provably optimal, not a heuristic guess.
๐ก Inspiration
Orion is judged by INFORMS โ operations-research people โ under the banner "Where Operations Research Meets Innovation." We bet the field would be flooded with RAG chatbots, so we went the other way: fuse agentic AI with real optimization. OR has always had a last-mile problem โ the models are powerful but locked behind experts and clean data. LLMs are the missing pieces: the layer that turns messy human language into optimizer input, and the interface that lets anyone interrogate a rigorous model. We didn't put a chatbot on top of OR. We gave OR a voice.
๐ ๏ธ How we built it
- 8 OR-Tools optimizers โ LifeChain (kidney paired-exchange, CP-SAT cycle/chain packing), FoodRescue (VRP + time windows), ReliefRoute (allocation + fairness floor), ShiftHeal (nurse rostering), ColdChain (cold-chain delivery), FairAid (concave-utility cash allocation), CarbonRoute (multi-objective sourcing), OR-Copilot (knapsack/assignment).
- MCP layer (FastMCP) โ every optimizer is an
optimize_*tool; runnable as one aggregated server or eight standalone servers. - Orchestrator, two ways โ a portable Conductor (Claude routing + keyword fallback + session memory for "what-ifs") and a Hybrid path where Accenture AI Refinery's Distiller drives an
MCPClientAgentconnected to our MCP server over SSE. - Interfaces โ a Slack-style web chat (FastAPI) plus a swappable Slack Bolt adapter.
- Runs with zero credentials; Claude, AI Refinery, and Slack are graceful enhancements.
๐ฏ The demo beat (LifeChain "Living Optimization")
Optimize a 18-pair kidney pool โ 13 transplants, +5 vs a naive matcher, optimality gap 0%. Then say "prioritize the children" โ it re-solves live in ~1s: still 13 transplants, but pediatric recipients rise 3 โ 5 โ a Pareto-improving fairness change, steered in plain English.
๐ง Challenges we ran into
- AB blood type = universal recipient, which turned a "find an incompatible donor" loop into an infinite loop โ fixed with a bounded, realistic crossmatch model.
- Reproducibility: Python's salted
hash()and multi-worker CP-SAT tie-breaking made the "provably optimal" demo flap between runs. We made the crossmatch a stable integer mix and pinned CP-SAT to a single worker + fixed seed โ now byte-identical every run. - A mislabeled
mcpPyPI package; pivoted to the reliable standalone FastMCP.
๐ What we learned
Constraining the LLM to fill typed parameters of pre-validated OR templates (never emit raw solver code) is what makes "talk to the optimizer" safe in front of experts โ the model can't hand a judge a wrong model. And honesty scores: we label the 6 exact solvers gap 0 and the 2 routing solvers as metaheuristic, rather than overclaiming.
๐ Accomplishments
8 real OR models ยท MCP tool layer ยท portable and AI Refinery orchestration ยท web + Slack ยท 29/29 tests pass ยท all 8 solve in ~4s from one command.
๐ What's next
Real EHR/FHIR ingestion for LifeChain, live map/graph visualizations, and a national-pool scale demo.
Log in or sign up for Devpost to join the conversation.