Switch from Langfuse
Moda vs Langfuse
For AI agents in production, Moda replaces Langfuse.
Langfuse is a well-built open-source (MIT) tool for tracing, prompt management, and evals that you can self-host at full scale for free. By its own count more than 50,000 companies use it, and it has been part of ClickHouse since January 2026.
Moda at a glance
Every trace
checked by built-in detections for frustration, tool failures, laziness, and hallucinations, with no evaluator to write and no sampling rate to set.
How it worksUsers affected
ranks every problem, so the failure that reaches the most people comes first, with the traces behind it.
How it worksSOC 2 and HIPAA
SOC 2 Type I, SOC 2 Type II, and HIPAA compliance, with self-hosted deployment available.
For teams running agents in production
Replay
A state-of-the-art eval runner for production evals. No mocks to write.
Replay a prompt or model change against the traces that failed, before it ships. Moda turns those production traces into eval cases, plays each one under your current configuration and under the change, and scores both.
Your production traces are the test cases
Each case comes from a real trace. A simulated user plays the scenario your user played, so the agent faces the conversation that actually went wrong, not a prompt someone wrote for a test.
Tool calls are simulated for you
When the replayed agent calls a tool, Moda simulates the tool from the calls recorded in your production traces: the answer comes back in the recorded output format, and fails the way the real tool fails. You write no mocks and no fixtures, and no real tool is called.
Both sides judged on every case
A judge scores every case under Production and under Proposed. The results show the pass rates side by side, and each case opens the full replayed transcript, tool calls included, so you can check a verdict against what the agent did.
In Langfuse, an experiment runs a task function you write over a dataset you build. Any tool your agent calls runs inside that function, so it hits the real tool or a mock your team maintains.
- 1Build an eval set from the production traces that failed
- 2A simulated user replays each conversation with your agent
- 3Every tool call is simulated from the tool calls recorded in your traces
- 4A judge scores Production and Proposed, case by case
Where Langfuse leads
What you give up
Langfuse still leads on two points; if one is a hard requirement, stay on Langfuse.
Open source
Langfuse is MIT licensed outside its ee directories. Moda is not open source.
Public pricing and a free plan
Langfuse publishes its pricing and has a free Hobby plan with 50k units a month. Moda access is invite-only with custom pricing.
The differences
Why teams switch from Langfuse
In Langfuse, finding the failures is work your team does: write evaluators, set sampling rates, read traces. Moda checks every trace, groups the failures into problems ranked by users affected, and replays a prompt or model change against the traces that failed before it ships.
- Difference 1Moda finds the failures. Langfuse makes you go looking.Moda's detections run on every trace from the first one, and failures are grouped into problems ranked by users affected. In Langfuse you write or pick each evaluator, choose a sampling rate, and find the failure categories by reading traces.
- Difference 2Moda judges the whole agent run. Langfuse judges one step at a time.Agents fail across turns and tool calls, and Moda reads each run end to end. Langfuse's LLM-as-a-judge evaluators score one observation at a time and cannot be applied to sessions.
Difference 1
Moda finds the failures. Langfuse makes you go looking.
What Moda does
Moda reads every production trace end to end and detects the failures that never throw an error: frustrated users, failing tools, lazy answers, and hallucinations. Add your own checks in plain language and get alerts in Slack, Linear, or email.
Failures are grouped into problems ranked by how many users they affect. Each problem shows the traces behind it, the turn where it went wrong, and related problems that share the cause.
There is no evaluator to write and no sampling rate to choose before the built-in detections run, and they typically appear within minutes of ingest.
How Langfuse approaches it
Langfuse's online evaluation is something you configure. You create an evaluator (LLM-as-a-judge, a decision model, or code), test it on sample observations, then attach a rule with filters and a sampling rate. For LLM-as-a-judge, Langfuse shows the estimated cost and suggests lowering the sampling rate if needed. A template gallery, added on 2026-08-24, gives editable starting points such as a conversational evaluator for implicit user signals.
To find out which failure categories exist, the Langfuse Academy recommends error analysis: read a sample of traces, note the first thing that went wrong in each, cluster the notes into categories, then label and measure. The Langfuse Assistant and Langfuse's coding-agent skill can run these steps with you on request.
Langfuse's roadmap lists proactive issue detection ("Topics", to surface recurring failure patterns across traces) as in progress. As of October 2026 it is not documented as released.
In Langfuse
- 1Create an evaluator: LLM-as-a-judge, a decision model, or code
- 2Attach a rule with filters and a sampling rate
- 3Read and cluster traces to find the failure categories
In Moda
- Built-in detections run on every trace
- Failures are grouped into problems
- Problems are ranked by users affected
Difference 2
Moda judges the whole agent run. Langfuse judges one step at a time.
What Moda does
A Moda trace is one complete agent run: every message, tool call, thinking block, and step, across turns. It can span many OpenTelemetry traces that share a moda.conversation_id.
Detections read the whole run. A hallucination is a claim the agent made that its recorded tool results contradict, and each problem shows the turn where the run went wrong.
How Langfuse approaches it
Langfuse's LLM-as-a-judge evaluators run on observations (recommended) or traces (legacy). They cannot be applied directly to sessions, because Langfuse does not know when a session has ended. The documented approach is to have your application write the full conversation history onto one observation and evaluate that, optionally only on a tagged final trace.
On Langfuse Cloud, trace-level LLM-as-a-judge evaluators stop producing results at the v4 cutover on 2026-11-16. "Multi-span, session, and trajectory evaluations" are on Langfuse's roadmap as in progress.
In Langfuse
- 1Evaluators score one observation, or a trace (legacy)
- 2Sessions cannot be evaluated directly
- 3Your app copies the conversation onto one observation to judge it
In Moda
- One trace is the whole agent run, across turns
- Claims are checked against recorded tool results
- Each problem shows the turn where the run went wrong
Side by side
Capability by capability
The same rows appear on every Moda comparison page, including the ones where Langfuse is ahead.
| Capability | Moda | Langfuse | Why it matters |
|---|---|---|---|
| Setup effort | SDKs or OpenTelemetry: moda init has your coding agent add an SDK, or point an existing OpenTelemetry exporter at Moda. The built-in detections run on traces as they arrive. | SDKs or OpenTelemetry for traces. Evaluators, rules, filters, and sampling rates are set up in the project before scores appear. | Time to the first useful answer about your agent, not just the first stored trace. |
| Failure detection | Built-in signals on every trace: user emotion and frustration, tool failures, laziness, and hallucinations checked against recorded tool results. Custom signals in plain language. | LLM-as-a-judge, decision-model, and code evaluators that you create or start from templates, run on filtered, sampled observations. | Whether failures that never throw an error are caught on the traces nobody reads, and how much setup that takes. |
| Grouping and ranking failures | Failures grouped into problems ranked by how many users they affect, with the traces behind each one. | Error analysis by reading and clustering traces; the Assistant can cluster errors on request. Topics, for recurring failure patterns, is on the roadmap as in progress. | Decides what your team works on first. |
| Testing a change before it ships | Replay a prompt or model change against traces from production and compare pass rates with the current configuration. Tool calls are simulated from the tool calls recorded in those traces, so there are no mocks to write. | Experiments on datasets you build from traces; the Playground reruns a single generation with a changed prompt or model. | Shows whether a change helps on the cases that actually failed before users see it. |
| Offline evals and CI | Replays of a change against traces from production, run and reviewed in the dashboard. No CI gate. | Datasets, experiments from the UI or SDK, run comparisons, annotation queues, and a GitHub Action that blocks a pull request on a regression. | Matters most when your release process gates on eval scores in CI. |
| Alert destinations | Slack, Linear, and email. | Slack, webhooks, and GitHub Actions, on thresholds over metrics and scores. 2, 20, 50, or 100 alerts per plan on Cloud; no limit self-hosted on v4. | Alerts should land where your team already triages work. |
| SDKs and frameworks | Python and Node SDKs; Vercel AI SDK, Claude Agent SDK, and coding agents; any OpenTelemetry source; HTTP API. | Python and JS/TS SDKs, other languages through OpenTelemetry, and more than 100 listed integrations. | Less glue code for the languages and frameworks you already run. |
| OpenTelemetry | OTLP/HTTP trace endpoint (JSON or protobuf). Reads OpenTelemetry GenAI, OpenLLMetry, and Vercel AI SDK attributes, and groups spans across OpenTelemetry traces by moda.conversation_id or gen_ai.conversation.id. | OTLP endpoint at /api/public/otel; maps common GenAI attribute conventions onto its data model. | One instrumentation can feed more than one tool, so trying a second one costs a config change. |
| Prompt management | Prompt files versioned from your repository, with release labels and per-version attribution of production calls. Not in the request path: the SDKs do not fetch prompts. | Versioned prompts fetched at runtime and cached client-side by the SDKs, with labels and a playground. | Decides whether prompts ship with your code or are served to your app at runtime. |
| Open source and self-hosting | Self-hosted deployment available; contact the team to set it up. Not open source. | MIT licensed (outside its ee directories). Self-host the same codebase as Cloud for free, with unlimited usage. | Often required when trace data cannot leave your own infrastructure. |
| Security and compliance | SOC 2 Type I, SOC 2 Type II, and HIPAA compliance. | Annual SOC 2 Type II and ISO 27001 audits, a HIPAA region, and a GDPR DPA. US, EU, and Japan regions. | Often a procurement gate before any trial starts. |
| Pricing and free tier | Invite-only, with custom pricing. Request access to get a workspace. | Public pricing. Free Hobby plan with 50k units a month; free self-hosting. | Decides whether you can start today without talking to anyone. |
Migration
Switching from Langfuse
What moves depends on how your app sends traces to Langfuse today. Spans from OpenTelemetry instrumentation move by changing where they are exported. Calls traced with Langfuse's own SDK move to the Moda SDK. In both cases, carry your session and user IDs over so each agent run stays one trace under the right user, then import the history you already have in Langfuse.
1.Point your OpenTelemetry exporter at Moda
If your spans come from OpenTelemetry GenAI instrumentation, OpenLLMetry, or the Vercel AI SDK's telemetry and go to Langfuse's /api/public/otel endpoint, Moda reads them as they are. Change the exporter's endpoint to https://moda-ingest.modas.workers.dev/v1/traces and its header to Authorization: Bearer with your Moda API key. For direct export, set moda.user_id on each span to the same user ID you sent to Langfuse; changing the endpoint does not translate langfuse.user.id or user.id. If you use a Collector, step 3 copies that attribute for you.
Moda ingest accepts uncompressed request bodies only, and the OpenTelemetry spec leaves the default compression to each SDK, so set OTEL_EXPORTER_OTLP_TRACES_COMPRESSION=none. A Collector compresses by default; the config in step 3 sets compression: none on the Moda exporter.
Exporter environment variablesexport OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="https://moda-ingest.modas.workers.dev/v1/traces" export OTEL_EXPORTER_OTLP_TRACES_HEADERS="Authorization=Bearer YOUR_MODA_API_KEY" export OTEL_EXPORTER_OTLP_TRACES_COMPRESSION="none"2.Replace Langfuse SDK tracing with the Moda SDK
Langfuse's own SDK, including the observe decorator and the Langfuse OpenAI wrapper, writes model input and output to langfuse.observation.input and langfuse.observation.output. Moda does not read those attributes, so repointing that exporter is not enough.
Replace those wrappers with the Moda SDK for Python or Node.js. One init call instruments the OpenAI and Anthropic clients, including streamed responses and tool calls, without changes to your provider code.
3.Carry your session and user IDs over
Moda groups spans into one trace by moda.conversation_id, or gen_ai.conversation.id, across OpenTelemetry traces, and attributes them to a user by moda.user_id. It does not read Langfuse's keys, langfuse.session.id and session.id for sessions or langfuse.user.id and user.id for users. Set moda.conversation_id to the value you used as the Langfuse session ID and moda.user_id to the Langfuse user ID; with the Moda SDK, that is moda.conversation_id and moda.user_id in Python. In Node.js, import withContext from moda-ai and wrap each request in withContext(sessionId, userId, async () => { /* your existing agent code */ }), using your Langfuse IDs. This isolates concurrent requests. Reserve the process-wide Moda.conversationId and Moda.userId setters for scripts handling one session at a time.
If your spans pass through an OpenTelemetry Collector, the config below copies the Langfuse keys into moda.conversation_id and moda.user_id, so existing session and user IDs carry over without a code change. The copies work span by span: a session stays one trace only when every span carries the session ID, and a span is attributed to a user only when it carries the user ID. The insert action keeps any moda.user_id a span already has. Because session.id and user.id are also generic OpenTelemetry keys, drop those rules if other services send them through the same Collector with a broader meaning.
otel-collector-config.yamlreceivers: otlp: protocols: grpc: {} http: {} processors: batch: {} attributes/moda-session: actions: - key: moda.conversation_id from_attribute: langfuse.session.id action: insert # Langfuse also accepts session.id. It is a generic OpenTelemetry key: # drop this rule if other services send session.id through this # Collector with a broader meaning, such as a browser session. - key: moda.conversation_id from_attribute: session.id action: insert - key: moda.user_id from_attribute: langfuse.user.id action: insert # Langfuse also accepts user.id, another generic key: drop this rule # if other services send user.id through this Collector. - key: moda.user_id from_attribute: user.id action: insert exporters: # Replaces your Langfuse exporter. otlphttp/moda: traces_endpoint: https://moda-ingest.modas.workers.dev/v1/traces headers: Authorization: Bearer ${env:MODA_API_KEY} # Moda ingest rejects compressed request bodies; the Collector gzips by default. compression: none service: pipelines: traces: receivers: [otlp] processors: [attributes/moda-session, batch] exporters: [otlphttp/moda]4.Import your Langfuse history
Moda imports the traces you already have in Langfuse. In Settings, open Integrations, then Import traces, and choose Langfuse. Paste a Langfuse public key and secret key, pick your Langfuse Cloud region or enter your self-hosted URL, then choose the project and a date range.
Each Langfuse trace arrives with its observations, inputs and outputs, models, token usage, errors, and user ID. Traces that share a Langfuse session ID become one Moda trace, and Langfuse scores, tags, and metadata are kept with the trace they belong to. The import runs in the background, and you can pause, resume, or cancel it. Prompts, datasets, and experiments stay in Langfuse.
Questions
Frequently asked questions
Do I need Langfuse anymore?
Not to monitor and test AI agents in production. Moda takes the same OpenTelemetry spans, runs its detections on every trace, groups failures into problems ranked by users affected, and replays a prompt or model change against the traces that failed. Keep Langfuse only if you need something it does that Moda does not: open-source code, prompts served to your app at runtime, or a CI gate on curated datasets.
What do I lose by switching?
Open-source code and public pricing with a free plan. You also leave behind Langfuse's runtime prompt serving with client-side caching and its dataset and CI toolkit. Your trace history comes with you: Moda imports Langfuse traces with their sessions, users, and scores.
Can I bring my Langfuse history to Moda?
Yes. Moda supports migrating from Langfuse: in Settings, open Integrations, then Import traces, choose Langfuse, connect with a Langfuse API key pair, and pick a project and a date range. Traces arrive with their observations, users, and scores, and traces that share a session ID become one Moda trace. The step-by-step guide is at moda.dev/blog/migrating-from-langfuse.
Do I have to re-instrument my app?
Not if it already emits OpenTelemetry GenAI, OpenLLMetry, or Vercel AI SDK spans: change the exporter's endpoint, API key, and compression. Calls traced with Langfuse's own SDK move to the Moda SDK, which instruments the OpenAI and Anthropic clients with one init call. Either way, set moda.conversation_id to your Langfuse session ID.
Langfuse has LLM-as-a-judge evaluators. How are Moda's detections different?
In Langfuse you define each evaluator, choose which observations it scores, and set a sampling rate. Moda's detections for frustration, tool failures, laziness, and hallucinations run on every trace without that setup, and they read the whole agent run rather than one observation. You can still add your own checks in plain language as custom signals.
Can Langfuse group my failures?
Langfuse documents error analysis as a method you run: read traces, note what went wrong, and cluster the notes. The Langfuse Assistant can cluster errors when you ask it to, and Topics, for recurring failure patterns, is on Langfuse's roadmap as in progress. Moda groups failures into problems ranked by how many users they affect as traces arrive.
How is replay in Moda different from Langfuse experiments?
A Langfuse experiment runs a task function you write over a dataset you curate, so any tool your agent calls runs for real or behind a mock you maintain, and its Playground reruns one generation. In Moda you replay a prompt or model change against traces from production: a simulated user plays each conversation, every tool call is simulated from the tool calls recorded in your traces, and a judge compares pass rates with the current configuration. There are no mocks to write, and your team decides what ships.
What does Moda cost?
Moda access is invite-only and pricing is custom. Request access at moda.dev/signup, or email founders@modaflows.com for a quote. Langfuse publishes its pricing and has a free plan.
Can I self-host Moda, or is it open source?
Moda offers self-hosted deployment; contact the team at moda.dev/contact to set it up. Moda is not open source. Langfuse is MIT licensed outside its ee directories.
What security compliance does Moda have?
SOC 2 Type I, SOC 2 Type II, and HIPAA. Langfuse publishes annual SOC 2 Type II and ISO 27001 audits, a HIPAA region, and a GDPR DPA.
Replace Langfuse with Moda
Infrastructure for catching AI agent mistakes in production and turning them into evals.
Read the guide: Migrating from Langfuse


