Potato vs LangSmith and Langfuse for Agent Evaluation: A Practical Comparison
Compare Potato with LangSmith and Langfuse for AI agent evaluation across trace rendering, annotation, coding agent support, live observation, pricing, and self-hosting.
Three Tools, Three Philosophies
Potato, LangSmith, and Langfuse all touch agent evaluation, but they come at it from different starting points:
- Potato is annotation-first. It was built for collecting structured human judgments on AI outputs, then extended to support agent traces, coding diffs, and live observation. Its strength is the depth and configurability of its annotation schemas.
- LangSmith is observability-first. It was built to instrument, trace, and debug LangChain applications in production. Its annotation features came later, to support evaluation workflows inside the LangChain ecosystem.
- Langfuse is open-source observability. It covers tracing, prompt management, and evaluation for any LLM application. Its annotation features work but are secondary to its monitoring.
None of these is universally better. The right choice depends on whether you mainly need annotation, observability, or both, and whether you are committed to a particular framework ecosystem.
Feature Comparison
The table below compares capabilities relevant to AI agent evaluation. We include Label Studio, Argilla, and Scale AI as well, since teams often weigh those too.
| Feature | Potato | LangSmith | Langfuse | Label Studio | Argilla | Scale AI |
|---|---|---|---|---|---|---|
| Primary purpose | Annotation | Observability | Observability | Annotation | Annotation | Annotation |
| Trace format support | 13 formats | LangChain native | Langfuse SDK | None | None | Custom |
| Per-step annotation | Full (trajectory_eval) | Limited (score per run) | Limited (score per trace) | No | No | Custom |
| Real-time agent observation | Yes | No | No | No | No | No |
| Agent pause/resume/takeover | Yes | No | No | No | No | No |
| Code diff rendering | Yes (unified diff, syntax highlighting) | No | No | No | No | No |
| Terminal output rendering | Yes (ANSI color support) | No | Partial | No | No | No |
| PRM data collection | Yes (step-level correctness labels) | No | No | No | No | No |
| Code review with inline comments | Yes (line-level, categorized) | No | No | No | No | No |
| Pairwise comparison | 3 modes (side-by-side, sequential, blind) | Limited (1 mode) | No | No | Yes (1 mode) | Yes (1 mode) |
| Multi-criteria rubric | Yes (configurable dimensions, scales) | No | No | No | Partial | Yes |
| Error taxonomy | Hierarchical, configurable | No | No | No | No | Custom |
| Severity scoring | Yes (weighted, running score) | No | Numeric scores only | No | No | Custom |
| Self-hosted | Yes (fully) | No (cloud only) | Yes (open source) | Yes (open source) | Yes (open source) | No (managed) |
| Free | Yes (fully open source) | No (free tier limited) | Partial (open source core) | Partial (open source core) | Yes (open source) | No |
| Framework lock-in | None | LangChain ecosystem | None | None | None | None |
Among these tools, Potato is the only one that renders coding agent traces with proper diff formatting:
Potato's CodingTraceDisplay with unified diff rendering, syntax highlighting, and file tree
Trace Format Support in Detail
One of the biggest practical differences is how many agent trace formats each tool supports natively.
Potato includes converters for 13 formats:
# See all available converters
python -m potato.convert_traces --list-formats
# Available formats:
# react - ReAct-style (Thought/Action/Observation)
# openai - OpenAI function calling / tool use
# anthropic - Anthropic Messages API with tool_use
# langchain - LangChain run traces
# langfuse - Langfuse trace exports
# langsmith - LangSmith dataset exports
# autogen - Microsoft AutoGen conversations
# crewai - CrewAI task outputs
# swe_agent - SWE-Agent trajectories
# claude_code - Claude Code session logs
# aider - Aider chat histories
# webarena - WebArena episode traces
# custom - User-defined format with mapping configLangSmith works natively with LangChain traces. If your agent is built with LangChain or LangGraph, traces flow in automatically. If not, you need to manually instrument your code with the LangSmith SDK or convert your traces to LangSmith's format.
Langfuse works natively with traces instrumented via the Langfuse SDK. It supports Python, JavaScript, and has integrations with LangChain, LlamaIndex, and OpenAI. Like LangSmith, it requires instrumentation at the code level rather than post-hoc trace conversion.
Importing LangSmith or Langfuse Traces into Potato
If you already have traces in LangSmith or Langfuse and want to use Potato's annotation features, the converters handle this:
# Export from LangSmith and convert
python -m potato.convert_traces \
--input langsmith_export.jsonl \
--output data/traces.jsonl \
--format langsmith
# Export from Langfuse and convert
python -m potato.convert_traces \
--input langfuse_traces.json \
--output data/traces.jsonl \
--format langfuseSo you can keep LangSmith or Langfuse for production monitoring and bring traces into Potato when you want detailed human evaluation.
Per-Step Annotation: Where the Gap Is Widest
The most significant capability difference is in per-step annotation depth.
Potato provides the trajectory_eval schema with:
- Step-level correctness labels (correct/incorrect)
- Hierarchical error taxonomy selection
- Severity levels with configurable weights
- Running score that updates per step
- Free-text rationale per step
- All of this is configurable via YAML
# Potato: rich per-step annotation
annotation_schemes:
- annotation_type: "trajectory_eval"
name: "step_eval"
step_correctness:
labels: ["correct", "incorrect"]
error_taxonomy:
- category: "reasoning"
types:
- name: "logical_error"
- name: "incorrect_assumption"
- category: "action"
types:
- name: "wrong_tool"
- name: "wrong_arguments"
severity_levels:
- name: "minor"
weight: -1
- name: "major"
weight: -5
- name: "critical"
weight: -10
running_score:
initial: 100LangSmith allows you to attach a numeric score or a categorical label to individual runs within a trace. This is useful for basic quality tracking but does not support error taxonomies, severity weighting, or running scores. There is no built-in per-step review interface; you score runs from the trace detail view.
Langfuse supports scoring at the trace level and at the observation (span) level. You can attach numeric or categorical scores. Like LangSmith, there is no structured error taxonomy or severity system. Scores are flat key-value pairs.
If you need detailed per-step evaluation, say for building PRM training data or diagnosing where an agent fails, Potato is the only one of the three with tooling built for it.
Coding Agent Support
Evaluating coding agents (Claude Code, Aider, SWE-Agent, Devin, OpenHands) means rendering code diffs and terminal output so review goes quickly. This is where Potato pulls ahead of the others.
Potato renders:
- Unified diffs with red/green highlighting and syntax highlighting
- Terminal output with ANSI color code support
- Inline diff comments anchored to specific lines
- File-level quality ratings
- PR-style approve/request-changes verdicts
LangSmith displays tool call inputs and outputs as formatted JSON. Code diffs appear as raw text strings within tool outputs. There is no diff rendering, syntax highlighting, or inline commenting.
Langfuse similarly displays trace data as structured JSON. Code content appears as plain text. No specialized rendering for diffs or terminal output.
For coding agents, this changes the reviewer's day. Reviewing a 50-line diff in a syntax-highlighted unified diff view with inline commenting takes a fraction of the time it takes to read the same diff as a JSON string.
Web agent traces include screenshots with SVG overlays and filmstrip navigation:
Web agent trace viewer showing screenshots with SVG action overlays and filmstrip navigation
Live Agent Observation
Potato can observe a running agent in real time, which neither LangSmith nor Langfuse do in their annotation workflows.
In Potato's live observation mode, an annotator can watch the agent work step by step, pause it to review its current state, resume it afterward, and take over the session to correct course or finish the task by hand.
This helps in a few situations: stopping an agent before it does something destructive (safety), recording human corrections as demonstration data (training), and seeing how an agent responds when you intervene mid-stream (interactive evaluation).
# Enable live observation in Potato config
live_observation:
enabled: true
agent_endpoint: "http://localhost:5000/agent"
allow_pause: true
allow_takeover: true
auto_pause_on:
- action_type: "delete"
- action_type: "execute"
- confidence_below: 0.3LangSmith and Langfuse are designed for post-hoc analysis of completed traces, not real-time interaction with running agents.
Pairwise Comparison
Comparing two agent outputs side by side is a common evaluation pattern, especially for A/B testing model versions or comparing agent architectures.
Potato offers three comparison modes:
- Side-by-side: Both traces visible simultaneously, synced scrolling
- Sequential: View trace A first, then trace B, then judge
- Blind: Traces are randomly labeled "A" and "B" with no model attribution
annotation_schemes:
- annotation_type: "pairwise"
name: "comparison"
mode: "side_by_side" # or "sequential" or "blind"
labels:
- name: "A is better"
- name: "B is better"
- name: "Tie"
criteria:
- "Which agent completed the task more efficiently?"
- "Which agent's output is higher quality?"LangSmith supports basic pairwise comparison through its "comparison view" in evaluation experiments. You can compare runs across different model versions, but the interface is designed for side-by-side run inspection rather than structured preference annotation.
Langfuse does not have a built-in pairwise comparison feature for annotation.
When to Use Each Tool
Use Potato when:
- Annotation is your primary goal: You need structured human judgments, not just monitoring
- You need coding agent support: Diff rendering, inline comments, terminal output display
- You are collecting PRM training data: Step-level correctness labels with running scores
- You need self-hosting: Data stays on your infrastructure, no cloud dependency
- You work with multiple agent frameworks: 13 trace format converters vs. single-framework lock-in
- You need rich evaluation schemas: Trajectory eval, rubric eval, code review, pairwise comparison
- Budget is a constraint: Fully free and open source
Use LangSmith when:
- You are already using LangChain/LangGraph: Traces flow in automatically with zero configuration
- Production monitoring is your primary need: Real-time tracing, latency tracking, cost monitoring
- Annotation is secondary: You need basic scoring and feedback, not deep evaluation schemas
- You want a managed service: No infrastructure to maintain
- Your team is small: The free tier may be sufficient for light evaluation
Use Langfuse when:
- You need open-source observability: Self-hosted monitoring and tracing
- You use multiple LLM providers: Good integrations across OpenAI, Anthropic, LangChain, LlamaIndex
- Annotation is not your primary use case: Scoring is available but not the focus
- You want prompt management alongside tracing: Langfuse bundles prompt versioning with observability
- You need a free alternative to LangSmith for monitoring: Langfuse's open-source core covers most monitoring needs
The Complementary Approach: Observability + Annotation
For many teams, the practical setup is to run an observability tool (LangSmith or Langfuse) for production monitoring and Potato for detailed human evaluation. The workflow looks like this:
- Instrument your agent with LangSmith or Langfuse for production tracing
- Sample traces that need human review (failures, edge cases, random samples)
- Export those traces from your observability tool
- Convert and import into Potato using the built-in converters
- Run human evaluation with Potato's rich annotation schemas
- Feed results back into your development cycle
# Example: sample 100 failed traces from Langfuse and import to Potato
python -m potato.convert_traces \
--input langfuse_failed_traces.json \
--output data/traces_to_review.jsonl \
--format langfuse \
--sample 100That gives you the real-time visibility of an observability platform alongside the annotation depth of a tool built for annotation.
Key Differentiators Summary
Among free, self-hosted tools, Potato is the only one that combines all of these:
- Coding agent diff rendering with syntax highlighting and inline comments
- Process reward model (PRM) data collection with step-level correctness and severity labels
- Live coding agent observation with pause, resume, and takeover
- 13-format trace conversion for agents built with any framework
- Hierarchical error taxonomies with severity-weighted running scores
- Three pairwise comparison modes (side-by-side, sequential, blind)
- Multi-criteria rubric evaluation with configurable dimensions and scales
- GitHub PR-style code review with categorized inline comments and verdicts
We're not aware of another tool, open source or commercial, that bundles all of this. LangSmith and Langfuse are strong observability tools, but they are not annotation tools. Label Studio and Argilla are general annotation tools without agent-specific features. Scale AI offers managed annotation, but it costs money and lacks the self-hosting and customization research teams tend to want.
If your goal is to understand how and why your agents succeed or fail, and to collect the training data to improve them, Potato covers a gap the others leave open.
Migration Paths
From LangSmith to Potato (for annotation)
# 1. Export your dataset from LangSmith
langsmith export dataset my_eval_dataset -o langsmith_data.jsonl
# 2. Convert to Potato format
python -m potato.convert_traces \
--input langsmith_data.jsonl \
--output data/traces.jsonl \
--format langsmith
# 3. Create your Potato config and start annotating
potato start config.yaml -p 8000From Langfuse to Potato (for annotation)
# 1. Export traces from Langfuse via API
import requests
response = requests.get(
"https://cloud.langfuse.com/api/public/traces",
headers={"Authorization": "Bearer your_api_key"},
params={"limit": 500}
)
with open("langfuse_traces.json", "w") as f:
json.dump(response.json()["data"], f)# 2. Convert to Potato format
python -m potato.convert_traces \
--input langfuse_traces.json \
--output data/traces.jsonl \
--format langfuse
# 3. Start annotating
potato start config.yaml -p 8000From Label Studio or Argilla (for agent evaluation)
If you are currently using Label Studio or Argilla for general annotation and want to add agent evaluation capabilities, Potato can run alongside your existing tool. Use Label Studio or Argilla for your non-agent annotation tasks (NER, classification, etc.) and Potato for agent-specific evaluation that requires trace rendering, per-step annotation, and code review.
Conclusion
Choosing between Potato, LangSmith, and Langfuse is not about which is best in the abstract. It depends on what you mainly need:
- To monitor agents in production, use LangSmith or Langfuse.
- To evaluate agent behavior with structured human annotation, use Potato.
- If you need both, run them together. They complement each other.
The question to ask is whether your main goal is to observe what agents do or to evaluate how well they do it. If it's evaluation, Potato is built for that.
For a fuller side-by-side, see the comparison documentation and the agent evaluation guide.