@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.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.
|
|
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
|