# Create a new chart Source: https://docs.honeyhive.ai/v2/api-reference-autogen/charts/create-a-new-chart https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/projects/{project_id}/charts Create a chart in a project. # Create a new chart (deprecated) Source: https://docs.honeyhive.ai/v2/api-reference-autogen/charts/create-a-new-chart-deprecated https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/charts Deprecated. Use `POST /v1/projects/{project_id}/charts` with a data plane API key instead. # Delete a chart Source: https://docs.honeyhive.ai/v2/api-reference-autogen/charts/delete-a-chart https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml delete /v1/projects/{project_id}/charts/{chart_id} Delete a chart from a project, removing it from the project's dashboards. # Delete a chart (deprecated) Source: https://docs.honeyhive.ai/v2/api-reference-autogen/charts/delete-a-chart-deprecated https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml delete /v1/charts/{chart_id} Deprecated. Use `DELETE /v1/projects/{project_id}/charts/{chart_id}` with a data plane API key instead. # Get a chart Source: https://docs.honeyhive.ai/v2/api-reference-autogen/charts/get-a-chart https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/projects/{project_id}/charts/{chart_id} Retrieve a single chart by id. # Get a chart (deprecated) Source: https://docs.honeyhive.ai/v2/api-reference-autogen/charts/get-a-chart-deprecated https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/charts/{chart_id} Deprecated. Use `GET /v1/projects/{project_id}/charts/{chart_id}` with a data plane API key instead. Retrieves a single chart by id. # List charts Source: https://docs.honeyhive.ai/v2/api-reference-autogen/charts/list-charts https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/projects/{project_id}/charts Retrieve all charts in a project. # List charts (deprecated) Source: https://docs.honeyhive.ai/v2/api-reference-autogen/charts/list-charts-deprecated https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/charts Deprecated. Use `GET /v1/projects/{project_id}/charts` with a data plane API key instead. Retrieves all charts in the current scope. # Update a chart Source: https://docs.honeyhive.ai/v2/api-reference-autogen/charts/update-a-chart https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml patch /v1/projects/{project_id}/charts/{chart_id} Update a chart's editable fields. Only fields included in the request body are modified. # Update a chart (deprecated) Source: https://docs.honeyhive.ai/v2/api-reference-autogen/charts/update-a-chart-deprecated https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml put /v1/charts/{chart_id} Deprecated. Use `PATCH /v1/projects/{project_id}/charts/{chart_id}` with a data plane API key instead. Updates a chart's editable fields. Only fields included in the request body are modified. # Create a data plane API key Source: https://docs.honeyhive.ai/v2/api-reference-autogen/data-plane-api-keys/create-a-data-plane-api-key https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/projects/{project_id}/fine_grained_api_keys Create a fine-grained data plane API key rooted at a project. The caller's key must carry `project.fine_grained_api_key_dp.post` for the project. Only an organization-rooted key created in the organization's **Settings → API Keys**, on the **Data Plane** tab, can carry it, and a key created through this operation never can, so a provisioned key cannot create keys. The permissions requested are limited to the organization's data plane key policy, and `expires_at` to the system's maximum lifetime. The project must already exist on this data plane: a project created on the control plane reaches it asynchronously, and the operation answers 404 until it does. `key_value` is returned once and cannot be retrieved again. # Create a new datapoint Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datapoints/create-a-new-datapoint https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/datapoints Create a single datapoint with inputs, history, ground truth, and metadata. # Create multiple datapoints in batch Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datapoints/create-multiple-datapoints-in-batch https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/datapoints/batch Create multiple datapoints from events using field mappings and optional filters. # Delete a specific datapoint Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datapoints/delete-a-specific-datapoint https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml delete /v1/datapoints/{datapoint_id} Permanently delete a datapoint by its unique identifier. # Retrieve a list of datapoints Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datapoints/retrieve-a-list-of-datapoints https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/datapoints Retrieve datapoints, optionally filtered by a list of datapoint IDs or dataset name. # Retrieve a specific datapoint Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datapoints/retrieve-a-specific-datapoint https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/projects/{project_id}/datapoints/{datapoint_id} Get a single datapoint by its unique identifier. # Retrieve a specific datapoint (deprecated) Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datapoints/retrieve-a-specific-datapoint-deprecated https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/datapoints/{datapoint_id} Deprecated. Use `GET /v1/projects/{project_id}/datapoints/{datapoint_id}` with a data plane API key instead. Gets a single datapoint by its unique identifier. # Update a specific datapoint Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datapoints/update-a-specific-datapoint https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml put /v1/datapoints/{datapoint_id} Update fields on an existing datapoint. Only the provided fields are modified. # Add datapoints to a dataset Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datasets/add-datapoints-to-a-dataset https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/projects/{project_id}/datasets/{dataset_id}/datapoints Add new datapoints to an existing dataset. Provide raw data objects and a field mapping that specifies which fields map to inputs, ground truth, and history. # Add datapoints to a dataset (deprecated) Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datasets/add-datapoints-to-a-dataset-deprecated https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/datasets/{dataset_id}/datapoints Deprecated. Use `POST /v1/projects/{project_id}/datasets/{dataset_id}/datapoints` with a data plane API key instead. Adds new datapoints to an existing dataset. Provide raw data objects and a field mapping that specifies which fields map to inputs, ground truth, and history. # Create a dataset Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datasets/create-a-dataset https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/datasets Create a new dataset with an optional name, description, and initial set of datapoint IDs. # Delete a dataset Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datasets/delete-a-dataset https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml delete /v1/datasets/{dataset_id} Permanently delete a dataset by its unique identifier. # Get datasets Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datasets/get-datasets https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/projects/{project_id}/datasets Retrieve datasets, optionally filtered by dataset ID or name. # Get datasets (deprecated) Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datasets/get-datasets-deprecated https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/datasets Deprecated. Use `GET /v1/projects/{project_id}/datasets` with a data plane API key instead. Retrieves datasets, optionally filtered by dataset ID or name. # Remove a datapoint from a dataset Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datasets/remove-a-datapoint-from-a-dataset https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml delete /v1/datasets/{dataset_id}/datapoints/{datapoint_id} Remove a specific datapoint from a dataset. The datapoint itself is not deleted, only dereferenced from the dataset. # Update a dataset Source: https://docs.honeyhive.ai/v2/api-reference-autogen/datasets/update-a-dataset https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml put /v1/datasets/{dataset_id} Update a dataset's name, description, or list of datapoint IDs. # Create a batch of events Source: https://docs.honeyhive.ai/v2/api-reference-autogen/events/create-a-batch-of-events https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/events/batch Create multiple events in a single request. When `single_session` is true, all events share the same session created from `session_properties`. **Required properties:** - `events` (array of event objects): Each event must include `event_type` (one of `chain`, `model`, `tool`, `session`) and `inputs`. **Optional properties:** - `single_session` (boolean): If true, all events share a single session created from `session_properties`. Defaults to false. - `session_properties` (object): Session metadata used when `single_session` is true. May include `session_name`, `start_time`, `metadata`. Unknown top-level fields and per-event fields are rejected at the SDK boundary; the legacy aliases `is_single_session`, `session`, and per-event `project` are no longer accepted. # Create a new event Source: https://docs.honeyhive.ai/v2/api-reference-autogen/events/create-a-new-event https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/events Create a new event (span) within a session trace. The request body is a bare event object (no `event` wrapper). **Required properties:** - `event_type` (string): Must be one of: `chain`, `model`, `tool`, `session`. - `inputs` (object): Input data for the event. **Auto-generated properties** (provided by the server when omitted): - `event_id` (string, UUID): Unique identifier for the event. - `session_id` (string, UUID): Session/trace identifier. - `parent_id` (string, UUID): Parent event ID. Defaults to `session_id`. **Optional properties with defaults:** - `event_name` (string): Name of the event. Defaults to `"unknown"`. - `source` (string): Source of the event (e.g. `sdk-python`). Defaults to `"unknown"`. **Optional properties:** - `config` (object): Configuration data (e.g. model parameters, prompt templates). - `outputs` (object): Output data from the event. - `error` (string or null): Error message if the event failed. - `children_ids` (array of strings): IDs of child events. - `duration` (number): Duration of the event in milliseconds. - `start_time` (number): Unix timestamp in milliseconds for event start. - `end_time` (number): Unix timestamp in milliseconds for event end. - `metadata` (object): Additional metadata (e.g. token counts, cost). - `metrics` (object): Custom metrics. - `feedback` (object): Feedback data (e.g. ratings, ground truth). - `user_properties` (object): User properties associated with the event. # Get an event by ID Source: https://docs.honeyhive.ai/v2/api-reference-autogen/events/get-an-event-by-id https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/events/{event_id} Retrieve a single event by its unique identifier. The event is fetched directly from S3/MinIO storage. # Retrieve events based on filters Source: https://docs.honeyhive.ai/v2/api-reference-autogen/events/retrieve-events-based-on-filters https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/events/search Search events via POST with filtering and pagination. This is the primary method for retrieving events from HoneyHive. # Update an event Source: https://docs.honeyhive.ai/v2/api-reference-autogen/events/update-an-event https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml put /v1/events/{event_id} Update fields on an existing event. Only the provided fields are modified; omitted fields are left unchanged. Extra fields not listed below are accepted by the server but silently ignored. # Compare events between two experiment runs Source: https://docs.honeyhive.ai/v2/api-reference-autogen/experiments/compare-events-between-two-experiment-runs https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/runs/{new_run_id}/compare/{old_run_id}/events Retrieve and compare events between two experiment runs for detailed analysis # Create a new evaluation run Source: https://docs.honeyhive.ai/v2/api-reference-autogen/experiments/create-a-new-evaluation-run https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/runs Create a new experiment run to track an evaluation against a dataset. # Delete an evaluation run Source: https://docs.honeyhive.ai/v2/api-reference-autogen/experiments/delete-an-evaluation-run https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml delete /v1/runs/{run_id} Permanently delete an experiment run by its run ID. # Get a list of evaluation runs Source: https://docs.honeyhive.ai/v2/api-reference-autogen/experiments/get-a-list-of-evaluation-runs https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/runs List experiment runs with optional filtering by dataset, status, name, date range, and specific run IDs. Results are paginated and sortable. # Get details of an evaluation run Source: https://docs.honeyhive.ai/v2/api-reference-autogen/experiments/get-details-of-an-evaluation-run https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/runs/{run_id} Retrieve the full details of a single experiment run by its run ID. # Get event metrics for an experiment run Source: https://docs.honeyhive.ai/v2/api-reference-autogen/experiments/get-event-metrics-for-an-experiment-run https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/runs/{run_id}/metrics Retrieve event metrics from ClickHouse for a specific experiment run # Get events schema across all experiment runs in a project Source: https://docs.honeyhive.ai/v2/api-reference-autogen/experiments/get-events-schema-across-all-experiment-runs-in-a-project https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/runs/schema Retrieve the aggregated events schema (fields, datasets, mappings) across all experiment runs in the project. # Get events schema for a single experiment run Source: https://docs.honeyhive.ai/v2/api-reference-autogen/experiments/get-events-schema-for-a-single-experiment-run https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/runs/{run_id}/schema Retrieve the events schema (fields, datasets, mappings) for a single experiment run. # Retrieve experiment comparison Source: https://docs.honeyhive.ai/v2/api-reference-autogen/experiments/retrieve-experiment-comparison https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/runs/{new_run_id}/compare/{old_run_id} Compare metrics and results between two experiment runs # Retrieve experiment summary Source: https://docs.honeyhive.ai/v2/api-reference-autogen/experiments/retrieve-experiment-summary https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/runs/{run_id}/summary Compute evaluation summary for an experiment run: pass/fail results, metric aggregations, per-datapoint results, event details, and the experiment run object. # Update an evaluation run Source: https://docs.honeyhive.ai/v2/api-reference-autogen/experiments/update-an-evaluation-run https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml put /v1/runs/{run_id} Update fields on an existing experiment run such as name, status, metadata, or results. # Create an ingestion API key Source: https://docs.honeyhive.ai/v2/api-reference-autogen/ingestion-api-keys/create-an-ingestion-api-key https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/projects/{project_id}/ingestion_api_keys Create an ingestion API key for a project, the credential an application sends traces with. The caller's key must carry `project.ingestion_api_key.post` for the project. Only an organization-rooted data plane key created in the organization's **Settings → API Keys**, on the **Data Plane** tab, can carry it. An ingestion key has no permissions of its own and cannot create keys. The project must already exist on this data plane: a project created on the control plane reaches it asynchronously, and the operation answers 404 until it does. `key_value` is returned once and cannot be retrieved again. # Create a new metric version Source: https://docs.honeyhive.ai/v2/api-reference-autogen/metric-versions/create-a-new-metric-version https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/metrics/{metric_id}/versions Snapshot the supplied metric definition as a new version. By default the version is created as a draft (`deployed: false`); set `deploy_immediately: true` to also make it the live version in the same transaction. # Deploy a specific metric version Source: https://docs.honeyhive.ai/v2/api-reference-autogen/metric-versions/deploy-a-specific-metric-version https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/metrics/{metric_id}/versions/{version_name}/deploy Mark the named version as the live version for the metric, unmarking any previously deployed version. # List versions for a metric Source: https://docs.honeyhive.ai/v2/api-reference-autogen/metric-versions/list-versions-for-a-metric https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/metrics/{metric_id}/versions Retrieve all snapshot versions of the metric's definition, ordered oldest-first. Returns the full version history unpaginated. # Create a new metric Source: https://docs.honeyhive.ai/v2/api-reference-autogen/metrics/create-a-new-metric https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/metrics # Delete a metric Source: https://docs.honeyhive.ai/v2/api-reference-autogen/metrics/delete-a-metric https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml delete /v1/metrics/{metric_id} # List all metrics Source: https://docs.honeyhive.ai/v2/api-reference-autogen/metrics/list-all-metrics https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/metrics # Run a metric evaluation Source: https://docs.honeyhive.ai/v2/api-reference-autogen/metrics/run-a-metric-evaluation https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/metrics/run Execute a metric on a specific event # Update an existing metric Source: https://docs.honeyhive.ai/v2/api-reference-autogen/metrics/update-an-existing-metric https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml put /v1/metrics/{metric_id} Update a metric's editable fields. Only fields included in the request body are modified. # Create an annotation queue Source: https://docs.honeyhive.ai/v2/api-reference-autogen/queues/create-an-annotation-queue https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/queues Create a new annotation queue with a name, optional description, filters, and an initial set of event IDs to add. # Delete an annotation queue Source: https://docs.honeyhive.ai/v2/api-reference-autogen/queues/delete-an-annotation-queue https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml delete /v1/queues/{queue_id} Soft-delete an annotation queue by its unique identifier. # Get an annotation queue Source: https://docs.honeyhive.ai/v2/api-reference-autogen/queues/get-an-annotation-queue https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/queues/{queue_id} Retrieve a single annotation queue by its unique identifier. # List annotation queues Source: https://docs.honeyhive.ai/v2/api-reference-autogen/queues/list-annotation-queues https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml get /v1/queues List annotation queues for the current project scope, optionally filtered by enabled status. # Update an annotation queue Source: https://docs.honeyhive.ai/v2/api-reference-autogen/queues/update-an-annotation-queue https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml put /v1/queues/{queue_id} Update fields on an existing annotation queue. Supports updating name, description, filters, enabled status, and adding/removing events. # Add a batch of events to a session Source: https://docs.honeyhive.ai/v2/api-reference-autogen/sessions/add-a-batch-of-events-to-a-session https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/sessions/{session_id}/events/batch Add a batch of events to an existing session. Each event in the batch is stored with `session_id` set from the URL path, overriding any `session_id` in the event body. Each event must include `event_type` (one of `chain`, `model`, `tool`, `session`) and `inputs`. Unknown top-level fields and unknown per-event fields are rejected. Events are processed sequentially. For higher-throughput ingestion across sessions, use `POST /v1/events/batch` instead. # Start a new session Source: https://docs.honeyhive.ai/v2/api-reference-autogen/sessions/start-a-new-session https://raw.githubusercontent.com/honeyhiveai/honeyhive-openapi/main/data_plane_openapi.yaml post /v1/sessions Start a new session. The request body is a bare session object (no `session` wrapper). The server creates a session event and returns it. **No required properties.** Every field has a server-side fallback. **Auto-generated properties** (provided by the server when omitted): - `session_id` (string, UUID): Server generates a UUIDv4 if omitted or if the supplied value is not a valid UUID. **Optional properties with defaults:** - `event_name` (string): Falls back to `session_name` when not provided; defaults to `"unknown"` if both are absent. - `source` (string): Defaults to `"unknown"`. **Optional properties:** - `session_name` (string): Display name for the session. - `start_time` (number): Session start time as Unix milliseconds. The session normalizer uses `getInt64()` which only accepts numeric types; if a string is passed, the server silently falls back to the current time. - `end_time` (number): Session end time as Unix milliseconds (same numeric-only caveat as `start_time`). - `duration` (number): Session duration in milliseconds. - `config` (object): Configuration associated with the session. - `inputs` (object): Input data for the session. - `outputs` (object): Output data from the session. - `metadata` (object): Arbitrary metadata. - `user_properties` (object): User properties. - `children_ids` (array of strings): IDs of child events. Idempotent on `session_id`: posting twice with the same `session_id` merges metadata/user_properties into the existing session and returns the existing event. # Deprecated API routes Source: https://docs.honeyhive.ai/v2/api-reference/deprecated-routes Index of deprecated HoneyHive data plane API endpoints with links to each reference page. These endpoints still work but are not listed in the API Reference navigation. Use the current routes documented in the sidebar for new integrations. ## Configurations | Endpoint | Reference | | - | - | | `GET /v1/configurations` | [Retrieve a list of configurations](/v2/api-reference-autogen/configurations/retrieve-a-list-of-configurations) | | `POST /v1/configurations` | [Create a new configuration](/v2/api-reference-autogen/configurations/create-a-new-configuration) | | `PUT /v1/configurations/{configId}` | [Update an existing configuration](/v2/api-reference-autogen/configurations/update-an-existing-configuration) | | `DELETE /v1/configurations/{configId}` | [Delete a configuration](/v2/api-reference-autogen/configurations/delete-a-configuration) | ## Datasets | Endpoint | Reference | | - | - | | `PUT /v1/datasets` | [Update a dataset](/v2/api-reference-autogen/datasets/update-a-dataset-deprecated) | | `DELETE /v1/datasets` | [Delete a dataset](/v2/api-reference-autogen/datasets/delete-a-dataset-deprecated) | | `DELETE /v1/datasets/{dataset_id}/{datapoint_id}` | [Remove a datapoint from a dataset](/v2/api-reference-autogen/datasets/remove-a-datapoint-from-a-dataset-deprecated) | ## Events | Endpoint | Reference | | - | - | | `POST /events` | [Create a new event](/v2/api-reference-autogen/events/create-a-new-event-deprecated) | | `PUT /events` | [Update an event](/v2/api-reference-autogen/events/update-an-event-deprecated) | | `POST /v1/events/export` | [Retrieve events based on filters](/v2/api-reference-autogen/events/retrieve-events-based-on-filters-deprecated) | | `POST /events/model` | [Create a new model event](/v2/api-reference-autogen/events/create-a-new-model-event-deprecated) | | `POST /events/batch` | [Create a batch of events](/v2/api-reference-autogen/events/create-a-batch-of-events-deprecated) | | `POST /events/model/batch` | [Create a batch of model events](/v2/api-reference-autogen/events/create-a-batch-of-model-events-deprecated) | | `GET /v1/events/schema` | [Get events schema](/v2/api-reference-autogen/events/get-events-schema-deprecated) | ## Experiments | Endpoint | Reference | | - | - | | `GET /v1/runs/{run_id}/result` | [Retrieve experiment result](/v2/api-reference-autogen/experiments/retrieve-experiment-result-deprecated) | | `GET /v1/runs/{new_run_id}/compare-with/{old_run_id}` | [Retrieve experiment comparison](/v2/api-reference-autogen/experiments/retrieve-experiment-comparison-deprecated) | | `GET /v1/runs/compare/events` | [Compare events between two experiment runs](/v2/api-reference-autogen/experiments/compare-events-between-two-experiment-runs-deprecated) | ## Metrics | Endpoint | Reference | | - | - | | `PUT /v1/metrics` | [Update an existing metric](/v2/api-reference-autogen/metrics/update-an-existing-metric-deprecated) | | `DELETE /v1/metrics` | [Delete a metric](/v2/api-reference-autogen/metrics/delete-a-metric-deprecated) | | `POST /v1/metrics/run_metric` | [Run a metric evaluation](/v2/api-reference-autogen/metrics/run-a-metric-evaluation-deprecated) | ## Sessions | Endpoint | Reference | | - | - | | `POST /session/start` | [Start a new session](/v2/api-reference-autogen/sessions/start-a-new-session-deprecated) | | `POST /session/{session_id}/traces` | [Add traces to a session](/v2/api-reference-autogen/sessions/add-traces-to-a-session-deprecated) | # Clients Source: https://docs.honeyhive.ai/v2/changelog/clients Browse release notes for the HoneyHive Python SDK, TypeScript API SDK, TypeScript Control Plane SDK, and CLI. Stay current with new features, bug fixes, and breaking API changes.
## CLI ### [v1.8.0](https://github.com/honeyhiveai/honeyhive-cli/releases/tag/v1.8.0) #### What's New * Added `--data-plane-api-key` and `HH_DATA_PLANE_API_KEY` for fine-grained data plane API keys (`hh_fgdp_...`). Create one in the HoneyHive app under project, workspace, or organization **Settings → API keys**, on the **Data Plane** tab. * Added `--project-id` to `charts list`, `charts create`, `charts get`, and `charts update`. With `--project-id`, the command calls the project-scoped route and authenticates with the data plane API key. Pass `--project-id` even when the key is rooted at that project. Without it, the command calls the legacy route with the project API key, even when a data plane key is configured. A project API key cannot stand in for a data plane key on the scoped route. * Added `data-plane-api-keys create`, which creates a data plane API key. It takes `--project-id`, `--name`, `--permissions` (a JSON array such as `["project.chart.get"]`), `--expires-at` (ISO 8601), and an optional `--description`. * Added `ingestion-api-keys create`, which creates an ingestion API key. It takes `--project-id`, `--name`, and an optional `--description`. * `charts create` and `charts update` now accept `five_minute` and `auto` for `--bucketing`. #### Fixes & Improvements * An error for a missing API key now names the key the command needs and the flag and environment variable that supply it. For data plane and control plane keys, the error also says where in the app to create one. An error for a malformed key names the flag or environment variable the bad value came from. * `--verbose` on data plane commands now logs all three data plane keys (project, ingestion, and data plane), and prints `(none)` for any that are unset. A masked ingestion or fine-grained key shows its prefix and key id with the secret replaced by `******`, which matches the masked form in the HoneyHive app. #### Compatibility & Deprecations * Calling `charts` commands without `--project-id` is deprecated. `--project-id` becomes required in the next major version. Pass it with a data plane API key. * The CLI now checks every typed key you have configured (ingestion, data plane, control plane) when a command starts, including keys that command does not use. A key of the wrong type or an incomplete key in `HH_INGESTION_API_KEY`, `HH_DATA_PLANE_API_KEY`, or the matching flag now fails the command before it sends a request. The error names the flag or environment variable that holds the bad value. Fix or unset the stale value. * The CLI no longer checks the format of the project API key (`--project-api-key` / `HH_PROJECT_API_KEY`) locally. It sends the value as given, and the server decides whether to accept it.
## Python SDK ### [v1.7.0](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.7.0) #### Added * **Data plane API keys** * `HoneyHive(...)` accepts `data_plane_api_key=`, also read from `HH_DATA_PLANE_API_KEY`, for fine-grained `hh_fgdp_` keys. It is exposed as `client.data_plane_api_key`. A value that is set but is not a complete `hh_fgdp_` key raises `ValueError` at construction. * **Project-scoped chart operations** * Every `client.charts` method (`list`, `get`, `create`, `update`, `delete` and their `_async` variants) accepts an optional keyword-only `project_id`. With `project_id`, the call targets that project and is sent with the data plane API key. It never falls back to `api_key`. * **`MissingApiKeyError`** * New exception, importable from `honeyhive`. It subclasses `ValueError` and has a `key_kind` attribute. An operation raises it before sending a request when no key it accepts is configured, and the message names the key and environment variable to set. #### Changed * **Clearer API error messages** * `HTTPException` raised by API calls now includes the server's error message, and a 404 adds a hint that the resource does not exist or the key lacks access to it. New `server_message` and `error_code` attributes expose the parsed error body. The exception type, `status_code`, and the message prefix are unchanged, so existing handlers keep working. * **Missing keys fail before the request is sent** * An operation called with no usable API key now raises `MissingApiKeyError` locally, instead of sending an unauthenticated request and failing at the API. * **`events.update_event()` accepts a model** * `update_event()` now accepts an `UpdateEventRequest` as well as a dict. A dict is validated into the model. #### Deprecated * **Chart calls without `project_id`** * Calling a `client.charts` method without `project_id` still uses the project API key, but now emits a `DeprecationWarning`. These calls stop working in v2.0. Pass `project_id` and configure a data plane API key. * **Unused error-handling helpers in `honeyhive.utils`** * `ErrorHandler`, `get_error_handler`, `handle_api_errors`, `ErrorContext`, `ValidationError`, `HoneyHiveConnectionError`, `RateLimitError`, and `AuthenticationError` can still be imported from `honeyhive.utils` and `honeyhive.utils.error_handler`, but importing them now emits a `DeprecationWarning`.
## TypeScript API SDK ### [v1.6.0](https://github.com/honeyhiveai/typescript-api-client/releases/tag/v1.6.0) #### What's New * New `dataPlaneApiKey` client option and `HH_DATA_PLANE_API_KEY` environment variable for a fine-grained data plane API key (a value beginning with `hh_fgdp_`). The client sends this key on operations that are scoped to a project, which today are the chart operations. * Every `client.charts` method (`list`, `create`, `get`, `update`, `delete`) now accepts an optional `project_id`. With `project_id`, the call goes to the project-scoped chart endpoints and authenticates with the data plane API key. `client.charts.list()` now takes an optional request argument, a new `GetChartsRequest` type. * New `client.dataPlaneApiKeys.create()` creates a fine-grained data plane API key rooted at a project. New `client.ingestionApiKeys.create()` creates an ingestion API key for a project. Both return `key_value` once, and you cannot get it again. * New exported request and response types: `CreateDataPlaneApiKeyRequest`/`Response` and `CreateIngestionApiKeyRequest`/`Response`. * New exported error classes `MissingApiKeyError` and `MalformedApiKeyError`, both subclasses of `HoneyHiveError`, and the `ApiKeyKind` type. Each error has a `keyKind` property (`'project'`, `'ingestion'` or `'dataPlane'`). `MalformedApiKeyError` also has a `source` property that names the option or environment variable the bad value came from. * The chart `bucketing` option now accepts `five_minute` and `auto`. * Verbose logging now prints a `Data plane API key:` line. The line shows `hh_fgdp_`, the key id and none of the secret, and shows `(none)` when no key is set. #### Fixes & Improvements * An operation whose required key is not configured now throws a `MissingApiKeyError` before it sends a request. The error names the key that the operation needs. Previously, some operations sent the request without a key and failed with a `401`. * An `ingestionApiKey`, `HH_INGESTION_API_KEY`, `dataPlaneApiKey` or `HH_DATA_PLANE_API_KEY` value that is not a well-formed key of that kind now throws a `MalformedApiKeyError` when the client is constructed. The error never echoes the value. #### Compatibility & Deprecations * Calling a `client.charts` method without `project_id` is deprecated. It becomes required in the next major version. These calls still use the legacy route and the project API key. Each method logs a one-time deprecation warning to stderr. To migrate, pass `project_id` and configure a data plane API key. * A call with `project_id` needs a data plane API key and never falls back to the project API key. A data plane API key cannot send traces, so keep an ingestion key or a project key for ingestion. * A client with no API key configured now constructs successfully. The first operation that needs a key throws a `MissingApiKeyError`. Previously, the constructor threw a `Missing API key` error. If your code catches the missing-key error at construction, also handle it at the first call. * A client that has custom middleware or its own `Authorization` header never throws `MissingApiKeyError`. Authentication is left to the middleware or the header.
## TypeScript Control Plane SDK ### [v1.3.0](https://github.com/honeyhiveai/typescript-control-plane-sdk/releases/tag/v1.3.0) #### What's New * New exported error classes `MissingApiKeyError` and `MalformedApiKeyError`. Both extend `HoneyHiveError`. * Client construction now throws `MissingApiKeyError` when no API key and no middleware are configured, and `MalformedApiKeyError` when `apiKey` or `HH_CONTROL_PLANE_API_KEY` is not a well-formed fine-grained control plane key. Before this release, both cases threw a plain `Error`. You can now catch these with `instanceof` checks. `MalformedApiKeyError.source` names the option or environment variable that held the bad value. The error never echoes the key.
## Python SDK ### [v1.6.1](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.6.1) #### Fixed * **Install: `import honeyhive` failed with `ModuleNotFoundError: No module named 'requests'`** * On a fresh install of 1.6.0, `import honeyhive` could fail with this error. `pip install honeyhive` now installs everything the SDK needs to import. #### Compatibility * **`requests>=2.32.0` and `urllib3>=1.26` are now required** * If your environment pins `requests` or `urllib3` below these versions, raise the pin to install 1.6.1.
## CLI ### [v1.7.0](https://github.com/honeyhiveai/honeyhive-cli/releases/tag/v1.7.0) #### What's New * Added `--ingestion-api-key` and `HH_INGESTION_API_KEY` for the commands that send traces and events: `sessions create`, `sessions create-event-batch`, `events create`, `events update`, and `events create-batch`. These take an ingestion API key (`hh_ingst_...`), created at project scope on the **API Keys** page under **Settings**. They still accept a project API key, so a shell that exports only `HH_PROJECT_API_KEY` keeps working. Give ingestion its own key in a new setup. Every other command is unchanged. * Added `--slug` to `workspaces create` and `virtual-dataplanes create`. A slug takes letters, digits, and underscores only, and must be globally unique. Omit it and the server derives a slug from the name with a random suffix, exactly as before. Supply it when the identifier has to match a value maintained outside HoneyHive, such as an identity provider group that grants access to the scope. A slug already in use fails with a `409` naming the slug. #### Fixes & Improvements * API keys are now trimmed before the CLI checks their shape. A key pasted with surrounding whitespace or a trailing newline is no longer rejected locally when the API would have accepted it. * The pre-flight key check now judges the exact credential each command sends, rather than assuming one key per API. Its error names the key and the flag or environment variable that command needs. * `metrics run` no longer fails with a `400` when the metric reads `ground_truth` and the event carries none. The command now exits 0 and prints `success: false` with `result: null` and the reason in `explanation`. A script that read the non-zero exit code as the signal must read `success` in the printed JSON instead. #### Compatibility & Deprecations * Every command now gets a `404` where the API used to answer a permission failure with `403` or a rejected API key with `401`. A rejected key is one that is invalid, revoked, or expired. The response does not say which case applies, and the error no longer names the check that refused. A script that branched on `401` or `403` must read the not-found error as covering all three cases. These are server changes, so they apply to every CLI version. * `--needs-ground-truth` and `--no-needs-ground-truth` on `metrics create` and `metrics update` are deprecated and ignored, and now log a deprecation warning to stderr. The server infers ground-truth use from the metric definition. A Python metric that reads `ground_truth` needs it, and so does an LLM metric whose template references it. The same field inside a `metric-versions create --content` payload, and inside any `--filename` payload, is likewise accepted and ignored. The flags will be removed in the next major version. Stop passing them. * `workspace_id` inside the `--event` payload of `metrics run` is deprecated and ignored. The workspace whose provider credentials run the metric is derived from the authenticated key's scope, so naming a different workspace has no effect. * The bundled YAML parser used for `--filename` input now bounds recursive merge aliases. A YAML file with deeply chained merge keys no longer expands unchecked.
## TypeScript API SDK ### [v1.5.0](https://github.com/honeyhiveai/typescript-api-client/releases/tag/v1.5.0) #### What's New * New `ingestionApiKey` client option and `HH_INGESTION_API_KEY` environment variable for supplying an ingestion API key (a value beginning with `hh_ingst_`). The client sends it on the operations that send traces and events: `client.sessions.create()`, `client.sessions.createEventBatch()`, `client.events.create()`, `client.events.update()`, and `client.events.createBatch()`. The client sends the project API key on everything else. * An ingestion API key is now a credential on its own. A process that only sends traces and events can construct a client with the ingestion key and no project API key. Every other operation on such a client behaves as it does with no project API key configured. * An `ingestionApiKey` or `HH_INGESTION_API_KEY` value that is not a well-formed ingestion key throws when the client is constructed. The error names the option or variable the value came from and never echoes the value. * Verbose logging now prints an `Ingestion API key:` line next to the project key. The line shows `hh_ingst_`, the key id, and none of the secret. This is the form HoneyHive displays, so you can match the line against the key in your account. A credential that is not configured logs as `(none)`. #### Fixes & Improvements * `client.metrics.run()` now derives the workspace whose provider credentials run the metric from the caller's authenticated scope rather than from the request body. Previously a `workspace_id` in the request event was forwarded as-is. That let an authenticated caller run an ad-hoc LLM metric against another tenant's configured provider credentials. * A metric run that needs ground truth the event does not carry is now skipped instead of failed. `client.metrics.run()` returns `200` with `success: false`, a null `result`, and an `explanation`. It previously threw a `400` with `ground_truth_missing`. Adding ground truth to the event re-enqueues it, and the metric computes on that pass. * The error thrown when no credential is configured now reads `Missing API key` and names the four current sources: `projectApiKey`, `ingestionApiKey`, `HH_PROJECT_API_KEY`, and `HH_INGESTION_API_KEY`. #### Compatibility & Deprecations * A client configured with a project API key and no ingestion key still sends the project key on the ingestion operations. * `HH_INGESTION_API_KEY` is read at client construction for the first time in this release. A process that already sets it to a non-empty value that is not a well-formed ingestion key now fails to construct a client. Unset the variable, or set it to your ingestion key, before upgrading. * `needs_ground_truth` is deprecated and ignored on every metric request and response type, including `CreateMetricRequest`, `UpdateMetricRequest`, `MetricItem`, `MetricVersionContent`, and the metric passed to `client.metrics.run()`. The API now infers the need for ground truth from the metric definition. The property remains in the type definitions so existing code keeps compiling, and reads still return the stored value. * `workspace_id` on the event passed to `client.metrics.run()` is deprecated and ignored. It remains accepted, so existing code keeps compiling. Remove it and rely on the key's scope. * Bumped `axios` from `1.19.0` to `1.20.0`.
## TypeScript Control Plane SDK ### [v1.2.0](https://github.com/honeyhiveai/typescript-control-plane-sdk/releases/tag/v1.2.0) #### What's New * Scope creation accepts a caller-supplied identifier: an optional `slug` on `CreateWorkspaceRequest` and `CreateVirtualDataplaneRequest`. Omit it and the server derives one from `name` with a random suffix, as before. Supply it when the identifier has to match a value maintained outside HoneyHive, such as an identity provider group that grants access to the scope. A slug already in use gets a 409 that names it. #### Compatibility & Deprecations * The client validates the API key at construction. A value in `apiKey` or `HH_CONTROL_PLANE_API_KEY` that is not a well-formed fine-grained control plane key (`hh_fgcp_…`) throws when you build the client. The error names the option or the environment variable the value came from, and it does not echo the key. Before this release the same value failed on the first request as an authentication error. * Every control plane endpoint answers an authorization failure with 404 instead of 403. The status no longer reveals whether a resource you may not touch exists. The control plane does not emit 403 at all any more. * An authentication failure on a fine-grained control plane key also answers 404 instead of 401. This covers a missing `Authorization` header and a key that is invalid, revoked, or expired. * A 404 now means "not found", "not permitted", or "not authenticated", and the response does not say which. Code that refreshes a credential on 401 or branches on 403 no longer sees either status. * A 404 body carries the fixed `message` `"Not found"` and the fixed `errorCode` `"not_found"`. `ApiError.message` and `parseError()` no longer name which check refused. The server logs carry that detail. * The three status changes above are control plane changes, so they apply to every SDK version, not only 1.2.0. * The `axios` runtime dependency moves from 1.19.0 to 1.20.0.
## Python SDK ### [v1.6.0](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.6.0) #### Added * **Ingestion API keys** * `HoneyHive(...)`, `HoneyHiveTracer.init(...)`, and `evaluate(...)` accept `ingestion_api_key=`, also read from `HH_INGESTION_API_KEY`. The ingestion key is sent only on the routes that create sessions and write events, including OTLP trace export; every other route keeps using `api_key`. When it is unset, `api_key` is used for ingestion too, so existing setups are unchanged. A value that is set but is not an `hh_ingst_` key raises `ValueError` at construction rather than failing later at request time. #### Changed * **Connection settings resolve the same way in every entry point** * The client, the tracer, `evaluate()`, and the CLI now resolve `api_key`, `ingestion_api_key`, and the API URL through one resolver, so a single process can no longer authenticate with one key in `evaluate()` and another in a tracer. An explicit argument beats the environment, and a blank value counts as unset. * `HH_API_KEY` and `HH_API_URL` are the preferred variables and win when more than one is set. `HONEYHIVE_API_KEY`, `HONEYHIVE_SERVER_URL`, and `HH_SERVER_URL` still work but are deprecated and emit a `DeprecationWarning` once per process. If you set both `HONEYHIVE_API_KEY` and `HH_API_KEY` to different values, `evaluate()` and the CLI now use `HH_API_KEY`; they previously preferred `HONEYHIVE_API_KEY`. #### Fixed * **Tracer: `RecursionError` from `trace.get_tracer()` after tracer shutdown** * Shutting down the main `HoneyHiveTracer` reset the global OpenTelemetry provider to a fresh `ProxyTracerProvider`, which delegates back to the global provider — itself. Any subsequent `opentelemetry.trace.get_tracer(...)` call (including module-level calls made when importing libraries such as `mcp`) raised `RecursionError`. Shutdown now clears the global provider so OpenTelemetry returns its own proxy. * **Events API: retry config now controls `events.export()`** * `HoneyHive(retry_config=...)` and `HH_MAX_RETRIES` were accepted and ignored. They did not reach `events.export()` / `export_async()`, which fell back to a fixed budget of 3 retries. Both configuration methods now set the retry budget for `events.export()` / `export_async()`. #### Compatibility * **Anthropic extras cap `anthropic` below 1.0.0** * `honeyhive[openinference-anthropic]`, `honeyhive[traceloop-anthropic]`, and the bundles that include them now require `anthropic<1.0.0`, and the OpenInference extras also require `openinference-instrumentation-anthropic<2.0.0`. A mismatched pair either raised `ModuleNotFoundError` on import or logged a dependency conflict and skipped instrumentation. The SDK already implicitly depended on `anthropic<1.0.0` as that was the only version available, which worked until Anthropic recently published v1.0 of their SDK. * **LangChain extras now install `langchain-openai`** * `honeyhive[openinference-langchain]` and `honeyhive[traceloop-langchain]` pull in `langchain-openai>=1.0.0` alongside `langchain`. These dependencies were always required for tracing to work correctly with LangChain but they weren't declared before.
## CLI ### [v1.6.0](https://github.com/honeyhiveai/honeyhive-cli/releases/tag/v1.6.0) #### What's New * Added `workspaces` subcommands for managing workspaces: `workspaces create`, `workspaces get`, `workspaces update`, and `workspaces delete`. `workspaces create` takes `--virtual-dataplane-id` and `--name`, plus optional `--description` and `--workspace-creator` (the email of the user to grant workspace-creator membership to, for API key callers). * Added `virtual-dataplanes` subcommands for managing virtual data planes: `virtual-dataplanes create`, `virtual-dataplanes get`, `virtual-dataplanes update`, and `virtual-dataplanes delete`. `virtual-dataplanes create` takes `--org-id` and `--name`, plus optional `--cluster-id` (required when the organization has no virtual data planes yet, or its virtual data planes span more than one cluster) and `--dataplane-creator`. * `workspaces delete` and `virtual-dataplanes delete` accept `--dangerously-delete-child-scopes` to archive a scope that still has active children, archiving those children too. Without the flag, deleting a workspace with active projects — or a virtual data plane with active workspaces — fails with a `409` and changes nothing. * Like `projects` and `alerts`, both new command groups talk to the HoneyHive control plane: they take a fine-grained control plane API key (`hh_fgcp_...`) via `--control-plane-api-key` / `HH_CONTROL_PLANE_API_KEY` and honor `--control-plane-url` / `HH_CONTROL_PLANE_URL`. Data plane commands are unchanged and still use `--project-api-key` / `HH_PROJECT_API_KEY`. #### Fixes & Improvements * Security fixes
## TypeScript API SDK ### [v1.4.1](https://github.com/honeyhiveai/typescript-api-client/releases/tag/v1.4.1) #### Fixes & Improvements * `client.metrics.run()` now distinguishes failure classes: `400` when the request is invalid or is missing inputs the metric needs (e.g. ground truth the event doesn't carry), `422` when evaluation itself failed (`execution_error`, `compilation_error`, `template_render_error`, `llm_response_parse_error`, …), and `500` for internal errors. `ApiError.parseError()` returns the `errorCode` along with the evaluator's detailed failure text in `message`. * Empty or whitespace-only `name` values passed to `client.experiments.createRun()` and `client.experiments.updateRun()` are now rejected with a `400`, and accepted names are trimmed before storage. Such names previously created runs with a blank display name. #### Compatibility & Deprecations * Composite metrics are no longer supported. `child_metrics` is marked deprecated on every metric request and response type and is now ignored by the API, and creating or updating a metric with `type: 'COMPOSITE'` returns a `400`. Both remain in the type definitions so existing code keeps compiling; replace composite metrics with standalone metrics. * Bumped `axios` from `1.18.0` to `1.19.0`.
## TypeScript Control Plane SDK ### [v1.1.0](https://github.com/honeyhiveai/typescript-control-plane-sdk/releases/tag/v1.1.0) #### What's New * Workspace management via the new `workspaces` namespace: `create()`, `get()`, `update()`, and `delete()`, with matching `CreateWorkspaceRequest`/`Response`, `GetWorkspaceRequest`/`Response`, `UpdateWorkspaceRequest`/`Response`, and `DeleteWorkspaceRequest`/`Response` types. * Virtual data plane management via the new `virtualDataplanes` namespace: `create()`, `get()`, `update()`, and `delete()`, with matching `CreateVirtualDataplaneRequest`/`Response`, `GetVirtualDataplaneRequest`/`Response`, `UpdateVirtualDataplaneRequest`/`Response`, and `DeleteVirtualDataplaneRequest`/`Response` types. * Deleting a workspace or virtual data plane archives everything inside it, so a resource with active children is rejected with a 409 unless the request sets `dangerously_delete_child_scopes: true`. #### Fixes & Improvements * Creating a project with `project_creator` now marks that user's sessions for refresh, so they no longer have to sign out and back in to see the new project. The change is in the control plane, so it applies to any SDK version. The refresh takes effect on their next request to the control plane, so an idle browser tab may still need a page reload. #### Compatibility & Deprecations * Security fixes
## CLI ### [v1.5.1](https://github.com/honeyhiveai/honeyhive-cli/releases/tag/v1.5.1) #### Fixes & Improvements * Fixed the Homebrew formula published for each release so `brew install honeyhive` and `brew upgrade honeyhive` resolve the current CLI version. The formula no longer declares an explicit version that recent Homebrew versions reject as redundant during validation. #### Compatibility & Deprecations * Installing a stable release via Homebrew now requires Homebrew 6.0.14 or newer, which reads the version from the release URL. An older client that installs without updating first — most commonly `HOMEBREW_NO_AUTO_UPDATE=1` in a Docker or CI image — records the wrong version and will not report the install as outdated afterwards. Run `brew update` before installing, or reinstall once Homebrew is current. `npm` and `npx` installs are unaffected.
## CLI ### [v1.5.0](https://github.com/honeyhiveai/honeyhive-cli/releases/tag/v1.5.0) #### What's New * Added `projects` subcommands for managing projects: `projects create`, `projects get`, `projects update`, and `projects delete`. * Added `alerts` subcommands: `alerts list`, `alerts create`, and `alerts get`. * Added `--control-plane-api-key` / `HH_CONTROL_PLANE_API_KEY` and `--control-plane-url` / `HH_CONTROL_PLANE_URL`. The new `projects` and `alerts` commands talk to the HoneyHive control plane, which takes a fine-grained control plane API key (`hh_fgcp_...`) created at workspace or organization scope — not a project API key. Every other command is unchanged and still uses `--project-api-key` / `HH_PROJECT_API_KEY`; you only need the key for the commands you actually run. #### Fixes & Improvements * The CLI now checks what kind of API key you supplied before sending a request. Passing a control plane key to a data plane command (or the reverse) fails immediately with a message naming the key kind the command needs and the flag or environment variable the wrong key came from, instead of an unexplained `401` from the server. * `--verbose` now reports the URL and key for whichever API the command talks to (`Control plane URL:` for `projects` and `alerts`), and masks a fine-grained control plane key exactly as the HoneyHive app displays it, so you can match a log line to a key in your account. #### Compatibility & Deprecations * Composite metrics are no longer supported. `metrics create` and `metrics update` now fail with a `400` when passed `--type COMPOSITE`, existing composite metrics and their versions have been deleted, and `--child-metrics` no longer has any effect on a metric's score.
## TypeScript Control Plane SDK ### [v1.0.0](https://github.com/honeyhiveai/typescript-control-plane-sdk/releases/tag/v1.0.0) #### What's New * First stable release of the HoneyHive TypeScript Control Plane SDK (`@honeyhive/control-plane-sdk`). Functionally identical to `1.0.0-rc.1` — no code changes, so upgrading from the release candidate requires no migration.
## TypeScript Control Plane SDK ### [v1.0.0-rc.1](https://github.com/honeyhiveai/typescript-control-plane-sdk/releases/tag/v1.0.0-rc.1) #### What's New * Initial release candidate of the HoneyHive TypeScript Control Plane SDK (`@honeyhive/control-plane-sdk`).
## Python SDK ### [v1.5.1](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.5.1) No customer-facing changes. Internal release tooling only.
## Python SDK ### [v1.5.0](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.5.0) #### Fixed * **Tracing: root SERVER spans get an automatic `session_id`** * When `HoneyHiveTracer` is initialized with `skip_backend_session_creation=True` and no `session_id`, the SDK now generates a `session_id` for each root SERVER span (`SpanKind.SERVER`, no parent) and propagates it via baggage. Previously these root spans were dropped and their children appeared orphaned in the Sessions tab — common with `FastAPIInstrumentor`, where the root span is created before any middleware runs. Existing single-session and client-span behavior is unchanged. * **Experiments: `evaluate()` normalizes run names** * `evaluate(name=...)` now trims surrounding whitespace, and a blank or whitespace-only name falls back to the default `experiment-` name instead of being submitted as-is. The backend also now rejects empty run names. #### Removed * **Composite metrics removed from the metric API surface** * The `child_metrics` field and the generated `*ChildMetricsItem` models have been removed from the metric request/response models in `honeyhive.models`, completing the composite-metrics deprecation. Composite metrics are no longer part of the product, so any remaining code referencing them can be safely cleaned up and removed. * Existing code that passes `child_metrics=...` keeps working — metric models accept unknown fields (`extra="allow"`), so the value is still accepted without error. The API already ignored and dropped `child_metrics`, so this change aligns the client with the backend behavior. The only difference: `child_metrics` is no longer a declared field, so reading `metric.child_metrics` off a response now raises `AttributeError` instead of returning `None`.
## TypeScript API SDK ### [v1.4.0](https://github.com/honeyhiveai/typescript-api-client/releases/tag/v1.4.0) #### What's New * New `client.events.get({ event_id })` method for `GET /v1/events/{event_id}`, fetching a single event by ID. * All SDK methods now accept an optional `options?: FetchOptions` second argument for cancelling in-flight requests via `AbortController`. New exported `FetchOptions` type (`{ signal?: AbortSignal }`). Example: `await client.events.search(request, { signal: controller.signal })`. * New `projectApiKey` client option and `HH_PROJECT_API_KEY` environment variable for supplying the project-scoped API key. These replace the previous `apiKey` option and `HH_API_KEY` environment variable. * Experiment run objects now include a `dataset_name` field alongside `dataset_id`. #### Fixes & Improvements * The `outputs` field on update-event requests is now typed as an object or `null` (previously `unknown`). Passing a non-object value (array, string, or scalar) previously corrupted the stored event and broke downstream consumers such as the Python SDK; such values are now rejected. Passing `null` preserves the existing outputs. #### Compatibility & Deprecations * The `apiKey` client option and `HH_API_KEY` environment variable are deprecated and will be removed in the next major version. They continue to work but log a one-time deprecation warning to stderr on client construction. Migrate to `projectApiKey` / `HH_PROJECT_API_KEY`. * Bumped `axios` from `1.16.0` to `1.18.0`.
## CLI ### [v1.4.0](https://github.com/honeyhiveai/honeyhive-cli/releases/tag/v1.4.0) #### What's New * Added `events get --event-id ` to fetch a single event by its ID. * Added the `--project-api-key` flag and `HH_PROJECT_API_KEY` environment variable as the primary way to authenticate the CLI. Verbose output now labels the key as `Project API key:` (previously `API Key:`). * `experiments list-runs`, `experiments get-run`, and `experiments get-summary` output now includes the linked `dataset_name`, and `get-summary` now reports `dataset_id` for offline (`EXT-*`) datasets that previously returned `null`. #### Fixes & Improvements * `events update --outputs` now requires an object or `null` (where `null` preserves the existing outputs); non-object values (strings, arrays, scalars) are rejected up front. These values were previously accepted but corrupted the stored event, which could break other consumers reading it back. #### Compatibility & Deprecations * The `--api-key` flag and `HH_API_KEY` environment variable are now deprecated aliases for `--project-api-key` / `HH_PROJECT_API_KEY`. They still work but log a deprecation warning to stderr and will be removed in the next major version. Migrate to the new names.
## Python SDK ### [v1.4.0](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.4.0) #### Added * **Copilot Studio trace forwarding adapter** * New `honeyhive.adapters.copilot_studio.copilot_studio_records_to_spans()` converts Azure Application Insights diagnostic-export records from a Copilot Studio agent into OpenTelemetry spans you can forward to HoneyHive via OTLP. Maps user/agent messages, tool calls, and errors using GenAI semantic conventions, preserves parent/child trace correlation, and groups a conversation into a single HoneyHive session. Set `COPILOT_STUDIO_ADAPTER_KEEP_TOPIC_SPANS=1` to retain internal orchestration spans (dropped by default) and `COPILOT_STUDIO_ADAPTER_DEBUG=1` to attach the raw source record for debugging. * **`dataset_name` on experiment runs** * `ExperimentRunObject` now includes a `dataset_name` field alongside `dataset_id`, so the linked dataset's name is available when listing or fetching experiment runs. The field is optional and resolves to `None` for offline (`EXT-*`), deleted, or unset datasets. #### Changed * **Event update: `outputs` must be an object** * `UpdateEventRequest.outputs` and `LegacyUpdateEventRequest.outputs` are now typed as `Dict[str, Any]` instead of `Any`. Update calls accept only normalized (object-shaped) outputs; previously an array could slip through and corrupt the stored event. If you were passing a list when updating an event, wrap it as `{"value": [...]}`. Event creation and OTEL ingestion continue to normalize arrays automatically.
## Python SDK ### [v1.3.0](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.3.0) #### Added * **Configurable API request timeout** * `HoneyHive(timeout=...)` now sets the per-request timeout, in seconds, for standard API client calls. You can also set `HH_API_TIMEOUT`; the explicit `timeout=` argument takes precedence. The default remains 5 seconds, so existing clients keep the same timeout unless you opt in. * **Event lookup by ID** * The generated sync and async event services now include `GET /v1/events/{event_id}` as `getEvent(..., event_id=...)`, returning `GetEventResponse` / `GetEventResponseEvent` models exported from `honeyhive.models`. * **Custom tracer export HTTP sessions** * `HoneyHiveTracer.init(requests_session=...)` and `TracerConfig(requests_session=...)` now accept a caller-owned `requests.Session` for OTLP span export. Use this when you need custom proxies, retries, TLS settings, or connection pooling. The SDK does not close a session that you provide. #### Compatibility * **Self-host: `GET /v1/events/{event_id}` requires backend v1.3.0+** * Self-hosted deployments must run a HoneyHive backend on version 1.3.0 or greater before calling `GET /v1/events/{event_id}`. Older self-host backends do not expose this route, so event-by-id calls will fail until the backend is upgraded. HoneyHive Cloud users are unaffected.
## Python SDK ### [v1.2.1](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.2.1) No customer-facing changes. Internal OpenAPI generator and generated-model cleanup only.
## Python SDK ### [v1.2.0](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.2.0) #### Added * **Metric versions API: `client.metric_versions`** * New `client.metric_versions.list(metric_id)`, `.create(metric_id, request)`, and `.deploy(metric_id, version_name)` methods (plus `*_async` variants) for managing a metric's immutable version history, backed by `/v1/metrics/{metric_id}/versions`. Each metric keeps a history of versions with one deployed at a time; pass `deploy_immediately=True` on create to atomically deploy the new version. Version request/response models are exported from `honeyhive.models`. #### Fixed * **OTLP JSON exporter: serialize numeric fields as JSON strings** * Integer span attributes (`intValue`) and uint64 timestamp fields (`startTimeUnixNano`, `endTimeUnixNano`, `timeUnixNano`) were emitted as raw JSON numbers. The protobuf JSON mapping spec requires these to be JSON strings; values above 2^53 could otherwise lose precision silently through float64 rounding. Now matches native `opentelemetry-exporter-otlp-proto-http` behavior. * **Decorator input capture: remove truncation of serialized list/dict values** * List and dict span attributes are serialized to strings and previously were truncated to 1000 characters in length. The arbitrary limit of 1000 characters has been removed.
## TypeScript API SDK ### [v1.3.0](https://github.com/honeyhiveai/typescript-api-client/releases/tag/v1.3.0) #### What's New * New `client.metricVersions` namespace with `list`, `create`, and `deploy` methods for managing snapshot versions of a metric's definition via `/v1/metrics/{metric_id}/versions` and `/v1/metrics/{metric_id}/versions/{version_name}/deploy`. * New exported request/response types: `GetMetricVersionsRequest`/`Response`, `CreateMetricVersionRequest`/`Response`, and `DeployMetricVersionRequest`/`Response`.
## CLI ### [v1.3.0](https://github.com/honeyhiveai/honeyhive-cli/releases/tag/v1.3.0) #### What's New * Added `metric-versions` subcommands for managing snapshot versions of a metric's definition: `metric-versions list`, `metric-versions create`, and `metric-versions deploy`. Use these to review history, create new draft or immediately-deployed versions, and roll between versions without losing history.
## TypeScript API SDK ### [v1.2.1](https://github.com/honeyhiveai/typescript-api-client/releases/tag/v1.2.1) Internal improvements only.
## CLI ### [v1.2.1](https://github.com/honeyhiveai/honeyhive-cli/releases/tag/v1.2.1) Internal improvements only.
## TypeScript API SDK ### [v1.2.0](https://github.com/honeyhiveai/typescript-api-client/releases/tag/v1.2.0) #### What's New * Added a `dataPlaneUrl` client option and `HH_DATA_PLANE_URL` environment variable for configuring the data plane URL. These replace the previous `serverUrl` option and `HH_API_URL` environment variable. * The verbose logging output now labels the resolved URL as `Data plane URL:` (previously `API URL:`). #### Fixes & Improvements * Environment variables set to the empty string (e.g. `HH_API_KEY=`, `HH_DATA_PLANE_URL=`) are now treated as unset and fall back to defaults, rather than being propagated as a literal empty string. #### Compatibility & Deprecations * The `serverUrl` client option and `HH_API_URL` environment variable are deprecated and will be removed in the next major version. They continue to work but log a one-time deprecation warning to stderr on client construction. Migrate to `dataPlaneUrl` / `HH_DATA_PLANE_URL`.
## CLI ### [v1.2.0](https://github.com/honeyhiveai/honeyhive-cli/releases/tag/v1.2.0) #### What's New * Added `--data-plane-url` flag and `HH_DATA_PLANE_URL` environment variable for pointing the CLI at a specific HoneyHive data plane (e.g. self-hosted or staging deployments). Verbose output now labels this value as `Data plane URL:` instead of `API URL:`. #### Compatibility & Deprecations * The `--base-url` flag and `HH_API_URL` environment variable are deprecated and will be removed in the next major version. They still work as aliases for the new names but now log a deprecation warning to stderr on each invocation. Migrate to `--data-plane-url` / `HH_DATA_PLANE_URL`.
## TypeScript API SDK ### [v1.1.1](https://github.com/honeyhiveai/typescript-api-client/releases/tag/v1.1.1) #### Fixes & Improvements * Fixed a bug where `error.message` on thrown API errors was not populated, causing error logs and CLI output to omit the underlying failure detail.
## CLI ### [v1.1.1](https://github.com/honeyhiveai/honeyhive-cli/releases/tag/v1.1.1) #### Fixes & Improvements * Error output for failed API requests now includes the server's error message. All CLI commands that hit the API previously printed only `API error `; they now print `API error : ` with the actionable detail from the server.
## Python SDK ### [v1.1.0](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.1.0) #### Added * **Charts API: `client.charts` CRUD surface** * New `client.charts.create()`, `.list()`, `.get(chart_id)`, `.update(chart_id, request)`, and `.delete(chart_id)` methods (plus `*_async` variants) backed by `POST /v1/charts`, `GET /v1/charts`, `GET /v1/charts/{chart_id}`, `PUT /v1/charts/{chart_id}`, and `DELETE /v1/charts/{chart_id}`. Chart request and response models are exported from `honeyhive.models`. #### Changed * **CrewAI integration example refreshed** * The CrewAI example (`examples/integrations/crewai_integration.py`) has been rewritten with three realistic customer-support scenarios (single-agent with tool calls, sequential two-agent crew, and `@trace` escalation). Crews are now named for clearer span labels, and teardown properly flushes remaining spans. #### Fixed * **Tracer init: `project` / `HH_PROJECT` no longer required** * `HoneyHiveTracer.init()` previously required `project` and treated a missing value as degraded mode. Since the backend determines the project from the API key, only `api_key` is actually needed. Callers that followed the v1.0.1 deprecation guidance and removed `project` were silently running in degraded mode — this is now fixed. `project` and `HH_PROJECT` remain accepted for backwards compatibility (deprecated, to be removed in v2.0). * **Duplicate `model` spans in `evaluate()`** * `evaluate()` could occasionally emit two `model` spans for a single LLM call when running multiple datapoints concurrently. The underlying race condition in instrumentation setup has been fixed. #### Removed * **`cp_base_url=` parameter and `HH_CP_API_URL` env var removed** * These options were vestigial configuration for an incomplete Control Plane integration that was never wired up or shipped. No customer code could have depended on them. They have been removed to clean up the public API surface. If you happen to pass `cp_base_url=` or set `HH_CP_API_URL`, simply remove them — `HH_API_URL` / `base_url=` is the only base-URL setting.
## TypeScript API SDK ### [v1.1.0](https://github.com/honeyhiveai/typescript-api-client/releases/tag/v1.1.0) #### What's New * New `client.charts` namespace with `create`, `list`, `get`, `update`, and `delete` methods for managing charts via `/v1/charts` and `/v1/charts/{chart_id}`. * New `client.experiments.getSummary()` method for `GET /v1/runs/{run_id}/summary`, returning pass/fail results, metric aggregations, per-datapoint results, and the experiment run object. * New `client.sessions.createEventBatch()` method for `POST /v1/sessions/{session_id}/events/batch`, accepting a batch of events scoped to a single session (the `session_id` from the path overrides any value in the event body). * New exported request/response types: `CreateChartRequest`/`Response`, `GetChartRequest`/`Response`, `GetChartsResponse`, `UpdateChartRequest`/`Response`, `DeleteChartRequest`/`Response`, `GetExperimentSummaryRequest`/`Response`, and `CreateSessionEventBatchRequest`/`Response`. #### Compatibility & Deprecations * Bumped `axios` from `1.15.2` to `1.16.0`.
## CLI ### [v1.1.0](https://github.com/honeyhiveai/honeyhive-cli/releases/tag/v1.1.0) #### What's New * Added `charts` subcommands for managing charts via the CLI: `charts list`, `charts create`, `charts get`, `charts update`, and `charts delete`. * Added `sessions create-event-batch` for adding a batch of events to an existing session. * Added `experiments get-summary` for retrieving an experiment run's evaluation summary, including pass/fail results and metric aggregations.
## Python SDK ### [v1.0.2](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.0.2) #### Fixed * **Experiments: client-side evaluator scores now flow end-to-end in `evaluate()`** * Scores returned by evaluators in `evaluate()` are now written to the correct user-function chain span via `enrich_span(metrics=…)`, exported over OTLP, and surfaced in server-side run comparison's per-event `metric_deltas`. Previously, evaluator scores were duplicated into `run.metadata.evaluator_metrics` and onto the per-datapoint session event, but neither path actually populated the per-event surface that run comparison requires — client-side evaluator scoring and comparison did not work end-to-end. * The two legacy write paths have been removed now that the scores are correctly written to the chain span as the single source of truth. * **API Client: `event_id` typed as required on `POST /events` responses** * `PostEventResponse.event_id` was incorrectly typed as `Optional[str]` in the OpenAPI spec; the backend always returns the field on a 2xx response. The spec was corrected and the generated SDK now reflects the runtime guarantee, removing the need for defensive `if event.event_id:` guards. No runtime behavior change, but strictly typed mypy codebases with `warn_unreachable = True` or pyright with `reportUnnecessaryComparison` enabled may produce "unnecessary comparison" or "redundant Optional guard" warnings, depending on exact usage patterns. #### Added * **`FilterFieldType.DATETIME` enum value** * The SDK enum was missing the `"datetime"` wire value supported by the backend. Additive — no behavior change for existing callers. #### Deprecated * **`FilterFieldType.ID`** * `ID = "id"` was never a valid backend wire value and has always been rejected on the wire. Use `"string"` for UUID-shaped fields such as `session_id`. The alias is preserved so existing imports continue to resolve and will be removed in the next major. #### Removed * **`honeyhive` Python CLI entry point removed from `pyproject.toml`** * The shipped Python `honeyhive` console script was non-functional (dead code) and shadowed the official TypeScript CLI on `$PATH`. CLI functionality is now provided by the official [`honeyhive` TypeScript CLI](https://docs.honeyhive.ai/v2/cli-reference/getting-started); removing the Python script entry point lets `honeyhive` resolve correctly when both packages are installed globally.
## TypeScript API SDK ### [v1.0.1](https://github.com/honeyhiveai/typescript-api-client/releases/tag/v1.0.1) Internal improvements only.
## TypeScript API SDK ### [v1.0.0](https://github.com/honeyhiveai/typescript-api-client/releases/tag/v1.0.0) Initial launch.
## CLI ### [v1.0.0](https://github.com/honeyhiveai/honeyhive-cli/releases/tag/v1.0.0) Initial launch
## Python SDK ### [v1.0.1](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.0.1) #### Fixed * **Default API URL fallback corrected to `https://api.dp1.us.honeyhive.ai`** * The fallback value for the base API URL in the v1.0.0 release was incorrect. Any callers who relied on the implicit default would fail. The default now points at the host the SDK is built against, though self-hosted / non-default Data Plane deployments will still need to set `HH_API_URL` explicitly. Callers that explicitly set `base_url=` / `server_url=` or `HH_API_URL` are unaffected. #### Deprecated * **`project` argument and `HH_PROJECT` environment variable** * The SDK's public surface has accepted `project=` on `HoneyHive()` and `HoneyHiveTracer.init()` and the `HH_PROJECT` env var for historical reasons. These arguments and env vars have no influence on the backend and they were maintained purely for backwards compatibility of callers. This release sweeps the stale references out of the example scripts, README, and docstrings, and adds a `DeprecationWarning` at the remaining call sites that previously didn't emit one. The argument and the `HH_PROJECT` env var alias **remain** accepted for backwards compatibility and will be removed in v2.0.
## Python SDK ### [v1.0.0](https://github.com/honeyhiveai/python-sdk/releases/tag/v1.0.0) First stable GA release of the HoneyHive Python SDK. Public APIs follow semver from this release forward — breaking changes only on major versions, additive on minor and patch. The changes below are relative to `1.0.0rc22`. For the full picture of what shipped during the release-candidate cycle, see the `1.0.0rc1`–`1.0.0rc22` entries. #### Changed * **Tracing: `skip_backend_session_creation=True` now works without an explicit `session_id`** * Previously the flag only opted out of the init-time backend roundtrip when a `session_id` was also supplied. Setting the flag alone is now supported: the SDK skips the roundtrip, does not mint a UUID, and per-request `create_session(session_id=..., skip_api_call=True)` calls emit spans that ingestion materializes into Session rows on first arrival. * **Tracing: `create_session(skip_api_call=True)` propagates `session_name` into baggage** * When `session_name` is supplied, it now travels with `session_id` across async / threaded boundaries. #### Removed * **`DeleteMetricQuery` removed from `honeyhive.models`** * Internal query-params type that was exported but unused — no public method accepted or returned it. The public `client.metrics.delete(id=...)` signature is unchanged.
# Product Source: https://docs.honeyhive.ai/v2/changelog/product See what is new in the HoneyHive platform and UI. Browse product updates, feature launches, and major improvements that affect how you build and monitor AI. ## Core Platform ### Project-Scoped Dataset and Datapoint Endpoints You can now work with datasets and datapoints using fine-grained data plane API keys. New project-scoped endpoints list datasets, delete them, add datapoints, and read individual datapoints: `GET /v1/projects/{project_id}/datasets`, `DELETE /v1/projects/{project_id}/datasets/{dataset_id}`, `POST /v1/projects/{project_id}/datasets/{dataset_id}/datapoints`, and `GET /v1/projects/{project_id}/datapoints/{datapoint_id}`. [Learn more about fine-grained keys](/v2/workspace/api-keys#fine-grained-keys) ### Control Plane Admin Access for an SSO Group Self-hosted SSO deployments can now grant control plane admin access to everyone in one identity provider group by setting `license_policy.controlplane_admin_sso_group`. The group replaces the built-in admin entitlement groups, so admins outside it lose control plane admin access at their next sign-in. It requires `license_policy.sso_group_scheme: entitlement-roles-2026-8` and cannot be combined with `controlplane_admin_emails`. [Learn more about group claims](/v2/workspace/identity-provider#group-claims-optional) ### Action Required **The following changes may require action on your part** * **Four dataset and datapoint endpoints are deprecated.** `GET /v1/datasets`, `DELETE /v1/datasets/{dataset_id}`, `POST /v1/datasets/{dataset_id}/datapoints`, and `GET /v1/datapoints/{datapoint_id}` are deprecated in favor of the project-scoped endpoints above. If you call these endpoints directly, move to the new endpoints and authenticate with a data plane API key. The new endpoints do not accept project API keys and the deprecated endpoints do not accept data plane keys, so changing only the URL returns a `404`. The deprecated endpoints continue to work for now. * **Self-hosted SSO deployments on 2026 entitlement roles: review your admin email allowlist before upgrading.** Every address and wildcard pattern in `license_policy.controlplane_admin_emails` now keeps control plane admin access after sign-in (see Fixes below), so remove stale entries first. ### Fixes * Strands agent model events now keep every tool call and tool result in a turn, where previously only the first tool call was kept. Assistant messages and model outputs now also include a `tool_calls` list, and tool messages include a `tool_results` list. Events ingested before this release are not updated. [Learn more about the Strands integration](/v2/integrations/strands) * Self-hosted SSO deployments: users listed in a license's control plane admin email allowlist now keep admin access after signing in on licenses that use 2026 entitlement roles. ## Core Platform ### New Chart Types in Discover Discover now offers histogram, number, categorical bar, time series bar, doughnut, and table charts, so you can pick the view that fits the question you are asking. Time-axis charts gain a cumulative sum option and 1-minute buckets (including on 1-day ranges), and number cards can show a comparison line against the previous period. Histogram, number card, "auto" bucket, and "5 min" bucket settings are saved with the chart. Discover chart editor showing a session duration histogram with p50 and p95 markers, the chart type picker with Line, Number, Bar, Doughnut, Histogram, and Table options, and the matching sessions listed below [Learn more about charts](/v2/monitoring/charts) ### Interactive Charts Charts in Discover now respond to clicks, so you can drill into what you see without rebuilding filters by hand. Click a doughnut slice, a bar, a table row, or a time series legend entry to filter to it. Drag across a time series chart to zoom into that date range, and click or drag across a histogram to filter to a value range. ### Shareable Discover Links Discover now keeps its filters and chart settings in the page URL. You can send a teammate a link to a chart you have not saved yet, and the browser back and forward buttons step through your changes. ### Dashboard Improvements Dashboards are easier to arrange and read. Drag tiles to reorder them, and each tile header now shows the chart's source, aggregation, and filters. The new date range selector filters every chart on the dashboard to the range you pick, or choose **Default** to see each chart with the date range and bucket size it was saved with. The dashboard remembers your date range and carries it into Discover when you open a chart. Dashboard on the Default date range with number cards comparing against the previous period, grouped bar charts, and histograms, each tile header showing its aggregation and date range ### Fine-Grained Data Plane API Keys The **Data Plane** tab under API Keys settings now lets you create fine-grained keys rooted at an organization, workspace, or project. You choose the key's permissions when you create it, and the full key value is shown only once. These keys work with the project-scoped chart endpoints and the key-creation endpoints below. They do not replace classic project keys or ingestion keys for other API calls. Your organization's key policy limits the permissions these keys can carry, and on self-hosted deployments with more than one data plane, you choose which data plane an organization-level key belongs to. [Learn more about fine-grained keys](/v2/workspace/api-keys#fine-grained-keys) ### Create API Keys Through the API You can now automate key provisioning. `POST /v1/projects/{project_id}/fine_grained_api_keys` creates a data plane API key, and `POST /v1/projects/{project_id}/ingestion_api_keys` creates an ingestion API key. The request must use an organization-level data plane key that was granted key-creation permissions in the UI. Keys created through the API can never create other keys. [Learn how to create keys programmatically](/v2/workspace/api-keys/create-keys-programmatically) ### Project-Scoped Chart Endpoints New endpoints let you manage charts for a specific project: `GET` and `POST /v1/projects/{project_id}/charts`, and `GET`, `PATCH`, and `DELETE /v1/projects/{project_id}/charts/{chart_id}`. They accept data plane API keys, and chart updates use `PATCH`. ### Action Required **The following changes may require action on your part** * **Grant permissions to use the new Data Plane keys in organizations created before the September 17th, 2026 release.** Under Settings > Organization > Roles, add `org.fine_grained_api_key_dp.*`, `workspace.fine_grained_api_key_dp.*`, and `project.fine_grained_api_key_dp.*` to the roles that should manage these keys, and the matching `.get` and `.list` permissions to roles that should only view them. Without these permissions, the **Data Plane** tab stays disabled. Organizations created on or after that release get these permissions automatically, and existing keys are unaffected. * **`/v1/charts` and `/v1/charts/{chart_id}` are deprecated.** Move your integrations to the project-scoped endpoints under `/v1/projects/{project_id}/charts`. The deprecated endpoints continue to work for now. ### Improvements * Large sessions open much faster in the trace drawer. The session tree loads first, and an event's inputs and outputs load when you open that event. The Event JSON view no longer embeds child events' payloads. * Chart queries can now run for up to 20 seconds before timing out, up from 10 seconds. * Discover chart management: delete a chart, save changes as a new chart, review and reset unsaved changes, and see on the Save button why a chart cannot be saved. * Discover now offers only fields that can be charted in its chart pickers, and its event type selector matches the tabs and names on the Traces page. * Alerts now open their charts in Discover. * Self-hosted deployments: the OAuth Gateway AI provider suggests models reported by your gateway in the evaluator model field. The field still accepts any model name, so a gateway that cannot list its models keeps working. * Self-hosted deployments: requests and ingested events are less likely to be interrupted by restarts and rolling upgrades. * The code editor no longer loads from a third-party CDN, so deployments that block outbound internet access can still use it. ### Fixes * Chart errors now explain the problem in your terms, for example "No completions have been logged to this project yet" or naming the field that no events have recorded. * A saved chart now renders the same on the dashboard and in Discover, and opens with its saved settings and date range. * SSO deployments: signing in with an identity provider credential already linked to another user now shows a readable error instead of an internal server error. * The event Output panel no longer crashes on an empty chat history, and JSON-encoded message content now expands in the output view. * Failed spans from OpenTelemetry instrumentations (including Google ADK, AWS Strands, Pydantic AI, LangChain and LangGraph, and Semantic Kernel) are now marked as errors, so error counts for these frameworks are accurate. Events ingested before this release are not updated. * Spans with an unrecognized `gen_ai.operation.name` are now typed as chain, model, or tool events based on their attributes, instead of always appearing as tool events. Workflow and task spans from OpenTelemetry GenAI senders now appear as chain events. * Sessions with a non-UUID session ID are no longer re-created on every ingestion batch, so the session's name and timestamps now reflect the whole session rather than only the last batch. * Token counts sent as numeric strings are now included in session token totals. * Event exports and event search return large result pages faster. ## Core Platform ### Conversation View The Thread tab of the trace drawer now shows a new Conversation view, in beta. It reads a session as the turns that actually happened: each user message, the agent's reply, and a turn divider between them that counts the model, tool, handoff, event, and error steps it covers, with the turn's duration and tokens. A toolbar switches between Turns, Events, and Details, each adding one more level of detail, and a per-agent toggle expands or collapses a single agent's steps. Each agent keeps its own color, so you can follow a handoff at a glance. While the Conversation view is in beta, a toggle in the drawer header switches the Thread tab back to the existing Thread view and remembers your choice. Conversation view showing a multi-agent support session at the Events level, with turn dividers, agent colors, and a handoff [Learn more about the Conversation view](/v2/tracing/thread-view#conversation-view) ### Shareable Traces Date Ranges The date range you pick on the Traces page is now part of the page URL, as `range` for a preset window or `from` and `to` for a custom one. It survives a refresh and an event-type change, and a link you send a teammate opens on the window you were looking at. The range previously reset to the last 7 days. ### Self-Hosted SSO and Gateway Configuration The OAuth Gateway AI provider now takes an explicit JWT signing algorithm, so you can match the algorithm your identity provider registered the client for. PS256, ES256, and RS256 are available as a new optional credential under Settings > Workspace > AI Providers. Leaving it unset keeps signing with PS256, so a gateway you have already configured is unaffected. For SSO deployments, the identity-provider claim that carries group names is now configurable through `license_policy.sso_group_field`. It names one top-level ID token claim and defaults to `group_list`, which is what earlier releases always read. The claim may hold a string or an array of strings. [Learn more about provider keys](/v2/workspace/provider-keys) | [Learn more about identity providers](/v2/workspace/identity-provider) ### Action Required **The following changes may require action on your part** * **Update any integration that branches on a `401` or a `403` from the HoneyHive API.** To harden the API, a request that fails authorization no longer reveals whether the resource it asked for exists. A permission denial now answers `404` instead of `403`, and an invalid, missing, or ineligible API key answers `404` instead of `401`. No endpoint returns `403` any more. `404` and `5xx` responses also no longer carry a descriptive error message, and the detail is written to the server log instead. If your code branches on those status codes or parses those messages, update it, otherwise a permission problem reads as a missing resource and a failure loses its explanation. Event ingestion is unchanged, and a request that already succeeds is unaffected. ### Improvements * The ingestion endpoints used by the SDKs and OpenTelemetry exporters now accept request bodies up to 7 MiB, raised from 5 MiB, on routes other than the OpenTelemetry trace endpoint, which keeps its separate 50 MiB limit. Limits on the rest of the API are unchanged. * The Alerts page and the Logs tab of an experiment run now use the same filter builder as the Traces page. Filters saved with the older component continue to load and stay editable. ### Fixes * The traces list no longer repeats or skips a row at a page boundary. Sessions and events sharing a start time had no stable order, so a row could come back on two consecutive pages or on neither. Sessions ingested in the same millisecond made this reachable in practice. * Event name lists load much faster on projects with a large event history. Traces now fetches them when you open the event-name control, rather than on every page load and date change, long lists render only their visible rows and page in as you scroll, and a search past the first page runs server-side. * A session that cannot be read as a conversation now explains why in the Conversation view, rather than failing silently. * SSO deployments: signing in with an identity provider that signs its tokens with PS256 now works. Only RS256 was accepted, so session creation rejected an otherwise valid token. An incorrect issuer or audience is also now reported as such, where it previously surfaced as an expired token. * Self-hosted deployments: the OAuth Gateway AI provider now works with an ES256 key. An EC private key was previously rejected with a key-type error because the client assertion was always signed as RSA. * Traces exported from MLflow's automatic instrumentation for OpenAI and Anthropic now render as a conversation. Their spans previously landed as raw input and output values, and the request messages, the reply, tool calls, tool results, and the finish reason now populate the conversation fields, with an Anthropic system prompt shown at the start of the chat history. [Learn more about the Databricks Agent Bricks integration](/v2/integrations/databricks-agent-bricks) ### Security * A denial from the HoneyHive API no longer reveals whether the resource exists. Every `404` carries one fixed body whether the resource is absent or merely out of your reach, so a status code can no longer be used to probe which resources exist, and `404` and `5xx` bodies no longer carry error detail. * Updated the OpenTelemetry libraries used by event ingestion to clear a dependency advisory. No action is required. ## Core Platform ### Ingestion API Keys You can now create a key whose only job is sending traces and events. An ingestion key works with the HoneyHive tracer and with any OpenTelemetry exporter, is bound to a single project, and cannot read data back, so a key leaked from a production server exposes nothing. Ingestion keys never expire, because a key that timed out would silently stop telemetry across a whole fleet. Revoking one is how it stops working, and revocation takes effect within a few minutes. Manage them under Settings > Project > API Keys, on the new **Ingestion** tab next to your existing project keys on the **Project** tab. The full key value appears once, at creation, and cannot be recovered afterwards, so copy it then. A revoked key stays in the list as a record of who created and revoked it. See **Action Required** below for the manual step on existing organizations. Project API Keys page on the Ingestion tab, listing three ingestion keys with masked key prefixes, names, creator, creation time, and active or revoked status [Learn more about API keys](/v2/workspace/api-keys) ### Action Required **The following changes may require action on your part** * **Add ingestion API key permissions to existing organizations.** Add `project.ingestion_api_key.*` to the roles that should manage these keys (typically your project admin role), and `project.ingestion_api_key.get` and `project.ingestion_api_key.list` to roles that should only view them, under Settings > Organization > Roles. Until you do, the **Ingestion** tab of the project **API Keys** page stays disabled. Organizations created on or after the September 14th release get these permissions automatically. [Learn more about roles and permissions](/v2/workspace/roles) ### Improvements * Request body size limits are now enforced per endpoint, and a request over the limit is rejected with a `413`. Batch and long-context endpoints (events, sessions, runs, datapoints, datasets, and the LLM proxy) accept up to 64 MB, other authenticated endpoints up to 5 MB, and unauthenticated endpoints up to 1 MB. Limits are measured after decompression, so a compressed request is checked against its decoded size. * An event field that has been logged with both whole-number and decimal values is now typed as a decimal. Decimal fields cannot be grouped by, so such a field no longer appears in group-by options. ### Fixes * Trace sessions no longer show a cost of \$0.10 when no cost was recorded. Newly ingested sessions show no cost unless you set `metadata.cost` yourself, and costs you provide are unaffected. Sessions ingested before this release keep their stored value. * The Python evaluator editor now shows Python field-access examples instead of the template syntax used by LLM evaluators, which raised a syntax error when pasted into a Python evaluator. [Learn more about Python evaluators](/v2/evaluators/python) ### Security * Security hardening in API request handling and in third-party dependencies. No action is required. ## Core Platform ### Permission Changes Take Effect Right Away A membership, role, or roles-manifest change now sends the affected users back through sign-in, instead of letting them keep working with the permissions they held before the change. They land back on the page they were on, and the round trip is silent while their identity-provider session is still alive. Saving the roles manifest affects every signed-in member of the organization, including the admin who saved it, so expect a brief redirect of your own after you save. Signed-in sessions now also expire at a set time after sign-in rather than extending as you keep working, so you may be asked to sign in again periodically. The session lasts until your identity provider's token expires, and at least three hours. That round trip is silent too while your identity-provider session is alive. [Learn more about roles and permissions](/v2/workspace/roles) ### Improvements * `POST /v1/metrics/run` and `POST /v1/metrics/run_metric` now answer `200` with `success: false` and no result when the evaluator reads ground truth that the event does not carry, where they previously returned a `400`. A missing reference value is no longer reported to your integration as a bad request. ### Fixes * Event ingestion now answers `503` with a `Retry-After` header, rather than `401`, when it temporarily cannot verify your API key. A `401` made OpenTelemetry exporters discard the batch, so events were lost during a brief outage. A `503` invites a retry and the events survive. * Filter suggestions on the Traces and Events pages now follow the selected time window and load faster, listing the fields that actually appear in that range. Field values are still aggregated across all time. * A newly created organization now appears in the organization switcher immediately, instead of showing "No organizations" until you refresh the page. * An evaluator that HoneyHive disables automatically after repeated failures now records a version snapshot, so you can compare and restore it like any other version. [Learn more about evaluator versioning](/v2/evaluators/versioning) * SSO deployments: signing out now also ends your session with identity providers that require the OIDC `id_token_hint`, which previously stayed alive. [Learn more about identity providers](/v2/workspace/identity-provider) ### Security * Security fixes across authentication, alerting, and event ingestion. No action is required. ## Evaluators ### Ground Truth Is Detected Automatically HoneyHive now detects whether a server-side Python or LLM evaluator needs ground truth by reading its code or prompt. An evaluator that references `feedback.ground_truth` runs only on events that carry a value, and the rest record no score at all rather than a failed score. If you add ground truth to an event later, the evaluator scores it then. The **Requires Ground Truth** setting is gone from the evaluator editor, and the matching `needs_ground_truth` API field and CLI flag are deprecated and ignored. Requests that still send them keep working, so no config or script needs to change. ## Core Platform ### Improvements * Resource IDs can now be copied from the Fine-Grained API Keys settings. Organization settings show the organization and data plane IDs, and workspace settings show the workspace ID, so you can paste them straight into scripts and API calls. [Learn more about API keys](/v2/workspace/api-keys) ### Fixes * Numeric filters on the Events page now send numeric values to the API. A filter such as `duration > 10000` previously submitted the value as a string and could return a `400`, and a zero value rendered as blank. Blank and non-finite values are now rejected, and `0` displays correctly. * Native MLflow OpenTelemetry traces now populate conversation fields and event types correctly. Default MLflow exports using `mlflow.*` attributes fill in inputs, outputs, model and provider configuration, token usage, and model, tool, and chain classifications. [Learn more about the Databricks Agent Bricks integration](/v2/integrations/databricks-agent-bricks) * AI provider credential "Last Updated" times now display correctly across time zones. A newly saved credential could previously appear hours old. * Self-hosted deployments: long OAuth Gateway credentials no longer push the rest of the settings form off-screen. Multi-line credential fields keep a fixed height and scroll internally. * Invalid event-statistics dates and chart or query identifiers now return clear validation errors, instead of failing later while the request is processed. ### Security * Additional security fixes across the platform. ## Core Platform ### Create and Update Workspaces Through the API You can now create a workspace and change its name or description without opening the UI, so spinning up a new team or environment can run from your own provisioning scripts. `POST /v1/virtual_dataplanes/{virtual_dataplane_id}/workspaces` creates a workspace from a name and optional description, and `PUT /v1/workspaces/{workspace_id}` updates either field. A new workspace holds no projects, so call `POST /v1/workspaces/{workspace_id}/projects` before logging events to it. Set `workspace_creator` to the email of an existing data plane member to make them the Workspace Admin of the new workspace. Leave it out and the workspace is created with no members, so add memberships before anyone can open it. [Learn more about the organization hierarchy](/v2/workspace/organization-hierarchy) ### Manage Data Planes Through the API (Dedicated Cloud and Self-Hosted) Data planes are now readable and manageable over the Control Plane API, so you can provision the top of your hierarchy with the same scripts that build the rest of it: * `GET /v1/virtual_dataplanes/{virtual_dataplane_id}` returns a single data plane, including the `cluster_id` of the cluster hosting it. * `POST /v1/orgs/{org_id}/virtual_dataplanes` creates one, `PUT` renames it, and `DELETE` archives it. Reads work on every deployment. The write endpoints return a `403` on deployments where HoneyHive assigns data planes automatically, which is the default. On create, omit `cluster_id` to place the new data plane alongside your organization's existing ones. Send it explicitly when your organization has no data planes yet, or when its existing ones span more than one cluster. Both cases return a `400` naming which one applies. Deleting a data plane archives everything inside it: every workspace, every project in those workspaces, and the events, datasets, and evaluations they hold. A data plane that still has active workspaces is rejected with a `409` unless the request sets `dangerously_delete_child_scopes=true`. ### Improvements * Fine-grained API keys can now carry the permissions the workspace and data plane endpoints above need: `org.dataplane.create`, `dataplane.scope.get`, `dataplane.scope.put`, `dataplane.scope.archive`, `dataplane.workspace.create`, and `workspace.scope.put`. [Learn more about API keys](/v2/workspace/api-keys) * Filtering on an event field that has no recorded values now returns a `400` naming that field, instead of a lower-level error from the query engine. An `exists` filter on the same field still works. * Server-side Python evaluators can now import `random` and the `pandas` submodules `api`, `arrays`, `errors`, `testing`, `tseries`, and `util`, which were previously rejected. ### Fixes * Annotation queue event counts now load faster. The lookup behind them scanned every event type, which made queues slow to open on projects with a large event history. * Filters using `contains` on a field that holds a list of values now work instead of failing with an unknown-identifier error, so a saved view or alert carrying one starts evaluating again. * Filtering on a metadata field whose key contains non-ASCII characters now works. * Self-hosted deployments: fixed an issue with data plane to control plane reconnects that could cause service disruptions. ### Security * Security hardening across server-side Python evaluators and the API. Typical evaluator code is unaffected. If one of your evaluators starts returning a permission error after upgrading, [contact us](mailto:support@honeyhive.ai). ## Core Platform ### Fine-Grained API Keys for Organizations and Workspaces You can now create API keys that carry an explicit set of permissions instead of blanket access. Create them under Settings > Organization > API Keys or Settings > Workspace > API Keys, select exactly the permissions the key needs, and set an expiration date. These keys authenticate the Control Plane API, so your own systems can manage projects and alerts with a key scoped to just that job. Organizations can also bound what any key is allowed to carry. Settings > Organization > API Key Policy limits which permissions may be placed on a fine-grained key, so workspace admins can create their own keys while your security team sets the ceiling. See **Action Required** below for the manual step on existing organizations. Create Fine-Grained API Key dialog showing the permission picker with workspace and project permissions selected, a key name, description, and expiration [Learn more about API keys](/v2/workspace/api-keys) ### Retrieve and Delete Workspaces Through the API Two new Control Plane endpoints let you manage workspaces programmatically. `GET /v1/workspaces/{workspace_id}` returns a single workspace, and `DELETE /v1/workspaces/{workspace_id}` archives one. A workspace that still contains active projects is rejected with a `409` unless the request sets `dangerously_delete_child_scopes=true`, which also archives those projects along with the events, datasets, and evaluations in them. ### OAuth Gateway as an AI Provider (Self-Hosted) Self-hosted deployments can now route model calls through an OAuth2-authenticated, OpenAI-compatible gateway. If your organization requires model traffic to pass through an internal gateway, your evaluators and playground calls can now go through it. Configure the gateway URL, token endpoint, client ID, private key, audience, and any required routing headers under Settings > Workspace > AI Providers. These credentials are configured at the workspace level; project-level credentials are not available yet. [Learn more about provider keys](/v2/workspace/provider-keys) ### Action Required **The following changes may require action on your part** * **Self-hosted deployments: add fine-grained API key permissions to existing organizations.** Add `org.fine_grained_api_key_cp.*` and `workspace.fine_grained_api_key_cp.*` to the roles that should manage these keys (typically your organization and workspace admin roles) under Settings > Organization > Roles. Until you do, the organization and workspace API Keys pages stay hidden. Organizations created on this release or later get these permissions automatically. [Learn more about roles and permissions](/v2/workspace/roles) * **Server-side Python evaluators now run on Python 3.13** (previously 3.11). If a custom Python evaluator imports a standard library module that was removed in Python 3.12 or 3.13, update it before upgrading, otherwise that evaluator stops running. ### Improvements * New models are available for LLM-as-judge evaluators: Claude Fable 5, Claude Opus 5, and the GPT-5.6 Sol, Luna, and Terra variants. [Learn more about LLM evaluators](/v2/evaluators/llm) * Providers without a fixed model list, including Azure OpenAI, now accept a model name typed directly, so you can use a model without waiting for it to appear in the catalog. * Custom roles can now cascade any permission to descendant scopes, not just administrative ones. You can give workspace members usable access to every project in the workspace without adding them as a member of each project individually. Nothing changes until you update a custom role: no built-in role uses this. Note that access granted this way does not show up in a scope's member list, so it is less visible than a direct membership. * Organizations can now be created without a default data plane, workspace, and project, so administrators can build the scope tree themselves. This applies only to deployments whose license selects manual data plane assignment; automatic provisioning remains the default. ### Fixes * Charts on the Discover and dashboard pages no longer truncate on busy time windows. Aggregation previously capped at 1000 raw events in the browser, so a busier window rendered an incomplete chart. Charts now aggregate server-side across the whole window, which is also faster. * Very long values in the trace side view no longer produce near-infinite scrolling. Long strings in the configuration, user feedback, user properties, metadata, and automated evaluation sections now collapse behind a "Show more" toggle, and long error text is capped to a scrollable area. * A project created through the API is now immediately usable in the UI, instead of appearing inaccessible until you log out and back in. An idle tab sitting on the project list may still need one further interaction to pick up the new project. ### Security * Service images now use minimal base images with no shell, package managers, or OS package tooling, and the Python services moved to a current Python runtime. Self-hosted deployments should see the [Self-Hosting changelog](/v2/changelog/self-hosting) for the operational impact. ## Integrations ### Salesforce Agentforce session traces You can send Salesforce Agentforce session traces to HoneyHive with a cookbook poller. [Learn more about the Salesforce Agentforce integration](/v2/integrations/salesforce-agentforce) ## Integrations ### Databricks Agent Bricks via MLflow OTel You can now export Databricks Agent Bricks and custom MLflow agent traces to HoneyHive with environment variables alone. Enable GenAI semantic conventions and dual export so the same agent spans land in Databricks MLflow and HoneyHive, including model inputs, outputs, and token usage. No HoneyHive SDK code is required in the agent. [Learn more about the Databricks Agent Bricks integration](/v2/integrations/databricks-agent-bricks) ## Core Platform ### New Anthropic Models for LLM-as-Judge Evaluators Claude Opus 4.8 and Claude Sonnet 5 are now available as backing models for your server-side evaluators. If you use LLM-as-judge evaluators, you can select these latest Anthropic models for more capable and up-to-date evaluation. The available AWS Bedrock Anthropic models have also been refreshed to current versions. [Learn more about LLM evaluators](/v2/evaluators/llm) ### Fixes * Searches and dashboard charts that filter on feedback, evaluator, output, or metadata field values are now significantly faster. These filters previously fell back to a slow query path that could take over a minute on large projects. * The evaluator test panel now loads sample events quickly and reliably, instead of scanning your entire event history. * Member settings now consistently reflect the organization shown in the page URL. Previously, invite and revoke dialogs could display the wrong organization, and admin controls could be hidden for users who had the right permissions. * Self-hosted deployments: Exporting or searching large volumes of events is now more memory-efficient and less likely to cause service disruptions. ## Core Platform ### Improvements * Old settings bookmarks using `/settings/organization/...`, `/settings/workspace/...`, or `/settings/project/...` now automatically redirect to the new scope-based settings routes. No need to update your bookmarks manually. ## Core Platform ### Inherited Admin Access in Scope Switcher If you're an organization or data plane admin, the workspace and project switchers now show every scope your role grants access to, including ones you aren't a direct member of. Newly created projects appear automatically without anyone needing to add you, so you no longer have to ask for access to scopes that your admin role already covers. ### Improvements * Settings access in the scope switcher has moved to a compact menu with General settings and Members options. The menu only shows options you have permission to use, and hides entirely when none apply. ### Fixes * Dashboard charts no longer spin indefinitely when chart data fails to load. They now display a clear error message. * The Experiments page now reloads correctly when switching between projects, instead of showing stale data or a broken loading state. * Users auto-invited to an organization by email domain are now automatically added to a data plane, so they can access workspaces and projects immediately (HoneyHive Cloud only). * Exporting large volumes of events no longer risks memory issues on the data plane. Exports now process in bounded batches for stable performance. ## Core Platform ### Evaluator Failure Visibility on Events When an evaluator fails, you can now see exactly what went wrong directly on the event. Failed evaluations appear as a `_failure` entry in the event's metrics, with details on whether execution started and what caused the failure. The evaluator run API also now returns more specific HTTP status codes (400 for invalid requests, 422 for execution failures), making it easier to diagnose issues in your integration code. ### Action Required * **Composite evaluators have been removed.** Composite evaluators can no longer be created, edited, or viewed. If you previously used composite evaluators, recreate the logic using individual evaluators. ### Fixes * Searching for recently ingested events now returns results within a few seconds, instead of appearing empty for up to a minute. * The Annotation Queue page no longer gets stuck in a loading state when the backend is slow. It now times out cleanly and shows a Retry button. * Fixed an issue where inviting a user to an organization could create an extra data plane on their first sign-in (HoneyHive Cloud only). * Dataset operations no longer fail on projects with very large datapoint payloads, and are significantly faster on large projects. ## Core Platform ### Usage Reports by Workspace and Project The Usage page now lets you break down event counts and computed metrics by workspace or project, not just at the organization level. A new **Group By** selector switches between Organization, Workspace, and Project views, with drill-down detail and JSON/CSV export. If you need to attribute costs or consumption to specific teams or applications, this is the view to use. ### Improvements * The All Workspaces page now lists workspaces across all data planes in your organization, matching the org switcher. Selecting a workspace on a different data plane switches to it automatically. * Organization-level API keys have been removed from the API key settings. These keys were never usable for authentication, so no working integrations are affected. Project-level API keys continue to work as before. ### Fixes * Faster event and trace searches on high-traffic projects. Searches that previously timed out under heavy ingestion are now consistently fast. * Fixed "Last updated" timestamps displaying a bogus value (such as "100000 ago") after creating or updating an item. * Fixed opening an invalid experiment run URL showing a blank page instead of a clear "not found" message. * Fixed the "Create annotation queue" dialog retaining values from a previous session when reopened. * Fixed the alerts onboarding quickstart content being cut off on shorter viewports. * Revoked API keys can no longer be edited or deleted, aligning with the rest of the API key permission behavior. * Fixed deleted annotation queues continuing to process events and queue configuration changes taking up to an hour to take effect. * Fixed evaluator versions being listable or creatable for a deleted evaluator. ## Core Platform ### Data Plane Selector in Admin Center Multi-data-plane deployments can now switch between data planes directly from the Admin Center. A new dropdown in the Data Plane section (General and Members) lets you target a specific data plane without leaving the page. Switching no longer resets your current workspace and project, and newly created data planes appear immediately without requiring a re-login. ### Improvements * Dataset ID is now a searchable field on the Datasets page, making it easier to find specific datasets when you know the ID. * Project and workspace settings pages now clearly prompt you to select a scope before showing settings, instead of displaying an ambiguous empty state. * The workspace switcher now consistently shows "Workspace" instead of a confusing "Onboarding" label when no workspace is selected. ### Fixes * Fixed intermittent "No events found" in the UI when the events database was temporarily unavailable. Transient failures now retry automatically and surface as errors instead of silently showing empty results. * Fixed slow loading of evaluator results on large projects. * String field values now appear as filter options on the Traces page. Previously, string values were not recorded for filtering. * Playground now loads the correct prompt template, config, and inputs after a page refresh. * Fixed a double scrollbar in the evaluator test panel and test results being cleared shortly after running. * Fixed the event-name dropdown on the Traces page rendering behind the table header. * Fixed the profile menu being hidden behind other page elements on the evaluator page. * Experiment run names can no longer be empty or whitespace-only. * Running an evaluator that requires ground truth on an event with no feedback now shows a clear message instead of a generic error. * Quickstart coding-agent prompts now wrap correctly within cards instead of overflowing. * Fixed an issue with the Admin Center scope selector when editing member roles. * Fixed the "New Workspace" button being incorrectly disabled in certain multi-data-plane configurations. ## Core Platform ### Streamlined Scope Navigation A redesigned navigation experience makes it faster to manage organizations, workspaces, and projects. New selectors in the top navigation let you browse all scopes in one place, jump directly to scope settings, and see at a glance which scopes you administer versus those you're a direct member of. Per-page scope selectors on Settings pages have been removed in favor of this unified workflow. ### Fetch a Single Event by ID A new `GET /v1/events/{event_id}` endpoint lets you retrieve a single event directly by its ID. Useful for building integrations, debugging pipelines, or pulling specific events into external tools without querying the full events list. ### Action Required **The following changes may require action on your part** * **Self-hosted deployments: update custom admin roles for downward permission inheritance.** The child-scope `list` and `manage_memberships` permissions (e.g., `org.dataplane.list`, `dataplane.workspace.manage_memberships`) are deprecated in this release and will be removed in a future version. Replace them with downward-cascading `scope` and `membership` permissions (e.g., `dataplane.scope.*`, `workspace.membership.*`) in your custom role manifests. Without this update, a future release may cause admins to lose the ability to view and manage descendant scopes where they are not direct members. See the [roles migration table](/v2/workspace/roles#downward-permission-inheritance-migration) for the full mapping. `ProjectAdmin` roles require no changes. ### Improvements * Experiment runs now display the linked dataset's name alongside the dataset ID in the runs table, run details, summary, and filters, making it easier to identify which dataset a run used. ### Fixes * Fixed the Traces table freezing or exhausting memory on projects with many event fields. The column selector is now virtualized, and the table only renders the columns you actually use. * Fixed the Alerts page silently capping at 10 alerts. All alerts now appear with full server-side filtering and pagination. * Fixed alert configuration offering invalid aggregation options (which could prevent alert creation) and now exposes all supported aggregations, including P99. * Fixed manual email/password sign-in being blocked for users whose email domain matches an SSO organization. These users can now sign in with their own credentials. * Fixed editing an alert resetting derived fields (such as the last evaluated result) when the underlying values had not changed. * Project and read-only API keys now work on the session and queue routes, matching the documented permission policy. Read-only keys can read these routes but still receive HTTP 403 on writes. * Fixed updating an event with a non-object output value corrupting the event. The `PUT /v1/events/{event_id}` endpoint now validates that `outputs` uses the canonical object form and returns a clear error otherwise. ### Security * Custom role permission inheritance is now limited to scope and membership permissions. Custom roles that previously inherited broader permissions should grant those permissions directly at the target scope. ## Core Platform ### Read-Only Project API Keys You can now create read-only API keys from Settings > Project > API Keys by toggling the read-only option when generating a new key. Read-only keys allow your team to query traces, datasets, and evaluator results without the ability to ingest new events. This is useful for dashboards, reporting tools, and integrations that should observe but not write. (See Action Required below for the manual step on existing orgs.) ### Action Required **The following changes may require action on your part** * **Read-only API key permissions needed for existing orgs.** To let users create and manage read-only project API keys, add `project.ro_project_api_key.*` to the roles that should manage them (e.g. ProjectAdmin and/or ProjectMember) under Settings > Organization > Roles. New organizations get these permissions automatically; the manual step is only needed for orgs created before this release. [Learn more about roles and permissions](/v2/workspace/roles) ### Improvements * The Alerts page is now generally available and no longer marked as Beta. * The event side view now includes a copy button for inputs/outputs JSON, making it faster to grab payloads for debugging or sharing. ### Fixes * Fixed event and experiment log tables freezing on large payloads. Tables that previously hung for up to 30 seconds when rendering large events now load consistently regardless of payload size. * Fixed an issue where users with access to many projects could be locked out of the Data Plane due to access tokens exceeding the HTTP header limit. Tokens are now scoped per workspace. * Error messages captured by the SDK (e.g. via enrichment or traced exceptions) are no longer silently dropped during OpenTelemetry ingestion. * Non-UUID session IDs sent via OpenTelemetry no longer cause dropped events. These IDs are now mapped to a stable session per project, and the original identifier is preserved for display and search. * Improved event search latency when retrieving large result sets. * The "Show Evals" button in the Session Summary is now hidden when an event has no evaluations or feedback. * Projects with no events now show the onboarding quickstart on the Alerts and Annotation Queues pages instead of a non-functional empty state. * The Experiments page now refreshes immediately when you navigate to it. Previously, returning to the page within 15 seconds showed cached data, so newly created experiments and runs would not appear until the next automatic refresh. ### Security * Streaming LLM completion error responses no longer expose internal details such as file paths or connection info. Clients receive a generic error message with no change to the streaming error signal. ## Core Platform ### Jinja2 Templating in LLM Evaluator Prompts LLM evaluator prompts now support full Jinja2 templating, giving you conditionals, loops, filters, and default values inside your prompt definitions. This makes it easier to write dynamic evaluator prompts that adapt to different event shapes and edge cases. [Learn how to use advanced template syntax](/v2/evaluators/llm#advanced-template-syntax) or browse the ready-made [conversation evaluator templates](/v2/evaluators/evaluator-templates#conversation-evaluator-templates). See **Action Required** below for migration guidance. ### Input/Output Redaction for Self-Hosted Deployments Self-hosted deployments can now redact event inputs and outputs before data leaves the Data Plane for the Control Plane. Set the `REDACT_VALUES=true` environment variable to replace every value inside event `inputs` and `outputs` with an empty value of its type, while preserving field structure for indexing and filtering. Useful for deployments with strict data residency or privacy requirements. ### Evaluator Version Management API New API endpoints let you list, create, and deploy evaluator versions programmatically. Create draft versions for testing, then deploy them when ready, without going through the UI. [Learn more about evaluator versioning](/v2/evaluators/versioning) ### OTLP/HTTP Protobuf Support OTLP/HTTP trace ingestion now accepts `application/x-protobuf` payloads, the default format for most OpenTelemetry SDKs. If you previously had to configure your exporter to send JSON to avoid HTTP 415 errors, you can now use the default protobuf format for better performance and smaller payloads. ### Action Required **The following changes may require action on your part** * **Review LLM evaluator prompts for variable casing and array access.** Evaluator prompts now render with Jinja2, so field names are case-sensitive. Use the exact field names shown in **Show Schema**. For array access, prefer explicit bracket notation like `{{ messages[0].content }}` because it is unambiguous and matches JSON indexing. Most prompts using lowercase dot-paths like `{{ outputs.content }}` are unaffected. ### Improvements * All project pages now enforce per-page permissions. Users without access see a clear "no access" message instead of a broken or empty page. * Datapoints now have shareable URLs, open in a side panel, and link directly to their source trace. * Deleting a dataset now requires a confirmation step to prevent accidental deletion. * The datasets list now includes a search field to filter by name or description. * Evaluator Advanced Settings are now expanded by default so the sampling percentage is visible without an extra click. * The alerts, prompts, annotation queue, API keys, providers, and usage tables now use the shared table layout for consistent sorting, pagination, and column resizing. * Ingestion endpoints now accept gzip-compressed payloads (`Content-Encoding: gzip`) across all OTLP, events, and sessions endpoints. ### Fixes * Fixed bulk-deleting datapoints removing them from every dataset instead of only the current one. * Fixed editing a datapoint metadata value unintentionally changing its type. * Unknown or zero session cost now displays as "-" instead of "\$0.0000". * Dataset deletion now surfaces success and failure notifications instead of failing silently. * Fixed evaluator changes not taking effect promptly due to a caching issue. Newly enabled evaluators now activate reliably, and deleted evaluators stop running immediately. ## Core Platform ### Coding Agent Onboarding If you instrument your application through a coding agent like Claude Code or Cursor, the onboarding flow now includes a dedicated path with copyable prompts and a picker for popular coding agents — get from sign-up to first traces faster by pasting straight into your agent. [Learn more about using coding agents with HoneyHive](/v2/introduction/ai-coding-agents). Coding agent onboarding quickstart showing the copyable prompt flow ### Faster Project Quickstarts Project quickstart page showing numbered setup steps, framework selection, starter snippet, status messaging, and unlock previews for dashboards, alerts, evaluators, annotations, and datasets Project and experiment quickstarts now help you get from a fresh project to your first trace or experiment faster, so you can start using HoneyHive sooner. ### Action Required **The following changes may require action on your part** * **Workspace Templates permission needed for existing orgs.** To let Workspace Admins view and edit project-creation templates, add `workspace.templates.*` to your workspace admin role under Settings > Organization > Roles. New organizations get this automatically; the manual step is only needed for orgs created before this release. [Learn more about templates](/v2/workspace/templates) ### Improvements * Evaluators that return categorical or string values now show a histogram of the top 5 values with frequency bars and counts in the session summary panel. * Page-size selector added to event tables (Traces, Discover, and experiment run views) so you can control how many rows display per page. * Hover tooltips now appear for long evaluator names in the Automated Evaluations panel. * Tables across the app (Datasets, Evaluators, Runs, Members, scope selectors, and event tables) now share a consistent experience with unified pagination, sorting, column resizing, and row selection. ### Fixes * Fixed OTLP/JSON ingestion rejecting valid payloads from JavaScript and TypeScript OpenTelemetry exporters. String-encoded integers, numeric enums, and hex-encoded trace/span IDs are now handled correctly, and malformed payloads return 400 instead of 500. * Fixed Workspace Admins being unable to access the [Workspace Templates](/v2/workspace/templates) page due to missing default permissions. (See Action Required above for the manual step on existing orgs.) * Fixed the side view jumping to the top when submitting a star rating in the feedback widget. ## Core Platform ### Project-Scoped URLs All top-level routes (Traces, Datasets, Experiments, Evaluators, Playground, Prompts, Alerts, Dashboard, and Discover) are now nested under `/p/[projectId]/...`. Every URL now explicitly identifies which project it belongs to, so shared links always open the intended project regardless of who clicks them. Old bookmarks to bare URLs like `/traces` still work and redirect based on your current project cookie, but when sharing links with teammates, use the project-scoped form for accuracy. ### Org Admin Permission Inheritance (HoneyHive Cloud) Org Admins on HoneyHive Cloud now automatically inherit membership and scope management permissions on all child workspaces and projects. You can manage workspace members, project settings, and scope configurations without needing an explicit role on each one. Self-hosted deployments with custom RBAC configurations are not affected unless you manually adopt the updated role definitions. [Learn more about permission inheritance](/v2/workspace/roles#permission-inheritance) ### Chart Data via API Keys You can now query dashboard chart data programmatically using project-scoped API keys. This opens up workflows like pulling chart data into external dashboards, automated reporting, or custom monitoring pipelines. ### Action Required **The following changes may require action on your part** * **Custom Python evaluator timeout reduced from 10s to 100ms.** If you have custom Python evaluators that perform heavy operations (large pandas transformations, complex regex on big payloads), they may now time out. Profile and optimize affected evaluators, or split work across multiple lighter evaluators. * **`POST /v1/events/export` deprecated.** Use `POST /v1/events/search` instead. The old `/export` route still works but will be removed in a future release. * **`POST /events/model` and `POST /events/model/batch` deprecated.** Use `POST /v1/events` with `event_type="model"` instead. The legacy routes continue to work. * **Legacy `DELETE /v1/datasets` query-based routes deprecated.** Migrate to the new path-based `DELETE /v1/datasets/{dataset_id}` and `DELETE /v1/datasets/{dataset_id}/datapoints/{datapoint_id}` routes. ### Improvements * Workspace Admins now receive `workspace.templates.*` permissions on newly created organizations, so they can view and edit workspace-scoped project templates. Existing organizations should add `workspace.templates.*` to the Workspace Admin role in **Settings > Organization > Roles**. * Scope settings (org, workspace, project) now have a dedicated General tab with edit and delete in one place. Delete confirmation requires typing the scope name. * New Account Settings tab for updating your display name and viewing your account ID and email. Display name editing is not available when SSO is enabled (your identity provider manages it). * Datasets page now uses a sortable table layout instead of cards. * The evaluator detail page now includes an Enabled toggle for quickly enabling or disabling an evaluator without navigating to settings. * Latest OpenAI, Anthropic, and Gemini models added to the provider config dropdown. * Your API URL is now displayed on the API Keys page, helpful when working with multi-dataplane deployments. * Email notifications are now sent when you are added to an organization, workspace, or project. * OTLP trace batch body limit raised from 10 MB to 50 MB on `/opentelemetry/v1/traces` for large agentic traces. * Traces table now fits the viewport with pinned pagination for smoother browsing across Discover, experiments, and trace run views. * Experiment runs list and chart now auto-refresh every 15 seconds while the tab is focused, so in-flight runs update without a manual reload. * **Tracing integration improvements:** * [AWS Strands](/v2/integrations/strands) and [AWS Bedrock](/v2/integrations/aws_bedrock) now route inputs and outputs correctly into the Inputs/Outputs panels instead of dumping them to metadata. * [CrewAI](/v2/integrations/crewai) spans now display named `Crew` identifiers instead of raw UUIDs. * [PydanticAI](/v2/integrations/pydantic-ai) v3 tool call arguments and results now populate the Inputs/Outputs panels instead of landing in metadata. * [OpenAI Agents](/v2/integrations/openai-agents) spans now use meaningful names and route inputs and outputs into the correct panels. * [Azure OpenAI](/v2/integrations/azure_openai) integration now captures inputs and outputs properly. * [Semantic Kernel](/v2/integrations/semantic-kernel) `invoke_agent` events now show inputs and outputs in the UI instead of only appearing in metadata. * Multiple browser tabs now coordinate sign-in/sign-out state, fixing intermittent "session expired immediately on login" issues. ### Fixes * Fixed a timestamp drift of up to 7 hours on session aggregate times in non-UTC environments. * Fixed `error exists` / `error not exists` trace filters matching every event or none instead of filtering correctly. * Fixed newline characters in error displays rendering as literal `\n` instead of actual line breaks. Python tracebacks are readable again. * Fixed boolean-valued evaluator scores not being counted in usage reports. * Fixed the "All" time period and "Download Report" buttons being disabled in usage reports when legacy events exist alongside current data. * Fixed trace side view not loading when opening a direct event link with an empty events list. * Fixed the auth error page not offering a sign-out option, which previously required manual cookie clearing to recover. * Fixed workspace members not being able to see AI provider settings. * Fixed experiment run comparisons silently returning empty results when evaluator data spanned multiple event types. * Fixed dropdown menus being clipped behind sticky table headers. * Fixed experiment run details returning 500 errors in multi-dataplane deployments when the request was routed to the wrong data plane. * Fixed the Human Annotations widget failing to save in certain deployment configurations. * Fixed experiment table row selection and select-all checkboxes not working. * Fixed `$gte` / `$lte` filter operators being silently ignored on events and sessions queries. * Fixed session tree views not honoring explicit `parent_id` chains, which could flatten well-defined parent-child structures. * Fixed evaluator processing holding slots for minutes during backend outages instead of failing fast. Timeouts are now configurable via `PYTHON_METRIC_TIMEOUT_MS` and `LLM_PROXY_TIMEOUT_MS`. * Fixed auto-disabled evaluators not staying disabled across all service instances. * Fixed OTLP model and tool spans being incorrectly reclassified as "chain" type when they have child spans. * Invalid `event_id` and `session_id` values now return clear 400 errors with the expected UUID format instead of failing silently downstream. * Server-side evaluators no longer error on non-OpenAI providers when `temperature` is configured. ### Security * Webhook URLs (which may embed tokens) and notification email addresses are no longer logged in plaintext. * Security patches applied for third-party dependencies (litellm, fast-xml-builder, protobufjs, aiohttp, urllib3). ## Core Platform ### Default Evaluator Sampling Changed to 10% New evaluators now default to a **10% sampling percentage** instead of 100%. This reduces cost for LLM-based evaluators at high trace volumes. Adjust the sampling percentage in the evaluator settings if you need higher coverage. ## Core Platform ### Faster First Project Setup New organizations now include a starter workspace and project automatically. You can create an API key and send traces right away, then add more workspaces or projects later when you need separate team boundaries or application environments. [Learn more about workspaces and projects](/v2/workspace/organization-hierarchy) ## Python SDK ### v1.0.0rc22 * New **OpenAI Agents** integration via OpenInference. Install with `pip install "honeyhive[openinference-openai-agents]"` to trace single-agent runs, multi-agent handoffs, and agents-as-tools flows. [Learn more →](/v2/integrations/openai-agents) * New **LangChain + LangGraph** integration. Install with `pip install "honeyhive[openinference-langchain]"` (OpenInference) or `pip install "honeyhive[traceloop-langchain]"` (Traceloop). One install covers both LangChain chains/agents and LangGraph `StateGraph` workflows. [LangChain →](/v2/integrations/langchain) | [LangGraph →](/v2/integrations/langgraph) * New **AWS Strands Agents** integration. Install with `pip install "honeyhive[aws-strands]"`. Strands emits OpenTelemetry spans natively, so the `HoneyHiveTracer` global TracerProvider is picked up automatically without a separate instrumentor. [Learn more →](/v2/integrations/strands) * Anthropic, LangChain, and AWS Bedrock integration examples and docs refreshed to current model IDs and modern usage patterns. [Anthropic →](/v2/integrations/anthropic) | [LangChain →](/v2/integrations/langchain) | [Bedrock →](/v2/integrations/aws_bedrock) * Numeric and boolean span attributes now preserve their original types through OTLP export instead of being converted to strings. * Mixed-library spans in the same batch (e.g. `pydantic-ai` + `httpx`) are now grouped under their correct instrumentation scope, fixing event misclassification. * Event creation now validates the required `event_type` field at request-construction time, raising `pydantic.ValidationError` instead of a server-side error after the round-trip. Same root cause, different exception type. ### Action Required **The following changes may require action on your part** * **OpenTelemetry minimum bumped from 1.20.0 to 1.41.0.** Update `opentelemetry-api`, `opentelemetry-sdk`, and `opentelemetry-exporter-otlp-proto-http` if your environment pins older versions. Traceloop instrumentor floors also raised to >= 0.58.0. * **Evaluation datasets now use `ground_truth` instead of `ground_truths`.** Update dataset datapoints and evaluator parameters to the singular name so evaluator scores, templates, and the UI can read reference values consistently. * **Response result fields are now typed Pydantic models instead of dicts.** Affects `client.events.export()` / `.get_by_session_id()`, `client.datapoints.create()` / `.update()`, `client.datasets.create()` / `.update()` / `.delete()`, and `client.metrics.list()` / `get_metric()`. Read nested fields with attribute access: `response.result["insertedIds"][0]` becomes `response.result.insertedIds[0]`. Call `.model_dump()` if you still need the dict form. The full per-endpoint migration table, validation steps, and edge cases live in the [SDK migration skill](https://github.com/honeyhiveai/python-sdk/blob/v1.0.0rc22/.agents/skills/migrate-to-1-0-0rc22/SKILL.md). AI coding assistants can invoke the `migrate-to-1-0-0rc22` skill directly. ## Core Platform ### Annotation Queue Automations Annotation queues now support filter-based automations. Define filter criteria on a queue, and matching events are automatically routed to it for human review. You can also add events to queues directly from the trace list, making it faster to build review workflows without leaving your debugging context. [Learn more about annotation queues](/v2/evaluation/annotation-queues) ### AutoGen and Google ADK Tracing AutoGen and Google ADK traces now ingest correctly over OTLP. If you use either framework, your spans appear in HoneyHive without additional configuration. [AutoGen integration](/v2/integrations/autogen) | [Google ADK integration](/v2/integrations/google-adk) ### Graph View for OpenAI Agent Traces The graph view now renders distinct agent nodes and handoff edges for OpenAI agent traces, instead of collapsing all agents into a single node. This makes multi-agent flows easier to follow visually. [Learn more](/v2/tracing/graph-view) ### Improvements * Scope creation is simpler: you no longer need to enter a separate unique name when creating an organization, workspace, or project. The display label is all you need. * Agent names are now consistent across all trace views (tree, trajectory, thread, and event details), with human-readable names from span metadata taking priority over internal IDs. * Inaccessible organizations, workspaces, and projects now appear as disabled rows in selector tables with a tooltip explaining who to contact for access. * Usage reports now sort most-recent-first for quicker access to current data. * The members page scope selector now shows all workspaces across every data plane you have list access to, not just the currently selected parent. ### Fixes * OTLP-ingested events now preserve the `source` field set in your tracing configuration (e.g., `production`, `staging`) instead of being overwritten. * Tool schemas are no longer dropped during ingestion for chat completion spans. Tool configurations now display correctly in trace details. * Admin Center pages now redirect users without access to the home page instead of showing broken content. * Traceloop-instrumented LangChain spans are no longer silently dropped during OTLP ingestion. * Malformed session and event IDs now return clear 404 responses instead of 500 errors. * Automated evaluators now run correctly on events ingested via the API. ### Security * Custom Python evaluators now block additional filesystem and network access paths for stronger sandbox isolation. * Security patches applied for third-party dependencies (including CVE-2026-39892). ## Core Platform ### Coding Agent and Multi-Agent Evaluator Templates 12 new LLM evaluator templates are now available across two new categories. **Coding Agent** templates help you evaluate task categorization, work type, complexity, and prompt specificity. **Multi-Agent** templates cover handoff completeness, integration coherence, scope adherence, escalation appropriateness, information sufficiency, role clarity, and retrospective quality. Use these to quickly set up evaluation for your agent applications without writing prompts from scratch. [Browse evaluator templates](/v2/evaluators/evaluator-templates) ### Action Required * **OpenAPI spec update: `event_id` and `session_id` now required in create-event responses.** These fields were always returned by the API but were previously marked as optional in the spec. If you generate client code from the OpenAPI spec, regenerate your client to pick up the corrected types. ### Improvements * Settings pages (Admin Keys, Roles, Templates) now use permission-based access control instead of plan-based gates. Users without the required permission see a clear "no permission" message rather than "Available on Enterprise plan." ## Core Platform ### Session Summary and Trajectory Visualization The session side view now displays **aggregated evaluator scores and feedback** in the summary panel. When the same evaluator runs on multiple child spans, results are grouped with count, average, min, and max. Click a grouped metric to expand per-span values, color-coded to highlight outliers. Session side view showing aggregated evaluator scores grouped by count, average, min, and max with an expanded grouped metric highlighting outlier spans A new **Trajectory tab** provides a visual fingerprint of agent sessions as a bubble chart. Each span appears as a bubble on a category-by-step grid, with bubble size encoding the selected metric (duration, cost, or evaluator scores) and color indicating relative performance. Useful for spotting behavioral patterns and anomalies across agent steps. Trajectory view showing agent session as a bubble chart with bubbles sized by metric across model, tool, and chain categories [Explore your traces →](/v2/tracing/ui-flows#session-side-view) ## Python SDK ### v1.0.0rc21 * New **Claude Agent SDK** integration via OpenInference. Install with `pip install "honeyhive[openinference-claude-agent-sdk]"` to trace `query` calls, tool invocations, and multi-turn agent flows. * New **LiteLLM** integration via OpenInference. Install with `pip install "honeyhive[openinference-litellm]"` to trace `completion`, `acompletion`, and `embedding` calls across all LiteLLM-supported providers. [Learn more →](/v2/integrations/litellm) * New `skip_backend_session_creation` flag on `HoneyHiveTracer.init()`. When initializing a tracer with an existing `session_id`, set this to `True` to skip the synchronous session creation call during init. Useful for attaching spans to a session created by another service or a prior tracer run. [Learn more →](/v2/tracing/tracer-initialization#skipping-init-time-session-creation) ### Fixes * `session_name` auto-detection now correctly identifies the caller script name instead of returning internal SDK filenames. ## Core Platform ### Usage Dashboard A new **Usage** page in Organization Settings gives you visibility into your event consumption. View monthly and quarterly event counts, enrichment metrics (events with computed evaluator scores), cumulative QTD/YTD totals, and export reports as JSON or CSV. The detail view for each period includes an event type breakdown and a printable report. Usage dashboard listing monthly reports with the April 2026 detail view open, showing event count, quarter-to-date and year-to-date totals, an event breakdown by type, and metrics computed counts Requires the `org.analytics.query` permission. [Learn more about usage reporting](/v2/workspace/usage) ### Searchable Evaluator Dropdown in Traces The evaluator metric dropdown in the trace side view now supports search and keyboard navigation, making it faster to find specific metrics when you have many configured. ## Python SDK ### Session Reuse Without Init-Time API Call * New `skip_backend_session_creation` flag on `HoneyHiveTracer.init()`. When initializing a tracer with an existing `session_id`, set this to `True` to skip the synchronous backend session creation call during init. [Learn more about tracer initialization](/v2/tracing/tracer-initialization#skipping-init-time-session-creation) ## Core Platform ### Jump from Alerts to Discover When an alert triggers, you can now navigate directly to the Discover page with the alert's filters, metric, and aggregation pre-applied. Instead of manually recreating the query to investigate what caused a trigger, one click takes you straight to the relevant data. Discover chart opened from an alert with filters, metric, aggregation, and grouped series applied [Learn more about alerts](/v2/monitoring/alerts/alerts_overview) ### Visual Tool Configuration in Traces Tool definitions in the trace side view now render as collapsible, labeled pills instead of raw JSON. The display supports OpenAI, Anthropic, Google Gemini, and AWS Bedrock tool formats, making it much easier to inspect tool configurations at a glance when debugging across providers. Trace side view with visual tool configuration pills ### Improvements * The intent identification [evaluator template](/v2/evaluators/evaluator-templates) now includes an Intent Taxonomy section where you can define your application-specific intents for more precise classification. * **Playground and Prompts have new URLs.** `/studio/playground` is now `/playground` and `/studio/library` is now `/prompts`. Old URLs redirect automatically. * Settings and Admin Center tabs have been reorganized, and "API Keys" has been renamed to "Admin Keys" in the Settings sidebar. * Browser tab titles now display descriptive names for Admin Center sub-pages. * "Metrics" references in page titles have been updated to "Evaluators" to match current terminology. * Self-hosted (federated) Docker images are now available for ARM64 architecture in addition to AMD64. ### Fixes * Fixed 500 errors on the schema and events endpoints when field names contained special characters like `/`, `[`, or `]`. These now return proper validation errors. * Fixed inconsistent event type values between the events list and session detail endpoints. * Fixed non-chat data incorrectly rendering as chat messages, and a layout overflow in the trace side view tool call display. ## Core Platform ### Traces (formerly Log Store) The "Log Store" section has been renamed to **Traces** across the platform to better reflect its purpose: viewing and analyzing your application traces. All routes have changed from `/datastore/*` to `/traces/*`. ### Action Required **The following changes may require action on your part** * **Log Store routes renamed to Traces.** All `/datastore/*` URLs now point to `/traces/*`. Update any bookmarks, saved links, or integrations that reference the old paths. ### Improvements * Filter values in the events table now lazy-load for faster initial page loads with large datasets. ### Fixes * Fixed alerts not firing when configured with "All Tools" as the event filter. * Fixed alerts returning incorrect results for session-level aggregate fields like cost, duration, and tokens. * Fixed the evaluator "Enabled" toggle resetting the evaluator's description and filter configuration. * Fixed a crash when rendering empty or malformed code blocks in trace views. * Fixed shared deep links ignoring the date range in the URL, which caused "No events found" for older events. * Fixed model name sometimes showing as "unknown" on agent and chain spans. ### Security * Security patches applied for third-party dependencies (including CVE-2026-32887). ## Core Platform ### Action Required **The following changes may require action on your part** * **Navigation routes renamed.** Navigation routes in the dashboard now match their page names for consistency. Previously bookmarked URLs will need to be updated. ### Improvements * The trace detail view now shows additional metadata, including session-level metrics and evaluator scores, inline for quicker inspection. * Tool call input JSON in the trace view now auto-expands up to two levels and renders faster with syntax highlighting for easier inspection. ### Fixes * Fixed incorrect token counts and durations displayed in the session side view. * Fixed event data being lost during partial event updates via the ingestion API. * Fixed parent-child hierarchy inconsistencies in session traces and exported event data. * Fixed agent names incorrectly propagating to parent spans when processing ADK chain events. * Fixed the Registered Data Planes list overflowing when many data planes are configured; it now scrolls properly. * Fixed log pagination not resetting when switching between projects. * Fixed self-invite on the members page triggering an unnecessary session reauthorization. * Resolved connection stability issues that could require service restarts in some deployments. ### Security * Custom metrics API error responses now sanitize internal details to prevent information leakage. ## Python SDK ### v1.0.0rc20 * New `span_name_filters` parameter on `HoneyHiveTracer.init()` to include or exclude spans by name prefix, filtering out noisy framework internals * Spans now export asynchronously in batches via a background thread by default, improving tracing performance. Use `disable_batch=True` to preserve synchronous export for Lambda/serverless environments. ## Python SDK ### v1.0.0rc19 * Export operations (`export()`, `export_async()`, `get_by_session_id()`) no longer time out on large result sets. The default read timeout is now 5 minutes instead of 5 seconds. * New `HH_EXPORT_TIMEOUT_SECONDS` environment variable to override the default export timeout for extremely large exports or constrained network environments ## Core Platform ### Alerts on Self-Hosted Deployments Alerting is now available for self-hosted HoneyHive deployments. Set up aggregate and drift alerts to monitor key metrics across your AI applications, just like on the cloud offering. Email delivery for alert notifications is coming soon. [Learn more about alerts](/v2/monitoring/alerts/alerts_overview) ### Custom Experiment Run IDs You can now pass your own `run_id` when creating experiment runs via the API. This makes it easier to link HoneyHive experiments to your internal CI pipelines, test suites, or tracking systems. ### Provider Secrets Management A new settings page lets you manage LLM provider keys per workspace. Configure your OpenAI, Anthropic, and other provider credentials directly from **Settings > Workspace**, with encryption at rest. [Learn more about provider keys](/v2/workspace/provider-keys) ### Action Required **The following changes may require action on your part** * **Datasets PUT endpoint now replaces datapoints.** `PUT /datasets` now replaces the datapoint list instead of merging, aligning with expected PUT behavior. Use `POST /datasets/{dataset_id}/datapoints` to append datapoints, or send the full list with PUT. * **`/commit` API route deprecated.** Use `/metric_version` instead. The `/commit` route will be removed in a future release. ### Improvements * Dashboard chart controls now respect your role permissions, so you only see actions you're authorized to perform. * A session expiry warning now appears before your session times out, giving you a chance to save your work. * Duplicate dataset names are now rejected with a clear validation error. * Datapoints now include a content hash for automatic deduplication. * Users in multi-dataplane deployments can now select which data plane to use when creating a workspace. * Improved support for OpenTelemetry GenAI semantic conventions, including Pydantic AI and Google ADK traces. * Thread View now displays actual agent names instead of generic labels, making it easier to follow multi-agent conversations. ### Fixes * Fixed filtering issues when working with large numbers of items. * Fixed Dashboard Y-axis labels displaying incorrectly for large values. * Fixed evaluator editor error messages to be more descriptive and actionable. * Fixed experiment run ID filter not accepting comma-separated values. * Fixed save flow issues in Playground and Prompts. * Fixed Thread View not handling non-string message content. * Fixed an infinite loading state on the experiment compare-with view. * Fixed UI layering issue on the alerts detail page. * Fixed file uploads remaining enabled after submission, which could cause duplicates. ### Security * Custom Python evaluators now run in a sandboxed environment with execution timeouts and restricted system access for safer metric evaluation. Existing custom evaluators that rely on network calls, filesystem writes, or uncommon imports may need to be updated. * Request body size limits are now enforced per route to prevent memory issues. * Sensitive tokens and keys are no longer included in log output. * Security patches applied for permission pattern handling and email validation. ## Python SDK ### v1.0.0rc18 * Large query batching: list operations like `datapoints.list()` and `experiments.list_runs()` now automatically batch when exceeding 100 items, merging results transparently. No API changes needed, existing code works as before without silent truncation or HTTP errors on large lists. * SDK identification headers (`hh-sdk-version`, `hh-sdk-language`, `hh-sdk-package`) sent on all HTTP requests for better debugging and support diagnostics ## Core Platform ### Introducing Workspaces HoneyHive now organizes your account into three levels: **Organization > Workspace > Project**. Workspaces are a new layer between your organization and projects, designed to map to how your company actually operates - one workspace per business unit, team, or department. Each workspace gets its own AI provider keys, access controls, and data boundaries, so the ML platform team, product team, and compliance team can all work independently under one organization. ```mermaid theme={null} graph TD Org["Organization"] WS1["Workspace A"] WS2["Workspace B"] P1["Project 1"] P2["Project 2"] P3["Project 3"] P4["Project 4"] Org --> WS1 Org --> WS2 WS1 --> P1 WS1 --> P2 WS2 --> P3 WS2 --> P4 ``` A new **org/workspace switcher** replaces the logo in the top navigation, letting you move between organizations and workspaces in two clicks. [Learn more about the organization hierarchy](/v2/workspace/organization-hierarchy) ### Workspace-Scoped AI Provider Keys AI provider keys have moved from the **organization level** down to the **workspace level**. Configure your OpenAI, Anthropic, Azure OpenAI, Bedrock, Gemini, or Vertex AI credentials per workspace in **Settings > Workspace > AI Providers**. This tightens your security posture and unlocks per-team cost attribution: * **Smaller blast radius** - A compromised key only affects one workspace, not your entire organization. Workspace Admins manage their own keys without needing org-level access. * **Cost attribution by team** - Each workspace uses its own provider keys, so API spend maps directly to the business unit, department, or team that owns the workspace. No more splitting a shared org bill across teams. * **Right provider for the right team** - One team can use Azure OpenAI to meet compliance requirements while another runs on AWS Bedrock. Each workspace's provider configuration is fully independent. [Learn more about provider keys](/v2/workspace/provider-keys) ### Enterprise-Grade Role-Based Access Control A new permission system replaces the previous four-role hierarchy (`Org Admin > Project Admin > Project Member > Org Member`) with independent roles at each scope level and 100+ granular permissions. Permissions no longer inherit across levels. An Org Admin must be explicitly added to a workspace and project to access its data. Each scope is independently controlled. Both membership and a role with the right permissions are required to access any resource. Neither condition alone is sufficient. Workspace Admins and Members join Org and Project roles as the new middle layer. Control who can manage AI provider keys, create projects, and invite team members within a workspace. Define custom roles with granular permission sets that match your team's specific access requirements. The platform supports 100+ individual permissions across all scope levels. This entry describes the February 2026 RBAC launch behavior. HoneyHive Cloud later added Org Admin permission inheritance for membership and scope management permissions. The UI now shows a **Permission Denied** state when a user attempts an action outside their role, rather than silently failing or hiding features. [Learn more about roles and permissions](/v2/workspace/roles) ### Introducing Organization Templates Enterprise organizations can now define **templates** that control which evaluators and charts are auto-created when new workspaces and projects are created. Instead of every team starting from scratch or copy-pasting setup from another project, Org Admins configure a standard set of evaluators and monitoring charts once, and they automatically populate when new workspaces and projects are created across the organization. This gives platform teams a way to enforce consistency at scale - standardize quality metrics across business units, ensure every new project ships with the right monitoring dashboards, and reduce onboarding time for teams spinning up new AI applications. Org Admins define templates via a YAML manifest in **Settings > Organization > Templates**. Every new project starts with the evaluators and monitoring charts you specify - ready to go from day one. Organization Templates require the **Enterprise** plan. [Learn more about organization templates](/v2/workspace/templates) ### LLM Evaluators with Workspace Provider Defaults LLM evaluators now pull from your workspace's configured AI provider keys instead of org-level credentials. Default provider and model values are pre-selected based on your workspace configuration, so evaluators work out of the box as soon as a provider key is set up. [Learn more about LLM evaluators](/v2/evaluators/llm) ### Other Improvements * Visibility toggle on input fields and improved dialog interactions * ClickHouse query performance improvements * Log Store UI fixes * Security-related fixes * Form validation improvements ## Python SDK ### v1.0.0rc17 * Git context automatically stamped on experiment runs (commit hash, branch, author, remote URL, dirty status) * Custom `run_id` support in `evaluate()` for using your own identifiers * Auto-infer `is_evaluation=True` when `dataset_id`, `datapoint_id`, and `run_id` are all provided, preventing silent loss of evaluation context * `export_async()` now retries on transient HTTP errors (502, 503, 504), matching `export()` behavior * Debug logging for `get_by_session_id` and export flows (entry/exit, HTTP metadata, empty result diagnostics) * Removed non-functional `include_datapoints` query param * Synced OpenAPI spec and removed defunct Tools API client * Fixed single-item list query param serialization causing 400 errors ### v1.0.0rc16 * Fixed import errors and `AttributeError` in events and context modules * Events API fixes: ordering, project deprecation handling, `enrich_span` event ID resolution * Corrected `evaluate()` docstrings to match actual function signature ### v1.0.0rc15 * New `flush()` method on `HoneyHiveTracer` for explicitly flushing pending spans before application shutdown * New `get_by_session_id()` method on Events API for retrieving all events for a given session using the Data Plane export endpoint * `enrich_span()` now supports `update_event_id` parameter for overriding a span's event\_id attribute without making API calls * Events returned in chronological order by default; `project` parameter deprecated in favor of project-scoped API keys * Pydantic models now preserve extra fields from API responses (`extra="allow"`), preventing data loss when backend returns additional fields ### v1.0.0rc9 * Auto-generated type-safe v1 API client from OpenAPI spec with full Pydantic models for all requests/responses, sync and async methods, and new endpoint support (batch events, experiment results/comparison, project CRUD) * Backwards-compatible API aliases: all API classes support both new (`list()`, `create()`, `get()`) and legacy (`list_datasets()`, `create_dataset()`) method names * OTLP HTTP/JSON export is now the default format (changed from `http/protobuf`), configurable via `HH_OTLP_PROTOCOL` or `OTEL_EXPORTER_OTLP_PROTOCOL` environment variables * `evaluate()` now accepts an `instrumentors` parameter to auto-instrument third-party libraries (OpenAI, Anthropic, Google ADK, LangChain, etc.) per datapoint * `evaluate()` now accepts async functions, automatically detected and executed with `asyncio.run()` inside worker threads * Typed Pydantic models for experiment results (`MetricDetail`, `DatapointResult`, `DatapointMetric`) * Fixed metrics table printing empty values after `evaluate()` by aligning with backend's `details` array format * Fixed `enrich_session()` silently failing when called without explicit parameters ## Python SDK ### v1.0.0rc5 * Metric schema updated for backend parity: new type enums (`PYTHON`/`LLM`/`HUMAN`/`COMPOSITE`), `categorical` return type, and new fields (`sampling_percentage`, `scale`, `categories`, `filters`) * Enhanced datapoints filtering with `dataset_id` and `dataset_name` parameters; legacy `dataset` parameter auto-detects ID vs. name * `EventsAPI.list_events()` now accepts a single `EventFilter` or a list, converting automatically * Simplified distributed tracing setup with `with_distributed_trace_context()` context manager (reduces server-side boilerplate from \~65 lines to 1 line) * Fixed `@trace` decorator overwriting distributed trace baggage (`session_id`, `project`, `source`) instead of preserving it * Configurable OpenTelemetry span limits via `TracerConfig` or environment variables (`HH_MAX_ATTRIBUTES`, `HH_MAX_EVENTS`, `HH_MAX_LINKS`) * Automatic preservation of critical HoneyHive attributes (`session_id`, `event_type`, `event_name`, `source`) when spans approach the attribute limit * Fixed session ID initialization when explicitly providing a `session_id` to `HoneyHiveTracer.init()` ## Core Platform ### Experiments Dashboard Visualize metric trends across all your experiments in a single unified view. HoneyHive Experiments The new Experiments dashboard provides comprehensive visibility into how changes affect your AI application's quality over time: View and compare metrics across 100+ experiments simultaneously. See results from experiments using different prompts, models, and retrieval parameters side-by-side. Identify when changes negatively impact your application's quality metrics. Metric trends make it easy to spot regressions at a glance. Track how sweeps across different configurations (prompts, models, retrieval parameters) impact performance over time. Analyze experiment results without jumping between individual experiment pages. All your experiment data in one place for faster, data-driven decision making. [Try it today →](https://app.us.honeyhive.ai/) ### Annotation Queues Automated trace collection and streamlined human evaluation workflows. HoneyHive Annotation Queues Configure filters to automatically add traces matching specific criteria to annotation queues. The system continuously runs in the background, identifying traces that need human review. Domain experts can evaluate traces based on predefined criteria fields. Use ← → arrow keys for quick navigation between events during high-volume annotation tasks. Build high-quality datasets and maintain consistent human oversight of your AI applications with organized evaluation workflows. ### Improved Evaluators UX New Evaluators UX Redesigned evaluator creation interface that combines evaluator configuration and editor into a single unified view. Configure evaluator parameters and edit evaluation logic in one place, eliminating the need to switch between multiple views. This streamlined workflow reduces context switching when creating and managing metrics. ### New Evaluator Templates Expanded evaluator templates library with 11 new pre-built templates for common evaluation patterns. | Category | Evaluators | | - | - | | **Agent Evaluation** | • Chain-of-Thought Faithfulness
• Plan Coverage
• Trajectory Plan Faithfulness
• Failure Recovery | | **Safety** | • Policy Compliance
• Harm Avoidance | | **RAG** | • Context Coverage | | **Text Evaluation** | • Tone Appropriateness | | **Translation** | • Translation Fluency | | **Code Generation** | • Compilation Success | | **Classification Metrics** | • Precision/Recall/F1 Metrics | Quick-start your evaluations with production-ready templates that follow best practices for various AI application use cases.
## Core Platform ### Improved Review Mode Enhanced context indicators in Review Mode that clearly show which output type you're evaluating. Improved Review Mode The UI now explicitly indicates whether you're providing reviews on: Evaluate individual LLM responses with clear context about the model being reviewed. Review end-to-end agent interactions and complete conversation flows. Assess function and API call results with full execution context. Analyze multi-step process results and complex execution paths. This improved clarity helps domain experts provide more accurate and consistent feedback when working with complex multi-agent systems. ### Categorical Evaluators New evaluator type that enables classification-based human evaluation with custom scoring. Categorical Evaluators Define custom categorical labels and assign specific scores to each category. Create binary classifications with associated scores for clear go/no-go decisions. Track when outputs shift from high-scoring to low-scoring categories over time. Define multiple categories representing different quality levels or response types. Categorical evaluators provide more structured and interpretable evaluation results compared to purely numeric scores, making it easier to identify specific failure modes in your AI applications. ## Core Platform ### Thread View New visualization mode that displays all LLM events and chat history in a unified, chronological timeline. Thread View View all LLM events alongside complete chat history in a single interface. Understand the full context of multi-turn conversations without navigating through nested spans. The system automatically identifies when control passes between different LLM workflows or agents, highlighting transition points in complex multi-agent systems. Domain experts can provide feedback at the session level, which is automatically applied to the root span (session event) in the trace. ### Improved Graph View Major enhancements to Graph View with automatic node deduplication and new analytical features. Improved Graph View The graph now intelligently deduplicates nodes, simplifying visualization of complex agent trajectories. View total number of nodes, state transitions, and structural complexity metrics for your agent workflows. Edge thickness represents execution frequency, making common paths immediately visible. Identify which nodes are causing performance issues in your agent workflows. Visualize the most frequent paths through your agent's decision tree to understand typical execution patterns. ### [Introducing Alerts](/v2/monitoring/alerts/alerts_overview) Monitor key metrics and get notified when behavior changes in your AI applications. HoneyHive Alerts 1. **Comprehensive Monitoring:** Track performance metrics (latency, error rate), quality scores from evaluators, cost and usage patterns, plus any custom fields from your events or sessions. Get visibility into what matters most for your AI applications. 2. **Smart Alert Types:** **Aggregate Alerts** trigger when metrics cross absolute thresholds, while **Drift Alerts** detect when current performance deviates from previous periods by a configurable percentage. Choose the right detection method for your use case. 3. **Flexible Scheduling:** Configure alerts to run hourly, daily, weekly, or monthly based on your monitoring needs. Set custom evaluation windows to balance responsiveness with noise reduction. 4. **Streamlined Workflow:** Real-time preview charts show exactly what your alert will monitor, guided configuration in the right panel walks you through setup, and a recent activity feed tracks alert history. Manage alert states (Active, Triggered, Resolved, Paused, Muted) directly from each alert's detail page. ### Evaluator Templates Gallery Quick-start your evaluations with pre-built templates organized by use case: Agent Trajectory, Tool Selection, RAG, Summarization, Translation, Structured Output, Code Generation, Performance, Safety, and Traditional NLP. New Evaluator Creation Flow ## Core Platform ### New Trace Visualization Modes 1. **Session Summaries and New Tree View:** Unified view of metrics, evaluations, and feedback across all spans in an agent session. Get a comprehensive overview without jumping between individual spans to understand overall session performance. Tree Wiew 2. **Timeline View:** Flamegraph visualization that identifies latency bottlenecks and shows the relationship between sequential and parallel operations in your agent workflows. Perfect for performance optimization and understanding execution flow. Timeline Wiew 3. **Graph View:** Visual representation of complex execution paths and decision points through multi-agent workflows. Quickly understand how your agents interact and make decisions at a glance. Graph Wiew ### Improved Log Store Analytics **Volume Charts:** New mini-charts display request volume patterns over time directly in the sessions table, providing instant visibility into traffic trends and activity levels without needing to drill into individual sessions. New Log Store ## Core Platform ### Role-Based Access Control (RBAC) RBAC 1. **Two-Tier Permission Structure:** Granular permission management with organization and project-level controls. Organization Admins have full control across the entire organization, while Project Admins maintain complete control within specific projects. This creates clear boundaries between teams and prevents data leakage between business units. 2. **Enhanced API Key Security:** Project-specific API key scoping ensures that teams can only access data within their designated projects. This provides better security isolation and compliance with industry regulations, especially critical for organizations in financial services, healthcare, and insurance. 3. **Flexible Team Management:** Easy onboarding and role transitions with transparent permission hierarchy. Delegate administrative responsibilities without compromising security, and manage team member access as organizations evolve. 4. **Seamless Migration Process:** Existing customers can migrate to RBAC with minimal disruption. All current users are automatically assigned Organization Admin roles, and project-specific API keys are available in Settings. Legacy API keys will remain functional until August 31st, 2025. [Learn more about RBAC implementation](/v2/workspace/roles) ## Core Platform * Added list of allowed characters for project names ## Python SDK (Logger) ### HoneyHive Logger (`honeyhive-logger`) released * The logger sdk has 1. No external dependencies 2. A fully stateless design * Optimized for * Serverless environments * Highly regulated environments with strict security requirements ## TypeScript SDK (Logger) ### HoneyHive Logger (`@honeyhive/logger`) released * The logger sdk has 1. No external dependencies 2. A fully stateless design * Optimized for * Serverless environments * Highly regulated environments with strict security requirements ## Python SDK - Version \[v0.2.49] * Added type annotation to decorators and the evaluation harness ## Documentation * Added documentation for Python/Typescript Loggers * Updated gemini integration documentation to use latest sdk (Python and TypeScript) ## Core Platform ### Support for External Datasets in Experiments You can now log experiments using external datasets with custom IDs for both datasets and datapoints. External dataset IDs will display with the "EXT-" prefix in the UI. This feature provides greater flexibility for teams working with custom datasets while maintaining full integration with our experiment tracking. ``` { "id": "", // Optional "name": "", // Optional "data": [ { "id": "", // Optional "inputs": { ... }, "ground_truths": { ... }, } // Additional datapoints... ] } ``` * Bug fixes and improvements across various areas to enhance performance and stability. * Bug fixes for playground & evaluator version controls. ## Documentation * Standardizes parameter names and clarified evaluation order in Experiments Quickstart and Python/TS SDK docs. * Adds cookbook: [Inspirational Quotes Recommender with Qdrant and OpenAI](https://github.com/honeyhiveai/cookbook/tree/main/qdrant-discovery) * Adds an "Evaluating External Logs" tutorial. * Updates Python and TypeScript SDK's references and overall documentation to align with recent improvements and best practices. * Adds [Datasets Introduction Guide](/v2/datasets/introduction). * Adds [Server-side Evaluator Templates List](/v2/evaluators/evaluator-templates) documentation. * Adds [LangGraph](/v2/integrations/langgraph) integration documentation. ## Core Platform ### Wide Mode We've introduced a new **Wide Mode** option that allows users to hide the sidebar, providing: * Expanded workspace area for a more immersive viewing experience * Distraction-free environment when focusing on complex tasks * Better content visibility on smaller screens and split-window setups * Toggle controls accessible via the header menu for easy switching