← Work

Nod First Triage Router

October 2026 · workshop build, open source · source on GitHub
PythonFastAPISQLiteDigitalOcean Serverless InferenceDigitalOcean Inference RouterOpenAI SDKwhisper.cppvanilla JS

Why it exists

Messages an adult child sends about a parent are not equally urgent. A question about a visit with a neighbor and “Mom had a fall in the kitchen” should not get the same model or cost the same. I built this solo for the OIS Workshop Day (MLH + DigitalOcean) on October 12, 2026, around one idea: route by caregiving risk. It is a build for NodFirst.

It is not medical advice. The agent never diagnoses or suggests medication changes, and anything that could be an emergency gets told to call 911 or Mom’s doctor.

How it works

A small model labels each message routine, logistics or urgent. A keyword safety net for falls, chest pain, confusion, a missed dose or not being able to reach the parent overrides any lower-risk label. Routine and logistics go through a nodfirst Inference Router I set up in the DigitalOcean Control Panel, with glm-5.3-flash for routine and glm-5.3 for logistics. A client-side mapping to the same tiers is the fallback, and a mock mode runs the whole app offline with no key.

The agent works on a shared sibling thread with seven tools: logging medications, booking appointments, assigning sibling tasks, reading Mom’s record, building a daily digest from the store, and emailing the digest or a short note. Each reply carries a badge with the route, model, latency and estimated cost, and a stats panel compares spend against pricing the same tokens at the large-model rate.

Urgent never waits on a router

Urgent messages bypass the router in every mode and go straight to the configured large model, qwen3.8-max. Each urgent turn also writes an alert that stays on screen until a sibling acknowledges it, and can be emailed. If the classifier call fails, the keyword classifier takes the turn so the safety net still applies. If the agent call fails, the reply says so and keeps the 911 note.

What the live run showed

On the day, the five scripted messages ran through the real DigitalOcean path. All five were classified as expected, both urgent ones were served by qwen3.8-max, every turn finished under 4 seconds, and the run took 12 calls at about $0.006 estimated. Total spend across every rehearsal and probe was under $0.10.

Rehearsal found real bugs. The thinking-model tiers returned empty text until I set reasoning_effort to none, urgent replies printed the 911 line twice, and a 529 overload from the provider surfaced as a server error. All were fixed and checked again live. The repo has 143 tests, all offline.

Voice

Spoken questions are transcribed on my own machine with whisper.cpp, since DigitalOcean had no speech-to-text route. Replies can be read aloud through DigitalOcean’s text-to-speech model. That model does not stream, so the page splits a reply into sentences, requests them in parallel and plays them in order.

What it is not

The brief suggested a Nous Hermes agent. No Hermes model was in the DigitalOcean catalog, so none was used; the client is provider-neutral and could take one through configuration. There is no accuracy evaluation, so I do not quote savings percentages or recall rates. Costs shown in the app are estimates from DigitalOcean’s published prices, not a bill.