evaluate() produces fully traced sessions using the same OpenTelemetry infrastructure as production, so evaluation and observability aren’t separate workflows - they’re the same system.
For a hands-on walkthrough, see the Experiments Quickstart. To reuse datasets stored in HoneyHive, see Run Experiments with HoneyHive Datasets.
Experiment Structure
Every experiment combines three independent parts:
The function is whatever you’re trying to evaluate - a single LLM call, a RAG pipeline, a multi-agent system, or an API wrapper around an external service. It receives a datapoint and returns an output dict. There are no constraints on what happens inside: call models, query databases, invoke tools, orchestrate sub-agents. If your code can run it,
evaluate() can test it.
These three components are deliberately decoupled. You can reuse a dataset across multiple functions, run the same function against different datasets, and swap evaluators without changing anything else.
Here’s a complete example:
Built-in Tracing
When you callevaluate(), your function is automatically traced using HoneyHive’s OpenTelemetry-based tracing. Every datapoint execution produces a full traced session, identical in structure to production traces, with no additional setup.
This means all tracing primitives work inside your function:
- Auto-instrumentation - LLM calls via OpenAI, Anthropic, etc. are captured automatically if you’ve configured instrumentors
- Custom spans - Use
@traceto create spans for any step in your pipeline - Enrichment - Call
enrich_span()to attach metrics, metadata, or feedback to any span - Nested traces - Multi-agent orchestration, sub-agent calls, and tool chains are traced with full parent-child relationships
Evaluator Types
HoneyHive supports four evaluator types, differentiated by what runs the evaluation logic.
For implementation details: Code | LLM | Human | Composite
Client-Side vs Server-Side
Evaluators can run in two places, each with a different interface and different tradeoffs. This is the most important architectural distinction in the evaluation system.Client-side evaluators
Run in your environment duringevaluate(). You define them as Python functions and pass them directly:
(outputs, inputs, ground_truth) → score
Use when: You need custom libraries, proprietary models, access to local resources, or are working with sensitive data that shouldn’t leave your environment.
Server-side evaluators
Configured in the HoneyHive UI and run on HoneyHive’s infrastructure. When enabled, they execute automatically on every trace that matches your event filters, both production and experiment traces, without any code changes.event dict (for Python evaluators) or {{ }} template syntax (for LLM evaluators)
The property keys (like
result, query) depend on how your functions are traced. Click Show Schema in the evaluator console to see available fields for your events.Choosing between them
You can use both together. A common pattern: client-side evaluators for experiment-specific scoring, server-side evaluators for baseline checks (toxicity, format, PII) that run on all traces automatically.
Evaluation Scope
Evaluators can target different levels of your application.
For multi-step pipelines like RAG, combine both:
answer_quality at the session level and num_docs, answer_length at individual span levels.
Human Review
Automated evaluators handle measurable dimensions, but some assessments need human judgment. HoneyHive provides two ways to add human evaluation to your experiments:Review Mode
Open any experiment run and click Review Mode to annotate results directly. You can review the full session output or drill into any individual span within a trace, such as a specific sub-agent’s response or a retrieval step. Each span can be annotated independently.Annotation Queues
For systematic review, create an annotation queue that filters specific events for targeted annotation. Queues can target full sessions or specific nested events (e.g., only thegenerate_response span in a RAG pipeline, or a particular sub-agent’s output). Events matching your filter criteria are routed to the queue automatically.
Both approaches use annotation fields defined by Human Evaluators, such as quality ratings, categorical labels, or free-text feedback. Create human evaluators first to configure what your team will assess.
Next Steps
Run Your First Experiment
Hands-on tutorial with a real example
Run with HoneyHive Datasets
Use
dataset_id to run against HoneyHive datasetsClient-Side Evaluators
Write evaluator functions for experiments
Server-Side Evaluators
Configure Python evaluators in the HoneyHive UI
LLM Evaluators
Use LLMs for subjective quality assessment
Compare Experiments
Identify improvements and regressions across runs
Annotation Queues
Set up human review workflows

