@@ -119,6 +119,7 @@ export class ExperimentManager {
119119 * @param config.maxConcurrency - Maximum number of concurrent task executions (default: 50)
120120 *
121121 * @returns Promise that resolves to experiment results including:
122+ * - experimentId: Stable identifier for the experiment execution
122123 * - runName: The experiment run name (either provided or generated)
123124 * - itemResults: Results for each processed data item
124125 * - runEvaluations: Results from run-level evaluators
@@ -193,6 +194,7 @@ export class ExperimentManager {
193194 name,
194195 runName : providedRunName ,
195196 } ) ;
197+ const fallbackExperimentId = await createExperimentId ( ) ;
196198
197199 if ( ! this . isOtelRegistered ( ) ) {
198200 this . logger . warn (
@@ -217,6 +219,7 @@ export class ExperimentManager {
217219 experimentRunName : runName ,
218220 experimentDescription : description ,
219221 experimentMetadata : metadata ,
222+ fallbackExperimentId,
220223 datasetVersion : config . datasetVersion ,
221224 } ) ;
222225 } ) ;
@@ -244,8 +247,10 @@ export class ExperimentManager {
244247 }
245248
246249 // Get dataset run URL
247- const datasetRunId =
248- itemResults . length > 0 ? itemResults [ 0 ] . datasetRunId : undefined ;
250+ const datasetRunId = itemResults . find (
251+ ( item ) => item . datasetRunId ,
252+ ) ?. datasetRunId ;
253+ const experimentId = datasetRunId || fallbackExperimentId ;
249254
250255 let datasetRunUrl = undefined ;
251256 if ( datasetRunId && data . length > 0 && "datasetId" in data [ 0 ] ) {
@@ -294,6 +299,7 @@ export class ExperimentManager {
294299 await this . langfuseClient . score . flush ( ) ;
295300
296301 return {
302+ experimentId,
297303 runName,
298304 itemResults,
299305 datasetRunId,
@@ -355,6 +361,7 @@ export class ExperimentManager {
355361 ExpectedOutput ,
356362 Metadata
357363 > [ "metadata" ] ;
364+ fallbackExperimentId : string ;
358365 item : ExperimentParams < Input , ExpectedOutput , Metadata > [ "data" ] [ 0 ] ;
359366 task : ExperimentTask < Input , ExpectedOutput , Metadata > ;
360367 evaluators ?: Evaluator < Input , ExpectedOutput , Metadata > [ ] ;
@@ -405,7 +412,7 @@ export class ExperimentManager {
405412 // Generate IDs
406413 const experimentItemId =
407414 datasetItemId || ( await createExperimentItemId ( input ) ) ;
408- const experimentId = datasetRunId || ( await createExperimentId ( ) ) ;
415+ const experimentId = datasetRunId || params . fallbackExperimentId ;
409416
410417 // Set non-propagated experiment attributes directly on root span
411418 const rootSpanAttributes : Record < string , string > = {
0 commit comments