HoneyHive replaces Langfuse with a purpose-built observability platform for production AI. This guide covers both live instrumentation migration (updating your code) and the data field mapping for migrating historical Langfuse traces.Documentation Index
Fetch the complete documentation index at: https://docs.honeyhive.ai/llms.txt
Use this file to discover all available pages before exploring further.
Why teams switch to HoneyHive
Built for agentic AI
Multi-agent workflows, tool orchestration, and reasoning traces - HoneyHive handles the complexity that Langfuse was not designed for. Get per-span latency, per-agent costs, and full reasoning paths out of the box.
Zero-dependency SDK (BYOI)
Bring Your Own Instrumentor. Use any version of
openai, anthropic, or langchain with no SDK conflicts. HoneyHive never patches your clients.Enterprise-grade security
SOC 2, SSO, and RBAC built in. Dedicated cloud and self-hosted deployment options for regulated industries.
Production monitoring
Real-time alerts, anomaly detection, and custom dashboards purpose-built for AI workloads, not retrofitted from generic APM.
Feature comparison at a glance
Feature comparison at a glance
| Capability | Langfuse | HoneyHive |
|---|---|---|
| Agentic trace depth | Basic trace trees | Per-span latency, per-agent cost, reasoning paths |
| SDK dependency model | Bundled deps, client patching | Zero dependencies (BYOI) |
| Security and compliance | Community-focused | SOC 2, SSO, RBAC |
| Production monitoring | Basic dashboards | Real-time alerts, anomaly detection |
| Evaluations | Client-side scoring only | Server-side evaluators (auto-run on all traces) + client-side |
| Auto-flush | Manual flush() required | Automatic |
Migration overview
Step 1: Install HoneyHive SDK
HoneyHive installs cleanly alongside your existing stack:Run
pip list | grep -E "honeyhive|langfuse|openai" to verify all packages coexist.Step 2: Configure API keys
Get your HoneyHive API key
- Log in to HoneyHive
- Go to Settings > API Keys
- Click Create New Key and copy it
Set environment variables
Step 3: Update tracing code
Basic decorator tracing
Nested spans with metadata
OpenAI integration (BYOI pattern)
Langfuse patches the OpenAI client. HoneyHive uses the BYOI pattern instead: you choose the instrumentor, and your OpenAI client stays standard.Step 4: Migrate evaluations
Langfuse uses client-side scoring. HoneyHive supports both client-side enrichment and server-side evaluators that run automatically on every trace.Step 5: Validate and remove Langfuse
Validate traces
- Run your application with typical workloads
- Compare traces side by side:
- Langfuse: your self-hosted or cloud instance
- HoneyHive: app.honeyhive.ai
- Verify that spans, metadata, and timing match
Complete the switch
Confirm traces and evaluations appear correctly in HoneyHive after removing Langfuse.
API mapping quick reference
| Langfuse | HoneyHive | Notes |
|---|---|---|
@observe() | @trace() | Function decorator for creating spans |
langfuse_context.observe() | @trace() (nested) | Child spans via nested decorators |
span.update(output=...) | enrich_span(outputs=...) | Set span output |
langfuse_context.update_current_observation() | enrich_span(metadata=...) | Attach metadata |
langfuse.score() | enrich_span(metrics=...) | Record metrics and scores |
langfuse.flush() | Not needed | HoneyHive auto-flushes |
from langfuse.openai import openai | OpenAI() + instrumentor | BYOI pattern, no patching |
Data migration field reference
When migrating historical Langfuse data to HoneyHive, each Langfuse object type maps to a HoneyHive equivalent. Use this reference alongside your migration script.Object type mapping
| Langfuse object | HoneyHive object | API endpoint |
|---|---|---|
| Trace | Session | /session/start |
| Generation | Event (model) | /events |
| Span | Event (chain) | /events |
| Event | Event (tool) | /events |
| Score | Session metadata | /session/start |
Event type mapping
| Langfuse type | HoneyHive event_type |
|---|---|
| Trace | session |
| GENERATION | model |
| SPAN | chain |
| EVENT | tool |
Trace to Session
Langfuse traces become HoneyHive sessions.| Langfuse field | HoneyHive field | Transformation |
|---|---|---|
| (auto) | session_id | Generated UUID |
id | metadata.langfuse_trace_id | Direct |
id | metadata.langfuse_original_id | Direct |
name | session_name | Direct |
userId | user_properties.user_id | Wrapped |
sessionId | external_id | Direct |
input | inputs | Direct |
output | outputs | Direct |
metadata | metadata | Merged |
tags | metadata.tags | Moved |
version | metadata.version | Moved |
release | metadata.release | Moved |
| (auto) | source | Set to "langfuse" |
| (auto) | event_type | Set to "session" |
| (auto) | project | From config |
| (auto) | metadata.is_session | Set to true |
Generation to Event (model)
Langfuse generations become HoneyHive model events. LLM-specific fields like model name, token counts, and cost are preserved.| Langfuse field | HoneyHive field | Transformation |
|---|---|---|
| (auto) | event_id | Generated UUID |
traceId | session_id | Mapped via trace_id_to_session_id |
id | metadata.langfuse_observation_id | Direct |
name | event_name | Direct (default: "generation") |
| (auto) | event_type | Set to "model" |
model | config.model | Moved |
modelParameters | config.hyperparameters | Moved |
modelParameters.provider | config.provider | Extracted |
input | inputs.messages | String converted to message array |
prompt | inputs.messages | String converted to message array |
output | outputs.text | String extraction |
completion | outputs.text | Direct |
promptTokens | usage.prompt_tokens | Renamed |
completionTokens | usage.completion_tokens | Renamed |
totalTokens | usage.total_tokens | Renamed |
calculatedTotalCost | cost | Direct |
startTime | start_time | ISO 8601 to Unix ms |
endTime | end_time | ISO 8601 to Unix ms |
| (auto) | latency_ms | Calculated: end_time - start_time |
| (auto) | duration | Same as latency_ms |
level | status | "ERROR" becomes "error", else "success" |
statusMessage | error | When level = "ERROR" |
metadata | metadata | Merged |
traceId | metadata.langfuse_trace_id | Direct |
| (auto) | metadata.observation_type | Set to "GENERATION" |
level | metadata.level | Direct |
| (auto) | source | Set to "langfuse" |
| (auto) | project | From config |
Input and output transformations
Input and output transformations
Input transformation:
Output transformation:
| Langfuse input type | HoneyHive output |
|---|---|
| String | {"messages": [{"role": "user", "content": "<string>"}]} |
| Array of messages | {"messages": <array>} |
| Object with messages | Direct passthrough |
| null or missing | {} |
| Langfuse output type | HoneyHive output |
|---|---|
| String | {"text": "<string>"} |
| Object | Direct passthrough |
| null or missing | {} |
Span / Event to Event (chain or tool)
Langfuse spans become HoneyHive chain events; Langfuse events become tool events.| Langfuse field | HoneyHive field | Transformation |
|---|---|---|
| (auto) | event_id | Generated UUID |
traceId | session_id | Mapped via trace_id_to_session_id |
id | metadata.langfuse_observation_id | Direct |
name | event_name | Direct (default: "span") |
type | event_type | "SPAN" becomes "chain", "EVENT" becomes "tool" |
input | inputs | Direct |
output | outputs | Direct |
startTime | start_time | ISO 8601 to Unix ms |
endTime | end_time | ISO 8601 to Unix ms |
level | status | "ERROR" becomes "error", else "success" |
statusMessage | error | When level = "ERROR" |
metadata | metadata | Merged |
traceId | metadata.langfuse_trace_id | Direct |
| (auto) | metadata.observation_type | Set to "SPAN" or "EVENT" |
level | metadata.level | Direct |
| (auto) | source | Set to "langfuse" |
| (auto) | project | From config |
Score to Session metadata
Langfuse scores are stored as session metadata. HoneyHive does not persist top-levelfeedback or metrics via /session/start, so scores are placed in the metadata object.
| Langfuse field | HoneyHive field | Transformation |
|---|---|---|
traceId | (lookup) | Used to find session_id via mapping |
id | metadata.langfuse_scores[].id | Direct |
observationId | metadata.langfuse_scores[].observation_id | Direct |
name | metadata.langfuse_scores[].name | Direct |
value | metadata.langfuse_scores[].value | Direct |
source | metadata.langfuse_scores[].source | Direct |
comment | metadata.langfuse_scores[].comment | Direct |
traceId | metadata.langfuse_scores[].trace_id | Direct |
| HoneyHive field | Derivation |
|---|---|
metadata.langfuse_score_feedback | Object with {score_name: {value, source}} |
metadata.langfuse_score_metrics | Object with {score_name: numeric_value} |
metadata.langfuse_score_count | Count of scores |
metadata.has_feedback | true if scores exist |
Data type transformations
Timestamps: ISO 8601 strings are converted to Unix milliseconds. Token fields (camelCase to snake_case):| Langfuse | HoneyHive |
|---|---|
promptTokens | prompt_tokens |
completionTokens | completion_tokens |
totalTokens | total_tokens |
Langfuse level | HoneyHive status |
|---|---|
"ERROR" | "error" |
| Any other value | "success" |
ID management
| ID type | Strategy |
|---|---|
session_id | Generated UUID |
event_id | Generated UUID |
| Original Langfuse IDs | Preserved in metadata fields |
trace_id_to_session_id dictionary that maps each Langfuse trace_id to its generated HoneyHive session_id. This mapping links events to sessions and attaches scores to the correct sessions.
Known limitations
Score migration limitations
Score migration limitations
- In-memory mapping: Scores can only attach to sessions migrated in the same run.
- Separate pagination: Traces and scores use independent pagination. A trace on page 19 may have scores on page 39.
- No native score storage: Scores are stored in
metadatasince HoneyHive does not persistfeedback/metricsat the top level via/session/start.
Data not migrated
Data not migrated
| Langfuse field | Reason |
|---|---|
public | No equivalent in HoneyHive |
bookmarked | No equivalent in HoneyHive |
createdAt / updatedAt | HoneyHive uses its own timestamps |
| Prompt templates | Different architecture |
| Dataset items | Different architecture |
| Annotation queues | Not supported in migration script |
Troubleshooting
Traces not appearing
Symptom: Application runs but no traces show in HoneyHive.-
Verify your API key is set:
-
Check initialization order. HoneyHive must initialize before other imports:
Missing child spans
Symptom: Parent traces appear but nested spans are missing. Use nested@trace decorators:
Evaluation scores not syncing
Symptom: Langfuse scores do not appear in HoneyHive. Langfuse scores are not migrated automatically. Recreate them using one of these approaches:- Simple metrics:
enrich_span(metrics={...})in your code - LLM evaluations: Configure server-side evaluators in the HoneyHive dashboard
- Human review: Set up annotation queues in HoneyHive
Next steps
LLM evaluators
Set up LLM-as-judge evaluators for automated quality scoring
Annotation queues
Create human review workflows for expert evaluation
Alerts and monitoring
Configure production alerts for quality degradation
Custom dashboards
Build custom metrics dashboards
Self-hosting Langfuse? HoneyHive offers dedicated cloud and self-hosted options with enterprise support. Contact sales@honeyhive.ai for migration assistance.

