@langfuse/client 4.3.0 → 4.4.0

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.cjs CHANGED
@@ -420,44 +420,86 @@ var ExperimentManager = class {
420
420
  * @internal
421
421
  */
422
422
  async runItem(params) {
423
- const { item, evaluators = [], task, experimentMetadata = {} } = params;
424
- const { output, traceId, observationId } = await (0, import_tracing.startActiveObservation)(
425
- "experiment-item-run",
426
- async (span) => {
427
- var _a;
428
- const output2 = await task(item);
429
- span.update({
430
- input: item.input,
431
- output: output2,
432
- metadata: {
433
- experiment_name: params.experimentName,
434
- experiment_run_name: params.experimentRunName,
435
- ...experimentMetadata,
436
- ...(_a = item.metadata) != null ? _a : {},
437
- ..."id" in item && "datasetId" in item ? {
438
- dataset_id: item["datasetId"],
439
- dataset_item_id: item["id"]
440
- } : {}
441
- }
442
- });
443
- return { output: output2, traceId: span.traceId, observationId: span.id };
423
+ const { item, evaluators = [], task, experimentMetadata } = params;
424
+ const { output, traceId, observationId, datasetRunId } = await (0, import_tracing.startActiveObservation)("experiment-item-run", async (span) => {
425
+ const input = item.input;
426
+ const expectedOutput = item.expectedOutput;
427
+ const itemMetadata = item.metadata;
428
+ const datasetId = "datasetId" in item ? item.datasetId : void 0;
429
+ const datasetItemId = "id" in item ? item.id : void 0;
430
+ const traceId2 = span.traceId;
431
+ const observationId2 = span.id;
432
+ if (input === void 0) {
433
+ throw new Error("Experiment item is missing input. Skipping item.");
444
434
  }
445
- );
446
- let datasetRunId = void 0;
447
- if ("id" in item) {
448
- await this.langfuseClient.api.datasetRunItems.create({
449
- runName: params.experimentRunName,
450
- runDescription: params.experimentDescription,
451
- metadata: params.experimentMetadata,
452
- datasetItemId: item.id,
453
- traceId,
454
- observationId
455
- }).then((result) => {
456
- datasetRunId = result.datasetRunId;
457
- }).catch(
458
- (err) => this.logger.error("Linking dataset run item failed", err)
435
+ let datasetRunId2 = void 0;
436
+ if (datasetItemId) {
437
+ try {
438
+ const result = await this.langfuseClient.api.datasetRunItems.create(
439
+ {
440
+ runName: params.experimentRunName,
441
+ runDescription: params.experimentDescription,
442
+ metadata: params.experimentMetadata,
443
+ datasetItemId,
444
+ traceId: traceId2,
445
+ observationId: observationId2
446
+ }
447
+ );
448
+ datasetRunId2 = result.datasetRunId;
449
+ } catch (err) {
450
+ this.logger.error("Linking dataset run item failed", err);
451
+ }
452
+ }
453
+ const experimentItemId = datasetItemId || await (0, import_core.createExperimentItemId)(input);
454
+ const experimentId = datasetRunId2 || await (0, import_core.createExperimentId)();
455
+ const rootSpanAttributes = {
456
+ [import_core.LangfuseOtelSpanAttributes.ENVIRONMENT]: import_core.LANGFUSE_SDK_EXPERIMENT_ENVIRONMENT
457
+ };
458
+ if (params.experimentDescription) {
459
+ rootSpanAttributes[import_core.LangfuseOtelSpanAttributes.EXPERIMENT_DESCRIPTION] = params.experimentDescription;
460
+ }
461
+ if (expectedOutput !== void 0) {
462
+ const serialized = (0, import_core.serializeValue)(expectedOutput);
463
+ if (serialized) {
464
+ rootSpanAttributes[import_core.LangfuseOtelSpanAttributes.EXPERIMENT_ITEM_EXPECTED_OUTPUT] = serialized;
465
+ }
466
+ }
467
+ span.otelSpan.setAttributes(rootSpanAttributes);
468
+ const output2 = await (0, import_core.propagateAttributes)(
469
+ {
470
+ _internalExperiment: {
471
+ experimentId,
472
+ experimentName: params.experimentRunName,
473
+ experimentMetadata: (0, import_core.serializeValue)(experimentMetadata),
474
+ experimentDatasetId: datasetId,
475
+ experimentItemId,
476
+ experimentItemMetadata: (0, import_core.serializeValue)(itemMetadata),
477
+ experimentItemRootObservationId: span.id
478
+ }
479
+ },
480
+ async () => await task(item)
459
481
  );
460
- }
482
+ span.update({
483
+ input,
484
+ output: output2,
485
+ metadata: {
486
+ experiment_name: params.experimentName,
487
+ experiment_run_name: params.experimentRunName,
488
+ ...experimentMetadata,
489
+ ...itemMetadata != null ? itemMetadata : {},
490
+ ...datasetId && datasetItemId ? {
491
+ dataset_id: datasetId,
492
+ dataset_item_id: datasetItemId
493
+ } : {}
494
+ }
495
+ });
496
+ return {
497
+ output: output2,
498
+ traceId: traceId2,
499
+ observationId: observationId2,
500
+ datasetRunId: datasetRunId2
501
+ };
502
+ });
461
503
  const evalPromises = evaluators.map(
462
504
  async (evaluator) => {
463
505
  const params2 = {
@@ -491,6 +533,7 @@ ${JSON.stringify(params2)}
491
533
  for (const ev of evals) {
492
534
  this.langfuseClient.score.create({
493
535
  traceId,
536
+ observationId,
494
537
  ...ev
495
538
  });
496
539
  }