diff --git a/braintrust-sdk/src/main/java/dev/braintrust/eval/DatasetBrainstoreImpl.java b/braintrust-sdk/src/main/java/dev/braintrust/eval/DatasetBrainstoreImpl.java index 7b8c21a9..60ecfc48 100644 --- a/braintrust-sdk/src/main/java/dev/braintrust/eval/DatasetBrainstoreImpl.java +++ b/braintrust-sdk/src/main/java/dev/braintrust/eval/DatasetBrainstoreImpl.java @@ -118,9 +118,18 @@ public Optional> next() { OUTPUT expected = (OUTPUT) event.getExpected(); var metadataObj = event.getMetadata(); - Map metadata = - metadataObj != null ? metadataObj.getAdditionalProperties() : Map.of(); - if (metadata == null) metadata = Map.of(); + // InsertProjectLogsEventMetadata extends HashMap. Jackson stores + // unknown fields in the HashMap base (not in additionalProperties) for Map subclasses, + // so copy from both sources defensively. + Map metadata; + if (metadataObj != null) { + metadata = new HashMap<>(metadataObj); + if (metadataObj.getAdditionalProperties() != null) { + metadata.putAll(metadataObj.getAdditionalProperties()); + } + } else { + metadata = Map.of(); + } List tags = event.getTags() != null ? event.getTags() : List.of(); diff --git a/braintrust-sdk/src/test/java/dev/braintrust/eval/DatasetBrainstoreImplTest.java b/braintrust-sdk/src/test/java/dev/braintrust/eval/DatasetBrainstoreImplTest.java index 0ad8f999..40227f08 100644 --- a/braintrust-sdk/src/test/java/dev/braintrust/eval/DatasetBrainstoreImplTest.java +++ b/braintrust-sdk/src/test/java/dev/braintrust/eval/DatasetBrainstoreImplTest.java @@ -221,6 +221,50 @@ void testFetchWithPinnedVersion() { .withRequestBody(matchingJsonPath("$.version", equalTo(pinnedVersion)))); } + @Test + void testMetadataPopulatedFromDatasetRow() { + wireMock.stubFor( + post(urlEqualTo("/v1/dataset/" + datasetId + "/fetch")) + .willReturn( + aResponse() + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody( + """ + { + "events": [ + { + "object_type": "dataset", + "dataset_id": "%s", + "id": "meta-row-1", + "_xact_id": "1", + "created": "2024-01-01T00:00:00Z", + "input": "test input", + "expected": "test output", + "metadata": { + "performance_strategy": "TURBO", + "userId": "user123" + } + } + ], + "cursor": null + } + """ + .formatted(datasetId)))); + + DatasetBrainstoreImpl dataset = + new DatasetBrainstoreImpl<>(apiClient, datasetId, "test-version"); + + List> cases = new ArrayList<>(); + dataset.forEach(cases::add); + + assertEquals(1, cases.size()); + Map metadata = cases.get(0).metadata(); + assertFalse(metadata.isEmpty(), "metadata should not be empty"); + assertEquals("TURBO", metadata.get("performance_strategy")); + assertEquals("user123", metadata.get("userId")); + } + @Test void testFetchFromBraintrustNotFound() { String projectName = "test-project";