How AI twins work

Written for anyone who wants to know what's actually happening behind a twin — whether you're building one or talking to one.

Where answers come from

A twin is built from material its creator provided: things they wrote, said, recorded, or uploaded. When you ask a question, hiy searches that material for the passages most relevant to what you asked, and a language model writes an answer grounded in those passages, in the creator's voice.

It isn't searching the web, and it isn't drawing on general world knowledge to answer for the creator. If the material doesn't cover it, the honest answer is that it doesn't know.

How one question becomes an answer

  1. Question1–2000 characters.
  2. embedQueryTurn it into one vector.
  3. match_chunksRetrieve top matching passages; search at most three times.
  4. AnswerGrounded in the retrieved context and platform rules.

possible outcome

  1. Cited answerOne citation per source.
  2. Honest gapMissing material is queued to knowledge_gaps.
The pipeline does not fork at the end. Nothing in it can invent a source: the citations are built from the passages the answer actually drew on, and they are stored on every answer. The dashed feed is a second, conditional write — it happens when the answer admits the material is missing, which a partial answer can do while still citing what it had.

Why answers show sources

Grounded answers carry a citation. Open it and you see the actual passage the answer drew on — not just a title, the text itself. Where that source was a page on the web, the receipt also carries a Read the original link that jumps to the passage on your own site.

This is the part we care most about. An AI answer you can't check is a claim; an answer with its evidence attached is something you can judge for yourself.

Only your words are quoted

To answer well, hiy writes its own summary of everything you've given it, and answers often lean on that summary rather than on one particular thing you wrote. That summary is genuinely useful — but it is hiy's writing, not yours, so it is never shown to a visitor. Nothing a stranger reads in quotation marks is anything other than your own material.

Note

There is a consequence worth knowing about, because it looks like a bug and isn't: you can see more citations than your visitors do. In your own test chat you see everything the answer used, summary included and clearly labelled as hiy's. On your public page, the summary is simply absent — so an answer that leaned mostly on it may show a visitor one citation, or none. The answer is the same. What's shown as evidence is only ever the part we can attribute to you.

The three states of a passage’s provenance

source

  1. Creator’s own wordsChunked from a source row.
  2. A citationPlus a link when the source had a URL.

summary

  1. hiy’s synthesisThe wiki has no source row.
  2. Dropped from the wirecitationsForVisitor() removes it.

absent

  1. Nothing knowsThe row predates provenance.
  2. A citation, as alwaysNever guessed to be a source.
Half the retrieval index is a summary hiy writes. Showing it to a visitor, however carefully labelled, would present a machine’s paraphrase where the creator’s own material is promised — so it is dropped server-side, not hidden in the view.

The creator's two source controls

Under Voice & rules → Sources & citations, a creator can shape how this appears:

  • Show sources on answers (on by default) — visitors can open the passage behind an answer. A creator with private material can turn this off; when they do, the sources aren't just hidden from view, they're never sent to the visitor's browser at all. The AI label, the honest "I don't know" and its search count, and the Report link stay regardless — those are never removable. With sources off, a gap still shows how many ways it looked; it just doesn't show the wording, because a reworded search is written from the material it just read and can carry that material's vocabulary.
  • Verifiable receipts (off by default) — puts the exact passage up front as open citation chips beneath every answer, rather than one quiet "read the source" line, and opens the search receipt on a gap by default too. It also sends the whole passage rather than the first couple of lines, so "the exact passage" is exactly that. For creators who want provenance to be impossible to miss.

What a plan can and can't change

A paid plan removes our name from a twin — the "Powered by hiy.ai" line, and the word "hiy" in the chat. It cannot remove the AI label, the honest "I don't know", the citations behind grounded answers, the Report link or the Verified badge. Those stay on every tier. The hiy.ai credit is the whole list, in one place.

What "I don't know" means

When the material doesn't support an answer, a twin says so. That's a designed behaviour, not a failure — and it's never paywalled.

Those unanswered questions go to the creator, who can answer once and have the twin use their words from then on. Asking something a twin can't answer is genuinely useful: it's how the twin gets better.

It shows you where it looked

An honest "I don't know" is only worth something if you can tell it looked. So a gap carries a receipt: the searches the answer actually ran — your question first, exactly as you typed it, then any rewordings the twin tried on its own. Open it and you see the wording, one line each.

This shows up on any answer that admits the material doesn't cover something — however the twin words it, not only when it says the exact phrase "I don't know". Your teach queue is filled by that same test, not a stricter one. What keeps it readable is what happens after the match: a question already sitting in your queue raises no second row, and the queue stops at 100 open gaps until you catch up.

Two gap matchers, deliberately out of step

display path · wide

  1. The answerOne string of text.
  2. looksLikeGap()The browser detects a broad range of admissions.
  3. Dashed panelShows the honest-gap treatment and search receipt.

write path · narrow

  1. The same answerRead again on the server.
  2. isHonestUncertainty()Uses the narrower matcher.
  3. knowledge_gapsQueues a creator task, up to 100 open gaps.
The two used to disagree on purpose, and the disagreement was the bug: the server gate demanded a literal “I don’t know” while a Support Agent is told to say “that isn’t something I have from …”, so it matched none of the 24 real declines in the labelled corpus and the queue never filled.

It reports the searches, not their results. hiy will never tell you a search "found nothing", because the honest claim is the one it can prove — a search on a gap often does return passages, they just don't answer what you asked. And like every other honesty surface here, the receipt is never behind a plan.

What a twin is not

It isn't the person. It's a clearly labelled AI version of them, and it can be wrong. It doesn't have access to their calendar, inbox, or private life. Treat it as a very well-read stand-in, not as the person speaking.

Was this page helpful?

View Markdown