An answer with nothing behind it
A chatbot with no "I don't know" will answer from general knowledge even when your documents say something different, or say nothing at all — and the reader cannot tell the difference.
A knowledge base you can type to, or talk to
Every answer carries its source, or it is not given at all. When nothing in the index covers the question, it says so and hands off to a human — and that handoff is confirmed by reading the reply back, never assumed.
Try it
Type to it or talk to it — same index, same sourcing rule either way. This is the real agent, not a recording.
Loading the voice agent…
The blind spot
Most chatbots are built to always sound sure. A wrong answer stated plainly costs more than an honest "I don't have that," because the reader has no reason to doubt it.
A chatbot with no "I don't know" will answer from general knowledge even when your documents say something different, or say nothing at all — and the reader cannot tell the difference.
"Passed to a human" is easy to say and easy to get wrong. If the handoff itself fails silently, the question is unanswered and nothing anywhere says so.
A fallback path that has never actually been exercised is a claim, not a proof. The only way to know it works is to break it on purpose and watch what happens.
How it works
Typing and talking are two ways into the same answer, not two separate products. Both end the same way when the index has nothing: a human, and proof the human was actually reached.
Source documents are embedded once and stored in a vector index. Nothing is answered from outside that set.
Pinecone
Azure OpenAI embeddings
A typed or spoken question is matched against the index. A reply is only given alongside the document and location it came from.
n8n
LangChain
When nothing in the index covers the question, the agent says so in plain language rather than answering from general knowledge.
FastAPI
A refusal escalates to a human over Telegram. The handoff is checked by reading the delivery reply back, not assumed from a queued request.
Telegram Bot API
pytest
The evidence
Captured from the acceptance runs on 2026-08-29. Recorded, not staged for this page — including the one where the safety net was cut on purpose.
Q: what is the minimum mass of the car?
During Sprint Qualifying and Qualifying the Minimum Mass is 726kg plus the Nominal Tyre Mass. In all other sessions it is 724kg plus the Nominal Tyre Mass.
Answered from a source document, and it names the source out loud.
Q: what is the capital of Peru?
I don't have a sourced answer for that, so I'm passing it to a human who will follow up.
Nothing in the knowledge base covers this, so it refused rather than guessed — and the handoff was confirmed by reading the reply back, not assumed.
Q: how do I cancel my gym membership?
I don't have a sourced answer for that, so I'm passing it to a human who will follow up.
The channel was deliberately broken. The agent still spoke truthfully, but the handoff never arrived — and the console said so instead of staying quiet. A safety net nobody has seen catch anything is not known to work.
What you get
Written to be read by whoever is deciding whether to trust it with real documents.
Every reply names the document and location it came from, so it can be checked without asking the agent to explain itself.
Answers: where did this come from?
A refused question hands off to a human, and the handoff itself is verified rather than assumed to have arrived.
Answers: did the escalation actually land?
Type it or talk to it — same index, same sourcing rule, same refusal behaviour either way.
Answers: does it work the way people actually ask?
The public index is a demo document set, not a client's real corpus — the difference matters, so it's stated rather than implied.
Answers: is this open to strangers, or a demo?
The typed and spoken versions above are running today against a public demo corpus. Wiring the same agent to a real document set is a separate, scoped conversation.