Sightline 3.0 · Replay is here

Know exactly why your agent did that.

Sightline traces every step your AI agents take in production: each model call, tool call and retrieval. Then it scores the output, so you find the regression before a customer does.

Start tracing free
$ pip install sightline
app.sightline.dev / acme-support / traces
Traces / tr_8f3a19c2
Eval failed

refund-agent · “Charged twice for my annual plan”

4.82s11 spans$0.0214
Span
0s1.2s2.4s3.6s4.8s
Dur
Arefund-agent.run
4.82s
Mplan · claude-sonnet-5-5
0.93s
Rkb.search “double charge”
0.29s
Tstripe.list_charges
0.52s
Thttp GET /v1/charges
0.44s
Mdecide · claude-sonnet-5-5
1.12s
Tstripe.create_refund
0.41s
Mrecover · claude-sonnet-5-5
0.66s
Tzendesk.reply
0.33s
Eeval · policy_adherence
0.14s

Teams shipping agents to millions of users trust Sightline

4.1Bspans traced every month
180msp99 ingest, from SDK to searchable
2lines of code to instrument an agent
38%median drop in eval failures after 60 days
Tracing

Every decision, laid out on one timeline

Agents fail in the gaps between steps: a stale retrieval, a tool call with the wrong ID, a retry loop that burns $40. Sightline records all of it as one nested trace you can read like a stack trace.

Nested spans with full payloads

Prompts, completions, tool arguments and responses, captured automatically and redacted for PII before they leave your VPC.

run
plan
retrieve
crm.lookup
draft
self_check
send

Cost per outcome

See spend per resolved ticket, not just per token.

$0.031−22%
ModelsToolsRetrieval

Replay any trace against a new prompt

Pick a production failure, change the prompt or model, and re-run it with the original tool responses mocked in.

prompt v12fail

I’ll refund the second charge now.

prompt v13pass

I’ll check refund status before refunding.

Search that understands agents

Query traces by tool, eval score, cost, user or any attribute you attach.

tool = "stripe.create_refund" AND status = error
AND eval.policy < 0.5 SINCE 7d
errorCharged twice for my annual plan4.8s
errorRefund didn’t come through after cancel6.1s
Evals

Ship prompt changes with evidence

Score every production trace with LLM judges, code checks or human review. Then compare versions side by side before a change reaches 100% of traffic.

refund-agent · prompt v12 → v13

2,400 replayed traces
Ready to promote
EvaluatorTypev12v13ChangeScore distribution (v13)
Policy adherenceLLM judge0.720.91+0.19
GroundednessLLM judge0.860.89+0.03
Refund amount correctCode check96.1%99.4%+3.3%
ToneLLM judge0.930.92−0.01
p95 latencyMetric6.4s5.1s−1.3s

Judges you can trust

Calibrate every LLM judge against 50 human labels. Sightline shows you its agreement rate before you rely on it.

Datasets from real traffic

One click turns a failing trace into a regression test. Your eval set grows with every incident.

Gates in CI

Block a merge when a score drops. sightline eval --gate runs in GitHub Actions in about 90 seconds.

Guardrails

Stop the bad step before it runs

Guardrails run inline, in under 20ms. They can block a tool call, rewrite a response or hand the conversation to a human. Every intervention is logged on the trace.

  • Spend limits per tool, per user and per hour
  • PII and secret detection on inputs and outputs
  • Loop detection that stops a run after repeated identical calls
  • Custom rules written in Python or TypeScript

Blocked refund over limit

refund-agent tried to refund $2,340. The per-call limit is $500. Handed to a human.

Loop stopped after 6 retries

triage-router called crm.lookup with the same arguments 6 times in 9s.

Redacted card number

A user pasted a card number. It was masked before reaching the model.

Rewrite: removed legal promise

kb-answerer said “guaranteed”. Rewritten to match support policy §4.2.

Developers

Two lines to instrument. No lock-in.

Built on OpenTelemetry, so your traces stay portable. Works with every major model provider and agent framework, including the one you wrote yourself.

import sightline
# auto-instruments model and tool calls
sightline.init(project="acme-support")

@sightline.agent(name="refund-agent")
def handle(ticket):
    plan = llm.create(model="claude-sonnet-5-5", ...)
    charges = stripe.Charge.list(customer=ticket.customer)
    return resolve(plan, charges)

sightline.evaluate("policy_adherence", sample=0.2)
AnAnthropicMessages, tool use, batches
OaOpenAIResponses, Assistants
LgLangGraphNodes as spans
VcVercel AI SDKStreaming aware
OtOpenTelemetryOTLP in and out

We went from “the agent is acting weird” to the exact span and the exact prompt line in under a minute. Sightline is the first tool our support engineers open every morning.

Priya RamanHead of AI Platform, Northpeak
Read the story

See what your agents actually do

Free for 50,000 spans a month. No credit card.