lighthouse-scoring / README.md
AaravArora's picture
gradio owns the server; graft /health and /score onto it
14a0030 verified
|
Raw
History Blame Contribute Delete
2.34 kB
---
title: Lighthouse Scoring Service
emoji: 🪔
colorFrom: indigo
colorTo: blue
sdk: gradio
app_file: app.py
python_version: "3.12"
suggested_hardware: zero-a10g
pinned: false
---
# Lighthouse scoring service
The classifier half of Lighthouse, behind one HTTP call. A fine-tuned turn classifier, a
logistic conversation head with isotonic calibration, and a deterministic safety gate,
returning a finished escalation card.
**Every conversation this service was trained and demonstrated on is synthetic.** No real
student ever spoke to it.
This is a listening and routing tool. It does not diagnose, treat, or offer therapy.
## Endpoints
The Gradio page at `/` is a courtesy. The API is the product.
| Route | Purpose |
|---|---|
| `GET /health` | Liveness, plus whether the checkpoint is present and loaded |
| `POST /score` | One conversation in, one escalation card out |
```bash
curl -X POST https://AaravArora-lighthouse-scoring.hf.space/score \
-H 'Content-Type: application/json' \
-d '{"caseId":"demo","handle":"anon","startedAt":"2026-01-01T00:00:00Z",
"turns":[{"role":"student","text":"i have not slept in days and nothing helps"}]}'
```
## What this service cannot do
It cannot decide whether a student sees crisis resources. That already happened, in the
browser, before this service was contacted, from a safety gate that runs in about 123µs
with no network. Nothing returned here can revoke it.
A failure here is not an outage. The caller applies a four-second timeout and keeps its
gate-only card if this does not answer, which is a designed state with its own screen copy.
## Note on the first request
The checkpoint loads lazily, on first `/score`, so `/health` answers while it is still
loading rather than being killed during a slow start. That first scoring request takes
about ten seconds; every one after it is about 30ms. Free Spaces also sleep, so warm this
before demoing.
Scoring runs on CPU. ZeroGPU allocates a GPU per decorated call, which is the wrong shape
for a model held across requests, and a DistilBERT does not need one. The self-test button
on `/ui` proves the GPU allocation is real; nothing on the scoring path uses it.
Built from the `ml/` half of the Lighthouse repository by `ml/space/make_space.sh`. This
Space is a generated build output, not the source of truth.