Docs

    Traces

    Topics, agent versions and release comparison

    Group traces by what users asked and find their recurring problems, tell agent configurations apart by fingerprint, and compare two releases.

    Topics group traces by what users asked. Agent versions tell configurations of your agent apart without release tags. Release comparison puts two versions side by side.

    Topics

    Topics have no tab or menu item; open them at …/traces/topics. Extraction needs the trace-optimization plan feature and a Model. Choose the time range, a sample of up to 500 traces (200 by default) and a Model, then click Extract topics.

    The job sends the first user message of each trace to the Model in batches. Labels are normalized and merged onto existing topics, so each trace belongs to exactly one topic, and re-extraction reassigns it. The job reports traces scanned, labeled and skipped for no content or a failed fetch, and topics touched.

    The table lists each topic with its traces, error rate, average latency, trend, pattern count and last seen, busiest first. The trend compares the later half of the last seven days with the earlier half. Error rate and latency show a dash, never zero, when there is nothing to divide.

    Click a topic, then Find patterns. It digests up to 20 of the topic's traces, errors first and then the slowest, and asks the Model for up to 8 recurring problems. Each has a title, what happened, why, evidence trace ids from that sample, and Copy fix prompt for a coding agent. Patterns are stored on the topic with the time they were generated.

    • The trace list has no topic: filter. The traces of a topic are listed in its drawer.
    • Extraction runs only when you start it. There is no cost estimate before a run, and no alert when a pattern grows.
    • Topics carry counts, error rate and latency only. Tokens and cost per topic are not aggregated.

    Agent versions

    At ingest, every llm_call span gets an agent version, a SHA-256 cut to 16 hex characters. It hashes the system prompt (whitespace collapsed), the sorted tool names, the model, and the temperature and top-p values. The same configuration always gives the same id, and a changed prompt, tool set, model or sampling value gives a new one.

    No tagging is needed. When your SDK also sets app_version, the two are shown side by side. A call with neither a model nor a system prompt gets no version.

    The trace service takes the prompt and tools from the first place that has them. First come dedicated attributes: gen_ai.request.system, gen_ai.system_instructions and their variants for the prompt, and gen_ai.request.tools, gen_ai.tool.definitions or llm.tools for the tools. Next is the system block of the recorded prompt, then the request body (gen_ai.request.body) in the OpenAI chat, OpenAI Responses, Anthropic, Bedrock Converse and Gemini shapes.

    From Python 0.3.1 and TypeScript 0.3.2, the SDKs record the tool names as gen_ai.request.tools, and the sampling parameters. Python does this for OpenAI chat, OpenAI Responses and Anthropic. TypeScript covers OpenAI and compatible clients, Anthropic, Bedrock, the Google clients, Cohere, Ollama and LangChain.

    Traces → Agents → All versions lists up to 200 versions seen in the range, most recently seen first, with the agent that ran each. Columns show the model, tool names, a system prompt preview, traces, calls, error rate, and first and last seen. Error rate is the share of model calls that ended in ERROR.

    On an agent page, the same table lists the versions of the model calls in that agent's traces, sub-agent calls included. agentVersion filters the trace list, its facets and export, and the timeseries and analytics rollups.

    A version's drawer has Filter traces by this version and Pin as monitor baseline, which opens a new monitor broken down by agent version; see Monitors. A per-version pass rate needs the scores, which are stored apart from traces, so the list does not serve it.

    Compare two releases

    Compare releases, in the Home header or at …/traces/compare, puts two values of one dimension side by side over one time range. The dimension is app version (service.version or app.version), Environment or agent version; app version is the default.

    The values offered are those seen in the range, busiest first, with their trace counts. Until you pick, the busiest is side B, the release most likely live now.

    Each side shows spans, error rate, LLM p50 and p95, model calls and tokens, with a chart of spans, error spans and p95 per bucket. The charts share one crosshair, and dragging on either zooms both. A table gives each figure for A and B and the change from A to B, red for regressions and green for improvements.

    Open traces for A and Open traces for B open the trace list filtered to that value, with the range kept. Cost is not compared, since the cost rollup has no version filter. Nor is pass rate, since scores cannot yet be queried next to traces. The dimension and both sides live in the URL, so a comparison is a link.

    EvalKit is built by SyntropyLabs. Published on PyPI and npm.