QVAC

Emergency

Triage-0

A clinical triage assistant for community health workers, grounded in a deterministic WHO decision table

ragtranscriptiontext-to-speech
Triage-0

A community health worker in a low-resource clinic often has no internet and no doctor on call. Triage-0 puts a protocol-grounded second opinion on the laptop they already have: speak or type a case, and it returns a severity card and a full WHO management plan, with every line traced back to the exact guideline page it came from.

The model classifies. The protocol decides.

Triage-0 deliberately keeps the language model out of the loop for anything that matters clinically. MedPsy-1.7B's only job is to parse the case into a single WHO classification, constrained by grammar to the categories valid for the symptom described. Everything after that - severity, the recommended action, the citation, the weight-banded drug dose - comes from a frozen WHO decision table, never from generation. If retrieval falls below a similarity threshold, the tool abstains with an UNKNOWN card instead of inventing a citation.

src/triage/triage.ts (excerpt)
// The model parses ONE classification; a frozen WHO table supplies the rest.
const { groundedHits } = await retrieveGrounding(caseText, ctx)  // GTE + @qvac/rag
const ex = await extract(caseText, groundedHits, ctx)            // MedPsy-1.7B -> { classification }
let cls = reconcileMalaria(ex.classification, caseText)          // WHO no-test rule
cls = reconcileDiarrhoea(cls, caseText, dangerSign)               // blood -> DYSENTERY
const entry = lookupProtocol(cls)                                 // frozen WHO decision table
// entry supplies severity, the action, the citation, and the dose-specific plan, verbatim.

Zero egress, proven not claimed

The claim that a patient's case never leaves the device is backed by a script, not just a README line. egress-check.ts arms a guard over every network primitive - net.connect, tls.connect, dns.lookup, fetch, and the rest - runs a full triage end to end, and prints a zero-outbound-connections result. The same guard runs again in CI, with a negative control to prove it isn't a no-op.

Demo video

Why it holds up on a 1.7B model

  • A frozen WHO decision table supplies severity, action, and dose - the model only classifies

  • Deterministic guards pin the cases a small model gets wrong, like the WHO no-test malaria rule

  • 97/97 tests pass, including a verbatim check that every dose line matches its cited WHO chunk

Build this

Ship your own local AI

One install in JavaScript or Python. 10+ AI tasks. Private, offline and free - on the hardware you already own.