Bring your own telemetry. Zero code rewrites.
No proprietary SDK wrappers or runtime monkey-patching. Built-in adapters ingest raw JSON traces from LangGraph, CrewAI, OpenAI Agents, OpenTelemetry, Langfuse, and LangSmith in under 2ms.
Zero ingestion friction. 100% deterministic parity.
AgentDiff eliminates telemetry lock-in. Regardless of how your agents execute or which framework you swap to next quarter, your CI quality gates remain rock-solid.
Keep Your Existing Telemetry Stack
No proprietary SDK wrappers, monkey-patching, or invasive decorators. Feed your existing raw telemetry dumps directly into CI without changing a single line of agent code.
Automatic Format Sniffing
AgentDiff inspects incoming JSON structures, identifies unique telemetry fingerprint keys, and auto-selects the appropriate parser with sub-2ms execution latency.
Mathematical Metric Parity
Every trace resolves into the exact same canonical DAG contract. Trajectory Divergence (TDI), Wasted Effort, Loop Detection, and Recovery Ratios calculate with 100% mathematical parity.
Battle-tested on production trace formats.
Each built-in adapter is continuously verified with regression test suites against live framework dumps, ensuring schema fidelity across new framework releases.
LangGraph
Ingests native LangGraph checkpoint state dumps and node graphs. Automatically maps branch checkpoints and tool node executions into a linear causal DAG.
agentdiff baseline.json cand.json --adapter langgraphfrom agentdiff import load_trace
trace = load_trace("checkpoint.json", adapter="langgraph")Build a custom adapter in ~50 lines of Python.
Running an in-house agent framework or proprietary telemetry pipeline? AgentDiff's modular plugin architecture lets you normalize custom execution schemas into canonical DAGs with a single Python class.
Subclass BaseAdapter
Implement the mandatory from_dict() classmethod to map proprietary telemetry keys into standardized TraceStep nodes.
Declare Format Sniffer
Add an optional detect(data) -> bool fingerprint to let the CLI and SDK automatically resolve your format without explicit flags.
Zero-Fork Registration
Register your package under the agentdiff.adapters entry-point. Discovered lazily by CLI runners with no core fork required.
Clean separation between raw traces and graph comparison.
The comparison engine never needs to know whether an event originated from an HTTP span, JSON log, or database dump. Your adapter handles schema normalization once, and all 5 regression metrics run automatically.
from agentdiff.adapters.base import BaseAdapter
from agentdiff.models.trace import AgentTrace, TraceStep
class AcmeAgentAdapter(BaseAdapter):
"""Normalizes Acme internal agent execution telemetry into canonical DAGs."""
@classmethod
def detect(cls, data: dict) -> bool:
"""Auto-sniffs Acme JSON dumps by signature keys."""
return "acme_run_id" in data and "execution_spans" in data
@classmethod
def from_dict(cls, data: dict) -> AgentTrace:
"""Transforms arbitrary internal spans into immutable TraceSteps."""
steps = []
for idx, span in enumerate(data.get("execution_spans", [])):
steps.append(
TraceStep(
step_id=span["span_id"],
parent_id=span.get("parent_span_id"),
step_index=idx,
step_type=span.get("type", "tool"),
name=span["operation_name"],
input_payload=span.get("inputs", {}),
output_payload=span.get("outputs", {}),
latency_ms=span.get("duration_ms", 0.0),
)
)
return AgentTrace(steps=steps)Ready to diff your telemetry with zero rewrites?
Pass existing LangGraph, CrewAI, OpenAI, or OTel traces directly into CI. Block regressions before merge.