Keep the traces. Add the whole platform.
Langfuse gives you open-source 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 (generations, spans, events)
- ✓ 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 with threat-feed sync
- + 200+ eval scorers (LLM-as-judge, pairwise, rubric)
- + Prompt IDE + optimizer across 90+ providers
- + Managed BYOK gateway with semantic 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, 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 (GENERATION / SPAN / EVENT) | 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) |
Langfuse records the model but not a separate provider field, so the provider is left blank on import. Everything else the importer recognizes is preserved verbatim under span.attributes.
One platform, one bill
Trace once. Secure, eval, optimize — everywhere.
Observability is the hook. The platform is why you stay.
Start free