Version markers, time to first token, prompts on the timeline, and alerts that come with the first pass done

Six additions in one release: version labels that mark deploys on the Spend and Verify charts, time to first token on Pulse, chat sessions stitched into one run over OpenTelemetry, a sortable fleet view, prompts and completions on the run timeline, and an investigation paragraph on every alert.

Most of what goes wrong with an agent in production is explained by a deploy. A prompt changed, a model was swapped, a tool was rewritten, and the cost line or the pass rate moved a few hours later. This release is about closing the distance between the chart that moved and the change that moved it. Six additions, all live for every plan unless noted, with the SDK releases that feed them.

Version markers on the Spend and Verify charts

Every run can now carry a version: the build, prompt or release that produced it. Set AGENTPING_VERSION once in the environment, or pass it to init(), and every run from that process is labelled. A single run can override it, which is how you A/B a prompt without a separate agent.

agentping.init(version="2026.10.28")

with agentping.run("support-triage", version="prompt-v7") as r:
    ...

The Spend chart and the Verify pass-rate chart draw a vertical marker where each new version was first seen, labelled with the version and the agent. When cost per run doubles, the marker two buckets earlier is usually the answer, and you no longer have to go and find the deploy log to confirm it. The run page shows the version, the read API returns it, and over OpenTelemetry it is read from agentping.version on the span or service.version on the resource.

Time to first token on Pulse

Users judge a streamed answer by how quickly it starts, not by how long it takes to finish. Streamed calls now report ttft_ms, the time from the request to the first chunk of model output, and Pulse charts its p95 per agent next to run duration.

The SDKs measure it on streamed Anthropic, OpenAI, Gemini, Mistral, Cohere and Bedrock Converse calls, and the LangChain and Vercel AI integrations report it too. Housekeeping events such as Anthropic's message_start do not count; the clock stops on the first chunk that carries text or a tool call. Over OpenTelemetry it is read from gen_ai.server.time_to_first_token, the Vercel AI SDK's ai.response.msToFirstChunk or agentping.ttft_ms. One honest gap: the Laravel SDK cannot measure it, because laravel/ai stream events carry whole-second timestamps.

Chat sessions as one run over OpenTelemetry

A trace per message is the wrong unit for a chat agent. The cost of the conversation is spread over twenty runs, the evaluation only ever sees one turn, and a session that ends in a refund looks like twenty successes.

Traces that carry gen_ai.conversation.id are now stitched onto one run per team and conversation. Turns are numbered as they arrive, the run stays open while the conversation is alive, and it closes as a success after 30 quiet minutes. Hand the session from one agent to another and it stays one run, because the key is the team and the conversation, not the agent. The SDKs have had conversation() for the same thing without OpenTelemetry; the conversations guide covers both routes, and the OpenTelemetry page has the attribute names.

A fleet view on the Agents page

The Agents page used to be a list. It is now a table you can sort: last run, runs and failure rate over 24 hours, p95 duration over 24 hours, tokens over 24 hours, customers hit by failures, and spend. Sort by failure rate and the agent that needs attention is at the top; sort by customers hit and you know who to write to first. The status buckets (healthy, degraded, failing, silent) stay as the default order.

Prompts and completions on the run timeline

Until now the timeline told you a model call happened, what it cost and how long it took. It could not tell you what was said, which is the first thing you want when an evaluation fails.

Prompt capture is off by default and stays off until you turn it on:

agentping.init(capture_llm_content=True, llm_content_max_chars=4000)
agentping.init({ captureLlmContent: true, llmContentMaxChars: 4000 });

With it on, each llm_call carries input (the messages as {role, content}), system_instructions and output, each clipped at the cap, and the run page renders them as a conversation with the roles labelled. Every provider the SDKs instrument is covered, and the framework integrations send what their callbacks expose. Images, tool calls and tool results appear as short markers such as [tool_use lookup_order] rather than their payloads. Over OpenTelemetry the standard gen_ai.input.messages and gen_ai.output.messages attributes are read when your exporter records them. The field reference is in the events docs.

Alerts that arrive with the first pass done

An alert says something tripped. The investigation that follows is the same every time: open the agent, compare today with yesterday, find which customers were hit, read the error messages, check what deployed. Agent Ping now does that first pass and sends it with the alert.

Spend anomalies, missed schedules, failing rubrics and incidents opening from an alert rule arrive with one paragraph headed Investigation, at most four sentences, written by Claude from the agent's own runs:

Investigation: Failures rose from 0% to 75% over the last 24 hours while cost went from $2.00 to $11.00, with p95 duration up from 0.5s to 9.5s. Two customers were hit, acme (2 failed runs) and globex (1). Every failed run carries the error "RateLimitError: tool quota exceeded" and all of them ran version v2, which first appeared three hours ago; v1 runs did not fail.

The version label from the first section is what makes the last sentence possible. Webhooks get the same text in an additive investigation field, so existing integrations keep working. One summary is produced per alert and shared across every channel it goes to, and an alert is never held up by it: if the model call is slow or fails, the alert goes out as before without the paragraph. Investigations are on Team and Business plans. Details in the investigations docs.

The SDK releases

All of the above needs data the SDKs did not send before, so there is a release for each: Python and TypeScript 0.3.0, and new Go and Laravel versions. Each adds the version label, ttft_ms on streams and the capture switch; the changelog has the per-SDK notes, and each provider page under the docs says exactly what is captured for that provider.

If you are not on Agent Ping yet, the free plan covers two agents, and the five-minute try page will get a real run, with its version label, into your account.

How do I label runs with a version in Agent Ping?
Set AGENTPING_VERSION in the environment, or pass version to init() in the Python, TypeScript, Go or Laravel SDK, and every run from that process carries it. A single run can override it. Over OpenTelemetry, set agentping.version on the span or service.version on the resource. The Spend and Verify charts then draw a marker where each new version was first seen, and alert investigations name a version that appeared just before a failure.
What is time to first token and how does Agent Ping measure it?
Time to first token is the delay between sending a streamed request and receiving the first chunk of model output. The SDKs measure it on streamed Anthropic, OpenAI, Gemini, Mistral, Cohere and Bedrock Converse calls, and the LangChain and Vercel AI integrations report it too. Over OpenTelemetry it is read from gen_ai.server.time_to_first_token or the Vercel AI SDK attribute. Pulse charts the p95 per agent next to run duration.
Does Agent Ping store my prompts and completions?
Only if you turn it on. Prompt capture is off by default in every SDK. With capture_llm_content or captureLlmContent enabled, each llm_call carries the messages, the system prompt and the response text, clipped at 4000 characters per piece unless you change the cap, and the run timeline renders them as a conversation. Over OpenTelemetry the standard gen_ai input and output attributes are read when your exporter records them.
What is an investigation summary on an alert?
A paragraph of at most four sentences that arrives with a spend anomaly, missed schedule, failing rubric or incident alert. It is written by Claude from the agent's own runs over the previous 24 hours and the day before: what changed, which customers were hit, the error message the failing runs share, and whether a newly seen version lines up with the change. It is included on Team and Business plans, one model call per alert regardless of how many channels the alert goes to.
How does Agent Ping turn a chat session into one run over OpenTelemetry?
Traces that carry gen_ai.conversation.id are stitched onto one run per team and conversation instead of becoming a run per message. The run stays open while turns arrive and closes as a success after 30 quiet minutes. Each turn is numbered, and the SDKs offer conversation() for the same thing without OpenTelemetry.