Already tracing with Langfuse, Arize Phoenix, or LangSmith? Connect it once and Coval imports traces automatically — no re-instrumentation.
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.
Your agent sends traces to your platform as it does today.
When a Coval simulation finishes, Coval looks up the traces that carry that simulation’s ID, around the time the simulation ran.
They’re normalized to OpenTelemetry spans and written to the same trace store that native OTLP ingestion uses.
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.For an uploaded conversation, include occurred_at when you submit it so Coval looks for traces around the time of the call. Without it, Coval looks only around the time it processed the conversation, and misses the traces of a call submitted well after it happened. Set occurred_at to the instant the audio recording starts. The trace viewer also uses it to line the audio up with the spans.
Correlation is required. Coval imports only traces that carry the simulation’s ID, for example as simulation_output_id (or session_id / coval_simulation_output_id) in your trace metadata. If none does, nothing is imported: Coval never falls back to every trace in the time window, so traces from concurrent calls aren’t mixed up. Each provider’s exact keys and code are in its tab below.
A Langfuse project with at least one completed trace
Langfuse Public Key and Secret Key from your project settings
Connect
Open Settings → Integrations in Coval and expand the Langfuse Integration panel.
Paste your Public Key and Secret Key.
Set Host if you self-host Langfuse; leave the default https://us.cloud.langfuse.com for Langfuse Cloud.
Save.
CorrelationCoval finds your traces by the simulation’s ID. Put it in either of these places:
Langfuse’s own session ID (sessionId).
Trace or observation metadata, under simulation_output_id, session_id, or coval_simulation_output_id.
Coval imports only traces that match. If no trace carries the simulation’s ID, nothing is imported: Coval does not fall back to importing every trace in the time window, because that would attach other callers’ traces to the wrong simulation.
from langfuse import Langfuse, propagate_attributeslangfuse = Langfuse()with langfuse.start_as_current_observation(name="turn"): # Every observation inside this block carries the simulation ID. with propagate_attributes( session_id=simulation_output_id, metadata={"simulation_output_id": simulation_output_id}, ): ...
Setting the ID with metadata= on a single span also works; Coval matches it on that observation and imports the whole trace it belongs to.On self-hosted Langfuse v3, only trace metadata is matched: Coval reads it through an older API (see Limits), so the session ID and observation metadata aren’t used there.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
Each fetch attempt has a 30-second budget.
If no trace is found, Coval tries again about 15 seconds and then 30 seconds later, without holding up other work. A conversation you upload more than a day after the call gets a single attempt.
If Langfuse rate-limits a request (HTTP 429), Coval waits about as long as Langfuse’s Retry-After header asks (30 seconds if it doesn’t say; a request for more than 5 minutes is treated as 5 minutes) and tries again.
Each simulation gets at most three attempts in total. Its metrics run after the last one, whether or not a trace was found.
Langfuse Cloud and self-hosted Langfuse v4 are read through Langfuse’s v2 observations API. Coval finds the traces that carry the simulation’s ID, then reads all of their observations, following every page Langfuse returns. It imports them completely or not at all: if they can’t all be read within the attempt’s budget, nothing is imported for that simulation, so a partial trace is never stored.
Self-hosted Langfuse v3 doesn’t have the v2 API, so Coval reads the older traces API there. It reads up to 500 traces in the simulation’s time window (100/page × 5 pages), keeps those whose trace metadata carries the simulation’s ID, and reads up to 500 observations per trace. Traces and observations past those limits aren’t imported.
Langfuse can take up to 15 minutes to make data available on its v2 API when it comes from an older SDK (langfuse-python before 4.7.0 or langfuse-js before 5.4.0) or from an OpenTelemetry exporter that doesn’t send the x-langfuse-ingestion-version: 4 header. Coval’s retries cover about a minute, so those traces can be missed. Upgrade the SDK or set the header on your exporter.
Troubleshooting
Symptom
Likely cause
No spans, correct time window
Check the Langfuse Integration card in Settings; re-save if the Configured chip is missing.
Traces are in Langfuse but not in Coval
Set the simulation’s ID as the Langfuse session ID or as simulation_output_id metadata (trace metadata on self-hosted Langfuse v3). Without it, Coval imports nothing. Also check your SDK version (see the warning above).
Only some of the simulation’s traces appear
Set simulation_output_id (or the session ID) on every trace for that simulation. Coval imports only the traces that carry it.
401 Unauthorized
Keys were rotated. Click Replace key in Settings.
Rate limit errors (HTTP 429)
Langfuse Cloud limits API requests per organization. Coval backs off and retries on its own. If a simulation still ends without traces, contact Coval support to re-import it.
Arize AX cloud support is on the roadmap. AX’s /v2/spans endpoint indexes 15–30 minutes after OTLP ingest, which doesn’t fit Coval’s per-simulation import window. For now, Coval imports from Phoenix, which exposes spans the moment they land.
Prerequisites
A self-hosted Phoenix deployment reachable from Coval’s workers, or a Phoenix Cloud account, with a project name you write spans to
Connect
Open Settings → Integrations in Coval and expand the Arize Integration panel.
Fill in the fields and save.
Field
Required
Notes
Phoenix Host
Yes
e.g. https://app.phoenix.arize.com for Cloud, or your self-hosted base URL.
Project Name
Yes
The Phoenix project your agent writes to.
API Key
Optional
Required for Phoenix Cloud, ignored for unauthenticated self-hosted Phoenix.
CorrelationCoval matches span attributes on simulation_output_id, session_id, session.id, or coval_simulation_output_id (and the same keys inside a JSON metadata attribute). It imports only the spans that carry one of them, not the rest of their trace, so set it on every span you want imported.
from opentelemetry import trace as otel_tracetracer = otel_trace.get_tracer("my-agent")with tracer.start_as_current_span("conversation") as span: span.set_attribute("simulation_output_id", simulation_output_id) ...
For OpenInference instrumentation: span.set_attribute(SpanAttributes.SESSION_ID, simulation_output_id), or wrap the call in using_session(session_id=simulation_output_id) from openinference.instrumentation so the spans OpenInference creates inside it carry session.id.Coval fails closed when a correlation hint is set but no spans match — it returns an empty result rather than importing everything in the window, avoiding cross-contamination between concurrent simulations.VerifyOpen the result and click View Traces. Imported spans appear with service.name = arize. LLM spans are normalized to span_name = "llm", and common token-count attributes are aliased to OTel GenAI conventions:
Arize / OpenInference
OTel GenAI alias
llm.token_count.prompt
gen_ai.usage.input_tokens
llm.token_count.completion
gen_ai.usage.output_tokens
input.value
input
output.value
output
Limits
Each fetch attempt has a 30-second budget. If no spans are found, Coval tries again about 15 and then 30 seconds later without holding up other work (a conversation uploaded more than a day after the call gets a single attempt); if the platform rate-limits a request (HTTP 429), Coval waits about as long as its Retry-After header asks (30 seconds if it doesn’t say; a request for more than 5 minutes is treated as 5 minutes) and retries, up to three attempts in total.
Coval reads up to 5,000 spans from the project in the simulation’s time window (1,000/page × 5 pages) and keeps the ones that match. On a busy project, spans past that limit aren’t imported.
Self-hosted Phoenix must be reachable from Coval’s workers — expose it via a public ingress if it’s on a private network.
Troubleshooting
Symptom
Likely cause
No spans, correct time window
Check the Arize Integration card; confirm Project Name matches what your agent writes to.
Spans in Phoenix but not Coval
Set simulation_output_id (or session_id / session.id) on every span you want imported.
401 Unauthorized
API key rotated. Click Replace key.
Connection refused (self-hosted)
Phoenix isn’t publicly reachable from Coval’s workers.
Prerequisites
A LangSmith account with a project your agent writes runs to
A LangSmith API key (Settings → API Keys, lsv2_pt_...)
Connect
Open Settings → Integrations in Coval and expand the LangSmith Integration panel.
Fill in the fields and save.
Field
Required
Notes
API Key
Yes
LangSmith API key (lsv2_pt_...). Workspace-scoped is fine.
Project Name
Yes
The LangSmith project (session name) your agent writes to.
Host
Yes
Defaults to https://api.smith.langchain.com. Use the EU or AWS host for those regions.
CorrelationSet simulation_output_id (or session_id / coval_simulation_output_id) in the run’s metadata. When the root run carries it, Coval also pulls in its child runs in the same trace — you don’t need to tag every span.
from langsmith import traceable@traceable(metadata={"simulation_output_id": simulation_output_id})def handle_call(payload): ...
Exporting via the OpenTelemetry SDK to LangSmith’s /otel/v1/traces? LangSmith only maps attributes prefixed with langsmith.metadata. into the run metadata that /runs/query filters on:
Coval fails closed when a correlation hint is set but no runs match, avoiding cross-contamination between concurrent simulations.VerifyOpen the result and click View Traces. Imported spans appear with service.name = langsmith. LLM runs are normalized to span_name = "llm", and token counts are extracted from LangSmith’s various locations and exposed as OTel GenAI conventions:
Each fetch attempt has a 30-second budget. If no spans are found, Coval tries again about 15 and then 30 seconds later without holding up other work (a conversation uploaded more than a day after the call gets a single attempt); if the platform rate-limits a request (HTTP 429), Coval waits about as long as its Retry-After header asks (30 seconds if it doesn’t say; a request for more than 5 minutes is treated as 5 minutes) and retries, up to three attempts in total.
Up to 500 runs per simulation (100/page × 5 pages).
Uses the /runs/query endpoint (available on all plans); bulk S3 export is not used.
Troubleshooting
Symptom
Likely cause
No spans, correct time window
Check the LangSmith Integration card; confirm Project Name matches your agent’s project.
Spans in LangSmith but not Coval
Set metadata.simulation_output_id on the root run.
401 Unauthorized
API key rotated or revoked. Click Replace key.
404 on /sessions
Wrong Host for your region — try the EU or AWS host.
Viewing traces — read imported spans in the trace viewer.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Coval Documentation","colors":{"primary":"#000000","light":"#D9D9D9","dark":"#333333"},"logo":{"light":"https://mintcdn.com/coval-2e18a559/Notp6opJUCHArykW/logo/coval-logo-vector.svg?fit=max\u0026auto=format\u0026n=Notp6opJUCHArykW\u0026q=85\u0026s=f08474458e9c5bbff1e1d7119fdc8012","dark":"https://mintcdn.com/coval-2e18a559/Notp6opJUCHArykW/logo/coval-logo-vector-white.svg?fit=max\u0026auto=format\u0026n=Notp6opJUCHArykW\u0026q=85\u0026s=ed477a66f2ca12c3c7a0289aa7c5bfb4"},"favicon":"https://mintcdn.com/coval-2e18a559/h96r_q_HmNOhXnSr/favicon.png?fit=max\u0026auto=format\u0026n=h96r_q_HmNOhXnSr\u0026q=85\u0026s=3451522324a1d00b3ad7c50ef0b825b3","api":{"mdx":{"auth":{"method":"key","name":"x-api-key"},"server":"https://api.coval.dev"}},"appearance":{"default":"light"},"background":{"image":"https://mintlify.s3.us-west-1.amazonaws.com/coval-2e18a559/images/background/frame_16opblack.svg","color":{"light":"#F2F1EE","dark":"#000000"}},"navbar":{"links":[{"href":"/changelog","label":"Changelog"},{"href":"mailto:support@coval.dev","label":"Support"},{"href":"https://www.coval.dev","label":"Website"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.coval.dev"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/covaldev","twitter":"https://x.com/covaldev"}},"contextual":{"options":["copy","view"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"coval-2e18a559","hasAudioNarration":false,"actualSubdomain":"coval-2e18a559","customDomains":["docs.coval.ai"],"gitSource":{"type":"github","owner":"coval-ai","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aef92d05a64506a906a5a99","clientVersion":"0.0.4088","searchFilterCounts":[{"language":"default","tag":"API","count":193},{"language":"default","tag":"Home","count":76},{"language":"default","tag":"Resources","count":44},{"language":"default","tag":"Simulated Conversations","count":41},{"language":"default","tag":"Metrics","count":34},{"language":"default","tag":"Agents","count":29},{"language":"default","tag":"CLI","count":22},{"language":"default","tag":"Test Sets","count":17},{"language":"default","tag":"Reviews","count":17},{"language":"default","tag":"Uploaded Conversations","count":16}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".cl{position:relative;max-width:880px}.cl-entry{position:relative;display:grid;grid-template-columns:96px 1fr;column-gap:2.5rem;padding-bottom:2.5rem}.cl-entry::before{content:\"\";position:absolute;left:96px;top:8px;bottom:-8px;width:2px;background:#dcdad5}.cl-entry:last-child::before{display:none}.cl-entry::after{content:\"\";position:absolute;left:91px;top:7px;width:12px;height:12px;border-radius:50%;background:#11161f;box-shadow:0 0 0 4px #f2f1ee}.cl-rail{text-align:center}.cl-rail__date{font-size:1.4rem;font-weight:700;color:#1a1a1a;line-height:1.1}.cl-rail__year{font-size:1.05rem;color:#9a958c;font-weight:500}.cl-rail__count{margin-top:0.35rem;font-size:0.8rem;color:#a8a399}.cl-content{min-width:0}.cl-highlights{background:#0f1320;border-radius:16px;padding:1.4rem 1.75rem;margin-bottom:1.25rem}.cl-highlights__label{font-size:0.72rem;letter-spacing:0.12em;text-transform:uppercase;font-weight:600;color:#8b94a5}.cl-highlights__list{margin:0.65rem 0 0;padding:0;list-style:none}.cl-highlights__list li{position:relative;padding-left:1.1rem;margin:0.3rem 0;font-size:1rem;line-height:1.45;color:#f5f6f8}.cl-highlights__list li::before{content:\"\";position:absolute;left:0;top:0.6em;width:5px;height:5px;border-radius:50%;background:#8b94a5}.cl-card{position:relative;background:#fff;border:1px solid #ececec;border-radius:16px;padding:1.5rem 1.75rem;margin-bottom:1rem}.cl-card__title{font-size:1.25rem;font-weight:700;color:#1a1a1a;margin-bottom:0.5rem}.cl-card__desc{color:#5b5b5b;line-height:1.55;margin:0}.cl-card__extra{display:none}.cl-card__divider{border:none;border-top:1px solid #ededed;margin:1.1rem 0}.cl-card__extra p{color:#5b5b5b;line-height:1.55}.cl-card__extra a,.cl-doc-link{color:#15803d;font-weight:600;text-decoration:none}.cl-card__extra a:hover{text-decoration:none;opacity:0.8}.cl-card__footer{display:flex;align-items:center;gap:0.75rem;margin-top:1.1rem}.cl-pill{font-size:0.8rem;font-weight:600;padding:0.25rem 0.7rem;border-radius:999px}.cl-pill--new{background:#d9f0e1;color:#1a7f4b}.cl-pill--improved{background:#dde9fb;color:#1d4ed8}.cl-pill--fixed{background:#fdeccf;color:#b45309}.cl-cat{font-size:0.85rem;color:#9aa0a6}.cl-cb{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.cl-toggle{margin-left:auto;cursor:pointer;user-select:none;font-size:0.85rem;font-weight:500;color:#1f2433;border:1px solid #cdd5e3;border-radius:9px;padding:0.45rem 0.85rem;white-space:nowrap}.cl-toggle:hover{background:#f6f8fc}.cl-cb:focus-visible~.cl-card__footer .cl-toggle{outline:2px solid #4f6bed;outline-offset:2px}.cl-toggle .less{display:none}.cl-cb:checked~.cl-card__extra{display:block}.cl-cb:checked~.cl-card__footer .cl-toggle .more{display:none}.cl-cb:checked~.cl-card__footer .cl-toggle .less{display:inline}.dark .cl-entry::before{background:#2a2f3a}.dark .cl-entry::after{background:#e5e7eb;box-shadow:0 0 0 4px #000}.dark .cl-rail__date{color:#f5f6f8}.dark .cl-rail__year{color:#9aa0ad}.dark .cl-rail__count{color:#7e8493}.dark .cl-card{background:#11161f;border-color:#242a36}.dark .cl-card__title{color:#f5f6f8}.dark .cl-card__desc,.dark .cl-card__extra p{color:#aab1bd}.dark .cl-card__divider{border-top-color:#262b36}.dark .cl-card__extra a,.dark .cl-doc-link{color:#4ade80}.dark .cl-pill--new{background:#10301d;color:#5cd98c}.dark .cl-pill--improved{background:#13233f;color:#7aa6f5}.dark .cl-pill--fixed{background:#3a2a10;color:#e0a955}.dark .cl-cat{color:#8b909a}.dark .cl-toggle{color:#cbd2de;border-color:#333a47}.dark .cl-toggle:hover{background:#1a2030}@media (max-width: 640px){.cl-entry{grid-template-columns:1fr;row-gap:1rem}.cl-entry::before,.cl-entry::after{display:none}.cl-rail{display:flex;align-items:baseline;gap:0.5rem;text-align:left}}html:not(.dark) #search-bar-entry,html:not(.dark) #search-bar-entry *,html:not(.dark) #assistant-entry,html:not(.dark) #assistant-entry *{color:#5c5c5c}html:not(.dark) #footer a[href*=\"mintlify\"]{color:#5c5c5c}.dark #footer a[href*=\"mintlify\"]{color:#8c8c8c}html:not(.dark) .chat-assistant-disclaimer-text{color:#5c5c5c}.dark .chat-assistant-disclaimer-text{color:#a3a3a3}html:not(.dark) .method-nav-pill>.text-green-700{color:#166534}html:not(.dark) .method-nav-pill>.text-blue-700{color:#1e40af}html:not(.dark) .method-nav-pill>.text-orange-700{color:#9a3412}html:not(.dark) .method-nav-pill>.text-red-700{color:#991b1b}html:not(.dark) [class*=\"bg-[#FDEAD8]\"]{color:#8a4508}.dark [class*=\"bg-[#FDEAD8]\"]{color:#f5a35c}html:not(.dark) [data-component-part=\"field-required-pill\"]{color:#b91c1c}#chat-assistant-sheet[aria-hidden=\"true\"]>*,#chat-assistant-sheet[role=\"dialog\"]:not([data-open])>*{visibility:hidden}:focus-visible,#root :focus-visible{outline:2px solid #11161f!important;outline-offset:2px!important}.dark :focus-visible,.dark #root :focus-visible{outline-color:#f5f6f8!important}#root [data-radix-scroll-area-viewport]:focus-visible,#root pre:focus-visible,#root div[tabindex=\"0\"]:focus-visible{outline-offset:-2px!important}:has(>.chat-assistant-input:focus-visible){outline:2px solid #11161f;outline-offset:2px}.dark :has(>.chat-assistant-input:focus-visible){outline-color:#f5f6f8}"}],"page":{"pagePath":"concepts/simulations/traces/imports","slug":"/concepts/simulations/traces/imports","pageMetadata":{"title":"Import Traces from a Platform","sidebarTitle":"Import from a platform","description":"Already tracing with Langfuse, Arize Phoenix, or LangSmith? Connect it once and Coval imports traces automatically — no re-instrumentation.","href":"/concepts/simulations/traces/imports"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Already tracing with Langfuse, Arize Phoenix, or LangSmith? Connect it once and Coval imports traces automatically — no re-instrumentation.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,OptimizedFrame,Tab,Table,Tabs,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedFrame)_missingMdxReference(`OptimizedFrame`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`If your agent already exports traces to Langfuse, Arize Phoenix, or LangSmith, Coval can pull those traces into the `,_jsx(_components.a,{href:`/concepts/simulations/traces/viewing`,children:`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 `,_jsx(_components.strong,{children:`Settings → Integrations`}),`, and Coval handles the rest after each simulation.`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-it-works`,children:`How it works`}),`\n`,_jsx(_components.p,{children:`The flow is the same for every provider:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Your agent sends traces to your platform as it does today.`}),`\n`,_jsx(_components.li,{children:`When a Coval simulation finishes, Coval looks up the traces that carry that simulation’s ID, around the time the simulation ran.`}),`\n`,_jsx(_components.li,{children:`They’re normalized to OpenTelemetry spans and written to the same trace store that native OTLP ingestion uses.`}),`\n`,_jsx(_components.li,{children:`The trace viewer, trace metrics, and transition heatmap work against the imported spans exactly as they do for native OTLP traces.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Imported spans are tagged with `,_jsx(_components.code,{children:`service.name`}),` set to the source (`,_jsx(_components.code,{children:`langfuse`}),`, `,_jsx(_components.code,{children:`arize`}),`, or `,_jsx(_components.code,{children:`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.`]}),`\n`,_jsxs(_components.p,{children:[`For an `,_jsx(_components.a,{href:`/concepts/uploaded-conversations/overview`,children:`uploaded conversation`}),`, include `,_jsx(_components.code,{children:`occurred_at`}),` when you `,_jsx(_components.a,{href:`/api-reference/uploaded-conversations/submit-conversation-for-evaluation`,children:`submit it`}),` so Coval looks for traces around the time of the call. Without it, Coval looks only around the time it processed the conversation, and misses the traces of a call submitted well after it happened. Set `,_jsx(_components.code,{children:`occurred_at`}),` to the instant the audio recording starts. The trace viewer also uses it to line the audio up with the spans.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Correlation is required.`}),` Coval imports only traces that carry the simulation’s ID, for example as `,_jsx(_components.code,{children:`simulation_output_id`}),` (or `,_jsx(_components.code,{children:`session_id`}),` / `,_jsx(_components.code,{children:`coval_simulation_output_id`}),`) in your trace metadata. If none does, nothing is imported: Coval never falls back to every trace in the time window, so traces from concurrent calls aren’t mixed up. Each provider’s exact keys and code are in its tab below.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`connect-your-platform`,children:`Connect your platform`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Langfuse`,id:`langfuse`,children:[_jsx(OptimizedFrame,{className:`mint-w-full mint-aspect-video mint-rounded-xl`,src:`https://www.loom.com/embed/362d0ac342b84f75bd3ac148bdf5ec19`,title:`Langfuse Integration Walkthrough`,frameBorder:`0`,allow:`accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture`,allowFullScreen:true}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Prerequisites`})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.a,{href:`https://langfuse.com`,children:`Langfuse`}),` project with at least one completed trace`]}),`\n`,_jsxs(_components.li,{children:[`Langfuse `,_jsx(_components.strong,{children:`Public Key`}),` and `,_jsx(_components.strong,{children:`Secret Key`}),` from your project settings`]}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Connect`})}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Open `,_jsx(_components.strong,{children:`Settings → Integrations`}),` in Coval and expand the `,_jsx(_components.strong,{children:`Langfuse Integration`}),` panel.`]}),`\n`,_jsxs(_components.li,{children:[`Paste your `,_jsx(_components.strong,{children:`Public Key`}),` and `,_jsx(_components.strong,{children:`Secret Key`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Set `,_jsx(_components.strong,{children:`Host`}),` if you self-host Langfuse; leave the default `,_jsx(_components.code,{children:`https://us.cloud.langfuse.com`}),` for Langfuse Cloud.`]}),`\n`,_jsx(_components.li,{children:`Save.`}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Correlation`})}),_jsx(_components.p,{children:`Coval finds your traces by the simulation’s ID. Put it in either of these places:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Langfuse’s own `,_jsx(_components.strong,{children:`session ID`}),` (`,_jsx(_components.code,{children:`sessionId`}),`).`]}),`\n`,_jsxs(_components.li,{children:[`Trace or observation `,_jsx(_components.strong,{children:`metadata`}),`, under `,_jsx(_components.code,{children:`simulation_output_id`}),`, `,_jsx(_components.code,{children:`session_id`}),`, or `,_jsx(_components.code,{children:`coval_simulation_output_id`}),`.`]}),`\n`]}),_jsx(_components.p,{children:`Coval imports only traces that match. If no trace carries the simulation’s ID, nothing is imported: Coval does not fall back to importing every trace in the time window, because that would attach other callers’ traces to the wrong simulation.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` langfuse `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Langfuse, propagate_attributes`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`langfuse `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Langfuse()`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` langfuse.start_as_current_observation(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`name`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"turn\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Every observation inside this block carries the simulation ID.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` propagate_attributes(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` session_id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`simulation_output_id,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` metadata`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"simulation_output_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: simulation_output_id},`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ):`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` ...`})}),`\n`]})})}),_jsxs(_components.p,{children:[`Setting the ID with `,_jsx(_components.code,{children:`metadata=`}),` on a single span also works; Coval matches it on that observation and imports the whole trace it belongs to.`]}),_jsxs(_components.p,{children:[`On self-hosted Langfuse v3, only trace metadata is matched: Coval reads it through an older API (see `,_jsx(_components.strong,{children:`Limits`}),`), so the session ID and observation metadata aren’t used there.`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Verify`})}),_jsxs(_components.p,{children:[`After a simulation finishes, open the result and click `,_jsx(_components.strong,{children:`View Traces`}),`. Imported spans appear with `,_jsx(_components.code,{children:`service.name = langfuse`}),` and the original Langfuse attributes preserved under `,_jsx(_components.code,{children:`langfuse.*`}),`. OTel GenAI attributes (`,_jsx(_components.code,{children:`gen_ai.request.model`}),`, `,_jsx(_components.code,{children:`gen_ai.usage.*`}),`) are emitted for LLM generations so trace metrics work out of the box.`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Limits`})}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Each fetch attempt has a 30-second budget.`}),`\n`,_jsx(_components.li,{children:`If no trace is found, Coval tries again about 15 seconds and then 30 seconds later, without holding up other work. A conversation you upload more than a day after the call gets a single attempt.`}),`\n`,_jsxs(_components.li,{children:[`If Langfuse rate-limits a request (HTTP 429), Coval waits about as long as Langfuse’s `,_jsx(_components.code,{children:`Retry-After`}),` header asks (30 seconds if it doesn’t say; a request for more than 5 minutes is treated as 5 minutes) and tries again.`]}),`\n`,_jsx(_components.li,{children:`Each simulation gets at most three attempts in total. Its metrics run after the last one, whether or not a trace was found.`}),`\n`,_jsx(_components.li,{children:`Langfuse Cloud and self-hosted Langfuse v4 are read through Langfuse’s v2 observations API. Coval finds the traces that carry the simulation’s ID, then reads all of their observations, following every page Langfuse returns. It imports them completely or not at all: if they can’t all be read within the attempt’s budget, nothing is imported for that simulation, so a partial trace is never stored.`}),`\n`,_jsx(_components.li,{children:`Self-hosted Langfuse v3 doesn’t have the v2 API, so Coval reads the older traces API there. It reads up to 500 traces in the simulation’s time window (100/page × 5 pages), keeps those whose trace metadata carries the simulation’s ID, and reads up to 500 observations per trace. Traces and observations past those limits aren’t imported.`}),`\n`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`Langfuse can take up to 15 minutes to make data available on its v2 API when it comes from an older SDK (`,_jsx(_components.code,{children:`langfuse-python`}),` before 4.7.0 or `,_jsx(_components.code,{children:`langfuse-js`}),` before 5.4.0) or from an OpenTelemetry exporter that doesn’t send the `,_jsx(_components.code,{children:`x-langfuse-ingestion-version: 4`}),` header. Coval’s retries cover about a minute, so those traces can be missed. Upgrade the SDK or set the header on your exporter.`]})}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Troubleshooting`})}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Symptom`}),_jsx(_components.th,{children:`Likely cause`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`No spans, correct time window`}),_jsxs(_components.td,{children:[`Check the `,_jsx(_components.strong,{children:`Langfuse Integration`}),` card in Settings; re-save if the `,_jsx(_components.strong,{children:`Configured`}),` chip is missing.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Traces are in Langfuse but not in Coval`}),_jsxs(_components.td,{children:[`Set the simulation’s ID as the Langfuse session ID or as `,_jsx(_components.code,{children:`simulation_output_id`}),` metadata (trace metadata on self-hosted Langfuse v3). Without it, Coval imports nothing. Also check your SDK version (see the warning above).`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Only some of the simulation’s traces appear`}),_jsxs(_components.td,{children:[`Set `,_jsx(_components.code,{children:`simulation_output_id`}),` (or the session ID) on every trace for that simulation. Coval imports only the traces that carry it.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`401 Unauthorized`})}),_jsxs(_components.td,{children:[`Keys were rotated. Click `,_jsx(_components.strong,{children:`Replace key`}),` in Settings.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Rate limit errors (HTTP 429)`}),_jsx(_components.td,{children:`Langfuse Cloud limits API requests per organization. Coval backs off and retries on its own. If a simulation still ends without traces, contact Coval support to re-import it.`})]})]})]})]}),_jsxs(Tab,{title:`Arize Phoenix`,id:`arize-phoenix`,children:[_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Arize AX cloud support is on the roadmap.`}),` AX’s `,_jsx(_components.code,{children:`/v2/spans`}),` endpoint indexes 15–30 minutes after OTLP ingest, which doesn’t fit Coval’s per-simulation import window. For now, Coval imports from Phoenix, which exposes spans the moment they land.`]})}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Prerequisites`})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A self-hosted `,_jsx(_components.a,{href:`https://docs.arize.com/phoenix`,children:`Phoenix`}),` deployment reachable from Coval’s workers, or a Phoenix Cloud account, with a project name you write spans to`]}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Connect`})}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Open `,_jsx(_components.strong,{children:`Settings → Integrations`}),` in Coval and expand the `,_jsx(_components.strong,{children:`Arize Integration`}),` panel.`]}),`\n`,_jsx(_components.li,{children:`Fill in the fields and save.`}),`\n`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Required`}),_jsx(_components.th,{children:`Notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Phoenix Host`}),_jsx(_components.td,{children:`Yes`}),_jsxs(_components.td,{children:[`e.g. `,_jsx(_components.code,{children:`https://app.phoenix.arize.com`}),` for Cloud, or your self-hosted base URL.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Project Name`}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`The Phoenix project your agent writes to.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`API Key`}),_jsx(_components.td,{children:`Optional`}),_jsx(_components.td,{children:`Required for Phoenix Cloud, ignored for unauthenticated self-hosted Phoenix.`})]})]})]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Correlation`})}),_jsxs(_components.p,{children:[`Coval matches span attributes on `,_jsx(_components.code,{children:`simulation_output_id`}),`, `,_jsx(_components.code,{children:`session_id`}),`, `,_jsx(_components.code,{children:`session.id`}),`, or `,_jsx(_components.code,{children:`coval_simulation_output_id`}),` (and the same keys inside a JSON `,_jsx(_components.code,{children:`metadata`}),` attribute). It imports only the spans that carry one of them, not the rest of their trace, so set it on every span you want imported.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` opentelemetry `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` trace `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`as`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` otel_trace`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`tracer `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` otel_trace.get_tracer(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"my-agent\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` tracer.start_as_current_span(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"conversation\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`as`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` span:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` span.set_attribute(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"simulation_output_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, simulation_output_id)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` ...`})}),`\n`]})})}),_jsxs(_components.p,{children:[`For OpenInference instrumentation: `,_jsx(_components.code,{children:`span.set_attribute(SpanAttributes.SESSION_ID, simulation_output_id)`}),`, or wrap the call in `,_jsx(_components.code,{children:`using_session(session_id=simulation_output_id)`}),` from `,_jsx(_components.code,{children:`openinference.instrumentation`}),` so the spans OpenInference creates inside it carry `,_jsx(_components.code,{children:`session.id`}),`.`]}),_jsx(_components.p,{children:`Coval fails closed when a correlation hint is set but no spans match — it returns an empty result rather than importing everything in the window, avoiding cross-contamination between concurrent simulations.`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Verify`})}),_jsxs(_components.p,{children:[`Open the result and click `,_jsx(_components.strong,{children:`View Traces`}),`. Imported spans appear with `,_jsx(_components.code,{children:`service.name = arize`}),`. LLM spans are normalized to `,_jsx(_components.code,{children:`span_name = \"llm\"`}),`, and common token-count attributes are aliased to OTel GenAI conventions:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Arize / OpenInference`}),_jsx(_components.th,{children:`OTel GenAI alias`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`llm.token_count.prompt`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`gen_ai.usage.input_tokens`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`llm.token_count.completion`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`gen_ai.usage.output_tokens`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`input.value`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`input`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`output.value`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`output`})})]})]})]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Limits`})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Each fetch attempt has a 30-second budget. If no spans are found, Coval tries again about 15 and then 30 seconds later without holding up other work (a conversation uploaded more than a day after the call gets a single attempt); if the platform rate-limits a request (HTTP 429), Coval waits about as long as its `,_jsx(_components.code,{children:`Retry-After`}),` header asks (30 seconds if it doesn’t say; a request for more than 5 minutes is treated as 5 minutes) and retries, up to three attempts in total.`]}),`\n`,_jsx(_components.li,{children:`Coval reads up to 5,000 spans from the project in the simulation’s time window (1,000/page × 5 pages) and keeps the ones that match. On a busy project, spans past that limit aren’t imported.`}),`\n`,_jsx(_components.li,{children:`Self-hosted Phoenix must be reachable from Coval’s workers — expose it via a public ingress if it’s on a private network.`}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Troubleshooting`})}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Symptom`}),_jsx(_components.th,{children:`Likely cause`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`No spans, correct time window`}),_jsxs(_components.td,{children:[`Check the `,_jsx(_components.strong,{children:`Arize Integration`}),` card; confirm `,_jsx(_components.strong,{children:`Project Name`}),` matches what your agent writes to.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Spans in Phoenix but not Coval`}),_jsxs(_components.td,{children:[`Set `,_jsx(_components.code,{children:`simulation_output_id`}),` (or `,_jsx(_components.code,{children:`session_id`}),` / `,_jsx(_components.code,{children:`session.id`}),`) on every span you want imported.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`401 Unauthorized`})}),_jsxs(_components.td,{children:[`API key rotated. Click `,_jsx(_components.strong,{children:`Replace key`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`Connection refused`}),` (self-hosted)`]}),_jsx(_components.td,{children:`Phoenix isn’t publicly reachable from Coval’s workers.`})]})]})]})]}),_jsxs(Tab,{title:`LangSmith`,id:`langsmith`,children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Prerequisites`})}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A LangSmith account with a project your agent writes runs to`}),`\n`,_jsxs(_components.li,{children:[`A LangSmith API key (Settings → API Keys, `,_jsx(_components.code,{children:`lsv2_pt_...`}),`)`]}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Connect`})}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Open `,_jsx(_components.strong,{children:`Settings → Integrations`}),` in Coval and expand the `,_jsx(_components.strong,{children:`LangSmith Integration`}),` panel.`]}),`\n`,_jsx(_components.li,{children:`Fill in the fields and save.`}),`\n`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Required`}),_jsx(_components.th,{children:`Notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`API Key`}),_jsx(_components.td,{children:`Yes`}),_jsxs(_components.td,{children:[`LangSmith API key (`,_jsx(_components.code,{children:`lsv2_pt_...`}),`). Workspace-scoped is fine.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Project Name`}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`The LangSmith project (session name) your agent writes to.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Host`}),_jsx(_components.td,{children:`Yes`}),_jsxs(_components.td,{children:[`Defaults to `,_jsx(_components.code,{children:`https://api.smith.langchain.com`}),`. Use the EU or AWS host for those regions.`]})]})]})]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Correlation`})}),_jsxs(_components.p,{children:[`Set `,_jsx(_components.code,{children:`simulation_output_id`}),` (or `,_jsx(_components.code,{children:`session_id`}),` / `,_jsx(_components.code,{children:`coval_simulation_output_id`}),`) in the run’s `,_jsx(_components.code,{children:`metadata`}),`. When the root run carries it, Coval also pulls in its child runs in the same trace — you don’t need to tag every span.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` langsmith `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` traceable`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`@traceable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`metadata`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"simulation_output_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: simulation_output_id})`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` handle_call`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`payload`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` ...`})}),`\n`]})})}),_jsxs(_components.p,{children:[`Exporting via the OpenTelemetry SDK to LangSmith’s `,_jsx(_components.code,{children:`/otel/v1/traces`}),`? LangSmith only maps attributes prefixed with `,_jsx(_components.code,{children:`langsmith.metadata.`}),` into the run metadata that `,_jsx(_components.code,{children:`/runs/query`}),` filters on:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`span.set_attribute(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"langsmith.metadata.simulation_output_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, simulation_output_id)`})]}),`\n`]})})}),_jsx(_components.p,{children:`Coval fails closed when a correlation hint is set but no runs match, avoiding cross-contamination between concurrent simulations.`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Verify`})}),_jsxs(_components.p,{children:[`Open the result and click `,_jsx(_components.strong,{children:`View Traces`}),`. Imported spans appear with `,_jsx(_components.code,{children:`service.name = langsmith`}),`. LLM runs are normalized to `,_jsx(_components.code,{children:`span_name = \"llm\"`}),`, and token counts are extracted from LangSmith’s various locations and exposed as OTel GenAI conventions:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`LangSmith field`}),_jsx(_components.th,{children:`OTel GenAI alias`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`outputs.usage_metadata.input_tokens`}),` (or `,_jsx(_components.code,{children:`prompt_tokens`}),`)`]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`gen_ai.usage.input_tokens`})})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`outputs.usage_metadata.output_tokens`}),` (or `,_jsx(_components.code,{children:`completion_tokens`}),`)`]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`gen_ai.usage.output_tokens`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`outputs.usage_metadata.total_tokens`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`gen_ai.usage.total_tokens`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`extra.metadata.ls_model_name`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`gen_ai.request.model`})})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`inputs`}),` / `,_jsx(_components.code,{children:`outputs`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`input`}),` / `,_jsx(_components.code,{children:`output`})]})]})]})]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Limits`})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Each fetch attempt has a 30-second budget. If no spans are found, Coval tries again about 15 and then 30 seconds later without holding up other work (a conversation uploaded more than a day after the call gets a single attempt); if the platform rate-limits a request (HTTP 429), Coval waits about as long as its `,_jsx(_components.code,{children:`Retry-After`}),` header asks (30 seconds if it doesn’t say; a request for more than 5 minutes is treated as 5 minutes) and retries, up to three attempts in total.`]}),`\n`,_jsx(_components.li,{children:`Up to 500 runs per simulation (100/page × 5 pages).`}),`\n`,_jsxs(_components.li,{children:[`Uses the `,_jsx(_components.code,{children:`/runs/query`}),` endpoint (available on all plans); bulk S3 export is not used.`]}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Troubleshooting`})}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Symptom`}),_jsx(_components.th,{children:`Likely cause`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`No spans, correct time window`}),_jsxs(_components.td,{children:[`Check the `,_jsx(_components.strong,{children:`LangSmith Integration`}),` card; confirm `,_jsx(_components.strong,{children:`Project Name`}),` matches your agent’s project.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Spans in LangSmith but not Coval`}),_jsxs(_components.td,{children:[`Set `,_jsx(_components.code,{children:`metadata.simulation_output_id`}),` on the root run.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`401 Unauthorized`})}),_jsxs(_components.td,{children:[`API key rotated or revoked. Click `,_jsx(_components.strong,{children:`Replace key`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`404`}),` on `,_jsx(_components.code,{children:`/sessions`})]}),_jsx(_components.td,{children:`Wrong Host for your region — try the EU or AWS host.`})]})]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`see-also`,children:`See also`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/concepts/simulations/traces/opentelemetry`,children:`OpenTelemetry Traces`}),` — push traces directly to Coval instead of importing.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/concepts/simulations/traces/wizard`,children:`Wizard`}),` — auto-instrument Pipecat/LiveKit/Vapi agents.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/concepts/simulations/traces/viewing`,children:`Viewing traces`}),` — read imported spans in the trace viewer.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Import Traces from a Platform","sidebarTitle":"Import from a platform","description":"Already tracing with Langfuse, Arize Phoenix, or LangSmith? Connect it once and Coval imports traces automatically — no re-instrumentation.","href":"/concepts/simulations/traces/imports"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"How it works","slug":"how-it-works","depth":2,"children":[]},{"title":"Connect your platform","slug":"connect-your-platform","depth":2,"children":[]},{"title":"See also","slug":"see-also","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/coval-2e18a559/96d9833460dc4be2/analytics.js","/_mintlify/custom/coval-2e18a559/37be8295f8507cc8/a11y.js"],"dynamicCss":".mint-aspect-video {\n aspect-ratio: 16 / 9\n}\n.mint-w-full {\n width: 100%\n}\n.mint-rounded-xl {\n border-radius: 0.75rem\n}","subdomain":"coval-2e18a559","siteName":"Coval Documentation","title":"Import Traces from a Platform - Coval Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-20T19:54:35.714Z","originalFileLocation":"concepts/simulations/traces/imports.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Already tracing with Langfuse, Arize Phoenix, or LangSmith? Connect it once and Coval imports traces automatically — no re-instrumentation.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Coval Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Import Traces from a Platform - Coval Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Already tracing with Langfuse, Arize Phoenix, or LangSmith? Connect it once and Coval imports traces automatically — no re-instrumentation.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Coval Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.coval.ai/concepts/simulations/traces/imports\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://coval-2e18a559.mintlify.site/_mintlify/api/og/v2?division=Set+up+tracing\u0026amp;title=Import+Traces+from+a+Platform\u0026amp;description=Already+tracing+with+Langfuse%2C+Arize+Phoenix%2C+or+LangSmith%3F+Connect+it+once+and+Coval+imports+traces+automatically+%E2%80%94+no+re-instrumentation.\u0026amp;theme=6eac43fcf99f568552f38b9e\u0026amp;signature=9566100455a0b630e70b2d09f179f2ab6fd3114617b214f1d7998eb69af15946\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Import Traces from a Platform - Coval Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Already tracing with Langfuse, Arize Phoenix, or LangSmith? Connect it once and Coval imports traces automatically — no re-instrumentation.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://coval-2e18a559.mintlify.site/_mintlify/api/og/v2?division=Set+up+tracing\u0026amp;title=Import+Traces+from+a+Platform\u0026amp;description=Already+tracing+with+Langfuse%2C+Arize+Phoenix%2C+or+LangSmith%3F+Connect+it+once+and+Coval+imports+traces+automatically+%E2%80%94+no+re-instrumentation.\u0026amp;theme=6eac43fcf99f568552f38b9e\u0026amp;signature=9566100455a0b630e70b2d09f179f2ab6fd3114617b214f1d7998eb69af15946\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Coval Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#000000\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.coval.ai/concepts/simulations/traces/imports\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/concepts/simulations/traces/imports.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.coval.ai/#organization\",\"name\":\"Coval Documentation\",\"url\":\"https://docs.coval.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/coval-2e18a559/Notp6opJUCHArykW/logo/coval-logo-vector.svg?fit=max\u0026auto=format\u0026n=Notp6opJUCHArykW\u0026q=85\u0026s=f08474458e9c5bbff1e1d7119fdc8012\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.coval.ai#website\",\"name\":\"Coval Documentation\",\"url\":\"https://docs.coval.ai\",\"publisher\":{\"@id\":\"https://docs.coval.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.coval.ai/concepts/simulations/traces/imports#webpage\",\"url\":\"https://docs.coval.ai/concepts/simulations/traces/imports\",\"name\":\"Import Traces from a Platform\",\"description\":\"Already tracing with Langfuse, Arize Phoenix, or LangSmith? Connect it once and Coval imports traces automatically — no re-instrumentation.\",\"dateModified\":\"2026-10-20T19:54:35.714Z\",\"isPartOf\":{\"@id\":\"https://docs.coval.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.coval.ai/concepts/simulations/traces/imports#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.coval.ai/concepts/simulations/traces/imports#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Analyze\",\"item\":\"https://docs.coval.ai/concepts/uploaded-conversations/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Traces\",\"item\":\"https://docs.coval.ai/concepts/simulations/traces/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Set up tracing\",\"item\":\"https://docs.coval.ai/concepts/simulations/traces/opentelemetry\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Import Traces from a Platform\",\"item\":\"https://docs.coval.ai/concepts/simulations/traces/imports\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.coval.ai/concepts/simulations/traces/imports#article\",\"headline\":\"Import Traces from a Platform\",\"name\":\"Import Traces from a Platform\",\"description\":\"Already tracing with Langfuse, Arize Phoenix, or LangSmith? Connect it once and Coval imports traces automatically — no re-instrumentation.\",\"url\":\"https://docs.coval.ai/concepts/simulations/traces/imports\",\"mainEntityOfPage\":{\"@id\":\"https://docs.coval.ai/concepts/simulations/traces/imports#webpage\"},\"dateModified\":\"2026-10-20T19:54:35.714Z\",\"publisher\":{\"@id\":\"https://docs.coval.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.coval.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Coval Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Coval Documentation","nav":{"global":null,"tabs":[{"tab":"Home","icon":"house","pages":[{"title":"Welcome to Coval","sidebarTitle":"The Continuous Quality Loop","href":"/welcome"},{"title":"Conversations","sidebarTitle":"Conversations","href":"/concepts/conversations/overview"},{"group":"Simulated Conversations","pages":[{"group":"Understand Simulated Conversations","pages":[{"title":"Simulated Conversations","sidebarTitle":"Overview","href":"/concepts/simulations/overview"},{"title":"Reports","sidebarTitle":"Reports: Compare Across Runs","href":"/concepts/simulations/reports"}]},{"group":"Resources","pages":[{"group":"Agents","pages":[{"title":"Agents","sidebarTitle":"Overview","href":"/concepts/agents/overview"},{"title":"Agent Mutations","sidebarTitle":"Mutations","href":"/concepts/agents/mutations"},{"group":"Connection Types","pages":[{"group":"Telephony","pages":[{"title":"Inbound Voice Agent","sidebarTitle":"Inbound","href":"/concepts/agents/connections/inbound-voice"},{"title":"Outbound Voice","sidebarTitle":"Outbound","href":"/concepts/agents/connections/outbound-voice"}]},{"group":"Chat","pages":[{"title":"Standard Chat","sidebarTitle":"Standard","href":"/concepts/agents/connections/chat"},{"title":"Chat WebSocket","sidebarTitle":"WebSocket","href":"/concepts/agents/connections/chat-websocket"},{"title":"Chat A2A (JSON-RPC)","sidebarTitle":"A2A (JSON-RPC)","href":"/concepts/agents/connections/chat-a2a"}]},{"group":"Voice-to-Voice","pages":[{"title":"OpenAI Realtime","href":"/concepts/agents/connections/openai-realtime"},{"title":"Gemini Live","href":"/concepts/agents/connections/gemini-live"},{"title":"Grok Realtime","href":"/concepts/agents/connections/grok-realtime"},{"title":"Deepgram Voice Agent","href":"/concepts/agents/connections/deepgram-voice-agent"}]},{"title":"SMS Simulations","sidebarTitle":"SMS","href":"/guides/simulations/sms"},{"title":"WebSocket (Voice)","href":"/concepts/agents/connections/websocket"},{"title":"Pipecat Cloud","href":"/concepts/agents/connections/pipecat"},{"title":"LiveKit","href":"/concepts/agents/connections/livekit"}]}]},{"title":"Personas","href":"/concepts/personas/overview"},{"group":"Test Sets","pages":[{"title":"Test Sets","sidebarTitle":"Overview","href":"/concepts/test-sets/overview"},{"title":"Create a Test Set","sidebarTitle":"Create a Test Set","href":"/concepts/test-sets/create"},{"title":"Input Types","sidebarTitle":"Input Types","href":"/concepts/test-sets/input-types"},{"title":"Expected Behavior \u0026 Attributes","sidebarTitle":"Expected Behavior \u0026 Attributes","href":"/concepts/test-sets/evaluation"},{"title":"API Simulation Wrappers (Beta)","sidebarTitle":"API Simulation Wrappers (Beta)","href":"/concepts/test-sets/api-simulation-wrappers"}]},{"title":"Templates","href":"/concepts/templates/overview"},{"title":"Runs \u0026 Schedules","sidebarTitle":"Runs \u0026 Schedules","href":"/concepts/runs/overview"},{"title":"Attributes","sidebarTitle":"Cross-Resource Attributes","href":"/concepts/attributes/overview"},{"title":"Versioning","sidebarTitle":"Versioning","href":"/concepts/versioning/overview"}]},{"title":"Benchmarks","sidebarTitle":"Benchmarks","href":"/concepts/benchmarks/overview"}]},{"group":"Evaluate","pages":[{"group":"Leveraging Metrics","pages":[{"title":"Metrics","sidebarTitle":"Metric Overview","href":"/concepts/metrics/overview"},{"title":"Add your first metric","sidebarTitle":"Add your first metric","href":"/concepts/metrics/quickstart"},{"title":"Choose a metric","sidebarTitle":"Choose a metric","href":"/concepts/metrics/choose-a-metric"},{"title":"Write judge prompts","sidebarTitle":"Write judge prompts","href":"/concepts/metrics/writing-judge-prompts"},{"title":"Custom SQL Metrics","sidebarTitle":"Custom SQL","href":"/concepts/metrics/sql-metrics"},{"title":"Configure metrics","sidebarTitle":"Configure metrics","href":"/concepts/metrics/configuring-metrics"},{"title":"Metric Chaining","href":"/concepts/metrics/metric-chaining"}]},{"group":"Metric Library","pages":[{"title":"Deterministic Metrics","href":"/concepts/metrics/types/deterministic"},{"title":"Statistical Metrics","href":"/concepts/metrics/types/statistical"},{"title":"ML Model Metrics","href":"/concepts/metrics/types/ml-model"},{"title":"LLM Judge Metrics","href":"/concepts/metrics/types/llm-judge"},{"title":"Standard and Agentic LLM Judges","sidebarTitle":"Agentic LLM Judge","href":"/concepts/metrics/judge-modes"},{"title":"Trace Metrics","href":"/concepts/metrics/types/trace"}]}]},{"group":"Analyze","pages":[{"group":"Uploaded Conversations","pages":[{"title":"Uploaded Conversations","sidebarTitle":"Overview","href":"/concepts/uploaded-conversations/overview"},{"title":"Upload Conversation Data","sidebarTitle":"Data Formats","href":"/concepts/uploaded-conversations/uploading"},{"title":"Dashboards","sidebarTitle":"Tracking Results in Dashboards","href":"/concepts/dashboard/overview"},{"title":"Attach Audio After a Call","sidebarTitle":"Attach Audio After a Call","href":"/concepts/uploaded-conversations/async-audio-attach"},{"title":"Add Metadata After a Call","sidebarTitle":"Add Metadata After a Call","href":"/concepts/uploaded-conversations/add-metadata-after-submit"}]},{"title":"Alerts","sidebarTitle":"Alerts","href":"/concepts/alerts/overview"},{"group":"Traces","pages":[{"title":"Traces","sidebarTitle":"Overview","href":"/concepts/simulations/traces/overview"},{"group":"Set up tracing","pages":[{"title":"OpenTelemetry Traces","href":"/concepts/simulations/traces/opentelemetry"},{"title":"Tracing Skills","href":"/concepts/simulations/traces/tracing-skills"},{"title":"Tracing Wizard","description":"Automatically add Coval OTel tracing to your Python voice agent with one command.","href":"/concepts/simulations/traces/wizard"},{"title":"Import Traces from a Platform","sidebarTitle":"Import from a platform","href":"/concepts/simulations/traces/imports"},{"title":"Twilio ConversationRelay + OTel Traces","sidebarTitle":"Twilio ConversationRelay","description":"Add OpenTelemetry tracing to a Twilio Programmable Voice agent and correlate spans with Coval simulations.","href":"/guides/simulations/twilio-conversationrelay"}]},{"title":"Viewing Traces","sidebarTitle":"Viewing traces \u0026 hotspots","href":"/concepts/simulations/traces/viewing"},{"title":"Trace Search","href":"/concepts/conversations/trace-search"}]}]},{"group":"Review","pages":[{"group":"Manage Projects","root":{"title":"Human Review Projects","sidebarTitle":"Manage Projects","href":"/concepts/metrics/human-review/human-review"},"pages":[{"title":"Human Review Insights and Annotations","sidebarTitle":"Insights and Annotations","href":"/concepts/metrics/human-review/insights"}]},{"title":"Label Conversations","sidebarTitle":"Label Conversations","href":"/concepts/metrics/human-review/how-to-review"},{"title":"Improving Metrics with Human Review","sidebarTitle":"Improving Metrics with Human Review","href":"/guides/improving-metrics-with-human-review"},{"title":"Human Review via API","sidebarTitle":"API","href":"/guides/human-review-api"}]},{"group":"Cookbooks","pages":[{"title":"Handling User Authentication","sidebarTitle":"Handling User Authentication","href":"/guides/handling-authentication"},{"title":"Testing IVR","sidebarTitle":"Testing IVR","href":"/guides/testing-ivr"},{"title":"Testing Across Audio Qualities","href":"/guides/testing-across-audio-qualities"},{"title":"Testing Across Accents","href":"/guides/testing-across-accents"},{"title":"Adversarial \u0026 Red-Team Testing","href":"/guides/adversarial-red-team-testing"},{"title":"Improving your LLM Judge","sidebarTitle":"Improving your LLM Judge","href":"/guides/improving-your-llm-judge"},{"title":"Evaluating Tool Calls","href":"/use-cases/evaluating-tool-calls"}]},{"group":"Sofia","pages":[{"title":"Sofia","sidebarTitle":"Overview","href":"/sofia/overview"},{"title":"Using Sofia","sidebarTitle":"Using Sofia","href":"/sofia/using-sofia"},{"title":"Sofia investigations","sidebarTitle":"Investigations","href":"/sofia/investigations"},{"title":"Sofia in Slack (Beta)","sidebarTitle":"Sofia in Slack (Beta)","href":"/sofia/slack-beta"}]},{"group":"Reference","pages":[{"title":"API Keys","sidebarTitle":"API Keys","href":"/guides/api-keys"},{"title":"Workspaces","sidebarTitle":"Workspaces","href":"/guides/workspaces"},{"title":"Keyboard Navigation","href":"/guides/keyboard-navigation"},{"title":"GitHub Actions","href":"/getting-started/github-actions-tutorial"}]}]},{"tab":"API","icon":"square-terminal","pages":[{"title":"API","href":"/api-reference/v1/introduction"}]},{"tab":"CLI","icon":"terminal","pages":[{"title":"CLI","href":"/cli/overview"}]},{"tab":"Developers","icon":"code","pages":[{"title":"Developers","href":"/sdks/overview"}]},{"tab":"Agents","icon":"microchip","pages":[{"title":"Agents","href":"/agents/overview"}]},{"tab":"Connectors","icon":"diagram-project","pages":[{"title":"Connectors","href":"/mcp/overview"}]}]},"basePath":"","title":"Import Traces from a Platform - Coval Documentation","buildId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","deploymentId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","dynamics":[],"chunks":[]}