@langfuse/core 4.3.0 → 4.4.1

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
@@ -30,6 +30,7 @@ __export(index_exports, {
30
30
  CommentObjectType: () => CommentObjectType,
31
31
  DatasetStatus: () => DatasetStatus,
32
32
  Error: () => Error2,
33
+ LANGFUSE_SDK_EXPERIMENT_ENVIRONMENT: () => LANGFUSE_SDK_EXPERIMENT_ENVIRONMENT,
33
34
  LANGFUSE_SDK_NAME: () => LANGFUSE_SDK_NAME,
34
35
  LANGFUSE_SDK_VERSION: () => LANGFUSE_SDK_VERSION,
35
36
  LANGFUSE_TRACER_NAME: () => LANGFUSE_TRACER_NAME,
@@ -37,6 +38,7 @@ __export(index_exports, {
37
38
  LangfuseAPIError: () => LangfuseAPIError,
38
39
  LangfuseAPITimeoutError: () => LangfuseAPITimeoutError,
39
40
  LangfuseMedia: () => LangfuseMedia,
41
+ LangfuseOtelContextKeys: () => LangfuseOtelContextKeys,
40
42
  LangfuseOtelSpanAttributes: () => LangfuseOtelSpanAttributes,
41
43
  LlmAdapter: () => LlmAdapter,
42
44
  LogLevel: () => LogLevel,
@@ -62,6 +64,8 @@ __export(index_exports, {
62
64
  comments: () => comments_exports,
63
65
  commons: () => commons_exports,
64
66
  configureGlobalLogger: () => configureGlobalLogger,
67
+ createExperimentId: () => createExperimentId,
68
+ createExperimentItemId: () => createExperimentItemId,
65
69
  createLogger: () => createLogger,
66
70
  datasetItems: () => datasetItems_exports,
67
71
  datasetRunItems: () => datasetRunItems_exports,
@@ -69,6 +73,7 @@ __export(index_exports, {
69
73
  generateUUID: () => generateUUID,
70
74
  getEnv: () => getEnv,
71
75
  getGlobalLogger: () => getGlobalLogger,
76
+ getPropagatedAttributesFromContext: () => getPropagatedAttributesFromContext,
72
77
  health: () => health_exports,
73
78
  ingestion: () => ingestion_exports,
74
79
  llmConnections: () => llmConnections_exports,
@@ -82,12 +87,14 @@ __export(index_exports, {
82
87
  projects: () => projects_exports,
83
88
  promptVersion: () => promptVersion_exports,
84
89
  prompts: () => prompts_exports,
90
+ propagateAttributes: () => propagateAttributes,
85
91
  resetGlobalLogger: () => resetGlobalLogger,
86
92
  safeSetTimeout: () => safeSetTimeout,
87
93
  scim: () => scim_exports,
88
94
  score: () => score_exports,
89
95
  scoreConfigs: () => scoreConfigs_exports,
90
96
  scoreV2: () => scoreV2_exports,
97
+ serializeValue: () => serializeValue,
91
98
  sessions: () => sessions_exports,
92
99
  trace: () => trace_exports,
93
100
  utils: () => utils_exports
@@ -149,6 +156,24 @@ function base64Decode(input) {
149
156
  const bytes = base64ToBytes(input);
150
157
  return new TextDecoder().decode(bytes);
151
158
  }
159
+ async function createExperimentId() {
160
+ const randomBytes = new Uint8Array(8);
161
+ crypto.getRandomValues(randomBytes);
162
+ return Array.from(randomBytes).map((b) => b.toString(16).padStart(2, "0")).join("");
163
+ }
164
+ async function createExperimentItemId(input) {
165
+ const serialized = serializeValue(input);
166
+ const data = new TextEncoder().encode(serialized);
167
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
168
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
169
+ const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
170
+ return hashHex.slice(0, 16);
171
+ }
172
+ function serializeValue(value) {
173
+ if (value === void 0 || value === null) return void 0;
174
+ if (typeof value === "string") return value;
175
+ return JSON.stringify(value);
176
+ }
152
177
 
153
178
  // src/logger/index.ts
154
179
  var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
@@ -325,7 +350,7 @@ var resetGlobalLogger = () => {
325
350
  // package.json
326
351
  var package_default = {
327
352
  name: "@langfuse/core",
328
- version: "4.3.0",
353
+ version: "4.4.1",
329
354
  description: "Core functions and utilities for Langfuse packages",
330
355
  type: "module",
331
356
  sideEffects: false,
@@ -352,6 +377,9 @@ var package_default = {
352
377
  files: [
353
378
  "dist"
354
379
  ],
380
+ peerDependencies: {
381
+ "@opentelemetry/api": "^1.9.0"
382
+ },
355
383
  devDependencies: {
356
384
  "@types/node": "^24.1.0"
357
385
  }
@@ -361,6 +389,7 @@ var package_default = {
361
389
  var LANGFUSE_TRACER_NAME = "langfuse-sdk";
362
390
  var LANGFUSE_SDK_VERSION = package_default.version;
363
391
  var LANGFUSE_SDK_NAME = "javascript";
392
+ var LANGFUSE_SDK_EXPERIMENT_ENVIRONMENT = "sdk-experiment";
364
393
  var LangfuseOtelSpanAttributes = /* @__PURE__ */ ((LangfuseOtelSpanAttributes2) => {
365
394
  LangfuseOtelSpanAttributes2["TRACE_NAME"] = "langfuse.trace.name";
366
395
  LangfuseOtelSpanAttributes2["TRACE_USER_ID"] = "user.id";
@@ -387,6 +416,15 @@ var LangfuseOtelSpanAttributes = /* @__PURE__ */ ((LangfuseOtelSpanAttributes2)
387
416
  LangfuseOtelSpanAttributes2["RELEASE"] = "langfuse.release";
388
417
  LangfuseOtelSpanAttributes2["VERSION"] = "langfuse.version";
389
418
  LangfuseOtelSpanAttributes2["AS_ROOT"] = "langfuse.internal.as_root";
419
+ LangfuseOtelSpanAttributes2["EXPERIMENT_ID"] = "langfuse.experiment.id";
420
+ LangfuseOtelSpanAttributes2["EXPERIMENT_NAME"] = "langfuse.experiment.name";
421
+ LangfuseOtelSpanAttributes2["EXPERIMENT_DESCRIPTION"] = "langfuse.experiment.description";
422
+ LangfuseOtelSpanAttributes2["EXPERIMENT_METADATA"] = "langfuse.experiment.metadata";
423
+ LangfuseOtelSpanAttributes2["EXPERIMENT_DATASET_ID"] = "langfuse.experiment.dataset.id";
424
+ LangfuseOtelSpanAttributes2["EXPERIMENT_ITEM_ID"] = "langfuse.experiment.item.id";
425
+ LangfuseOtelSpanAttributes2["EXPERIMENT_ITEM_EXPECTED_OUTPUT"] = "langfuse.experiment.item.expected_output";
426
+ LangfuseOtelSpanAttributes2["EXPERIMENT_ITEM_METADATA"] = "langfuse.experiment.item.metadata";
427
+ LangfuseOtelSpanAttributes2["EXPERIMENT_ITEM_ROOT_OBSERVATION_ID"] = "langfuse.experiment.item.root_observation_id";
390
428
  LangfuseOtelSpanAttributes2["TRACE_COMPAT_USER_ID"] = "langfuse.user.id";
391
429
  LangfuseOtelSpanAttributes2["TRACE_COMPAT_SESSION_ID"] = "langfuse.session.id";
392
430
  return LangfuseOtelSpanAttributes2;
@@ -4281,7 +4319,9 @@ var Datasets = class {
4281
4319
  * await client.datasets.create({
4282
4320
  * name: "name",
4283
4321
  * description: undefined,
4284
- * metadata: undefined
4322
+ * metadata: undefined,
4323
+ * inputSchema: undefined,
4324
+ * expectedOutputSchema: undefined
4285
4325
  * })
4286
4326
  */
4287
4327
  create(request, requestOptions) {
@@ -7386,6 +7426,108 @@ var Organizations = class {
7386
7426
  });
7387
7427
  }
7388
7428
  }
7429
+ /**
7430
+ * Get all API keys for the organization associated with the API key (requires organization-scoped API key)
7431
+ *
7432
+ * @param {Organizations.RequestOptions} requestOptions - Request-specific configuration.
7433
+ *
7434
+ * @throws {@link LangfuseAPI.Error}
7435
+ * @throws {@link LangfuseAPI.UnauthorizedError}
7436
+ * @throws {@link LangfuseAPI.AccessDeniedError}
7437
+ * @throws {@link LangfuseAPI.MethodNotAllowedError}
7438
+ * @throws {@link LangfuseAPI.NotFoundError}
7439
+ *
7440
+ * @example
7441
+ * await client.organizations.getOrganizationApiKeys()
7442
+ */
7443
+ getOrganizationApiKeys(requestOptions) {
7444
+ return HttpResponsePromise.fromPromise(
7445
+ this.__getOrganizationApiKeys(requestOptions)
7446
+ );
7447
+ }
7448
+ async __getOrganizationApiKeys(requestOptions) {
7449
+ var _a2, _b, _c, _d, _e, _f, _g, _h;
7450
+ let _headers = mergeHeaders(
7451
+ (_a2 = this._options) == null ? void 0 : _a2.headers,
7452
+ mergeOnlyDefinedHeaders({
7453
+ Authorization: await this._getAuthorizationHeader(),
7454
+ "X-Langfuse-Sdk-Name": (_c = requestOptions == null ? void 0 : requestOptions.xLangfuseSdkName) != null ? _c : (_b = this._options) == null ? void 0 : _b.xLangfuseSdkName,
7455
+ "X-Langfuse-Sdk-Version": (_e = requestOptions == null ? void 0 : requestOptions.xLangfuseSdkVersion) != null ? _e : (_d = this._options) == null ? void 0 : _d.xLangfuseSdkVersion,
7456
+ "X-Langfuse-Public-Key": (_g = requestOptions == null ? void 0 : requestOptions.xLangfusePublicKey) != null ? _g : (_f = this._options) == null ? void 0 : _f.xLangfusePublicKey
7457
+ }),
7458
+ requestOptions == null ? void 0 : requestOptions.headers
7459
+ );
7460
+ const _response = await fetcher({
7461
+ url: url_exports.join(
7462
+ (_h = await Supplier.get(this._options.baseUrl)) != null ? _h : await Supplier.get(this._options.environment),
7463
+ "/api/public/organizations/apiKeys"
7464
+ ),
7465
+ method: "GET",
7466
+ headers: _headers,
7467
+ queryParameters: requestOptions == null ? void 0 : requestOptions.queryParams,
7468
+ timeoutMs: (requestOptions == null ? void 0 : requestOptions.timeoutInSeconds) != null ? requestOptions.timeoutInSeconds * 1e3 : 6e4,
7469
+ maxRetries: requestOptions == null ? void 0 : requestOptions.maxRetries,
7470
+ abortSignal: requestOptions == null ? void 0 : requestOptions.abortSignal
7471
+ });
7472
+ if (_response.ok) {
7473
+ return {
7474
+ data: _response.body,
7475
+ rawResponse: _response.rawResponse
7476
+ };
7477
+ }
7478
+ if (_response.error.reason === "status-code") {
7479
+ switch (_response.error.statusCode) {
7480
+ case 400:
7481
+ throw new Error2(
7482
+ _response.error.body,
7483
+ _response.rawResponse
7484
+ );
7485
+ case 401:
7486
+ throw new UnauthorizedError(
7487
+ _response.error.body,
7488
+ _response.rawResponse
7489
+ );
7490
+ case 403:
7491
+ throw new AccessDeniedError(
7492
+ _response.error.body,
7493
+ _response.rawResponse
7494
+ );
7495
+ case 405:
7496
+ throw new MethodNotAllowedError(
7497
+ _response.error.body,
7498
+ _response.rawResponse
7499
+ );
7500
+ case 404:
7501
+ throw new NotFoundError(
7502
+ _response.error.body,
7503
+ _response.rawResponse
7504
+ );
7505
+ default:
7506
+ throw new LangfuseAPIError({
7507
+ statusCode: _response.error.statusCode,
7508
+ body: _response.error.body,
7509
+ rawResponse: _response.rawResponse
7510
+ });
7511
+ }
7512
+ }
7513
+ switch (_response.error.reason) {
7514
+ case "non-json":
7515
+ throw new LangfuseAPIError({
7516
+ statusCode: _response.error.statusCode,
7517
+ body: _response.error.rawBody,
7518
+ rawResponse: _response.rawResponse
7519
+ });
7520
+ case "timeout":
7521
+ throw new LangfuseAPITimeoutError(
7522
+ "Timeout exceeded when calling GET /api/public/organizations/apiKeys."
7523
+ );
7524
+ case "unknown":
7525
+ throw new LangfuseAPIError({
7526
+ message: _response.error.errorMessage,
7527
+ rawResponse: _response.rawResponse
7528
+ });
7529
+ }
7530
+ }
7389
7531
  async _getAuthorizationHeader() {
7390
7532
  const username = await Supplier.get(this._options.username);
7391
7533
  const password = await Supplier.get(this._options.password);
@@ -11442,6 +11584,369 @@ var LangfuseMedia = class {
11442
11584
  return this.base64DataUri;
11443
11585
  }
11444
11586
  };
11587
+
11588
+ // src/propagation.ts
11589
+ var import_api = require("@opentelemetry/api");
11590
+ var experimentKeys = [
11591
+ "experimentId",
11592
+ "experimentName",
11593
+ "experimentMetadata",
11594
+ "experimentDatasetId",
11595
+ "experimentItemId",
11596
+ "experimentItemMetadata",
11597
+ "experimentItemRootObservationId"
11598
+ ];
11599
+ var LangfuseOtelContextKeys = {
11600
+ userId: (0, import_api.createContextKey)("langfuse_user_id"),
11601
+ sessionId: (0, import_api.createContextKey)("langfuse_session_id"),
11602
+ metadata: (0, import_api.createContextKey)("langfuse_metadata"),
11603
+ version: (0, import_api.createContextKey)("langfuse_version"),
11604
+ tags: (0, import_api.createContextKey)("langfuse_tags"),
11605
+ // Experiments
11606
+ experimentId: (0, import_api.createContextKey)("langfuse_experiment_id"),
11607
+ experimentName: (0, import_api.createContextKey)("langfuse_experiment_name"),
11608
+ experimentMetadata: (0, import_api.createContextKey)("langfuse_experiment_metadata"),
11609
+ experimentDatasetId: (0, import_api.createContextKey)("langfuse_experiment_dataset_id"),
11610
+ experimentItemId: (0, import_api.createContextKey)("langfuse_experiment_item_id"),
11611
+ experimentItemMetadata: (0, import_api.createContextKey)("langfuse_experiment_item_metadata"),
11612
+ experimentItemRootObservationId: (0, import_api.createContextKey)(
11613
+ "langfuse_experiment_item_root_observation_id"
11614
+ )
11615
+ };
11616
+ var LANGFUSE_BAGGAGE_PREFIX = "langfuse_";
11617
+ var LANGFUSE_BAGGAGE_TAGS_SEPARATOR = ",";
11618
+ function propagateAttributes(params, fn) {
11619
+ var _a2;
11620
+ let context = import_api.context.active();
11621
+ const span = import_api.trace.getActiveSpan();
11622
+ const asBaggage = (_a2 = params.asBaggage) != null ? _a2 : false;
11623
+ const { userId, sessionId, metadata, version, tags, _internalExperiment } = params;
11624
+ if (userId) {
11625
+ if (isValidPropagatedString({ value: userId, attributeName: "userId" })) {
11626
+ context = setPropagatedAttribute({
11627
+ key: "userId",
11628
+ value: userId,
11629
+ context,
11630
+ span,
11631
+ asBaggage
11632
+ });
11633
+ }
11634
+ }
11635
+ if (sessionId) {
11636
+ if (isValidPropagatedString({
11637
+ value: sessionId,
11638
+ attributeName: "sessionId"
11639
+ })) {
11640
+ context = setPropagatedAttribute({
11641
+ key: "sessionId",
11642
+ value: sessionId,
11643
+ context,
11644
+ span,
11645
+ asBaggage
11646
+ });
11647
+ }
11648
+ }
11649
+ if (version) {
11650
+ if (isValidPropagatedString({
11651
+ value: version,
11652
+ attributeName: "version"
11653
+ })) {
11654
+ context = setPropagatedAttribute({
11655
+ key: "version",
11656
+ value: version,
11657
+ context,
11658
+ span,
11659
+ asBaggage
11660
+ });
11661
+ }
11662
+ }
11663
+ if (tags && tags.length > 0) {
11664
+ const validTags = tags.filter(
11665
+ (tag) => isValidPropagatedString({
11666
+ value: tag,
11667
+ attributeName: "tag"
11668
+ })
11669
+ );
11670
+ if (validTags.length > 0) {
11671
+ context = setPropagatedAttribute({
11672
+ key: "tags",
11673
+ value: validTags,
11674
+ context,
11675
+ span,
11676
+ asBaggage
11677
+ });
11678
+ }
11679
+ }
11680
+ if (metadata) {
11681
+ const validatedMetadata = {};
11682
+ for (const [key, value] of Object.entries(metadata)) {
11683
+ if (isValidPropagatedString({
11684
+ value,
11685
+ attributeName: `metadata.${key}`
11686
+ })) {
11687
+ validatedMetadata[key] = value;
11688
+ }
11689
+ }
11690
+ if (Object.keys(validatedMetadata).length > 0) {
11691
+ context = setPropagatedAttribute({
11692
+ key: "metadata",
11693
+ value: validatedMetadata,
11694
+ context,
11695
+ span,
11696
+ asBaggage
11697
+ });
11698
+ }
11699
+ }
11700
+ if (_internalExperiment) {
11701
+ for (const [key, value] of Object.entries(_internalExperiment)) {
11702
+ if (value !== void 0) {
11703
+ context = setPropagatedAttribute({
11704
+ key,
11705
+ value,
11706
+ context,
11707
+ span,
11708
+ asBaggage
11709
+ });
11710
+ }
11711
+ }
11712
+ }
11713
+ return import_api.context.with(context, fn);
11714
+ }
11715
+ function getPropagatedAttributesFromContext(context) {
11716
+ const propagatedAttributes = {};
11717
+ const baggage = import_api.propagation.getBaggage(context);
11718
+ if (baggage) {
11719
+ baggage.getAllEntries().forEach(([baggageKey, baggageEntry]) => {
11720
+ if (baggageKey.startsWith(LANGFUSE_BAGGAGE_PREFIX)) {
11721
+ const spanKey = getSpanKeyFromBaggageKey(baggageKey);
11722
+ if (spanKey) {
11723
+ const isMergedTags = baggageKey == getBaggageKeyForPropagatedKey("tags");
11724
+ propagatedAttributes[spanKey] = isMergedTags ? baggageEntry.value.split(LANGFUSE_BAGGAGE_TAGS_SEPARATOR) : baggageEntry.value;
11725
+ }
11726
+ }
11727
+ });
11728
+ }
11729
+ const userId = context.getValue(LangfuseOtelContextKeys["userId"]);
11730
+ if (userId && typeof userId === "string") {
11731
+ const spanKey = getSpanKeyForPropagatedKey("userId");
11732
+ propagatedAttributes[spanKey] = userId;
11733
+ }
11734
+ const sessionId = context.getValue(LangfuseOtelContextKeys["sessionId"]);
11735
+ if (sessionId && typeof sessionId === "string") {
11736
+ const spanKey = getSpanKeyForPropagatedKey("sessionId");
11737
+ propagatedAttributes[spanKey] = sessionId;
11738
+ }
11739
+ const version = context.getValue(LangfuseOtelContextKeys["version"]);
11740
+ if (version && typeof version === "string") {
11741
+ const spanKey = getSpanKeyForPropagatedKey("version");
11742
+ propagatedAttributes[spanKey] = version;
11743
+ }
11744
+ const tags = context.getValue(LangfuseOtelContextKeys["tags"]);
11745
+ if (tags && Array.isArray(tags)) {
11746
+ const spanKey = getSpanKeyForPropagatedKey("tags");
11747
+ propagatedAttributes[spanKey] = tags;
11748
+ }
11749
+ const metadata = context.getValue(LangfuseOtelContextKeys["metadata"]);
11750
+ if (metadata && typeof metadata === "object" && metadata !== null) {
11751
+ for (const [k, v] of Object.entries(metadata)) {
11752
+ const spanKey = `${"langfuse.trace.metadata" /* TRACE_METADATA */}.${k}`;
11753
+ propagatedAttributes[spanKey] = String(v);
11754
+ }
11755
+ }
11756
+ for (const key of experimentKeys) {
11757
+ const contextKey = LangfuseOtelContextKeys[key];
11758
+ const value = context.getValue(contextKey);
11759
+ if (value && typeof value === "string") {
11760
+ const spanKey = getSpanKeyForPropagatedKey(key);
11761
+ propagatedAttributes[spanKey] = value;
11762
+ }
11763
+ }
11764
+ if (propagatedAttributes[getSpanKeyForPropagatedKey("experimentItemRootObservationId")]) {
11765
+ propagatedAttributes["langfuse.environment" /* ENVIRONMENT */] = LANGFUSE_SDK_EXPERIMENT_ENVIRONMENT;
11766
+ }
11767
+ return propagatedAttributes;
11768
+ }
11769
+ function setPropagatedAttribute(params) {
11770
+ const { key, value, span, asBaggage } = params;
11771
+ let context = params.context;
11772
+ let mergedMetadata = key === "metadata" ? getContextMergedMetadata(context, value) : {};
11773
+ let mergedTags = key === "tags" ? getContextMergedTags(context, value) : [];
11774
+ const contextKey = getContextKeyForPropagatedKey(key);
11775
+ if (key === "metadata") {
11776
+ context = context.setValue(contextKey, mergedMetadata);
11777
+ } else if (key === "tags") {
11778
+ context = context.setValue(contextKey, mergedTags);
11779
+ } else {
11780
+ context = context.setValue(contextKey, value);
11781
+ }
11782
+ if (span && span.isRecording()) {
11783
+ if (key === "metadata") {
11784
+ for (const [k, v] of Object.entries(mergedMetadata)) {
11785
+ span.setAttribute(
11786
+ `${"langfuse.trace.metadata" /* TRACE_METADATA */}.${k}`,
11787
+ v
11788
+ );
11789
+ }
11790
+ } else if (key === "tags") {
11791
+ const spanKey = getSpanKeyForPropagatedKey(key);
11792
+ span.setAttribute(spanKey, mergedTags);
11793
+ } else {
11794
+ const spanKey = getSpanKeyForPropagatedKey(key);
11795
+ span.setAttribute(spanKey, value);
11796
+ }
11797
+ }
11798
+ if (asBaggage) {
11799
+ const baggageKey = getBaggageKeyForPropagatedKey(key);
11800
+ let baggage = import_api.propagation.getBaggage(context) || import_api.propagation.createBaggage();
11801
+ if (key === "metadata") {
11802
+ for (const [k, v] of Object.entries(mergedMetadata)) {
11803
+ baggage = baggage.setEntry(`${baggageKey}_${k}`, { value: v });
11804
+ }
11805
+ } else if (key === "tags") {
11806
+ baggage = baggage.setEntry(baggageKey, {
11807
+ value: mergedTags.join(LANGFUSE_BAGGAGE_TAGS_SEPARATOR)
11808
+ });
11809
+ } else {
11810
+ baggage = baggage.setEntry(baggageKey, { value });
11811
+ }
11812
+ context = import_api.propagation.setBaggage(context, baggage);
11813
+ }
11814
+ return context;
11815
+ }
11816
+ function getContextMergedTags(context, newTags) {
11817
+ const existingTags = context.getValue(LangfuseOtelContextKeys["tags"]);
11818
+ if (existingTags && Array.isArray(existingTags)) {
11819
+ return [.../* @__PURE__ */ new Set([...existingTags, ...newTags])];
11820
+ } else {
11821
+ return newTags;
11822
+ }
11823
+ }
11824
+ function getContextMergedMetadata(context, newMetadata) {
11825
+ const existingMetadata = context.getValue(
11826
+ LangfuseOtelContextKeys["metadata"]
11827
+ );
11828
+ if (existingMetadata && typeof existingMetadata === "object" && existingMetadata !== null && !Array.isArray(existingMetadata)) {
11829
+ return { ...existingMetadata, ...newMetadata };
11830
+ } else {
11831
+ return newMetadata;
11832
+ }
11833
+ }
11834
+ function isValidPropagatedString(params) {
11835
+ const logger = getGlobalLogger();
11836
+ const { value, attributeName } = params;
11837
+ if (typeof value !== "string") {
11838
+ logger.warn(
11839
+ `Propagated attribute '${attributeName}' must be a string. Dropping value.`
11840
+ );
11841
+ return false;
11842
+ }
11843
+ if (value.length > 200) {
11844
+ logger.warn(
11845
+ `Propagated attribute '${attributeName}' value is over 200 characters (${value.length} chars). Dropping value.`
11846
+ );
11847
+ return false;
11848
+ }
11849
+ return true;
11850
+ }
11851
+ function getContextKeyForPropagatedKey(key) {
11852
+ return LangfuseOtelContextKeys[key];
11853
+ }
11854
+ function getSpanKeyForPropagatedKey(key) {
11855
+ switch (key) {
11856
+ case "userId":
11857
+ return "user.id" /* TRACE_USER_ID */;
11858
+ case "sessionId":
11859
+ return "session.id" /* TRACE_SESSION_ID */;
11860
+ case "version":
11861
+ return "langfuse.version" /* VERSION */;
11862
+ case "metadata":
11863
+ return "langfuse.trace.metadata" /* TRACE_METADATA */;
11864
+ case "tags":
11865
+ return "langfuse.trace.tags" /* TRACE_TAGS */;
11866
+ case "experimentId":
11867
+ return "langfuse.experiment.id" /* EXPERIMENT_ID */;
11868
+ case "experimentName":
11869
+ return "langfuse.experiment.name" /* EXPERIMENT_NAME */;
11870
+ case "experimentMetadata":
11871
+ return "langfuse.experiment.metadata" /* EXPERIMENT_METADATA */;
11872
+ case "experimentDatasetId":
11873
+ return "langfuse.experiment.dataset.id" /* EXPERIMENT_DATASET_ID */;
11874
+ case "experimentItemId":
11875
+ return "langfuse.experiment.item.id" /* EXPERIMENT_ITEM_ID */;
11876
+ case "experimentItemMetadata":
11877
+ return "langfuse.experiment.item.metadata" /* EXPERIMENT_ITEM_METADATA */;
11878
+ case "experimentItemRootObservationId":
11879
+ return "langfuse.experiment.item.root_observation_id" /* EXPERIMENT_ITEM_ROOT_OBSERVATION_ID */;
11880
+ default: {
11881
+ const fallback = key;
11882
+ throw Error("Unhandled propagated key", fallback);
11883
+ }
11884
+ }
11885
+ }
11886
+ function getBaggageKeyForPropagatedKey(key) {
11887
+ switch (key) {
11888
+ case "userId":
11889
+ return `${LANGFUSE_BAGGAGE_PREFIX}user_id`;
11890
+ case "sessionId":
11891
+ return `${LANGFUSE_BAGGAGE_PREFIX}session_id`;
11892
+ case "version":
11893
+ return `${LANGFUSE_BAGGAGE_PREFIX}version`;
11894
+ case "metadata":
11895
+ return `${LANGFUSE_BAGGAGE_PREFIX}metadata`;
11896
+ case "tags":
11897
+ return `${LANGFUSE_BAGGAGE_PREFIX}tags`;
11898
+ case "experimentId":
11899
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_id`;
11900
+ case "experimentName":
11901
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_name`;
11902
+ case "experimentMetadata":
11903
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_metadata`;
11904
+ case "experimentDatasetId":
11905
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_dataset_id`;
11906
+ case "experimentItemId":
11907
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_item_id`;
11908
+ case "experimentItemMetadata":
11909
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_item_metadata`;
11910
+ case "experimentItemRootObservationId":
11911
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_item_root_observation_id`;
11912
+ default: {
11913
+ const fallback = key;
11914
+ throw Error("Unhandled propagated key", fallback);
11915
+ }
11916
+ }
11917
+ }
11918
+ function getSpanKeyFromBaggageKey(baggageKey) {
11919
+ if (!baggageKey.startsWith(LANGFUSE_BAGGAGE_PREFIX)) return;
11920
+ const suffix = baggageKey.slice(LANGFUSE_BAGGAGE_PREFIX.length);
11921
+ if (suffix.startsWith("metadata_")) {
11922
+ const metadataKey = suffix.slice("metadata_".length);
11923
+ return `${"langfuse.trace.metadata" /* TRACE_METADATA */}.${metadataKey}`;
11924
+ }
11925
+ switch (suffix) {
11926
+ case "user_id":
11927
+ return getSpanKeyForPropagatedKey("userId");
11928
+ case "session_id":
11929
+ return getSpanKeyForPropagatedKey("sessionId");
11930
+ case "version":
11931
+ return getSpanKeyForPropagatedKey("version");
11932
+ case "tags":
11933
+ return getSpanKeyForPropagatedKey("tags");
11934
+ case "experiment_id":
11935
+ return getSpanKeyForPropagatedKey("experimentId");
11936
+ case "experiment_name":
11937
+ return getSpanKeyForPropagatedKey("experimentName");
11938
+ case "experiment_metadata":
11939
+ return getSpanKeyForPropagatedKey("experimentMetadata");
11940
+ case "experiment_dataset_id":
11941
+ return getSpanKeyForPropagatedKey("experimentDatasetId");
11942
+ case "experiment_item_id":
11943
+ return getSpanKeyForPropagatedKey("experimentItemId");
11944
+ case "experiment_item_metadata":
11945
+ return getSpanKeyForPropagatedKey("experimentItemMetadata");
11946
+ case "experiment_item_root_observation_id":
11947
+ return getSpanKeyForPropagatedKey("experimentItemRootObservationId");
11948
+ }
11949
+ }
11445
11950
  // Annotate the CommonJS export names for ESM import in node:
11446
11951
  0 && (module.exports = {
11447
11952
  AccessDeniedError,
@@ -11454,6 +11959,7 @@ var LangfuseMedia = class {
11454
11959
  CommentObjectType,
11455
11960
  DatasetStatus,
11456
11961
  Error,
11962
+ LANGFUSE_SDK_EXPERIMENT_ENVIRONMENT,
11457
11963
  LANGFUSE_SDK_NAME,
11458
11964
  LANGFUSE_SDK_VERSION,
11459
11965
  LANGFUSE_TRACER_NAME,
@@ -11461,6 +11967,7 @@ var LangfuseMedia = class {
11461
11967
  LangfuseAPIError,
11462
11968
  LangfuseAPITimeoutError,
11463
11969
  LangfuseMedia,
11970
+ LangfuseOtelContextKeys,
11464
11971
  LangfuseOtelSpanAttributes,
11465
11972
  LlmAdapter,
11466
11973
  LogLevel,
@@ -11486,6 +11993,8 @@ var LangfuseMedia = class {
11486
11993
  comments,
11487
11994
  commons,
11488
11995
  configureGlobalLogger,
11996
+ createExperimentId,
11997
+ createExperimentItemId,
11489
11998
  createLogger,
11490
11999
  datasetItems,
11491
12000
  datasetRunItems,
@@ -11493,6 +12002,7 @@ var LangfuseMedia = class {
11493
12002
  generateUUID,
11494
12003
  getEnv,
11495
12004
  getGlobalLogger,
12005
+ getPropagatedAttributesFromContext,
11496
12006
  health,
11497
12007
  ingestion,
11498
12008
  llmConnections,
@@ -11506,12 +12016,14 @@ var LangfuseMedia = class {
11506
12016
  projects,
11507
12017
  promptVersion,
11508
12018
  prompts,
12019
+ propagateAttributes,
11509
12020
  resetGlobalLogger,
11510
12021
  safeSetTimeout,
11511
12022
  scim,
11512
12023
  score,
11513
12024
  scoreConfigs,
11514
12025
  scoreV2,
12026
+ serializeValue,
11515
12027
  sessions,
11516
12028
  trace,
11517
12029
  utils