Skip to main content
Zespan’s trace checks read what your SDK recorded: the final answer, the conversation, the system instructions, the tool definitions, and what each tool was asked and returned. A check never guesses. When an input is missing, the check reports that it could not run and names the input, instead of passing. This page lists each input, the switch that controls it, its size limit, and which integrations send it. It does not say how well your agent works: a trace where every check could run can still have problems, and one where few could run is a gap in what was recorded, not a verdict on the agent.

Capture v2

Capture v2 is off by default. It records fields that earlier SDK versions dropped or recorded in a form the checks could not read. It changes nothing until you turn it on, and with it off every event is exactly what it was.
Or set ZESPAN_CAPTURE_V2=1. ZESPAN_CAPTURE_V2=0 (or false, off) always turns it off, whatever the option says.
Two sub-options only matter when v2 is on, and both default to on: capture_tool_definitions / captureToolDefinitions and capture_agent_io / captureAgentIO. Capture v2 does not change what you are allowed to store. Prompt storage (store_prompts / storePrompts) and tool input and output storage (store_tool_io / storeToolIO), and the matching project settings, still decide what is kept, and redaction stays always on. Every new field goes through the same redaction as stored prompts. See PII redaction.

What is recorded

Image input metadata

A provider that rejects a call for an invalid image usually says only “invalid image”. With capture_image_meta / captureImageMeta (or ZESPAN_CAPTURE_IMAGE_META=1; =0 always turns it off) on top of capture v2, the SDK records metadata only for each image part of a model request, on the model call, including a call that failed. It never records the image bytes, a full URL, a query string or a file name, and it is off by default. At most 8 images are described per call (the count of all is kept). When the data for a call is too large it is dropped as a whole and marked, never partly kept. With prompt storage off the host and the hash are left out. It is sent by every wrapper and integration that records model calls (OpenAI, Anthropic, Google GenAI and ADK, Mistral, Groq, Cohere, Bedrock, LiteLLM, LangChain, and in TypeScript Vercel AI and LlamaIndex); also the OpenAI Responses API (responses.create, in both SDKs, streamed or not), Google GenAI chat sessions and streamed calls that the provider rejects before the first chunk, and in Python Haystack and Semantic Kernel. Haystack needs its content tracing on (HAYSTACK_CONTENT_TRACING_ENABLED=true), because that is how the component input reaches Zespan; for Semantic Kernel the images are read from a ChatHistory passed as an argument of a prompt function, not from images written inside the prompt template text. Zespan does not ship a TypeScript Haystack or Semantic Kernel integration.

Markers

Each recorded field comes with a small marker saying how it was captured: present, absent (the agent has no instructions, the last turn was only tool calls), cut, off, or not available from this integration. A marker holds fixed words and numbers, never content, so it is sent even when prompt or tool storage is off. It is what lets a check say absent or not available from this integration instead of not captured.

Why a check could not run

A check that is captured but empty or does not apply is not counted against readiness.

What capture can and cannot unlock

Capture changes what the checks can read. It does not unlock everything:
  • Checks that need a confirmed tool mapping (for example, checks of a customer-data pack) run only after a person confirms which tools do what. Upgrading the SDK does not enable them.
  • The end-user feedback check needs your app to tag traces with feedback.
  • Session checks need a session id on each trace.
  • A trace where the model call failed, or that only holds embedding or image calls, has no answer to check. That is does not apply, not a gap.

Integrations

Not covered yet: Python and TypeScript CrewAI and AutoGen tool results, TypeScript Semantic Kernel, and streamed Google GenAI calls.
wrap_adk_agent (Python) is deprecated and warns once. It patches an agent method that current ADK agents do not have, and it never sent the instructions. Use ZespanADKCallbackHandler.

Readiness

When readiness is enabled for your deployment (self-hosted: CAPTURE_READINESS=on), Zespan can tell you, per trace and per project, which checks could not run and why:
  • GET /v1/projects/{id}/traces/{traceId}/functional/unchecked lists the checks that could not run on one trace and the input each lacked.
  • GET /v1/projects/{id}/functional/readiness?days=7 returns the share of checks that could run over the last 1 to 7 days (readiness, not a quality score), the same share leaving out the inputs only a person can supply, the inputs that cost the most with what to do about each, and the figure per agent. It holds counts and fixed wording only, never content, and answers 404 while readiness is not enabled.

Self-hosted deployments

Some of the server-side reading described on this page (storing the output schema, reading the OpenTelemetry tool definitions above, filling in tool names and error codes from data a span already carries, and reading older tool results stored as Python literals as structure) is off by default on a self-hosted deployment and turned on with server settings. Contact us for the settings that match your version.

Next steps