Skip to main content
If your agent already exports traces to Langfuse, Arize Phoenix, or LangSmith, Coval can pull those traces into the trace viewer, run trace-based metrics (timings, LLM judges, custom metrics), and populate the transition heatmap — without re-instrumenting your agent. Connect your account once in Settings → Integrations, and Coval handles the rest after each simulation.

How it works

The flow is the same for every provider:
  1. Your agent sends traces to your platform as it does today.
  2. When a Coval simulation finishes, Coval fetches the traces that fall inside the simulation’s time window.
  3. They’re normalized to OpenTelemetry spans and written to the same ClickHouse-backed trace store that native OTLP ingestion uses.
  4. The trace viewer, trace metrics, and transition heatmap work against the imported spans exactly as they do for native OTLP traces.
Imported spans are tagged with service.name set to the source (langfuse, arize, or langsmith) so they’re easy to distinguish in the viewer. If a simulation already has native OTLP traces, the import is skipped to avoid duplicate spans.
Correlation keeps imports precise. Set simulation_output_id (or session_id / coval_simulation_output_id) in your trace metadata so Coval matches traces to the right simulation — essential when your agent handles concurrent calls. Each provider’s exact keys and code are in its tab below.

Connect your platform

Prerequisites
  • A Langfuse project with at least one completed trace
  • Langfuse Public Key and Secret Key from your project settings
Connect
  1. Open Settings → Integrations in Coval and expand the Langfuse Integration panel.
  2. Paste your Public Key and Secret Key.
  3. Set Host if you self-host Langfuse; leave the default https://us.cloud.langfuse.com for Langfuse Cloud.
  4. Save.
CorrelationCoval matches Langfuse trace metadata on simulation_output_id, session_id, or coval_simulation_output_id. If none is set, Coval falls back to the simulation’s time window and imports every trace in it — set a key to stay precise under concurrent calls.
from langfuse import Langfuse

langfuse = Langfuse()

with langfuse.start_as_current_span(
    name="turn",
    metadata={"simulation_output_id": simulation_output_id},
) as span:
    ...
VerifyAfter a simulation finishes, open the result and click View Traces. Imported spans appear with service.name = langfuse and the original Langfuse attributes preserved under langfuse.*. OTel GenAI attributes (gen_ai.request.model, gen_ai.usage.*) are emitted for LLM generations so trace metrics work out of the box.Limits
  • Import runs once per simulation, synchronously, within a 30-second budget.
  • Up to 500 traces per simulation window (100/page × 5 pages).
Troubleshooting
SymptomLikely cause
No spans, correct time windowCheck the Langfuse Integration card in Settings; re-save if the Configured chip is missing.
Spans don’t match the simulationSet metadata.simulation_output_id on your traces.
401 UnauthorizedKeys were rotated. Click Replace key in Settings.

See also