@langfuse/client 5.0.0 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -233,6 +233,8 @@ type ExperimentItemResult<Input = any, ExpectedOutput = any, Metadata extends Re
233
233
  * ```typescript
234
234
  * const result = await langfuse.experiment.run(config);
235
235
  *
236
+ * console.log(`Experiment ID: ${result.experimentId}`);
237
+ *
236
238
  * // Access individual results
237
239
  * console.log(`Processed ${result.itemResults.length} items`);
238
240
  *
@@ -255,6 +257,14 @@ type ExperimentItemResult<Input = any, ExpectedOutput = any, Metadata extends Re
255
257
  * @public
256
258
  */
257
259
  type ExperimentResult<Input = any, ExpectedOutput = any, Metadata extends Record<string, any> = Record<string, any>> = {
260
+ /**
261
+ * Stable identifier for this experiment execution.
262
+ *
263
+ * For Langfuse datasets, this is the dataset run ID when available.
264
+ * For local data, this is a generated fallback ID shared across all items
265
+ * in the run.
266
+ */
267
+ experimentId: string;
258
268
  /**
259
269
  * The experiment run name.
260
270
  *
@@ -641,6 +651,7 @@ declare class ExperimentManager {
641
651
  * @param config.maxConcurrency - Maximum number of concurrent task executions (default: 50)
642
652
  *
643
653
  * @returns Promise that resolves to experiment results including:
654
+ * - experimentId: Stable identifier for the experiment execution
644
655
  * - runName: The experiment run name (either provided or generated)
645
656
  * - itemResults: Results for each processed data item
646
657
  * - runEvaluations: Results from run-level evaluators
package/dist/index.d.ts CHANGED
@@ -233,6 +233,8 @@ type ExperimentItemResult<Input = any, ExpectedOutput = any, Metadata extends Re
233
233
  * ```typescript
234
234
  * const result = await langfuse.experiment.run(config);
235
235
  *
236
+ * console.log(`Experiment ID: ${result.experimentId}`);
237
+ *
236
238
  * // Access individual results
237
239
  * console.log(`Processed ${result.itemResults.length} items`);
238
240
  *
@@ -255,6 +257,14 @@ type ExperimentItemResult<Input = any, ExpectedOutput = any, Metadata extends Re
255
257
  * @public
256
258
  */
257
259
  type ExperimentResult<Input = any, ExpectedOutput = any, Metadata extends Record<string, any> = Record<string, any>> = {
260
+ /**
261
+ * Stable identifier for this experiment execution.
262
+ *
263
+ * For Langfuse datasets, this is the dataset run ID when available.
264
+ * For local data, this is a generated fallback ID shared across all items
265
+ * in the run.
266
+ */
267
+ experimentId: string;
258
268
  /**
259
269
  * The experiment run name.
260
270
  *
@@ -641,6 +651,7 @@ declare class ExperimentManager {
641
651
  * @param config.maxConcurrency - Maximum number of concurrent task executions (default: 50)
642
652
  *
643
653
  * @returns Promise that resolves to experiment results including:
654
+ * - experimentId: Stable identifier for the experiment execution
644
655
  * - runName: The experiment run name (either provided or generated)
645
656
  * - itemResults: Results for each processed data item
646
657
  * - runEvaluations: Results from run-level evaluators
package/dist/index.mjs CHANGED
@@ -206,6 +206,7 @@ var ExperimentManager = class {
206
206
  * @param config.maxConcurrency - Maximum number of concurrent task executions (default: 50)
207
207
  *
208
208
  * @returns Promise that resolves to experiment results including:
209
+ * - experimentId: Stable identifier for the experiment execution
209
210
  * - runName: The experiment run name (either provided or generated)
210
211
  * - itemResults: Results for each processed data item
211
212
  * - runEvaluations: Results from run-level evaluators
@@ -258,6 +259,7 @@ var ExperimentManager = class {
258
259
  * @public
259
260
  */
260
261
  async run(config) {
262
+ var _a;
261
263
  const {
262
264
  data,
263
265
  evaluators,
@@ -273,6 +275,7 @@ var ExperimentManager = class {
273
275
  name,
274
276
  runName: providedRunName
275
277
  });
278
+ const fallbackExperimentId = await createExperimentId();
276
279
  if (!this.isOtelRegistered()) {
277
280
  this.logger.warn(
278
281
  "OpenTelemetry has not been set up. Traces will not be sent to Langfuse.See our docs on how to set up OpenTelemetry: https://langfuse.com/docs/observability/sdk/typescript/setup#tracing-setup"
@@ -290,6 +293,7 @@ var ExperimentManager = class {
290
293
  experimentRunName: runName,
291
294
  experimentDescription: description,
292
295
  experimentMetadata: metadata,
296
+ fallbackExperimentId,
293
297
  datasetVersion: config.datasetVersion
294
298
  });
295
299
  });
@@ -310,7 +314,10 @@ var ExperimentManager = class {
310
314
  );
311
315
  itemResults.push(...results);
312
316
  }
313
- const datasetRunId = itemResults.length > 0 ? itemResults[0].datasetRunId : void 0;
317
+ const datasetRunId = (_a = itemResults.find(
318
+ (item) => item.datasetRunId
319
+ )) == null ? void 0 : _a.datasetRunId;
320
+ const experimentId = datasetRunId || fallbackExperimentId;
314
321
  let datasetRunUrl = void 0;
315
322
  if (datasetRunId && data.length > 0 && "datasetId" in data[0]) {
316
323
  const datasetId = data[0].datasetId;
@@ -346,13 +353,14 @@ var ExperimentManager = class {
346
353
  }
347
354
  await this.langfuseClient.score.flush();
348
355
  return {
356
+ experimentId,
349
357
  runName,
350
358
  itemResults,
351
359
  datasetRunId,
352
360
  datasetRunUrl,
353
361
  runEvaluations,
354
362
  format: async (options) => {
355
- var _a;
363
+ var _a2;
356
364
  return await this.prettyPrintResults({
357
365
  datasetRunUrl,
358
366
  itemResults,
@@ -361,7 +369,7 @@ var ExperimentManager = class {
361
369
  name: config.name,
362
370
  runName,
363
371
  description: config.description,
364
- includeItemResults: (_a = options == null ? void 0 : options.includeItemResults) != null ? _a : false
372
+ includeItemResults: (_a2 = options == null ? void 0 : options.includeItemResults) != null ? _a2 : false
365
373
  });
366
374
  }
367
375
  };
@@ -426,7 +434,7 @@ var ExperimentManager = class {
426
434
  }
427
435
  }
428
436
  const experimentItemId = datasetItemId || await createExperimentItemId(input);
429
- const experimentId = datasetRunId2 || await createExperimentId();
437
+ const experimentId = datasetRunId2 || params.fallbackExperimentId;
430
438
  const rootSpanAttributes = {
431
439
  [LangfuseOtelSpanAttributes.ENVIRONMENT]: LANGFUSE_SDK_EXPERIMENT_ENVIRONMENT
432
440
  };
@@ -1219,7 +1227,7 @@ var ChatPromptClient = class _ChatPromptClient extends BasePromptClient {
1219
1227
  }
1220
1228
  }
1221
1229
  return messagesWithPlaceholdersReplaced.map((item) => {
1222
- if (typeof item === "object" && item !== null && "role" in item && "content" in item) {
1230
+ if (typeof item === "object" && item !== null && "role" in item && "content" in item && typeof item.content === "string") {
1223
1231
  return {
1224
1232
  ...item,
1225
1233
  content: mustache.render(item.content, variables != null ? variables : {})