← All posts

Langfuse experiments as release evidence

14 October 2026 · Deliverd Engineering Team · 4 min read

A table of scored experiment items, one score failed, read through a padlocked key into evidence with each score judged, and on to a person.

Langfuse was the first eval tool we connected, for a simple reason. It is open source, it is widely self-hosted in the EU, and its experiments already carry the scores a release is judged on. Many of the teams asking us about DORA keep their traces in a Langfuse they run themselves.

This post covers what the connector reads, what it leaves alone, and how a build step uses it. Why we built the integrations this way is its own post.

What the Langfuse connector reads. From Langfuse, it reads the project the keys belong to, the newest experiment with the given name and its scores, and each item's trace id and item and trace scores. It never reads an item's input, output or metadata. In Deliverd, each score becomes one result under its own name, and each failed item becomes a failure with a link to its trace.

Connecting it

An owner or an administrator connects Langfuse on Admin → Integrations, under Evaluation tools. Choose Langfuse Cloud by region (EU, US, Japan or HIPAA) or Self-hosted with its https address, then paste the project's public and secret keys.

The keys are tried against Langfuse before anything is kept, and the card names the project they opened, so a typo shows up when you press Connect rather than at the first build. The secret key is sealed. Only a person, in the app, can connect or disconnect. No API key can.

A self-hosted Langfuse has to be reachable over https from the internet. Deliverd will not call a private address.

Pulling an experiment

From a build step, name the experiment and the controls it speaks to:

npx deliverd governance evidence "$TASK" --langfuse credit-memo-v12 --control model_evaluation

Deliverd reads the newest experiment with that name from the last 90 days (--since looks further back), or the exact one if you give its id. From the TypeScript SDK:

import { Deliverd } from "@deliverd/sdk";

const deliverd = new Deliverd(); // DELIVERD_API_KEY from the environment
const task = await deliverd.tasks.get(process.env.TASK_ID!);

await task.submitEvidence({
  type: "model_evaluation",
  title: "Langfuse: credit-memo-v12",
  controls: ["model_evaluation"],
  pull: { source: "langfuse", experiment: "credit-memo-v12" },
});

const gate = await task.checkGovernanceGate();
if (!gate.allowed) throw new Error(gate.reason);

On a governed task in the app, Pull from Langfuse does the same thing for a person.

What is read

It uses Langfuse's v4 public API:

  • the project the keys belong to, so links open in the right place;
  • the newest experiment with the name, and the scores on the experiment itself;
  • each item's trace, and its item and trace scores, 100 at a time and up to 2,000 items.

If the experiment is larger than that, the evidence says the read was partial instead of passing off part of the run as all of it.

What is never read: an item's input, output or metadata. Those are where personal data and the model's answers live, and the evidence needs neither.

How the scores map

Each Langfuse score becomes one result under its own name, so a person writes the threshold on what Langfuse calls it:

  • a numeric score becomes its mean;
  • a boolean score becomes the share of items it was true for;
  • a categorical score becomes a count for each category (tone: rude).

A boolean score that was false on an item is listed as a failure, and so is an item whose run failed. Each one links to its trace in Langfuse, so a reviewer can go from "failed" to the exact trace in one click. The evidence links to the experiment.

Text scores are left out, since there is nothing to set a bar on.

When something is wrong

Every refusal says why:

  • no Langfuse connected, or no experiment with that name: 404;
  • keys Langfuse no longer accepts: 409 connection_refused;
  • Langfuse unreachable: 502 upstream_unavailable.

A build step sees the reason and can stop on it, rather than recording an empty run.

One note on versions

The connector uses Langfuse's experiments API, not the older dataset-run and scores endpoints, which Langfuse Cloud is retiring. Nothing changes for you when they go.

Deliverd is human-in-the-loop infrastructure for AI agents. Connecting Langfuse is covered in Integrations, and evidence and thresholds in the Compliance Mode guide.

Give your agent a way to ask.

Give any AI agent a way to ask a person — for approval, a decision, an answer or a review.