HoneyHive Python SDK
A comprehensive Python SDK for HoneyHive, providing LLM observability, evaluation, and tracing capabilities with OpenTelemetry integration.
🚀 Features
- OpenTelemetry Integration - Full OTEL compliance with custom span processor and exporter
- Automatic Session Management - Seamless session creation and management
- Decorator Support - Easy-to-use
@trace(unified sync/async),@atrace, and@trace_classdecorators - Context Managers -
start_spanandenrich_spanfor manual span management - HTTP Instrumentation - Automatic HTTP request tracing
- Baggage Support - Context propagation across service boundaries
- Experiment Harness Integration - Automatic experiment tracking with MLflow, Weights & Biases, and Comet support
- Real-time API Integration - Direct integration with HoneyHive backend services
- Comprehensive Testing - Full test suite with 203 passing tests
📦 Installation
Choose Your Instrumentor Type:
HoneyHive supports both OpenInference (lightweight) and OpenLLMetry (enhanced metrics) instrumentors.
Option A: OpenInference (Recommended for Beginners)
# Install with OpenAI integration (most common)
pip install honeyhive[openinference-openai]
# Install with Anthropic integration
pip install honeyhive[openinference-anthropic]
# Install with Google AI integration
pip install honeyhive[openinference-google-ai]
# Install with multiple providers
pip install honeyhive[openinference-openai,openinference-anthropic,openinference-google-ai]
# Install all OpenInference integrations
pip install honeyhive[all-openinference]
Option B: OpenLLMetry (Enhanced Metrics)
# Install with OpenAI integration (enhanced metrics)
pip install honeyhive[traceloop-openai]
# Install with Anthropic integration
pip install honeyhive[traceloop-anthropic]
# Install with Google AI integration
pip install honeyhive[traceloop-google-ai]
# Install with multiple providers
pip install honeyhive[traceloop-openai,traceloop-anthropic,traceloop-google-ai]
# Install all OpenLLMetry integrations
pip install honeyhive[all-traceloop]
Option C: Mix Both Types
# Strategic mixing based on your needs
pip install honeyhive[traceloop-openai,openinference-anthropic]
Basic Installation (manual instrumentor setup required):
pip install honeyhive
📋 Including in Your Project
For detailed guidance on including HoneyHive in your pyproject.toml, see our pyproject.toml Integration Guide.
🔧 Quick Start
Basic Usage
from honeyhive import HoneyHiveTracer, trace
# Initialize tracer
tracer = HoneyHiveTracer.init(
api_key="your-api-key",
source="production"
)
# Use unified decorator for automatic tracing (works with both sync and async)
@trace(event_type="demo", event_name="my_function")
def my_function():
return "Hello, World!"
@trace(event_type="demo", event_name="my_async_function")
async def my_async_function():
await asyncio.sleep(0.1)
return "Hello, Async World!"
# Manual span management
with tracer.start_span("custom-operation"):
# Your code here
pass
# With HTTP tracing enabled (new simplified API)
tracer = HoneyHiveTracer.init(
api_key="your-api-key",
source="production",
disable_http_tracing=False # project derived from API key
)
Initialization
The HoneyHiveTracer.init() method is the recommended way to initialize the tracer:
from honeyhive import HoneyHiveTracer
# Standard initialization
tracer = HoneyHiveTracer.init(
api_key="your-api-key",
source="production" # project derived from API key
)
# With custom server URL for self-hosted deployments
tracer = HoneyHiveTracer.init(
api_key="your-api-key",
source="production",
server_url="https://custom-server.com" # project derived from API key
)
Enhanced Features Available
from honeyhive import HoneyHiveTracer
from openinference.instrumentation.openai import OpenAIInstrumentor
# All features are available in the init method
tracer = HoneyHiveTracer.init(
api_key="your-api-key",
source="production",
test_mode=True, # Test mode support
instrumentors=[OpenAIInstrumentor()], # Auto-integration
disable_http_tracing=True # Performance control
)
✅ The init method now supports ALL constructor features!
OpenInference Integration
from honeyhive import HoneyHiveTracer
from openinference.instrumentation.openai import OpenAIInstrumentor
# Initialize tracer with OpenInference instrumentor (recommended pattern)
tracer = HoneyHiveTracer.init(
api_key="your-api-key",
source="production",
instrumentors=[OpenAIInstrumentor()] # Auto-integration
)
# OpenInference automatically traces OpenAI calls
import openai
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Hello!"}]
)
Enriching Spans and Sessions
v1.0+ Recommended Pattern: Instance Methods
from honeyhive import HoneyHiveTracer
# Initialize tracer
tracer = HoneyHiveTracer.init(
api_key="your-api-key",
)
# Use instance methods for enrichment (PRIMARY - Recommended)
@tracer.trace(event_type="tool")
def my_function(input_data):
result = process_data(input_data)
# ✅ Instance method (PRIMARY pattern in v1.0+)
tracer.enrich_span(
metadata={"input": input_data, "result": result},
metrics={"processing_time_ms": 150}
)
return result
# Enrich session with user properties
tracer.enrich_session(
user_properties={"user_id": "user-123", "plan": "premium"}
)
Legacy Pattern: Free Functions (Backward Compatibility)
For backward compatibility, the free function pattern from v0.2.x still works:
from honeyhive import trace, enrich_span, enrich_session
# Free functions with automatic tracer discovery (LEGACY)
@trace(event_type="tool")
def my_function(input_data):
result = process_data(input_data)
# Free function with auto-discovery (backward compatible)
enrich_span(
metadata={"input": input_data, "result": result},
metrics={"processing_time_ms": 150}
)
return result
# Enrich session via free function
enrich_session(user_properties={"user_id": "user-123"})
⚠️ Deprecation Notice: Free functions will be deprecated in v2.0. We recommend migrating to instance methods for new code.
Why Instance Methods?
- ✅ Explicit tracer reference (no auto-discovery overhead)
- ✅ Better multi-instance support (multiple tracers in same process)
- ✅ Clearer code (explicit is better than implicit)
- ✅ Future-proof (primary pattern going forward)
🏗️ Architecture
Core Components
src/honeyhive/
├── api/ # API client implementations
│ ├── client.py # Main API client
│ ├── configurations.py # Configuration management
│ ├── datapoints.py # Data point operations
│ ├── datasets.py # Dataset operations
│ ├── events.py # Event management
│ ├── evaluations.py # Evaluation operations
│ ├── metrics.py # Metrics operations
│ ├── projects.py # Project management
│ ├── session.py # Session operations
│ └── tools.py # Tool operations
├── tracer/ # OpenTelemetry integration
│ ├── otel_tracer.py # Main tracer implementation
│ ├── span_processor.py # Custom span processor
│ ├── span_exporter.py # Custom span exporter
│ ├── decorators.py # Tracing decorators
│ └── http_instrumentation.py # HTTP request tracing
├── evaluation/ # Evaluation framework
│ └── evaluators.py # Evaluation decorators
├── models/ # Pydantic models
│ └── generated.py # Auto-generated from OpenAPI
└── utils/ # Utility functions
├── config.py # Configuration management
├── connection_pool.py # HTTP connection pooling
├── retry.py # Retry mechanisms
└── logger.py # Logging utilities
Key Design Principles
- Singleton Pattern - Single tracer instance per application
- Environment Configuration - Flexible configuration via environment variables
- Graceful Degradation - Fallback mechanisms for missing dependencies
- Test Isolation - Comprehensive test suite with proper isolation
- OpenTelemetry Compliance - Full OTEL standard compliance
⚙️ Configuration
API keys
The HoneyHive API client selects a credential per operation:
| Key | Environment variable | HoneyHive() parameter |
Used for |
|---|---|---|---|
Data plane fine-grained (hh_fgdp_) |
HH_DATA_PLANE_API_KEY |
data_plane_api_key |
Operations on a project-scoped route (/v1/projects/{project_id}/...). On a method with legacy and scoped routes, passing project_id selects the scoped route |
Ingestion (hh_ingst_) |
HH_INGESTION_API_KEY |
ingestion_api_key |
Creating sessions and writing events |
Classic project (hh_, or hh_ro_ for reads) |
HH_API_KEY |
api_key |
Other operations, and ingestion when no ingestion key is set |
See API Keys to create the credentials your workload needs. A tracing-only process can use an ingestion key alone. Data plane fine-grained keys cannot send telemetry.
Data plane API key
Set HH_DATA_PLANE_API_KEY to a complete hh_fgdp_ key, or pass data_plane_api_key to HoneyHive(). For supported methods, pass project_id even when the key is rooted at that project:
import os
from honeyhive import HoneyHive
client = HoneyHive()
charts = client.charts.list(project_id=os.environ["PROJECT_ID"])
print(charts.data)
This example requires project.chart.list. Set PROJECT_ID to the project ID from Settings > Project > API Keys > Data Plane. Set HH_API_URL or pass base_url to HoneyHive() if the project's data plane URL differs from the default.
For a method with both legacy and scoped routes, omitting project_id selects the legacy route and classic project key, even if a data plane key is configured. Omitting project_id from such a method is deprecated. Passing project_id selects the scoped route and requires a data plane key; there is no fallback to api_key or HH_API_KEY. See the credential matrix.
A wrong key type or incomplete value in data_plane_api_key or ingestion_api_key (or their environment variables) raises ValueError at initialization. A call whose required credential is absent raises MissingApiKeyError before sending a request.
Environment Variables
| Variable | Description | Default |
|---|---|---|
HH_API_KEY |
Classic project API key for operations that still require it; also used for ingestion when HH_INGESTION_API_KEY is unset |
Required for classic project-key operations |
HH_INGESTION_API_KEY |
Ingestion API key (hh_ingst_...) used to send traces and events; HH_API_KEY is used when unset |
Optional |
HH_DATA_PLANE_API_KEY |
Fine-grained data plane API key (hh_fgdp_...) for operations on a project-scoped route |
Required when project_id selects a method's scoped route |
HH_API_URL |
API base URL | https://api.dp1.us.honeyhive.ai |
HH_SOURCE |
Source environment | production |
HH_DISABLE_TRACING |
Disable tracing completely | false |
HH_DISABLE_HTTP_TRACING |
Disable HTTP request tracing | false |
HH_TEST_MODE |
Enable test mode | false |
HH_DEBUG_MODE |
Enable debug mode | false |
HH_VERBOSE |
Enable verbose API logging | false |
HH_OTLP_ENABLED |
Enable OTLP export | true |
Experiment Harness Variables
| Variable | Description | Default |
|---|---|---|
HH_EXPERIMENT_ID |
Unique experiment identifier | None |
HH_EXPERIMENT_NAME |
Human-readable experiment name | None |
HH_EXPERIMENT_VARIANT |
Experiment variant/treatment | None |
HH_EXPERIMENT_GROUP |
Experiment group/cohort | None |
HH_EXPERIMENT_METADATA |
JSON experiment metadata | None |
HTTP Client Configuration
| Variable | Description | Default |
|---|---|---|
HH_MAX_CONNECTIONS |
Maximum HTTP connections | 100 |
HH_MAX_KEEPALIVE_CONNECTIONS |
Keepalive connections | 20 |
HH_KEEPALIVE_EXPIRY |
Keepalive expiry (seconds) | 30.0 |
HH_POOL_TIMEOUT |
Connection pool timeout | 30.0 |
HH_RATE_LIMIT_CALLS |
Rate limit calls per window | 1000 |
HH_RATE_LIMIT_WINDOW |
Rate limit window (seconds) | 60.0 |
HH_HTTP_PROXY |
HTTP proxy URL | None |
HH_HTTPS_PROXY |
HTTPS proxy URL | None |
HH_NO_PROXY |
Proxy bypass list | None |
HH_VERIFY_SSL |
SSL verification | true |
🤝 Contributing
Want to contribute to HoneyHive? See CONTRIBUTING.md for development setup and guidelines.
Metadata
Release files for honeyhive 1.8.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| honeyhive-1.8.0.tar.gz | 1.1 MB | Without provenance | Details for honeyhive-1.8.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| honeyhive-1.8.0-py3-none-any.whl | Python 3 | none | any | Details for honeyhive-1.8.0-py3-none-any.whl |
Total release size: 1.6 MB
Release files / honeyhive-1.8.0.tar.gz
| Download URL | honeyhive-1.8.0.tar.gz |
|---|---|
| Size | 1.1 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
db40887cd31623036cb49d4e894dd8707a00fc555654c127d29187732156be35
|
|
BLAKE2b-256 checksum How to use checksums |
ed8bbbfdd649fbe5f52098e096e37260cd0c8ba7bd882598470ae7423f4c179c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.17
|
Release files / honeyhive-1.8.0-py3-none-any.whl
| Download URL | honeyhive-1.8.0-py3-none-any.whl |
|---|---|
| Size | 492.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9e81ddb7fd8e814d221a5f07fe0efd284811ea37e3e0096cb6605d1ddc9c52c2
|
|
BLAKE2b-256 checksum How to use checksums |
3cb77eba99b09b33da1d4565d1b7ed29f72cee9418d1a7041d6acf4f7a98cad5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.17
|
Security for honeyhive 1.8.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.