Under an answer, the assistant shows a Sources row: the help articles that answer came from. It is deliberately narrower than "every article the assistant touched", and narrower than "every article the answer links to".
This page explains the rule, because the difference occasionally surprises people.
The rule
An article earns a place in the Sources row when the assistant read its text. There are two ways that happens:
It opened the article. When the assistant fetches one specific article in full, that article is a source — whether or not the answer ends up linking to it. Opening it is the evidence.
A search returned it and the answer cited it. A search hands the assistant up to ten candidates with excerpts. The citation is what tells us which of those it actually used, so a search result the answer never links to is not a source.
An article the assistant only saw as a title in a listing is never a source. Listings — "what does your help center cover?", browsing a category, the most recent articles — return titles, not article text. A link copied out of one is a signpost, not something the answer was built on.
Why an answer can link more articles than it cites as sources
Ask the assistant to list your articles and it will reply with a tidy list of links, and no Sources row at all. That is correct: it read no article to produce that answer. It listed them. A Sources row restating the same links directly under them would be noise.
Every one of those links still works. Clicking any of them opens the article, exactly as a cited link does. Only the chips are filtered.
The short version:
Links in the answer — everywhere the assistant pointed you.
Chips in the Sources row — the articles behind what it said.
Why this matters when you write
The Sources row is a claim about provenance, so it is worth trusting. If an answer shows chips, the assistant had those articles' text in front of it when it wrote. If it shows none, the answer came from a listing, from the page the visitor was on, or from general knowledge.
That last case is worth watching for. An answer with no sources on a substantive product question usually means your help center did not cover it — which is exactly what the No article cited filter surfaces in the Conversations tab. See Read what visitors asked your assistant.
For developers
Each source object carries a consulted boolean:
for await (const chunk of kookee.help.chatStream({ messages })) {
if (chunk.type === 'sources') {
const shown = chunk.sources.filter((source) => source.consulted !== false);
}
}
consulted: true— the answer was built on this article.consulted: false— the answer linked it out of a listing.absent — an older server that predates the field. Treat a missing value as
true.
Keep the full sources array for resolving inline citation clicks, and filter it only for display. The built-in widget already does both: onSourceClick fires for a chip and for an inline citation, including citations whose article has no chip.
Available in @kookee/sdk and @kookee/react 1.6.2 and later.