Keep the traces. Add the whole platform.
Langfuse gives you MIT-licensed LLM tracing. EvalGuard imports that trace history and surrounds it with red-team security (300+ plugins), an LLM firewall, evals (200+ scorers), and a BYOK gateway — all on the same spans, in one workspace.
Observability was the start
What you keep — and what you gain
- ✓ Trace + span timeline — all ten observation types
- ✓ Token usage — input / output / total per call
- ✓ Cost per call, per model
- ✓ Full input / output capture (messages or text)
- ✓ Metadata, tags, and model parameters
- ✓ Latency, derived from each observation's start / end
- + Real-time LLM firewall (input + output)
- + 300+ red-team plugins
- + 200+ eval scorers (LLM-as-judge, pairwise, rubric)
- + Prompt IDE + optimizer across 90+ providers
- + Managed BYOK gateway with similarity response caching
- + 50 compliance frameworks + tamper-evident audit log
Backfill your history
Bring your Langfuse traces along
Export your observations from Langfuse (the /api/public/observations endpoint — which Langfuse marks deprecated, though its v2 replacement is still behind a preview opt-in, so it remains the working export path — or a dashboard download), then convert them with the EvalGuard CLI. No record is dropped — anything the importer can't parse is surfaced as an error — and re-running the same import never double-counts, because spans use a stable content hash.
Prints an import summary (spans imported / duplicates skipped / parse errors) and writes the neutral spans to spans.json. This is a trace / observability import — it moves your run history, not your Langfuse project configuration.
| What imports | Where it lands |
|---|---|
| Observations — SPAN, EVENT, GENERATION, AGENT, TOOL, CHAIN, RETRIEVER, EVALUATOR, EMBEDDING, GUARDRAIL | One EvalGuard span each, grouped by trace id |
| Model | span.model |
| Input / output | span.input / span.output (text or messages JSON) |
| Token usage (input / output / total) | span.promptTokens / completionTokens / totalTokens |
| Cost | span.costUsd (from calculatedTotalCost) |
| Latency | span.durationMs (computed from startTime / endTime) |
| Metadata + model parameters | span.attributes (langfuse.* namespace) |
A Langfuse observation records the model but has no provider field of its own, so the provider is left blank on import. (They do have a provider concept — it lives on LLM connections, not on the observation you export.) Everything else the importer recognizes is preserved verbatim under span.attributes.
Langfuse claims on this page were verified against their source — github.com/langfuse/langfuse @ 017ba00e5 (2026-08-07) — on 2026-08-10. The “Gain” column was checked by searching that tree for a firewall, a red-team module, a gateway/proxy and a semantic response cache — none exist, and their own docs position Langfuse as the ex-post evaluation of guardrails other libraries run. Capabilities move; check their current docs before you decide.
One platform, one bill
Trace once. Secure, eval, optimize — everywhere.
Observability is the hook. The platform is why you stay.
Start free