Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
.env
.env.*
.turbo
.venv
.corepack
.ruff_cache
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,20 @@

## [Unreleased]

## [1.4.0] - 2026-06-24

### 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.

## [1.3.0] - 2026-06-18

### Added
Expand Down
24 changes: 24 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
FROM ghcr.io/astral-sh/uv:python3.11-alpine
RUN apk add --no-cache nodejs npm && \
npm install -g @anthropic-ai/claude-code@2.1.190

WORKDIR /app

# Hatch resolves dynamic version/readme during uv sync, so copy metadata files
# before installing deps. Full source is copied in a later layer.
COPY pyproject.toml README.md ./
COPY src/honeyhive/__init__.py src/honeyhive/__init__.py

ENV UV_LINK_MODE=copy

RUN uv sync \
--no-install-project \
--all-packages \
--extra dev \
--extra openinference-openai \
--extra openinference-anthropic \
--extra openinference-claude-agent-sdk

COPY . .

ENTRYPOINT [ "uv", "run", "--extra", "dev" ]
16 changes: 14 additions & 2 deletions openapi/dataplane.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3649,7 +3649,11 @@ components:
additionalProperties: {}
description: Metric values to merge into the event
outputs:
description: Output data to replace on the event (accepts objects, strings, arrays, or scalars)
type:
- object
- 'null'
additionalProperties: {}
description: Output object to replace on the event. Must be an object or null; null preserves the existing outputs. Non-object values (strings, arrays, scalars) are rejected.
config:
type: object
additionalProperties: {}
Expand Down Expand Up @@ -3689,7 +3693,11 @@ components:
additionalProperties: {}
description: Metric values to merge into the event
outputs:
description: Output data to replace on the event (accepts objects, strings, arrays, or scalars)
type:
- object
- 'null'
additionalProperties: {}
description: Output object to replace on the event. Must be an object or null; null preserves the existing outputs. Non-object values (strings, arrays, scalars) are rejected.
config:
type: object
additionalProperties: {}
Expand Down Expand Up @@ -4186,6 +4194,10 @@ components:
type:
- string
- 'null'
dataset_name:
type:
- string
- 'null'
required:
- id
- run_id
Expand Down
1 change: 1 addition & 0 deletions pytest.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# in pyproject.toml is silently ignored — update markers and addopts here only.
[pytest]
testpaths = tests
pythonpath = src
python_files = test_*.py
python_classes = Test*
python_functions = test_*
Expand Down
2 changes: 1 addition & 1 deletion src/honeyhive/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
# Version must be defined BEFORE imports to avoid circular import issues
# Version must be semver or semver followed by "a" (alpha), "b" (beta), or "rc"
# (release candidate) + a number
__version__ = "1.3.0"
__version__ = "1.4.0"

# Main API client
from .api import HoneyHive
Expand Down
2 changes: 2 additions & 0 deletions src/honeyhive/_generated/models/ExperimentRunObject.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,5 @@ class ExperimentRunObject(BaseModel):
scope_id: str = Field(validation_alias="scope_id")

dataset_id: Optional[str] = Field(validation_alias="dataset_id", default=None)

dataset_name: Optional[str] = Field(validation_alias="dataset_name", default=None)
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class LegacyUpdateEventRequest(BaseModel):

metrics: Optional[Dict[str, Any]] = Field(validation_alias="metrics", default=None)

outputs: Optional[Any] = Field(validation_alias="outputs", default=None)
outputs: Optional[Dict[str, Any]] = Field(validation_alias="outputs", default=None)

config: Optional[Dict[str, Any]] = Field(validation_alias="config", default=None)

Expand Down
2 changes: 1 addition & 1 deletion src/honeyhive/_generated/models/UpdateEventRequest.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class UpdateEventRequest(BaseModel):

metrics: Optional[Dict[str, Any]] = Field(validation_alias="metrics", default=None)

outputs: Optional[Any] = Field(validation_alias="outputs", default=None)
outputs: Optional[Dict[str, Any]] = Field(validation_alias="outputs", default=None)

config: Optional[Dict[str, Any]] = Field(validation_alias="config", default=None)

Expand Down
9 changes: 9 additions & 0 deletions src/honeyhive/adapters/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"""Adapters that convert third-party telemetry exports into OpenTelemetry spans.

Import each adapter's submodule directly (e.g.
``from honeyhive.adapters.copilot_studio import copilot_studio_records_to_spans``) so that
pulling in one adapter does not eagerly import the OpenTelemetry SDK for users who don't need
it. This package intentionally does not re-export adapter symbols at the top level.
"""

__all__: list[str] = []
Loading