include_evidence and the response also carries the conclusions and messages the dialectic read while answering, plus the tools it called.
Basic Usage
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_callsrecords 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
conclusionsandmessages.
Response shape
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:evidenceis absent or null — you did not ask for it.evidenceis present with empty lists — you asked, and the agent read nothing. This is the honest answer for a peer with no history yet.
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:evidence mid-stream returns null.
Workspace chat
Workspace-level chat takes the same option:Scoped queries
Evidence never widens what a query could see. It reports only rows a permitted read actually returned, so a query confined byscope 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: