@@ -5,7 +5,7 @@ const { afterEach, beforeEach, describe, it } = require('mocha')
55const sinon = require ( 'sinon' )
66
77const { ExperimentsClient } = require ( '../../../src/llmobs/experiments/client' )
8- const { Dataset } = require ( '../../../src/llmobs/experiments/dataset' )
8+ const { Dataset, DatasetRecord } = require ( '../../../src/llmobs/experiments/dataset' )
99const { Experiment } = require ( '../../../src/llmobs/experiments/experiment' )
1010
1111// Routes the control-plane + events calls a run makes, recording each request.
@@ -240,7 +240,6 @@ describe('LLMObs Experiments — dataset + experiment run', () => {
240240 } )
241241
242242 it ( 'experiment create body carries project_id, dataset_id, dataset_version, config and ensure_unique' , async ( ) => {
243- const { DatasetRecord } = require ( '../../../src/llmobs/experiments/dataset' )
244243 const dataset = Dataset . fromExisting (
245244 client ,
246245 'demo' ,
@@ -267,6 +266,23 @@ describe('LLMObs Experiments — dataset + experiment run', () => {
267266 assert . deepEqual ( create . body . data . attributes . config , { approach : 'kw' } )
268267 } )
269268
269+ it ( 'uses the version returned by appending records when creating an experiment' , async ( ) => {
270+ installFetch ( calls , {
271+ 'POST /api/v2/llm-obs/v1/proj/datasets' : { data : { id : 'ds' , attributes : { current_version : 1 } } } ,
272+ 'POST /api/v2/llm-obs/v1/proj/datasets/ds/records' : {
273+ data : [ { id : 'rec-0' , attributes : { valid_from_version : 2 } } ] ,
274+ } ,
275+ } )
276+ const dataset = new Dataset ( client , 'demo' ) . addRecord ( 'x' )
277+
278+ await new Experiment ( client , { name : 'exp-demo' , dataset, task : ( i ) => i } ) . run ( )
279+
280+ const create = calls . find ( c =>
281+ c . method === 'POST' && c . path . endsWith ( '/experiments' ) && ! c . path . includes ( '/events' )
282+ )
283+ assert . equal ( create . body . data . attributes . dataset_version , 2 )
284+ } )
285+
270286 it ( 'validates required options' , ( ) => {
271287 const dataset = new Dataset ( client , 'demo' )
272288 assert . throws ( ( ) => new Experiment ( client , { dataset, task : ( i ) => i } ) , / n a m e / )
@@ -275,7 +291,6 @@ describe('LLMObs Experiments — dataset + experiment run', () => {
275291 } )
276292
277293 it ( 'exposes dataset getters and accepts a DatasetRecord instance' , ( ) => {
278- const { DatasetRecord } = require ( '../../../src/llmobs/experiments/dataset' )
279294 const dataset = new Dataset ( client , 'my-name' , 'desc' ) . addRecord ( new DatasetRecord ( 'in' , 'out' , { m : 1 } ) )
280295 assert . equal ( dataset . name ( ) , 'my-name' )
281296 assert . equal ( dataset . id ( ) , null )
@@ -292,12 +307,39 @@ describe('LLMObs Experiments — dataset + experiment run', () => {
292307 const result = await dataset . push ( )
293308 assert . deepEqual ( dataset . recordIds ( ) , [ '' , '' ] )
294309 assert . deepEqual ( result , { pushedCount : 0 , totalCount : 2 } )
310+ assert . equal ( dataset . version ( ) , null )
295311 } )
296312
297313 it ( 'resolves with the pushed/total record counts on a successful push' , async ( ) => {
298314 const dataset = new Dataset ( client , 'demo' ) . addRecord ( 'a' ) . addRecord ( 'b' )
299315 const result = await dataset . push ( )
300316 assert . deepEqual ( result , { pushedCount : 2 , totalCount : 2 } )
317+ assert . deepEqual ( dataset . recordIds ( ) , [ 'rec-0' , 'rec-1' ] )
318+ assert . deepEqual ( dataset . records ( ) . map ( record => record . id ) , [ 'rec-0' , 'rec-1' ] )
319+ } )
320+
321+ it ( 'submits custom record ids and keeps ids from JSON:API push responses' , async ( ) => {
322+ installFetch ( calls , {
323+ 'POST /api/v2/llm-obs/v1/proj/datasets/ds/records' : {
324+ data : [
325+ { id : 'custom-a' , attributes : { valid_from_version : 2 } } ,
326+ { id : 'custom-b' , attributes : { valid_from_version : 2 } } ,
327+ ] ,
328+ } ,
329+ } )
330+ const dataset = new Dataset ( client , 'demo' )
331+ . addRecord ( new DatasetRecord ( 'a' , null , { } , 'custom-a' ) )
332+ . addRecord ( new DatasetRecord ( 'b' , null , { } , 'custom-b' ) )
333+
334+ const result = await dataset . push ( )
335+
336+ const recordsCall = calls . find ( call => call . path === '/api/v2/llm-obs/v1/proj/datasets/ds/records' )
337+ assert . deepEqual ( recordsCall . body . data . attributes . records . map ( record => record . id ) , [ 'custom-a' , 'custom-b' ] )
338+ assert . deepEqual ( dataset . recordIds ( ) , [ 'custom-a' , 'custom-b' ] )
339+ assert . deepEqual ( dataset . records ( ) . map ( record => record . id ) , [ 'custom-a' , 'custom-b' ] )
340+ assert . equal ( dataset . version ( ) , 2 )
341+ assert . equal ( dataset . latestVersion ( ) , 2 )
342+ assert . deepEqual ( result , { pushedCount : 2 , totalCount : 2 } )
301343 } )
302344
303345 it ( 'resolves with a lower pushedCount when the backend confirms fewer records than sent' , async ( ) => {
@@ -308,6 +350,8 @@ describe('LLMObs Experiments — dataset + experiment run', () => {
308350 const result = await dataset . push ( )
309351 assert . deepEqual ( result , { pushedCount : 1 , totalCount : 2 } )
310352 assert . deepEqual ( dataset . recordIds ( ) , [ 'rec-0' , '' ] )
353+ assert . deepEqual ( dataset . records ( ) . map ( record => record . id ) , [ 'rec-0' , null ] )
354+ assert . equal ( dataset . version ( ) , null )
311355 } )
312356
313357 it ( 'resolves with zero counts when there is nothing new to push' , async ( ) => {
@@ -340,12 +384,12 @@ describe('LLMObs Experiments — dataset + experiment run', () => {
340384 assert . equal ( experiment . url ( ) , 'https://app.datadoghq.com/llm/experiments/exp' )
341385 } )
342386
343- it ( 'throws when the dataset has no id after push ' , async ( ) => {
387+ it ( 'throws when the dataset create response has no id' , async ( ) => {
344388 installFetch ( calls , { 'POST /api/v2/llm-obs/v1/proj/datasets' : { data : { } } } )
345389 const dataset = new Dataset ( client , 'demo' ) . addRecord ( 'x' )
346390 await assert . rejects (
347391 ( ) => new Experiment ( client , { name : 'exp-demo' , dataset, task : ( i ) => i } ) . run ( ) ,
348- / h a s n o i d a f t e r p u s h /
392+ / b a c k e n d r e s p o n s e i s m i s s i n g d a t a s e t i d /
349393 )
350394 } )
351395
0 commit comments