Send a trace, read the verdict
spanview receives your agent's OpenTelemetry traces, reviews every step with an LLM evaluator, and writes a plain-English verdict for each run. You add a few lines of standard OpenTelemetry setup; no spanview package is needed.
Quickstart
- Sign up at app.spanview.dev.
- Create an API key under API keys. It is shown once — copy it.
- Point OpenTelemetry at spanview:
export OTEL_EXPORTER_OTLP_ENDPOINT=https://app.spanview.dev export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer <your API key>" - Install the exporter and your framework's instrumentor:
pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-http # then one of: pip install openinference-instrumentation-langchain # LangChain / LangGraph pip install openinference-instrumentation-openai-agents # OpenAI Agents SDK pip install openinference-instrumentation-claude-agent-sdk # Claude Agent SDK - Add this before your agent runs (LangGraph shown — swap the instrumentor for your framework):
from opentelemetry import trace from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter from openinference.instrumentation.langchain import LangChainInstrumentor provider = TracerProvider(resource=Resource.create({"service.name": "my-agent"})) provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter())) trace.set_tracer_provider(provider) LangChainInstrumentor().instrument() # ... run your agent ... provider.force_flush() # short scripts: flush before the process exitsOpenAI Agents SDK:
from openinference.instrumentation.openai_agents import OpenAIAgentsInstrumentor. Claude Agent SDK:from openinference.instrumentation.claude_agent_sdk import ClaudeAgentSDKInstrumentor.service.namebecomes the run's project in spanview. - Run your agent. The run appears in the app within seconds.
After a run
- Within seconds — the run and every step show up in the app as they arrive.
- When the run goes quiet for 60 seconds, it is queued for evaluation. Spans keep arriving while an agent works, so spanview waits until the trace is complete.
- Within about 5 minutes of that, the verdict appears. Evaluation itself takes seconds to about half a minute, even for runs with hundreds of steps.
- To evaluate a run again, use
POST /api/v1/runs/{id}/evaluate(see HTTP API).
Reading a verdict
Each evaluated run gets a verdict and a note on every step.
| Verdict field | Meaning |
|---|---|
| Severity | none nothing wrong · info minor observations · warn real problems along the way · error the result is wrong, unreliable or missing |
| Headline | One sentence — what happened in this run. |
| Summary | The causal story across steps, with step numbers. |
| Likely causes | Categories, most likely first (list below). |
| Look here first | The steps a debugger should open first. |
Step notes. Open a run and click any step to see its input, output, latency, tokens and the evaluator's note: a severity, a category and one or two sentences of evidence quoted from the step. Wrapper spans (graph nodes, agent turns) are shown but not graded — their child steps are.
Categories the evaluator uses:
tool_call_failed tool_output_swallowed_error tool_output_invalid_json tool_arg_type_mismatch hallucinated_tool_name infinite_loop runaway_recursion silent_retry_storm premature_termination wrong_handoff unverified_claim ungrounded_answer stale_data retrieval_empty retrieval_irrelevant retrieval_duplicate_results context_window_overflow prompt_template_corruption prompt_injection_in_tool_output system_prompt_drift model_refusal output_schema_violation truncated_output latency_outlier cost_outlier token_explosion
Comparing runs
Open a run and use Compare to diff it against another run — a passing run against a failing one, or before and after a prompt change. spanview lines up the steps and highlights what changed: inputs, outputs, tool calls, token counts and the step sequence. Also available as POST /api/v1/compare.
Instrumentation
spanview accepts standard OTLP over HTTP (protobuf or JSON) and reads the three common LLM span conventions:
- OpenInference — LangChain / LangGraph, OpenAI Agents SDK, Claude Agent SDK instrumentors. This is what spanview is tested against end to end.
- OpenTelemetry GenAI semantic conventions.
- OpenLLMetry (Traceloop).
Any other framework works if you can export OTLP traces from it — custom spans still show up; LLM-specific fields are read when they follow one of the conventions above.
HTTP API
Base URL https://app.spanview.dev. Authenticate with your API key, either Authorization: Bearer <key> or X-API-Key: <key>.
| Endpoint | What it does |
|---|---|
POST /v1/traces | OTLP trace ingest (what the exporter calls). |
GET /api/v1/runs | List runs. Filters: project, status, limit (default 50, max 500). |
GET /api/v1/runs/{id} | One run with all its steps. |
GET /api/v1/runs/{id}/diagnosis | The verdict and step notes. |
POST /api/v1/runs/{id}/evaluate | Queue an evaluation (or a re-evaluation). |
POST /api/v1/compare | Compare two runs: {"run_a": "…", "run_b": "…"}. |
GET /api/v1/comparisons/{id} | Fetch a comparison. |
curl -s https://app.spanview.dev/api/v1/runs/<run id>/diagnosis \
-H "Authorization: Bearer $SPANVIEW_API_KEY"
Data & privacy
- Your traces stay in your account. Every run, step and verdict belongs to your organization; other accounts can't see or query them.
- Secrets are redacted on arrival, before anything is stored: values that look like API keys or tokens (OpenAI, Anthropic, Google, GitHub, AWS keys, bearer tokens, JWTs), and the whole value of any attribute whose name contains
password,secret,token,api_keyorauthorization. - The evaluator runs on Claude Haiku through OpenRouter, routed only to Amazon Bedrock or Google Cloud Vertex AI, with zero data retention enforced: the model provider does not store your prompts or outputs, and nothing is used for training. OpenRouter's prompt logging is off.
- Only what the evaluator needs is sent to it: each step's input, output and metadata, with repeated conversation history removed.
Limits
- 10 MB per request. OTLP exporters send traces in small batches, so this only affects unusually large single spans.
- Leave OTLP compression off (the default). gzip-compressed exports aren't accepted yet.
Support
Email team@spanview.dev.
Coming soon
- CLI — list runs, show a verdict, compare runs from the terminal.
- MCP server — let Claude Code, Claude Desktop or any MCP client read your runs and verdicts.
- Self-hosting — run spanview on your own infrastructure.