@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 +514 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +424 -8
- package/dist/index.d.ts +424 -8
- package/dist/index.mjs +512 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -1
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.
|
|
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
|