Content capture records the full text of prompts and completions as span attributes. This is useful for debugging, evaluation, and quality monitoring — you can review what was sent to a model, compare outputs across variants, and build evaluation datasets from production traffic.
Content capture is enabled by default: prompt and completion text is recorded verbatim on your GenAI spans.
View captured content
Captured prompt and completion text appears on your spans in the to11 dashboard — open your project’s Traces view, pick a trace, select a GenAI span, and read the input messages, output messages, and system instructions inline. There is no database to query — the content is rendered with the rest of the span.
Turning content capture off
Content capture is a gateway-level setting managed by to11. There is no per-request header or dashboard toggle to turn it off for an individual request or project — whether prompt and completion content is recorded is configured on the gateway, which to11 operates.
Content capture is on by default, so the full prompt and completion text — including any sensitive data such as PII, API keys, or confidential instructions — is recorded verbatim on your spans. If your data-handling requirements mean this content must not be stored, contact to11 — it cannot be turned off from your application.
What’s captured
When content capture is active, the following attributes are added to each GenAI span:
| Attribute | Description |
|---|
gen_ai.input.messages | Serialized prompt messages from the request |
gen_ai.output.messages | Serialized completion choices or accumulated stream content |
gen_ai.system_instructions | System/developer prompt text, captured separately for easy filtering |
The gen_ai.system_instructions attribute is recorded as a standalone string rather than embedded within gen_ai.input.messages. This separation lets you filter on the system prompt independently — for example, to see which system prompts are in use across your traffic without parsing the full message array.
Media endpoint content capture
Content capture behavior varies by endpoint because some endpoints handle binary data that cannot be meaningfully recorded as span attributes.
| Endpoint | Input captured | Output captured |
|---|
| Chat completions | Full messages array | Full choices array (or streamed content) |
| Embeddings | Input text | — (vector data not captured) |
| Image generation | prompt field | revised_prompt from DALL-E 3 |
| Audio speech (TTS) | input text | — (binary audio) |
| Audio transcription | — (binary audio) | Transcription text field |
For chat completions, both streaming and non-streaming responses are captured. Streaming responses are accumulated from individual deltas into the final content before recording. Embeddings capture only the input text; the output vector data is omitted because it is not human-readable and would be prohibitively large.
Size limits
Streaming responses are accumulated in memory before being recorded as span attributes. To prevent unbounded memory growth, the gateway enforces size limits on accumulated content.
| Path | Limit |
|---|
| Streaming accumulated content | 64 KB (MAX_ACCUMULATED_CONTENT_BYTES) |
| Streaming tool call arguments | 64 KB per tool (MAX_TOOL_CALL_ARGUMENT_BYTES) |
| Non-streaming response | Full response body captured (no limit) |
When the streaming accumulation limit is reached, content is truncated. The span still records token counts, finish reasons, and all other attributes normally. Only the content capture attributes are affected by this limit.
Tool call content
When content capture is enabled, tool call child spans include additional attributes that record the function invocation details:
gen_ai.tool.call.arguments — the function arguments as JSON
gen_ai.input.messages — an object with the function name and arguments, so the tool call’s input is populated on the span
On the parent span, gen_ai.tool.definitions contains the JSON schema of all declared tools sent in the request. This attribute appears on the parent rather than on individual tool call child spans, since the tool definitions apply to the entire request.
For requests that produce multiple tool calls, each child span carries its own gen_ai.tool.call.arguments value. The parent span’s gen_ai.tool.definitions is recorded once regardless of how many tool calls appear in the response.
See Span Attributes for the complete attribute reference, including all content capture attributes and their types. To read captured content, open your project’s Traces view in the dashboard.