Upload a PDF and ask it anything. Every answer names the page it came from — and when the document does not contain the answer, it says so instead of inventing one.
Answers only from your fileEvery claim cites its pageRefusal floor measured, not guessed
How it is built
Page-aware chunking
The PDF is split per page with overlap trimmed to sentence boundaries, so a citation points at a page a reader can actually check.
A floor from measurement
Relevant passages scored 0.64–0.85 and unrelated ones 0.42–0.45 on real documents. The floor sits at 0.55, between the two — not at a value copied from a tutorial.
Refusal is cheap
When nothing clears the floor the request ends there. One embedding, no completion — so refusing costs less than answering.
Next.js, Gemini embeddings and pgvector. Keys stay on the server — the page calls a route, the route calls the provider.