Skip to content

Answers You Can Check: Citations, Steps and Attachments in DocsGPT 1.0

How DocsGPT 1.0 makes an answer quick to check: a citation reader that opens the passage, labelled agent steps, whole long attachments and test retrieval.

Pavel Torbin8 min readknowledgeagents

A chat panel on the left: the question Who approves net 60 payment terms?, sent with an attached supplier-terms.pdf, then three labelled steps (Searched knowledge base, Searched files for net 60, Read F1 pages 4 to 5) and an answer with numbered citations. A dashed line runs from citation 1 to an accent citation reader card on the right, which shows the passage from MFG Delegation of Authority Matrix v3.2.docx with its knowledge source, file, date added and length, and an Open in Knowledge button. Illustrative sample content.

Most RAG products put small numbers after their sentences. Click one and you usually get a file name, or the first page of a long PDF, and you're back to searching, this time to check the assistant. A citation that costs more time than the search it replaced is decoration.

DocsGPT 1.0 rebuilt the parts of the chat that decide whether you can trust an answer without redoing the work: the citation, the record of what the agent did, the files you attach, and the retrieval underneath. The release post gave them one paragraph. Here each gets a section.

A Citation Opens the Passage, Not the File

When an answer has sources, DocsGPT numbers them before the model sees them. The documents sent with the question are 1, 2, 3, and every search the agent runs during the answer continues the same numbering. So when the answer writes [2], the number points at one chunk of one document, and the chat turns it into a pill.

Click it and the citation reader opens beside the chat. It fetches the full passage by the key retrieval tagged it with, rather than the short excerpt saved with the answer, and lists what's known about it: the knowledge source, the file (or the wiki page, or the address of a web page), when it was added and its length in tokens. Open in Knowledge lands on that chunk inside its file, so you can read the paragraph before it and the one after. The Sources row under the question lists every passage the answer received, cited or not, and a file synced through a connector says where it lives: "From Google Drive".

Documents change after answers are written, and the reader says so. If the source was edited or re-indexed since, it tells you the passage is gone and shows the excerpt saved with the answer; if you've lost access, it says that instead. We'd rather show you the gap than quietly show you different text.

Your own prompts get citations too. The built-in prompts and any plain-text prompt get the citation rules automatically, and a template prompt gets them from one line, {{ source.citation_rules }}, which renders nothing when a turn has no sources. Citations in the docs lists which prompt kinds get them.

Formulas are checkable now too. Answers render maths with KaTeX, chemistry included, and dollar amounts stay text, so "$40 per pallet" never turns into an equation.

Why it matters: checking an answer should take one click and a paragraph of reading. Once it takes a search, people stop checking.

app.docsgpt.cloud — Chat › Sources
A chat answer with ten sources; the Sources panel beside it lists each cited document with the start of its passage, and source 7, Pricing guidelines 2026.docx, is marked From Google Drive.
app.docsgpt.cloud — Chat › Sources
A chat answer with ten sources; the Sources panel beside it lists each cited document with the start of its passage, and source 7, Pricing guidelines 2026.docx, is marked From Google Drive.

Every Step Labelled, in the Order It Happened

An agent that searched two sources, read a wiki page and filed a ticket used to hand you its answer under a stack of tool calls. In 1.0 the answer renders in the order it streamed, text, reasoning and tool calls interleaved, so each step sits next to the sentence it led to.

Each step names what it did and to what: "Searched Notion", "Used Linear: create issue", "Read wiki page /sales/pricing.md". Three or more calls in a row fold into one step group showing their tool icons, a count of steps and, in red, how many failed. Open a row and you see the arguments the agent sent and the response it got back.

The labels also tell you when something didn't happen. A call the server refused stays on the message as a failed call with its reason, even after a reload. A call still waiting for your approval when you moved on is marked not run, under its tool and action name rather than a past tense that claims it sent something. Where those Notion and Linear actions come from, and who approves a write, is the subject of the connectors post.

Why it matters: an answer is only as good as the steps behind it, and you can't question a step you never saw.

app.docsgpt.cloud — Chat
app.docsgpt.cloud — Chat

Long Attachments, Read to the Last Page

Attaching a long contract used to fail quietly. DocsGPT stored the start of its text for the prompt and the rest wasn't there, so a question about a clause near the end got an answer from whatever it had.

In 1.0 only what fits goes into the prompt, and the rest stays within reach. The worker keeps the whole extracted text next to the original file, and the model gets a short list of the conversation's files. If it takes tools, it can search across all of them and read a PDF by page, and those steps get labels like any other: "Searched files for "net 60"", "Read F3 (pages 2–4)". A zip unpacks into one attachment per file.

