Skip to main content
If you already run Langfuse for observability, Hone can ingest your traces directly — no SDK changes, no re-instrumentation. Hone reads your Langfuse project, backfills history, and streams new traces into the same eval / mining / healing loop as native Hone data.

How it works

Hone lists your traces (GET /api/public/traces, paginated by time) and fetches each trace’s observations, then maps them to Hone’s model. Every observation keeps its Langfuse id, so re-syncing an overlapping window is idempotent.

Connect (dashboard)

  1. In Langfuse, open Settings → API Keys and create a key pair. Copy the Public key (pk-lf-…) and Secret key (sk-lf-…), and note your host (e.g. https://us.cloud.langfuse.com or https://cloud.langfuse.com).
  2. In Hone, go to Settings → Connections → Langfuse and paste the host and keys. Optionally set:
    • Customer-id metadata key — the Langfuse metadata field Hone treats as your downstream tenant (customer_id by default).
    • Backfill from — an ISO date to bound history (blank = everything).
  3. Save. Hone backfills, then keeps syncing new traces.
Your Langfuse secret key is used server-side only, to read your project. Grant a key with the least privilege your Langfuse plan allows.

What gets mapped

Once ingested, your Langfuse conversations show up in Raw Logs and User Stories, get scored by the online eval runner (Evals), and are eligible for eval mining and auto-healing — exactly like agents instrumented with the Hone SDK.

Automatic prompt mining (→ self-healing)

A GENERATION observation’s input is the full request sent to the model — including your system prompt. Hone preserves that input verbatim into the agent turn, so the prompt registry can mine it: across many turns of the same agent, the recurring system prompt is reduced to a skeleton with {{slot}} markers where per-request injected values (customer name, tier, date, …) vary. That skeleton is the safe edit surface the Healer improves. For this to work automatically, log the generation input as a chat messages array with a system role (the default for the OpenAI / Anthropic / LangChain Langfuse integrations), e.g.:
Hone also accepts an object with a top-level system field, a { "messages": […] } wrapper, or those nested under an input key. A generation whose input is only a bare user string carries no system prompt, so nothing is mined for it — no manual seeding is needed once the system prompt is present in the trace.

Real-time (OpenTelemetry)

Langfuse is itself an OpenTelemetry backend, so if your app emits OTel you can add a second OTLP exporter pointing at Hone’s collector for real-time delivery alongside the pull sync. See Authentication for endpoints, or reach out and we’ll help wire it.