Skip to main content
By default the chat endpoint returns an answer and nothing else, which makes it hard to check. Pass include_evidence and the response also carries the conclusions and messages the dialectic read while answering, plus the tools it called.

Basic Usage

Without include_evidence, chat returns the answer on its own exactly as before, and the server collects nothing — asking for evidence is the only thing that turns collection on.

What evidence is, and is not

Evidence is collated from what the agent read, not reported by the model. As the dialectic runs its tool loop, every conclusion and message a read path returns is recorded, and the finished list is returned alongside the answer. That has a consequence worth being clear about: evidence over-reports. A conclusion appears because the agent saw it, which is not proof the answer relied on it. A query that prefetches twenty-five conclusions and answers from three will list all twenty-five. The alternative — asking the model which sources it used — reads better but fails quietly. Weaker models and lower reasoning levels produce incomplete citations, invented IDs, or none at all, and you cannot tell a sparse citation list from a sparse answer. Collation is deterministic, costs no model tokens, and behaves identically at every reasoning level. Treat evidence as what was available to the answer, and audit within it. Evidence is built for auditing and analytics — working out why an answer looks the way it does, or measuring what recall actually reaches the agent. It is not a read API, and it is not meant to sit in a hot path. Two further limits:
  • tool_calls records successful invocations. A tool call that errored is retried or worked around by the agent and does not appear, so this is not a complete execution trace.
  • Tool results are omitted. They are large, and what they returned is already in conclusions and messages.

Response shape

Conclusions carry the ID, level, and text of each conclusion read. source_ids names the conclusions a derived one was reasoned from, so you can walk a chain back toward the explicit statements at its base; explicit conclusions have none, since they derive from messages rather than from other conclusions. session_id is null for a conclusion that was reasoned across sessions and so belongs to none. Timestamps are when a conclusion was derived, taken from its source messages where that is recorded. Messages carry identity and provenance only — no content. Fetch a message by its id when you need the text. That asymmetry with conclusions is deliberate. A conclusion’s text is written by the deriver, is short, and is the thing you are auditing, so it comes along. A message’s content is whatever a caller sent, up to the 25,000-character ingest limit, and one answer can touch a few hundred messages — carrying it would let a single response drag megabytes behind it, and would turn evidence into a way to read messages in bulk. Evidence is for auditing and analytics, not a substitute for the message endpoints. reasoning_trace_id is a placeholder for stored reasoning traces and is currently always null.

Empty is not absent

The two are different and worth distinguishing:
  • evidence is absent or null — you did not ask for it.
  • evidence is present with empty lists — you asked, and the agent read nothing. This is the honest answer for a peer with no history yet.
So checking that evidence exists tells you nothing about whether anything was found; check the lists.

Streaming

Evidence can only be known once the answer is complete, so a streaming response sends it on the stream’s final event. The SDKs surface it on the stream object after it has been fully consumed:
Reading evidence mid-stream returns null.

Workspace chat

Workspace-level chat takes the same option:
Because workspace chat opens with a statistical overview of the workspace rather than a conclusion prefetch, its evidence is usually weighted toward messages and whatever its tools went on to find.

Scoped queries

Evidence never widens what a query could see. It reports only rows a permitted read actually returned, so a query confined by scope or a session allowlist yields evidence confined the same way — a scope with no member sessions recalls nothing and cites nothing.

Combining with structured outputs

include_evidence and response_format are independent. With both, the answer is parsed to your schema and the evidence sits beside it: