How it works
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)
- 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.comorhttps://cloud.langfuse.com). - 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_idby default). - Backfill from — an ISO date to bound history (blank = everything).
- Customer-id metadata key — the Langfuse metadata field Hone treats as
your downstream tenant (
- 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)
AGENERATION 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.:
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.