@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.mjs CHANGED
@@ -59,6 +59,24 @@ function base64Decode(input) {
59
59
  const bytes = base64ToBytes(input);
60
60
  return new TextDecoder().decode(bytes);
61
61
  }
62
+ async function createExperimentId() {
63
+ const randomBytes = new Uint8Array(8);
64
+ crypto.getRandomValues(randomBytes);
65
+ return Array.from(randomBytes).map((b) => b.toString(16).padStart(2, "0")).join("");
66
+ }
67
+ async function createExperimentItemId(input) {
68
+ const serialized = serializeValue(input);
69
+ const data = new TextEncoder().encode(serialized);
70
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
71
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
72
+ const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
73
+ return hashHex.slice(0, 16);
74
+ }
75
+ function serializeValue(value) {
76
+ if (value === void 0 || value === null) return void 0;
77
+ if (typeof value === "string") return value;
78
+ return JSON.stringify(value);
79
+ }
62
80
 
63
81
  // src/logger/index.ts
64
82
  var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
@@ -235,7 +253,7 @@ var resetGlobalLogger = () => {
235
253
  // package.json
236
254
  var package_default = {
237
255
  name: "@langfuse/core",
238
- version: "4.3.0",
256
+ version: "4.4.1",
239
257
  description: "Core functions and utilities for Langfuse packages",
240
258
  type: "module",
241
259
  sideEffects: false,
@@ -262,6 +280,9 @@ var package_default = {
262
280
  files: [
263
281
  "dist"
264
282
  ],
283
+ peerDependencies: {
284
+ "@opentelemetry/api": "^1.9.0"
285
+ },
265
286
  devDependencies: {
266
287
  "@types/node": "^24.1.0"
267
288
  }
@@ -271,6 +292,7 @@ var package_default = {
271
292
  var LANGFUSE_TRACER_NAME = "langfuse-sdk";
272
293
  var LANGFUSE_SDK_VERSION = package_default.version;
273
294
  var LANGFUSE_SDK_NAME = "javascript";
295
+ var LANGFUSE_SDK_EXPERIMENT_ENVIRONMENT = "sdk-experiment";
274
296
  var LangfuseOtelSpanAttributes = /* @__PURE__ */ ((LangfuseOtelSpanAttributes2) => {
275
297
  LangfuseOtelSpanAttributes2["TRACE_NAME"] = "langfuse.trace.name";
276
298
  LangfuseOtelSpanAttributes2["TRACE_USER_ID"] = "user.id";
@@ -297,6 +319,15 @@ var LangfuseOtelSpanAttributes = /* @__PURE__ */ ((LangfuseOtelSpanAttributes2)
297
319
  LangfuseOtelSpanAttributes2["RELEASE"] = "langfuse.release";
298
320
  LangfuseOtelSpanAttributes2["VERSION"] = "langfuse.version";
299
321
  LangfuseOtelSpanAttributes2["AS_ROOT"] = "langfuse.internal.as_root";
322
+ LangfuseOtelSpanAttributes2["EXPERIMENT_ID"] = "langfuse.experiment.id";
323
+ LangfuseOtelSpanAttributes2["EXPERIMENT_NAME"] = "langfuse.experiment.name";
324
+ LangfuseOtelSpanAttributes2["EXPERIMENT_DESCRIPTION"] = "langfuse.experiment.description";
325
+ LangfuseOtelSpanAttributes2["EXPERIMENT_METADATA"] = "langfuse.experiment.metadata";
326
+ LangfuseOtelSpanAttributes2["EXPERIMENT_DATASET_ID"] = "langfuse.experiment.dataset.id";
327
+ LangfuseOtelSpanAttributes2["EXPERIMENT_ITEM_ID"] = "langfuse.experiment.item.id";
328
+ LangfuseOtelSpanAttributes2["EXPERIMENT_ITEM_EXPECTED_OUTPUT"] = "langfuse.experiment.item.expected_output";
329
+ LangfuseOtelSpanAttributes2["EXPERIMENT_ITEM_METADATA"] = "langfuse.experiment.item.metadata";
330
+ LangfuseOtelSpanAttributes2["EXPERIMENT_ITEM_ROOT_OBSERVATION_ID"] = "langfuse.experiment.item.root_observation_id";
300
331
  LangfuseOtelSpanAttributes2["TRACE_COMPAT_USER_ID"] = "langfuse.user.id";
301
332
  LangfuseOtelSpanAttributes2["TRACE_COMPAT_SESSION_ID"] = "langfuse.session.id";
302
333
  return LangfuseOtelSpanAttributes2;
@@ -4191,7 +4222,9 @@ var Datasets = class {
4191
4222
  * await client.datasets.create({
4192
4223
  * name: "name",
4193
4224
  * description: undefined,
4194
- * metadata: undefined
4225
+ * metadata: undefined,
4226
+ * inputSchema: undefined,
4227
+ * expectedOutputSchema: undefined
4195
4228
  * })
4196
4229
  */
4197
4230
  create(request, requestOptions) {
@@ -7296,6 +7329,108 @@ var Organizations = class {
7296
7329
  });
7297
7330
  }
7298
7331
  }
7332
+ /**
7333
+ * Get all API keys for the organization associated with the API key (requires organization-scoped API key)
7334
+ *
7335
+ * @param {Organizations.RequestOptions} requestOptions - Request-specific configuration.
7336
+ *
7337
+ * @throws {@link LangfuseAPI.Error}
7338
+ * @throws {@link LangfuseAPI.UnauthorizedError}
7339
+ * @throws {@link LangfuseAPI.AccessDeniedError}
7340
+ * @throws {@link LangfuseAPI.MethodNotAllowedError}
7341
+ * @throws {@link LangfuseAPI.NotFoundError}
7342
+ *
7343
+ * @example
7344
+ * await client.organizations.getOrganizationApiKeys()
7345
+ */
7346
+ getOrganizationApiKeys(requestOptions) {
7347
+ return HttpResponsePromise.fromPromise(
7348
+ this.__getOrganizationApiKeys(requestOptions)
7349
+ );
7350
+ }
7351
+ async __getOrganizationApiKeys(requestOptions) {
7352
+ var _a2, _b, _c, _d, _e, _f, _g, _h;
7353
+ let _headers = mergeHeaders(
7354
+ (_a2 = this._options) == null ? void 0 : _a2.headers,
7355
+ mergeOnlyDefinedHeaders({
7356
+ Authorization: await this._getAuthorizationHeader(),
7357
+ "X-Langfuse-Sdk-Name": (_c = requestOptions == null ? void 0 : requestOptions.xLangfuseSdkName) != null ? _c : (_b = this._options) == null ? void 0 : _b.xLangfuseSdkName,
7358
+ "X-Langfuse-Sdk-Version": (_e = requestOptions == null ? void 0 : requestOptions.xLangfuseSdkVersion) != null ? _e : (_d = this._options) == null ? void 0 : _d.xLangfuseSdkVersion,
7359
+ "X-Langfuse-Public-Key": (_g = requestOptions == null ? void 0 : requestOptions.xLangfusePublicKey) != null ? _g : (_f = this._options) == null ? void 0 : _f.xLangfusePublicKey
7360
+ }),
7361
+ requestOptions == null ? void 0 : requestOptions.headers
7362
+ );
7363
+ const _response = await fetcher({
7364
+ url: url_exports.join(
7365
+ (_h = await Supplier.get(this._options.baseUrl)) != null ? _h : await Supplier.get(this._options.environment),
7366
+ "/api/public/organizations/apiKeys"
7367
+ ),
7368
+ method: "GET",
7369
+ headers: _headers,
7370
+ queryParameters: requestOptions == null ? void 0 : requestOptions.queryParams,
7371
+ timeoutMs: (requestOptions == null ? void 0 : requestOptions.timeoutInSeconds) != null ? requestOptions.timeoutInSeconds * 1e3 : 6e4,
7372
+ maxRetries: requestOptions == null ? void 0 : requestOptions.maxRetries,
7373
+ abortSignal: requestOptions == null ? void 0 : requestOptions.abortSignal
7374
+ });
7375
+ if (_response.ok) {
7376
+ return {
7377
+ data: _response.body,
7378
+ rawResponse: _response.rawResponse
7379
+ };
7380
+ }
7381
+ if (_response.error.reason === "status-code") {
7382
+ switch (_response.error.statusCode) {
7383
+ case 400:
7384
+ throw new Error2(
7385
+ _response.error.body,
7386
+ _response.rawResponse
7387
+ );
7388
+ case 401:
7389
+ throw new UnauthorizedError(
7390
+ _response.error.body,
7391
+ _response.rawResponse
7392
+ );
7393
+ case 403:
7394
+ throw new AccessDeniedError(
7395
+ _response.error.body,
7396
+ _response.rawResponse
7397
+ );
7398
+ case 405:
7399
+ throw new MethodNotAllowedError(
7400
+ _response.error.body,
7401
+ _response.rawResponse
7402
+ );
7403
+ case 404:
7404
+ throw new NotFoundError(
7405
+ _response.error.body,
7406
+ _response.rawResponse
7407
+ );
7408
+ default:
7409
+ throw new LangfuseAPIError({
7410
+ statusCode: _response.error.statusCode,
7411
+ body: _response.error.body,
7412
+ rawResponse: _response.rawResponse
7413
+ });
7414
+ }
7415
+ }
7416
+ switch (_response.error.reason) {
7417
+ case "non-json":
7418
+ throw new LangfuseAPIError({
7419
+ statusCode: _response.error.statusCode,
7420
+ body: _response.error.rawBody,
7421
+ rawResponse: _response.rawResponse
7422
+ });
7423
+ case "timeout":
7424
+ throw new LangfuseAPITimeoutError(
7425
+ "Timeout exceeded when calling GET /api/public/organizations/apiKeys."
7426
+ );
7427
+ case "unknown":
7428
+ throw new LangfuseAPIError({
7429
+ message: _response.error.errorMessage,
7430
+ rawResponse: _response.rawResponse
7431
+ });
7432
+ }
7433
+ }
7299
7434
  async _getAuthorizationHeader() {
7300
7435
  const username = await Supplier.get(this._options.username);
7301
7436
  const password = await Supplier.get(this._options.password);
@@ -11352,6 +11487,374 @@ var LangfuseMedia = class {
11352
11487
  return this.base64DataUri;
11353
11488
  }
11354
11489
  };
11490
+
11491
+ // src/propagation.ts
11492
+ import {
11493
+ context as otelContextApi,
11494
+ trace as otelTraceApi,
11495
+ propagation,
11496
+ createContextKey
11497
+ } from "@opentelemetry/api";
11498
+ var experimentKeys = [
11499
+ "experimentId",
11500
+ "experimentName",
11501
+ "experimentMetadata",
11502
+ "experimentDatasetId",
11503
+ "experimentItemId",
11504
+ "experimentItemMetadata",
11505
+ "experimentItemRootObservationId"
11506
+ ];
11507
+ var LangfuseOtelContextKeys = {
11508
+ userId: createContextKey("langfuse_user_id"),
11509
+ sessionId: createContextKey("langfuse_session_id"),
11510
+ metadata: createContextKey("langfuse_metadata"),
11511
+ version: createContextKey("langfuse_version"),
11512
+ tags: createContextKey("langfuse_tags"),
11513
+ // Experiments
11514
+ experimentId: createContextKey("langfuse_experiment_id"),
11515
+ experimentName: createContextKey("langfuse_experiment_name"),
11516
+ experimentMetadata: createContextKey("langfuse_experiment_metadata"),
11517
+ experimentDatasetId: createContextKey("langfuse_experiment_dataset_id"),
11518
+ experimentItemId: createContextKey("langfuse_experiment_item_id"),
11519
+ experimentItemMetadata: createContextKey("langfuse_experiment_item_metadata"),
11520
+ experimentItemRootObservationId: createContextKey(
11521
+ "langfuse_experiment_item_root_observation_id"
11522
+ )
11523
+ };
11524
+ var LANGFUSE_BAGGAGE_PREFIX = "langfuse_";
11525
+ var LANGFUSE_BAGGAGE_TAGS_SEPARATOR = ",";
11526
+ function propagateAttributes(params, fn) {
11527
+ var _a2;
11528
+ let context = otelContextApi.active();
11529
+ const span = otelTraceApi.getActiveSpan();
11530
+ const asBaggage = (_a2 = params.asBaggage) != null ? _a2 : false;
11531
+ const { userId, sessionId, metadata, version, tags, _internalExperiment } = params;
11532
+ if (userId) {
11533
+ if (isValidPropagatedString({ value: userId, attributeName: "userId" })) {
11534
+ context = setPropagatedAttribute({
11535
+ key: "userId",
11536
+ value: userId,
11537
+ context,
11538
+ span,
11539
+ asBaggage
11540
+ });
11541
+ }
11542
+ }
11543
+ if (sessionId) {
11544
+ if (isValidPropagatedString({
11545
+ value: sessionId,
11546
+ attributeName: "sessionId"
11547
+ })) {
11548
+ context = setPropagatedAttribute({
11549
+ key: "sessionId",
11550
+ value: sessionId,
11551
+ context,
11552
+ span,
11553
+ asBaggage
11554
+ });
11555
+ }
11556
+ }
11557
+ if (version) {
11558
+ if (isValidPropagatedString({
11559
+ value: version,
11560
+ attributeName: "version"
11561
+ })) {
11562
+ context = setPropagatedAttribute({
11563
+ key: "version",
11564
+ value: version,
11565
+ context,
11566
+ span,
11567
+ asBaggage
11568
+ });
11569
+ }
11570
+ }
11571
+ if (tags && tags.length > 0) {
11572
+ const validTags = tags.filter(
11573
+ (tag) => isValidPropagatedString({
11574
+ value: tag,
11575
+ attributeName: "tag"
11576
+ })
11577
+ );
11578
+ if (validTags.length > 0) {
11579
+ context = setPropagatedAttribute({
11580
+ key: "tags",
11581
+ value: validTags,
11582
+ context,
11583
+ span,
11584
+ asBaggage
11585
+ });
11586
+ }
11587
+ }
11588
+ if (metadata) {
11589
+ const validatedMetadata = {};
11590
+ for (const [key, value] of Object.entries(metadata)) {
11591
+ if (isValidPropagatedString({
11592
+ value,
11593
+ attributeName: `metadata.${key}`
11594
+ })) {
11595
+ validatedMetadata[key] = value;
11596
+ }
11597
+ }
11598
+ if (Object.keys(validatedMetadata).length > 0) {
11599
+ context = setPropagatedAttribute({
11600
+ key: "metadata",
11601
+ value: validatedMetadata,
11602
+ context,
11603
+ span,
11604
+ asBaggage
11605
+ });
11606
+ }
11607
+ }
11608
+ if (_internalExperiment) {
11609
+ for (const [key, value] of Object.entries(_internalExperiment)) {
11610
+ if (value !== void 0) {
11611
+ context = setPropagatedAttribute({
11612
+ key,
11613
+ value,
11614
+ context,
11615
+ span,
11616
+ asBaggage
11617
+ });
11618
+ }
11619
+ }
11620
+ }
11621
+ return otelContextApi.with(context, fn);
11622
+ }
11623
+ function getPropagatedAttributesFromContext(context) {
11624
+ const propagatedAttributes = {};
11625
+ const baggage = propagation.getBaggage(context);
11626
+ if (baggage) {
11627
+ baggage.getAllEntries().forEach(([baggageKey, baggageEntry]) => {
11628
+ if (baggageKey.startsWith(LANGFUSE_BAGGAGE_PREFIX)) {
11629
+ const spanKey = getSpanKeyFromBaggageKey(baggageKey);
11630
+ if (spanKey) {
11631
+ const isMergedTags = baggageKey == getBaggageKeyForPropagatedKey("tags");
11632
+ propagatedAttributes[spanKey] = isMergedTags ? baggageEntry.value.split(LANGFUSE_BAGGAGE_TAGS_SEPARATOR) : baggageEntry.value;
11633
+ }
11634
+ }
11635
+ });
11636
+ }
11637
+ const userId = context.getValue(LangfuseOtelContextKeys["userId"]);
11638
+ if (userId && typeof userId === "string") {
11639
+ const spanKey = getSpanKeyForPropagatedKey("userId");
11640
+ propagatedAttributes[spanKey] = userId;
11641
+ }
11642
+ const sessionId = context.getValue(LangfuseOtelContextKeys["sessionId"]);
11643
+ if (sessionId && typeof sessionId === "string") {
11644
+ const spanKey = getSpanKeyForPropagatedKey("sessionId");
11645
+ propagatedAttributes[spanKey] = sessionId;
11646
+ }
11647
+ const version = context.getValue(LangfuseOtelContextKeys["version"]);
11648
+ if (version && typeof version === "string") {
11649
+ const spanKey = getSpanKeyForPropagatedKey("version");
11650
+ propagatedAttributes[spanKey] = version;
11651
+ }
11652
+ const tags = context.getValue(LangfuseOtelContextKeys["tags"]);
11653
+ if (tags && Array.isArray(tags)) {
11654
+ const spanKey = getSpanKeyForPropagatedKey("tags");
11655
+ propagatedAttributes[spanKey] = tags;
11656
+ }
11657
+ const metadata = context.getValue(LangfuseOtelContextKeys["metadata"]);
11658
+ if (metadata && typeof metadata === "object" && metadata !== null) {
11659
+ for (const [k, v] of Object.entries(metadata)) {
11660
+ const spanKey = `${"langfuse.trace.metadata" /* TRACE_METADATA */}.${k}`;
11661
+ propagatedAttributes[spanKey] = String(v);
11662
+ }
11663
+ }
11664
+ for (const key of experimentKeys) {
11665
+ const contextKey = LangfuseOtelContextKeys[key];
11666
+ const value = context.getValue(contextKey);
11667
+ if (value && typeof value === "string") {
11668
+ const spanKey = getSpanKeyForPropagatedKey(key);
11669
+ propagatedAttributes[spanKey] = value;
11670
+ }
11671
+ }
11672
+ if (propagatedAttributes[getSpanKeyForPropagatedKey("experimentItemRootObservationId")]) {
11673
+ propagatedAttributes["langfuse.environment" /* ENVIRONMENT */] = LANGFUSE_SDK_EXPERIMENT_ENVIRONMENT;
11674
+ }
11675
+ return propagatedAttributes;
11676
+ }
11677
+ function setPropagatedAttribute(params) {
11678
+ const { key, value, span, asBaggage } = params;
11679
+ let context = params.context;
11680
+ let mergedMetadata = key === "metadata" ? getContextMergedMetadata(context, value) : {};
11681
+ let mergedTags = key === "tags" ? getContextMergedTags(context, value) : [];
11682
+ const contextKey = getContextKeyForPropagatedKey(key);
11683
+ if (key === "metadata") {
11684
+ context = context.setValue(contextKey, mergedMetadata);
11685
+ } else if (key === "tags") {
11686
+ context = context.setValue(contextKey, mergedTags);
11687
+ } else {
11688
+ context = context.setValue(contextKey, value);
11689
+ }
11690
+ if (span && span.isRecording()) {
11691
+ if (key === "metadata") {
11692
+ for (const [k, v] of Object.entries(mergedMetadata)) {
11693
+ span.setAttribute(
11694
+ `${"langfuse.trace.metadata" /* TRACE_METADATA */}.${k}`,
11695
+ v
11696
+ );
11697
+ }
11698
+ } else if (key === "tags") {
11699
+ const spanKey = getSpanKeyForPropagatedKey(key);
11700
+ span.setAttribute(spanKey, mergedTags);
11701
+ } else {
11702
+ const spanKey = getSpanKeyForPropagatedKey(key);
11703
+ span.setAttribute(spanKey, value);
11704
+ }
11705
+ }
11706
+ if (asBaggage) {
11707
+ const baggageKey = getBaggageKeyForPropagatedKey(key);
11708
+ let baggage = propagation.getBaggage(context) || propagation.createBaggage();
11709
+ if (key === "metadata") {
11710
+ for (const [k, v] of Object.entries(mergedMetadata)) {
11711
+ baggage = baggage.setEntry(`${baggageKey}_${k}`, { value: v });
11712
+ }
11713
+ } else if (key === "tags") {
11714
+ baggage = baggage.setEntry(baggageKey, {
11715
+ value: mergedTags.join(LANGFUSE_BAGGAGE_TAGS_SEPARATOR)
11716
+ });
11717
+ } else {
11718
+ baggage = baggage.setEntry(baggageKey, { value });
11719
+ }
11720
+ context = propagation.setBaggage(context, baggage);
11721
+ }
11722
+ return context;
11723
+ }
11724
+ function getContextMergedTags(context, newTags) {
11725
+ const existingTags = context.getValue(LangfuseOtelContextKeys["tags"]);
11726
+ if (existingTags && Array.isArray(existingTags)) {
11727
+ return [.../* @__PURE__ */ new Set([...existingTags, ...newTags])];
11728
+ } else {
11729
+ return newTags;
11730
+ }
11731
+ }
11732
+ function getContextMergedMetadata(context, newMetadata) {
11733
+ const existingMetadata = context.getValue(
11734
+ LangfuseOtelContextKeys["metadata"]
11735
+ );
11736
+ if (existingMetadata && typeof existingMetadata === "object" && existingMetadata !== null && !Array.isArray(existingMetadata)) {
11737
+ return { ...existingMetadata, ...newMetadata };
11738
+ } else {
11739
+ return newMetadata;
11740
+ }
11741
+ }
11742
+ function isValidPropagatedString(params) {
11743
+ const logger = getGlobalLogger();
11744
+ const { value, attributeName } = params;
11745
+ if (typeof value !== "string") {
11746
+ logger.warn(
11747
+ `Propagated attribute '${attributeName}' must be a string. Dropping value.`
11748
+ );
11749
+ return false;
11750
+ }
11751
+ if (value.length > 200) {
11752
+ logger.warn(
11753
+ `Propagated attribute '${attributeName}' value is over 200 characters (${value.length} chars). Dropping value.`
11754
+ );
11755
+ return false;
11756
+ }
11757
+ return true;
11758
+ }
11759
+ function getContextKeyForPropagatedKey(key) {
11760
+ return LangfuseOtelContextKeys[key];
11761
+ }
11762
+ function getSpanKeyForPropagatedKey(key) {
11763
+ switch (key) {
11764
+ case "userId":
11765
+ return "user.id" /* TRACE_USER_ID */;
11766
+ case "sessionId":
11767
+ return "session.id" /* TRACE_SESSION_ID */;
11768
+ case "version":
11769
+ return "langfuse.version" /* VERSION */;
11770
+ case "metadata":
11771
+ return "langfuse.trace.metadata" /* TRACE_METADATA */;
11772
+ case "tags":
11773
+ return "langfuse.trace.tags" /* TRACE_TAGS */;
11774
+ case "experimentId":
11775
+ return "langfuse.experiment.id" /* EXPERIMENT_ID */;
11776
+ case "experimentName":
11777
+ return "langfuse.experiment.name" /* EXPERIMENT_NAME */;
11778
+ case "experimentMetadata":
11779
+ return "langfuse.experiment.metadata" /* EXPERIMENT_METADATA */;
11780
+ case "experimentDatasetId":
11781
+ return "langfuse.experiment.dataset.id" /* EXPERIMENT_DATASET_ID */;
11782
+ case "experimentItemId":
11783
+ return "langfuse.experiment.item.id" /* EXPERIMENT_ITEM_ID */;
11784
+ case "experimentItemMetadata":
11785
+ return "langfuse.experiment.item.metadata" /* EXPERIMENT_ITEM_METADATA */;
11786
+ case "experimentItemRootObservationId":
11787
+ return "langfuse.experiment.item.root_observation_id" /* EXPERIMENT_ITEM_ROOT_OBSERVATION_ID */;
11788
+ default: {
11789
+ const fallback = key;
11790
+ throw Error("Unhandled propagated key", fallback);
11791
+ }
11792
+ }
11793
+ }
11794
+ function getBaggageKeyForPropagatedKey(key) {
11795
+ switch (key) {
11796
+ case "userId":
11797
+ return `${LANGFUSE_BAGGAGE_PREFIX}user_id`;
11798
+ case "sessionId":
11799
+ return `${LANGFUSE_BAGGAGE_PREFIX}session_id`;
11800
+ case "version":
11801
+ return `${LANGFUSE_BAGGAGE_PREFIX}version`;
11802
+ case "metadata":
11803
+ return `${LANGFUSE_BAGGAGE_PREFIX}metadata`;
11804
+ case "tags":
11805
+ return `${LANGFUSE_BAGGAGE_PREFIX}tags`;
11806
+ case "experimentId":
11807
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_id`;
11808
+ case "experimentName":
11809
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_name`;
11810
+ case "experimentMetadata":
11811
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_metadata`;
11812
+ case "experimentDatasetId":
11813
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_dataset_id`;
11814
+ case "experimentItemId":
11815
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_item_id`;
11816
+ case "experimentItemMetadata":
11817
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_item_metadata`;
11818
+ case "experimentItemRootObservationId":
11819
+ return `${LANGFUSE_BAGGAGE_PREFIX}experiment_item_root_observation_id`;
11820
+ default: {
11821
+ const fallback = key;
11822
+ throw Error("Unhandled propagated key", fallback);
11823
+ }
11824
+ }
11825
+ }
11826
+ function getSpanKeyFromBaggageKey(baggageKey) {
11827
+ if (!baggageKey.startsWith(LANGFUSE_BAGGAGE_PREFIX)) return;
11828
+ const suffix = baggageKey.slice(LANGFUSE_BAGGAGE_PREFIX.length);
11829
+ if (suffix.startsWith("metadata_")) {
11830
+ const metadataKey = suffix.slice("metadata_".length);
11831
+ return `${"langfuse.trace.metadata" /* TRACE_METADATA */}.${metadataKey}`;
11832
+ }
11833
+ switch (suffix) {
11834
+ case "user_id":
11835
+ return getSpanKeyForPropagatedKey("userId");
11836
+ case "session_id":
11837
+ return getSpanKeyForPropagatedKey("sessionId");
11838
+ case "version":
11839
+ return getSpanKeyForPropagatedKey("version");
11840
+ case "tags":
11841
+ return getSpanKeyForPropagatedKey("tags");
11842
+ case "experiment_id":
11843
+ return getSpanKeyForPropagatedKey("experimentId");
11844
+ case "experiment_name":
11845
+ return getSpanKeyForPropagatedKey("experimentName");
11846
+ case "experiment_metadata":
11847
+ return getSpanKeyForPropagatedKey("experimentMetadata");
11848
+ case "experiment_dataset_id":
11849
+ return getSpanKeyForPropagatedKey("experimentDatasetId");
11850
+ case "experiment_item_id":
11851
+ return getSpanKeyForPropagatedKey("experimentItemId");
11852
+ case "experiment_item_metadata":
11853
+ return getSpanKeyForPropagatedKey("experimentItemMetadata");
11854
+ case "experiment_item_root_observation_id":
11855
+ return getSpanKeyForPropagatedKey("experimentItemRootObservationId");
11856
+ }
11857
+ }
11355
11858
  export {
11356
11859
  AccessDeniedError,
11357
11860
  AnnotationQueueObjectType,
@@ -11363,6 +11866,7 @@ export {
11363
11866
  CommentObjectType,
11364
11867
  DatasetStatus,
11365
11868
  Error2 as Error,
11869
+ LANGFUSE_SDK_EXPERIMENT_ENVIRONMENT,
11366
11870
  LANGFUSE_SDK_NAME,
11367
11871
  LANGFUSE_SDK_VERSION,
11368
11872
  LANGFUSE_TRACER_NAME,
@@ -11370,6 +11874,7 @@ export {
11370
11874
  LangfuseAPIError,
11371
11875
  LangfuseAPITimeoutError,
11372
11876
  LangfuseMedia,
11877
+ LangfuseOtelContextKeys,
11373
11878
  LangfuseOtelSpanAttributes,
11374
11879
  LlmAdapter,
11375
11880
  LogLevel,
@@ -11395,6 +11900,8 @@ export {
11395
11900
  comments_exports as comments,
11396
11901
  commons_exports as commons,
11397
11902
  configureGlobalLogger,
11903
+ createExperimentId,
11904
+ createExperimentItemId,
11398
11905
  createLogger,
11399
11906
  datasetItems_exports as datasetItems,
11400
11907
  datasetRunItems_exports as datasetRunItems,
@@ -11402,6 +11909,7 @@ export {
11402
11909
  generateUUID,
11403
11910
  getEnv,
11404
11911
  getGlobalLogger,
11912
+ getPropagatedAttributesFromContext,
11405
11913
  health_exports as health,
11406
11914
  ingestion_exports as ingestion,
11407
11915
  llmConnections_exports as llmConnections,
@@ -11415,12 +11923,14 @@ export {
11415
11923
  projects_exports as projects,
11416
11924
  promptVersion_exports as promptVersion,
11417
11925
  prompts_exports as prompts,
11926
+ propagateAttributes,
11418
11927
  resetGlobalLogger,
11419
11928
  safeSetTimeout,
11420
11929
  scim_exports as scim,
11421
11930
  score_exports as score,
11422
11931
  scoreConfigs_exports as scoreConfigs,
11423
11932
  scoreV2_exports as scoreV2,
11933
+ serializeValue,
11424
11934
  sessions_exports as sessions,
11425
11935
  trace_exports as trace,
11426
11936
  utils_exports as utils