Spaces:
Running on Zero
A newer version of the Gradio SDK is available: 6.24.0
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 |
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.