When the files are more than the model can read at once, a line under them says so and offers Add to Knowledge. One click turns them into a knowledge source, indexes it like any upload and selects it for the chat, so the question runs against real retrieval with citations rather than a truncated paste. If a message does overflow the model's context, the error offers the same button, and the retry goes out against the new source instead of failing the same way twice.

A file that fails no longer holds your question hostage. It used to block Send until you found the chip and removed it. Now a failed file is dropped when you send, the rest of the message goes, and hovering the failed chip tells you why, a file type it can't read for example.

Why it matters: the long document is usually the one you most need checked.

app.docsgpt.cloud — Chat › Attachments
The chat composer with six attached files and a question about Halvorsen's Q4 request. One file has failed, and hovering it shows why: Rotterdam yard layout.dwg is not a supported file type. Under the files: These files are larger than the model can read at once. It will read the rest as needed, with Add to Knowledge.
app.docsgpt.cloud — Chat › Attachments
The chat composer with six attached files and a question about Halvorsen's Q4 request. One file has failed, and hovering it shows why: Rotterdam yard layout.dwg is not a supported file type. Under the files: These files are larger than the model can read at once. It will read the rest as needed, with Add to Knowledge.
app.docsgpt.cloud — Chat › Steps
The answer to the same question: two labelled steps, Read F1 and Searched files for net 60 SLA credit, then the answer, drawn from the Halvorsen deal pack (F1): net 60 is a deviation from the standard terms and needs CFO approval.
app.docsgpt.cloud — Chat › Steps
The answer to the same question: two labelled steps, Read F1 and Searched files for net 60 SLA credit, then the answer, drawn from the Halvorsen deal pack (F1): net 60 is a deviation from the standard terms and needs CFO approval.

Test Retrieval Before Anyone Relies on It

In our experience most bad answers are retrieval problems wearing a model's voice: a fluent paragraph written from the wrong chunks, or from the right chunk crowded out by its neighbours.

So 1.0 changes the default first. Chats without an agent, and agents that don't set a count, now retrieve 6 chunks per search instead of 2. The count is a total split across an agent's sources, so the old default gave an agent with two sources one chunk from each, and its answers changed with whichever chunk won. Agents and sources that store a count keep it, and a small local model with a short context can be given fewer per source.

Then you can look at retrieval without asking a chat. Test retrieval, on any source in Knowledge, runs a question through the same pipeline an answer uses and lists the chunks in rank order with their file, score and token count, plus the retriever and how long it took. Try a different retriever, chunk count or score threshold for the test; nothing is saved until you change the source's settings. Scores are labelled for what they are: similarity, distance on FAISS, or RRF for hybrid, which only orders one query's results. Testing retrieval has the details.

Why it matters: you see what a question retrieves before a colleague relies on the answer.

app.docsgpt.cloud — Knowledge › Test retrieval
Test retrieval on a contracts library: the question Who approves net 60 payment terms? returns 6 chunks with hybrid retrieval in 92 ms, each listed with its file, score and token count.
app.docsgpt.cloud — Knowledge › Test retrieval
Test retrieval on a contracts library: the question Who approves net 60 payment terms? returns 6 chunks with hybrid retrieval in 92 ms, each listed with its file, score and token count.

Fix the Chunk, Then Read the Trace

When the test turns up a bad chunk, open it. Every chunk in Knowledge now shows its token count, and anyone who can edit the source can edit, add or delete chunks in place. A sync replaces a synced source's content, so fix those in the document itself.

After the answer, the record is in Logs. Open a chat's entry, choose View trace, and retrieval has its own spans in the waterfall: each retriever with its chunk count and time, with the embedding call and vector search beneath it. Click a search to see the query, the top score and the chunks it returned. The same spans go out over OpenTelemetry, next to the model call that followed them. Execution traces lists the span types.

Why it matters: when an answer is wrong, the trace tells you whether retrieval or the model is to blame, and that tells you what to fix.

app.docsgpt.cloud — Logs › Execution trace
An execution trace for one chat answer: totals for duration, LLM calls, tokens and retrieval time, then a waterfall of steps — hybrid and classic retrieval with their embeddings and searches, and the agent's model call — each with its duration.
app.docsgpt.cloud — Logs › Execution trace
An execution trace for one chat answer: totals for duration, LLM calls, tokens and retrieval time, then a waterfall of steps — hybrid and classic retrieval with their embeddings and searches, and the agent's model call — each with its duration.

Try It on a Document You Know

Pick a source you know well and a question you could answer blindfolded. Run it through Test retrieval, then ask it in chat and click the citation. If the passage that opens isn't the one you'd have picked, you've found the setting to change. Search & Retrieval covers the retrievers and per-source settings, and Deploy compares where DocsGPT can run. Next in this series: roles, quotas and the activity log.

← All posts

See DocsGPT on your documents

A 30-minute demo on your use case, or a free on-premises review with an engineer.