Inspiration
Anyone who's sat in an ER waiting room knows the drill. You get triaged, you sit down, and then nobody looks at you again for a long time. Meanwhile some people in that room are quietly getting worse. Sepsis is the scary one: in a study of 2,731 septic shock patients, each hour of delay before effective antibiotics cut survival by an average of 7.6% (Kumar et al., Critical Care Medicine, 2006). Nurses aren't the problem. They're stretched thin, and rechecking vitals by hand is slow. We wanted to give them a way to know which waiting patient to look at next.
What it does
RiskER is a wearable plus a nurse dashboard for the waiting room. Each patient wears a sensor that streams their vitals, and the board ranks everyone by risk in real time. Instead of using one set of thresholds for everybody, RiskER adjusts them for each person. It starts from what's normal for people of the same age, sex and health conditions. Then it learns that patient's own baseline while they sit there. An LLM reads the intake notes and chief complaint and can tighten the alert limits (never loosen them). On top of that, a forecasting model looks 15 minutes ahead and flags people who are trending toward trouble before they actually get there. Every alert comes with a plain-English reason, like "SpO2 may reach 90% within 15 min."
Nurses can also just ask. Our Fetch.ai agent, available on ASI:One, answers questions like "Who needs a recheck right now?" from the live board.
How we built it
- Wearable: streams real heart rate over Bluetooth to a laptop, and we work out breathing rate from tiny variations in the time between heartbeats. SpO2 and temperature are simulated for now.
- Risk engine (Python): NEWS2 scoring as the base layer. Normal ranges fit to NHANES survey data for each patient profile. A personal baseline that narrows those ranges over time, tuned on 1,945 eICU stays. Alert logic with persistence windows, so one noisy reading doesn't page anyone.
- 15-minute forecast: LightGBM models trained on about 1 million minutes of MIMIC-III bedside vitals from 259 patients. They predict each vital's lowest or highest value over the next 15 minutes and alert when a cautious forecast crosses a danger line.
- Context adjuster: StepFun's step-5-preview reads the intake and proposes changes from a fixed list of rules. Code checks every change, drops any whose quote isn't word-for-word in the complaint, and logs each one with the exact quote that triggered it.
- Fetch.ai agent: a uAgents agent on Agentverse using the Agent Chat Protocol. ASI:One does the reasoning through function calling over two read-only tools: open alerts across the waiting room, and one patient's latest risk result. It can read the board but never change it.
- Tiger Data: every reading is mirrored into a TimescaleDB hypertable, segmented by patient and compressed after 7 days, and a real-time continuous aggregate rolls vitals up into per-minute medians.
- Backend: FastAPI with WebSockets and SQLite.
- Frontend: React, Vite and Tailwind.
- Simulator: a scripted waiting room with six patients and fast-forward buttons, so you can watch someone deteriorate in a few minutes instead of an hour.
Challenges we ran into
Breathing rate gave us the most trouble. We get it from tiny changes in the gap between heartbeats, which works fine if you sit still. Shift in your chair and the number jumps all over the place. At one point we just turned it off, and only brought it back later. All our training data came from ICUs, since that's where vitals get recorded minute by minute. ICU patients are a lot sicker than people in a waiting room, so the first time we ran our alert logic it fired almost three times per patient per hour. A lot of the night went into retuning windows and cutoffs. The LLM needed babysitting. In early tests it would cite "Age 72" as evidence even though that wasn't anywhere in the patient's complaint. So we moved anything structured, like age and medications, into plain code, and only let the model handle free text. It also can only make limits stricter, never looser. Our first forecasting model was a yes/no classifier, and it lost to a couple of simple rules we wrote by hand. That one hurt. We rebuilt it to predict the actual vital values 15 minutes out, which ended up more accurate and much easier to explain on screen.
Accomplishments that we're proud of
The whole pipeline works end to end. A real wearable on a real person feeds a risk engine that's personalized at three levels and forecasts ahead. The board updates live, and you can see why every alert fired. And we measured it:
- Context adjuster: on 70 held-out intake cases, 69 came out exactly right, with 0 false changes and 0 attempts to loosen a limit (median response 4.2 s).
- Forecast: on 52 held-out MIMIC patients, its error is 30-55% lower than assuming vitals stay where they are. At our chosen alert rate it warns about 25 minutes before a patient reaches danger, on average.
- Alert fatigue: across 1,945 eICU stays, our persistence windows cut alerts on patients who survived by 31%, while still alerting on all 167 who didn't.
Every modelling choice is backed by real data (NHANES for normal ranges, eICU for baseline and alert tuning, MIMIC-III for the forecast) and written down with its evidence, not just guessed.
What we learned
An alarm that goes off all the time is worse than no alarm, because people stop listening to it. That ended up shaping almost every choice we made: the persistence windows, the forecast cutoff, which alerts even make it to the board. We also found out how little of building with an LLM is the LLM. The API call is a few lines. Checking what comes back, making sure every quote is real, and making sure it can never loosen a limit was most of the work. On top of that we picked up a lot about NEWS2, ICU datasets, and Bluetooth heart rate straps that we didn't know going in.
What's next for RiskER
Retrain the forecast model on a bigger batch of MIMIC patients and on data from actual waiting rooms, which run much healthier than an ICU. Add real SpO2 and temperature sensing to the wearable. Chart long-term trends on the dashboard straight from the Tiger Data aggregates. Run a pilot with ER nurses to find out what they actually want on the screen.
Links
Built With
- bluetooth
- fastapi
- lightgbm
- mimic-iii
- nhanes
- openai-sdk
- pydantic
- python
- react
- recharts
- sqlite
- stepfun
- tailwind-css
- typescript
- uv
- uvicorn
- vite
- websockets
Log in or sign up for Devpost to join the conversation.