@anvia/langfuse 0.3.6 → 0.3.8
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.js +126 -99
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -281,16 +281,20 @@ function createLangfuseDatasetClient(tracing, options = {}) {
|
|
|
281
281
|
const secretKey = resolvedConfig.secretKey;
|
|
282
282
|
const pageSize = options.pageSize ?? DEFAULT_PAGE_SIZE;
|
|
283
283
|
const timeoutMs = resolvedConfig.timeoutMs;
|
|
284
|
-
const fetchImpl = (...args) =>
|
|
284
|
+
const fetchImpl = (...args) => {
|
|
285
|
+
const init = {};
|
|
286
|
+
Object.assign(init, args[1]);
|
|
287
|
+
init.signal = AbortSignal.timeout(timeoutMs);
|
|
288
|
+
return fetch(args[0], init);
|
|
289
|
+
};
|
|
285
290
|
const authHeader = buildAuthHeader(publicKey, secretKey);
|
|
286
291
|
async function request(input, init) {
|
|
292
|
+
const headers = {};
|
|
293
|
+
Object.assign(headers, init.headers, authHeader);
|
|
294
|
+
headers["Content-Type"] = "application/json";
|
|
287
295
|
const response = await fetchImpl(input, {
|
|
288
296
|
...init,
|
|
289
|
-
headers
|
|
290
|
-
...init.headers ?? {},
|
|
291
|
-
...authHeader,
|
|
292
|
-
"Content-Type": "application/json"
|
|
293
|
-
}
|
|
297
|
+
headers
|
|
294
298
|
});
|
|
295
299
|
if (!response.ok) {
|
|
296
300
|
const body = await readErrorBody(response);
|
|
@@ -315,12 +319,13 @@ function createLangfuseDatasetClient(tracing, options = {}) {
|
|
|
315
319
|
metadata: dataset.metadata
|
|
316
320
|
})
|
|
317
321
|
});
|
|
318
|
-
|
|
322
|
+
const result = {
|
|
319
323
|
name: dataset.name,
|
|
320
|
-
...dataset.description === void 0 ? {} : { description: dataset.description },
|
|
321
|
-
...dataset.metadata === void 0 ? {} : { metadata: dataset.metadata },
|
|
322
324
|
items: []
|
|
323
325
|
};
|
|
326
|
+
if (dataset.description !== void 0) result.description = dataset.description;
|
|
327
|
+
if (dataset.metadata !== void 0) result.metadata = dataset.metadata;
|
|
328
|
+
return result;
|
|
324
329
|
},
|
|
325
330
|
async getDataset(name) {
|
|
326
331
|
const items = [];
|
|
@@ -338,12 +343,13 @@ function createLangfuseDatasetClient(tracing, options = {}) {
|
|
|
338
343
|
metadata = response.metadata;
|
|
339
344
|
}
|
|
340
345
|
for (const item of response.items) {
|
|
341
|
-
|
|
346
|
+
const normalized = {
|
|
342
347
|
id: item.id,
|
|
343
|
-
input: item.input
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
348
|
+
input: item.input
|
|
349
|
+
};
|
|
350
|
+
if (item.expected !== void 0) normalized.expected = item.expected;
|
|
351
|
+
if (item.metadata !== void 0) normalized.metadata = item.metadata;
|
|
352
|
+
items.push(normalized);
|
|
347
353
|
}
|
|
348
354
|
const totalPages = response.meta?.totalPages;
|
|
349
355
|
if (totalPages !== void 0 && page >= totalPages) {
|
|
@@ -387,12 +393,15 @@ function createLangfuseDatasetClient(tracing, options = {}) {
|
|
|
387
393
|
for (const item of items) {
|
|
388
394
|
try {
|
|
389
395
|
const result = await opts.run(item);
|
|
390
|
-
|
|
396
|
+
const datasetItemRun = {
|
|
391
397
|
datasetItemId: item.id,
|
|
392
|
-
...result.trace?.traceId === void 0 ? {} : { traceId: result.trace.traceId },
|
|
393
|
-
...result.trace?.observationId === void 0 ? {} : { observationId: result.trace.observationId },
|
|
394
398
|
output: toJsonValue(result.output)
|
|
395
|
-
}
|
|
399
|
+
};
|
|
400
|
+
if (result.trace?.traceId !== void 0) datasetItemRun.traceId = result.trace.traceId;
|
|
401
|
+
if (result.trace?.observationId !== void 0) {
|
|
402
|
+
datasetItemRun.observationId = result.trace.observationId;
|
|
403
|
+
}
|
|
404
|
+
datasetItemRuns.push(datasetItemRun);
|
|
396
405
|
} catch (error) {
|
|
397
406
|
errors.push({ itemId: item.id, error });
|
|
398
407
|
}
|
|
@@ -473,16 +482,18 @@ function createLangfuseEvalReporter(tracing, options = {}) {
|
|
|
473
482
|
includeMessages
|
|
474
483
|
});
|
|
475
484
|
const comment = scoreComment(args.outcome);
|
|
476
|
-
|
|
485
|
+
const configId = resolveConfigId(args.metric);
|
|
486
|
+
const score = {
|
|
477
487
|
traceId: trace.traceId,
|
|
478
|
-
...trace.observationId === void 0 ? {} : { observationId: trace.observationId },
|
|
479
488
|
name: args.metric.name,
|
|
480
|
-
value: scoreValue
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
489
|
+
value: scoreValue
|
|
490
|
+
};
|
|
491
|
+
if (trace.observationId !== void 0) score.observationId = trace.observationId;
|
|
492
|
+
if (args.metric.dataType !== void 0) score.dataType = args.metric.dataType;
|
|
493
|
+
if (configId !== void 0) score.configId = configId;
|
|
494
|
+
if (comment !== void 0) score.comment = comment;
|
|
495
|
+
if (metadata !== void 0) score.metadata = metadata;
|
|
496
|
+
await tracing.score(score);
|
|
486
497
|
}
|
|
487
498
|
};
|
|
488
499
|
}
|
|
@@ -607,10 +618,9 @@ function traceFromEvalReport(args) {
|
|
|
607
618
|
if (typeof traceId !== "string") {
|
|
608
619
|
return void 0;
|
|
609
620
|
}
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
};
|
|
621
|
+
const trace = { traceId };
|
|
622
|
+
if (typeof observationId === "string") trace.observationId = observationId;
|
|
623
|
+
return trace;
|
|
614
624
|
}
|
|
615
625
|
function traceFromOutput(output) {
|
|
616
626
|
if (typeof output !== "object" || output === null || !("trace" in output)) {
|
|
@@ -633,19 +643,19 @@ function readTrace(trace) {
|
|
|
633
643
|
if (typeof traceId !== "string") {
|
|
634
644
|
return void 0;
|
|
635
645
|
}
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
};
|
|
646
|
+
const result = { traceId };
|
|
647
|
+
if (typeof observationId === "string") result.observationId = observationId;
|
|
648
|
+
return result;
|
|
640
649
|
}
|
|
641
650
|
|
|
642
651
|
// src/experiment-runner.ts
|
|
643
652
|
import { runEvalSuite } from "@anvia/core/evals";
|
|
644
653
|
async function runEvalAsExperiment(evalOptions, experimentOptions) {
|
|
645
|
-
const
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
654
|
+
const clientOptions = {};
|
|
655
|
+
if (experimentOptions.pageSize !== void 0) clientOptions.pageSize = experimentOptions.pageSize;
|
|
656
|
+
if (experimentOptions.timeoutMs !== void 0)
|
|
657
|
+
clientOptions.timeoutMs = experimentOptions.timeoutMs;
|
|
658
|
+
const client = experimentOptions.client ?? createLangfuseDatasetClient(experimentOptions.tracing, clientOptions);
|
|
649
659
|
const suite = await runEvalSuite(evalOptions);
|
|
650
660
|
const items = evalOptions.cases.map((testCase) => {
|
|
651
661
|
const item = {
|
|
@@ -664,11 +674,9 @@ async function runEvalAsExperiment(evalOptions, experimentOptions) {
|
|
|
664
674
|
for (const result of suite.results) {
|
|
665
675
|
datasetItemMap.set(result.case.id, result);
|
|
666
676
|
}
|
|
667
|
-
const
|
|
677
|
+
const runOptions = {
|
|
668
678
|
datasetName: experimentOptions.datasetName,
|
|
669
679
|
runName: experimentOptions.runName,
|
|
670
|
-
...experimentOptions.description === void 0 ? {} : { description: experimentOptions.description },
|
|
671
|
-
...experimentOptions.metadata === void 0 ? {} : { metadata: experimentOptions.metadata },
|
|
672
680
|
items,
|
|
673
681
|
run: (item) => {
|
|
674
682
|
const result = datasetItemMap.get(item.id);
|
|
@@ -682,7 +690,12 @@ async function runEvalAsExperiment(evalOptions, experimentOptions) {
|
|
|
682
690
|
const trace = readTraceFromOutput(result.output);
|
|
683
691
|
return { output, trace };
|
|
684
692
|
}
|
|
685
|
-
}
|
|
693
|
+
};
|
|
694
|
+
if (experimentOptions.description !== void 0) {
|
|
695
|
+
runOptions.description = experimentOptions.description;
|
|
696
|
+
}
|
|
697
|
+
if (experimentOptions.metadata !== void 0) runOptions.metadata = experimentOptions.metadata;
|
|
698
|
+
const datasetRun = await client.runExperiment(runOptions);
|
|
686
699
|
return { suite, datasetRun };
|
|
687
700
|
}
|
|
688
701
|
function readTraceFromOutput(output) {
|
|
@@ -753,9 +766,9 @@ function createLangfusePromptClient(tracing, options = {}) {
|
|
|
753
766
|
labels: raw.labels ?? [],
|
|
754
767
|
prompt: normalizePrompt(raw.prompt, raw.type),
|
|
755
768
|
type: raw.type,
|
|
756
|
-
...raw.tags === void 0 ? {} : { tags: raw.tags },
|
|
757
769
|
resolvedAt: /* @__PURE__ */ new Date()
|
|
758
770
|
};
|
|
771
|
+
if (raw.tags !== void 0) prompt.tags = raw.tags;
|
|
759
772
|
cache.set(key, { prompt, expiresAt: Date.now() + ttl });
|
|
760
773
|
return prompt;
|
|
761
774
|
}
|
|
@@ -1036,15 +1049,16 @@ var LangfuseAgentObserver = class {
|
|
|
1036
1049
|
prompt: args.prompt,
|
|
1037
1050
|
history: args.history
|
|
1038
1051
|
});
|
|
1052
|
+
const metadata = {
|
|
1053
|
+
agentName: args.agentName,
|
|
1054
|
+
agentDescription: args.agentDescription,
|
|
1055
|
+
maxTurns: args.maxTurns
|
|
1056
|
+
};
|
|
1057
|
+
if (this.serviceName !== void 0) metadata.serviceName = this.serviceName;
|
|
1058
|
+
Object.assign(metadata, args.trace?.metadata);
|
|
1039
1059
|
const rootAttributes = {
|
|
1040
1060
|
input: redactedInput,
|
|
1041
|
-
metadata
|
|
1042
|
-
...this.serviceName !== void 0 ? { serviceName: this.serviceName } : {},
|
|
1043
|
-
agentName: args.agentName,
|
|
1044
|
-
agentDescription: args.agentDescription,
|
|
1045
|
-
maxTurns: args.maxTurns,
|
|
1046
|
-
...args.trace?.metadata ?? {}
|
|
1047
|
-
}
|
|
1061
|
+
metadata
|
|
1048
1062
|
};
|
|
1049
1063
|
if (args.trace?.version !== void 0) {
|
|
1050
1064
|
rootAttributes.version = args.trace.version;
|
|
@@ -1258,10 +1272,11 @@ function promptMetadata(ref) {
|
|
|
1258
1272
|
if (ref === void 0) {
|
|
1259
1273
|
return {};
|
|
1260
1274
|
}
|
|
1261
|
-
|
|
1262
|
-
promptName: ref.name
|
|
1263
|
-
...ref.version === void 0 ? {} : { promptVersion: ref.version }
|
|
1275
|
+
const metadata = {
|
|
1276
|
+
promptName: ref.name
|
|
1264
1277
|
};
|
|
1278
|
+
if (ref.version !== void 0) metadata.promptVersion = ref.version;
|
|
1279
|
+
return metadata;
|
|
1265
1280
|
}
|
|
1266
1281
|
function serializeMetadataValue(value) {
|
|
1267
1282
|
if (value === void 0) {
|
|
@@ -1310,26 +1325,30 @@ var LangfuseRunObserver = class {
|
|
|
1310
1325
|
this.closeEarlierTurns(args.turn);
|
|
1311
1326
|
const turn = this.turnSpan(args.turn);
|
|
1312
1327
|
const redactedChatHistory = this.redactInputValue(modelInputMessages(args.request.chatHistory));
|
|
1328
|
+
const metadata = {
|
|
1329
|
+
turn: args.turn,
|
|
1330
|
+
toolCount: args.request.tools.length,
|
|
1331
|
+
hasOutputSchema: args.request.outputSchema !== void 0
|
|
1332
|
+
};
|
|
1333
|
+
if (args.providerRequest !== void 0) metadata.providerRequest = args.providerRequest;
|
|
1334
|
+
if (args.modelInfo !== void 0) {
|
|
1335
|
+
const modelInfo = {
|
|
1336
|
+
provider: args.modelInfo.provider,
|
|
1337
|
+
defaultModel: args.modelInfo.defaultModel
|
|
1338
|
+
};
|
|
1339
|
+
if (args.modelInfo.capabilities !== void 0) {
|
|
1340
|
+
modelInfo.capabilities = args.modelInfo.capabilities;
|
|
1341
|
+
}
|
|
1342
|
+
metadata.modelInfo = modelInfo;
|
|
1343
|
+
}
|
|
1344
|
+
Object.assign(metadata, promptMetadata(this.promptRef));
|
|
1313
1345
|
const generation = turn.startObservation(
|
|
1314
1346
|
`model.turn.${args.turn}`,
|
|
1315
1347
|
{
|
|
1316
1348
|
input: redactedChatHistory,
|
|
1317
1349
|
model: args.request.model ?? "default",
|
|
1318
1350
|
modelParameters: modelParameters(args.request),
|
|
1319
|
-
metadata
|
|
1320
|
-
turn: args.turn,
|
|
1321
|
-
toolCount: args.request.tools.length,
|
|
1322
|
-
hasOutputSchema: args.request.outputSchema !== void 0,
|
|
1323
|
-
...args.providerRequest !== void 0 ? { providerRequest: args.providerRequest } : {},
|
|
1324
|
-
...args.modelInfo !== void 0 ? {
|
|
1325
|
-
modelInfo: {
|
|
1326
|
-
provider: args.modelInfo.provider,
|
|
1327
|
-
defaultModel: args.modelInfo.defaultModel,
|
|
1328
|
-
...args.modelInfo.capabilities !== void 0 ? { capabilities: args.modelInfo.capabilities } : {}
|
|
1329
|
-
}
|
|
1330
|
-
} : {},
|
|
1331
|
-
...promptMetadata(this.promptRef)
|
|
1332
|
-
}
|
|
1351
|
+
metadata
|
|
1333
1352
|
},
|
|
1334
1353
|
{ asType: "generation" }
|
|
1335
1354
|
);
|
|
@@ -1338,6 +1357,13 @@ var LangfuseRunObserver = class {
|
|
|
1338
1357
|
startTool(args) {
|
|
1339
1358
|
const turn = this.turnSpan(args.turn);
|
|
1340
1359
|
const redactedArgs = this.redactInputValue(args.args);
|
|
1360
|
+
const metadata = {
|
|
1361
|
+
turn: args.turn,
|
|
1362
|
+
internalCallId: args.internalCallId,
|
|
1363
|
+
toolCallId: args.toolCallId
|
|
1364
|
+
};
|
|
1365
|
+
if (args.toolDefinition !== void 0) metadata.toolDefinition = args.toolDefinition;
|
|
1366
|
+
if (args.toolMetadata !== void 0) metadata.toolMetadata = args.toolMetadata;
|
|
1341
1367
|
const tool = turn.startObservation(
|
|
1342
1368
|
`tool.${args.toolName}`,
|
|
1343
1369
|
{
|
|
@@ -1345,13 +1371,7 @@ var LangfuseRunObserver = class {
|
|
|
1345
1371
|
args: redactedArgs,
|
|
1346
1372
|
toolCall: args.toolCall
|
|
1347
1373
|
},
|
|
1348
|
-
metadata
|
|
1349
|
-
turn: args.turn,
|
|
1350
|
-
internalCallId: args.internalCallId,
|
|
1351
|
-
toolCallId: args.toolCallId,
|
|
1352
|
-
...args.toolDefinition !== void 0 ? { toolDefinition: args.toolDefinition } : {},
|
|
1353
|
-
...args.toolMetadata !== void 0 ? { toolMetadata: args.toolMetadata } : {}
|
|
1354
|
-
}
|
|
1374
|
+
metadata
|
|
1355
1375
|
},
|
|
1356
1376
|
{ asType: "tool" }
|
|
1357
1377
|
);
|
|
@@ -1385,7 +1405,8 @@ var LangfuseRunObserver = class {
|
|
|
1385
1405
|
this.clearCurrentHandle?.();
|
|
1386
1406
|
}
|
|
1387
1407
|
event(args) {
|
|
1388
|
-
const metadata = {
|
|
1408
|
+
const metadata = {};
|
|
1409
|
+
Object.assign(metadata, args.attributes);
|
|
1389
1410
|
this.root.startObservation(args.name, { metadata }, { asType: "event" }).end();
|
|
1390
1411
|
}
|
|
1391
1412
|
getHandle() {
|
|
@@ -1400,7 +1421,8 @@ var LangfuseRunObserver = class {
|
|
|
1400
1421
|
this.setCurrentHandle?.(this.handle);
|
|
1401
1422
|
},
|
|
1402
1423
|
addEvent: (name, attributes) => {
|
|
1403
|
-
const metadata = {
|
|
1424
|
+
const metadata = {};
|
|
1425
|
+
Object.assign(metadata, attributes);
|
|
1404
1426
|
this.root.startObservation(name, { metadata }, { asType: "event" }).end();
|
|
1405
1427
|
this.setCurrentHandle?.(this.handle);
|
|
1406
1428
|
}
|
|
@@ -1451,6 +1473,8 @@ var LangfuseGenerationObserver = class {
|
|
|
1451
1473
|
end(args) {
|
|
1452
1474
|
const redactedText = this.run.redactOutputValue(textFromAssistantContent(args.response.choice));
|
|
1453
1475
|
const redactedChoice = this.run.redactOutputValue(args.response.choice);
|
|
1476
|
+
const metadata = { turn: args.turn };
|
|
1477
|
+
if (args.firstDeltaMs !== void 0) metadata.firstDeltaMs = args.firstDeltaMs;
|
|
1454
1478
|
this.generation.update({
|
|
1455
1479
|
output: {
|
|
1456
1480
|
messageId: args.response.messageId,
|
|
@@ -1458,10 +1482,7 @@ var LangfuseGenerationObserver = class {
|
|
|
1458
1482
|
text: redactedText
|
|
1459
1483
|
},
|
|
1460
1484
|
usageDetails: usageDetails(args.response.usage),
|
|
1461
|
-
metadata
|
|
1462
|
-
turn: args.turn,
|
|
1463
|
-
...args.firstDeltaMs !== void 0 ? { firstDeltaMs: args.firstDeltaMs } : {}
|
|
1464
|
-
}
|
|
1485
|
+
metadata
|
|
1465
1486
|
}).end();
|
|
1466
1487
|
}
|
|
1467
1488
|
error(args) {
|
|
@@ -1511,11 +1532,14 @@ var LangfuseToolObserver = class {
|
|
|
1511
1532
|
if (child.type === "turn_end") {
|
|
1512
1533
|
const generation = this.childGenerations.get(generationKey(agentId, childTurn));
|
|
1513
1534
|
if (generation !== void 0) {
|
|
1514
|
-
|
|
1535
|
+
const update = {
|
|
1515
1536
|
output: child.response,
|
|
1516
|
-
...isRecord(child.response) && isRecord(child.response.usage) ? { usageDetails: usageDetailsFromRecord(child.response.usage) } : {},
|
|
1517
1537
|
metadata: childMetadata(args, agentId, agentName, childTurn)
|
|
1518
|
-
}
|
|
1538
|
+
};
|
|
1539
|
+
if (isRecord(child.response) && isRecord(child.response.usage)) {
|
|
1540
|
+
update.usageDetails = usageDetailsFromRecord(child.response.usage);
|
|
1541
|
+
}
|
|
1542
|
+
generation.update(update).end();
|
|
1519
1543
|
this.childGenerations.delete(generationKey(agentId, childTurn));
|
|
1520
1544
|
}
|
|
1521
1545
|
return;
|
|
@@ -1540,13 +1564,14 @@ var LangfuseToolObserver = class {
|
|
|
1540
1564
|
},
|
|
1541
1565
|
{ asType: "tool" }
|
|
1542
1566
|
);
|
|
1543
|
-
|
|
1567
|
+
const childToolRecord = {
|
|
1544
1568
|
agentId,
|
|
1545
1569
|
toolName,
|
|
1546
|
-
...toolCallId === void 0 ? {} : { toolCallId },
|
|
1547
1570
|
tool: childTool,
|
|
1548
1571
|
ended: false
|
|
1549
|
-
}
|
|
1572
|
+
};
|
|
1573
|
+
if (toolCallId !== void 0) childToolRecord.toolCallId = toolCallId;
|
|
1574
|
+
this.childTools.push(childToolRecord);
|
|
1550
1575
|
return;
|
|
1551
1576
|
}
|
|
1552
1577
|
if (child.type === "tool_result") {
|
|
@@ -1569,19 +1594,20 @@ var LangfuseToolObserver = class {
|
|
|
1569
1594
|
return;
|
|
1570
1595
|
}
|
|
1571
1596
|
if (child.type === "final") {
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
}).end();
|
|
1597
|
+
const update = { output: child.output };
|
|
1598
|
+
if (isRecord(child.usage)) update.metadata = { usage: child.usage };
|
|
1599
|
+
agent.update(update).end();
|
|
1576
1600
|
this.childAgents.delete(agentId);
|
|
1577
1601
|
return;
|
|
1578
1602
|
}
|
|
1579
1603
|
if (child.type === "error") {
|
|
1580
|
-
|
|
1604
|
+
const update = {
|
|
1581
1605
|
level: "ERROR",
|
|
1582
1606
|
statusMessage: errorMessage(child.error),
|
|
1583
1607
|
output: { error: errorMessage(child.error) }
|
|
1584
|
-
}
|
|
1608
|
+
};
|
|
1609
|
+
if (isRecord(child.usage)) update.metadata = { usage: child.usage };
|
|
1610
|
+
agent.update(update).end();
|
|
1585
1611
|
this.childAgents.delete(agentId);
|
|
1586
1612
|
}
|
|
1587
1613
|
}
|
|
@@ -1589,15 +1615,16 @@ var LangfuseToolObserver = class {
|
|
|
1589
1615
|
this.endOpenChildren();
|
|
1590
1616
|
const redactedResult = this.run.redactOutputValue(args.result);
|
|
1591
1617
|
const redactedStructured = this.run.redactOutputValue(args.structuredResult);
|
|
1618
|
+
const metadata = {
|
|
1619
|
+
turn: args.turn,
|
|
1620
|
+
internalCallId: args.internalCallId,
|
|
1621
|
+
toolCallId: args.toolCallId,
|
|
1622
|
+
skipped: args.skipped
|
|
1623
|
+
};
|
|
1624
|
+
if (redactedStructured !== void 0) metadata.structuredResult = redactedStructured;
|
|
1592
1625
|
const attributes = {
|
|
1593
1626
|
output: redactedResult,
|
|
1594
|
-
metadata
|
|
1595
|
-
turn: args.turn,
|
|
1596
|
-
internalCallId: args.internalCallId,
|
|
1597
|
-
toolCallId: args.toolCallId,
|
|
1598
|
-
skipped: args.skipped,
|
|
1599
|
-
...redactedStructured !== void 0 ? { structuredResult: redactedStructured } : {}
|
|
1600
|
-
},
|
|
1627
|
+
metadata,
|
|
1601
1628
|
level: args.skipped ? "WARNING" : "DEFAULT"
|
|
1602
1629
|
};
|
|
1603
1630
|
if (args.skipped) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helpers.ts","../src/config.ts","../src/scoring.ts","../src/dataset-client.ts","../src/eval-reporter.ts","../src/experiment-runner.ts","../src/prompt-client.ts","../src/redaction.ts","../src/tracing.ts"],"sourcesContent":["import type { Message } from \"@anvia/core/completion\";\nimport type {\n AgentGenerationEndArgs,\n AgentGenerationStartArgs,\n AgentToolStartArgs,\n} from \"@anvia/core/observability\";\n\nexport function modelInputMessage(message: Message): Message {\n if (message.metadata === undefined) {\n return message;\n }\n const result: Message = { ...message };\n delete result.metadata;\n return result;\n}\n\nexport function modelInputMessages(messages: Message[]): Message[] {\n return messages.map(modelInputMessage);\n}\n\nexport function modelParameters(\n request: AgentGenerationStartArgs[\"request\"],\n): Record<string, string | number> {\n const params: Record<string, string | number> = {};\n if (request.temperature !== undefined) params.temperature = request.temperature;\n if (request.maxTokens !== undefined) params.maxTokens = request.maxTokens;\n if (request.toolChoice !== undefined) {\n params.toolChoice =\n typeof request.toolChoice === \"string\" ? request.toolChoice : request.toolChoice.name;\n }\n return params;\n}\n\nexport function usageDetails(\n usage: AgentGenerationEndArgs[\"response\"][\"usage\"],\n): Record<string, number> {\n return {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n cachedInputTokens: usage.cachedInputTokens,\n cacheCreationInputTokens: usage.cacheCreationInputTokens,\n };\n}\n\nexport function usageDetailsFromRecord(usage: Record<string, unknown>): Record<string, number> {\n return {\n inputTokens: numberValue(usage.inputTokens) ?? 0,\n outputTokens: numberValue(usage.outputTokens) ?? 0,\n totalTokens:\n numberValue(usage.totalTokens) ??\n (numberValue(usage.inputTokens) ?? 0) + (numberValue(usage.outputTokens) ?? 0),\n cachedInputTokens: numberValue(usage.cachedInputTokens) ?? 0,\n cacheCreationInputTokens: numberValue(usage.cacheCreationInputTokens) ?? 0,\n };\n}\n\nexport function childMetadata(\n args: AgentToolStartArgs,\n agentId: string,\n agentName: string | undefined,\n childTurn: number,\n): Record<string, unknown> {\n return {\n source: \"agent_tool_event\",\n childAgentId: agentId,\n childAgentName: agentName,\n childTurn,\n parentToolName: args.toolName,\n parentInternalCallId: args.internalCallId,\n parentToolCallId: args.toolCallId,\n };\n}\n\nexport function generationKey(agentId: string, turn: number): string {\n return `${agentId}:${turn}`;\n}\n\nexport function agentLabel(agentId: string, agentName: string | undefined): string {\n return (agentName ?? agentId).replaceAll(/\\s+/g, \"_\");\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nexport function emptyToUndefined(value: string | undefined): string | undefined {\n return value === undefined || value.length === 0 ? undefined : value;\n}\n\n/**\n * Resolve an option value: prefer the explicit option, fall back to the\n * env var, and treat empty strings as missing. Empty env vars are common\n * when a process inherits a process manager that injects blank values.\n */\nexport function resolveOption(\n option: string | undefined,\n envVar: string | undefined,\n): string | undefined {\n return emptyToUndefined(option) ?? emptyToUndefined(envVar);\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { emptyToUndefined } from \"./helpers.js\";\n\nexport const langfuseResolvedConfigSymbol: unique symbol = Symbol.for(\n \"@anvia/langfuse.resolvedConfig\",\n);\n\nexport type LangfuseResolvedConfig = {\n publicKey?: string | undefined;\n secretKey?: string | undefined;\n baseUrl: string;\n environment?: string | undefined;\n release?: string | undefined;\n serviceName?: string | undefined;\n timeoutMs: number;\n};\n\nexport type LangfuseConfigOptions = {\n publicKey?: string | undefined;\n secretKey?: string | undefined;\n baseUrl?: string | undefined;\n environment?: string | undefined;\n release?: string | undefined;\n serviceName?: string | undefined;\n timeoutMs?: number | undefined;\n};\n\nexport type LangfuseResolvedConfigCarrier = {\n [langfuseResolvedConfigSymbol]?: LangfuseResolvedConfig | undefined;\n};\n\nexport function resolveLangfuseConfig(\n options: LangfuseConfigOptions = {},\n fallback?: Partial<LangfuseResolvedConfig> | undefined,\n): LangfuseResolvedConfig {\n return {\n publicKey: resolveStringOption(\n options.publicKey,\n fallback?.publicKey,\n process.env.LANGFUSE_PUBLIC_KEY,\n ),\n secretKey: resolveStringOption(\n options.secretKey,\n fallback?.secretKey,\n process.env.LANGFUSE_SECRET_KEY,\n ),\n baseUrl:\n resolveStringOption(options.baseUrl, fallback?.baseUrl, process.env.LANGFUSE_BASE_URL) ??\n \"https://cloud.langfuse.com\",\n environment: resolveStringOption(\n options.environment,\n fallback?.environment,\n process.env.LANGFUSE_TRACING_ENVIRONMENT,\n ),\n release: resolveStringOption(options.release, fallback?.release, process.env.LANGFUSE_RELEASE),\n serviceName: resolveStringOption(\n options.serviceName,\n fallback?.serviceName,\n process.env.LANGFUSE_SERVICE_NAME,\n ),\n timeoutMs: options.timeoutMs ?? fallback?.timeoutMs ?? 30_000,\n };\n}\n\nexport function getResolvedLangfuseConfig(value: unknown): LangfuseResolvedConfig | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n return (value as LangfuseResolvedConfigCarrier)[langfuseResolvedConfigSymbol];\n}\n\nfunction resolveStringOption(\n option: string | undefined,\n fallback: string | undefined,\n envVar: string | undefined,\n): string | undefined {\n return emptyToUndefined(option) ?? emptyToUndefined(fallback) ?? emptyToUndefined(envVar);\n}\n","import type { LangfuseScoreArgs } from \"./types.js\";\n\nexport class LangfuseScoreError extends Error {\n readonly scores: LangfuseScoreArgs[];\n override readonly cause?: unknown;\n\n constructor(message: string, scores: LangfuseScoreArgs[], cause?: unknown) {\n super(message);\n this.name = \"LangfuseScoreError\";\n this.scores = scores;\n if (cause !== undefined) {\n this.cause = cause;\n }\n }\n}\n\nexport type ScoreQueueOptions = {\n baseUrl: string;\n publicKey: string;\n secretKey: string;\n timeoutMs: number;\n batchSize: number;\n flushIntervalMs: number;\n maxRetries: number;\n fetchImpl?: typeof fetch;\n sleep?: (ms: number) => Promise<void>;\n setTimer?: (handler: () => void, ms: number) => unknown;\n clearTimer?: (handle: unknown) => void;\n};\n\nconst defaultSleep = (ms: number): Promise<void> =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\nconst defaultSetTimer = (handler: () => void, ms: number): unknown => setTimeout(handler, ms);\nconst defaultClearTimer = (handle: unknown): void => {\n clearTimeout(handle as ReturnType<typeof setTimeout>);\n};\n\nexport function computeBackoff(attempt: number, jitter: number = Math.random()): number {\n const base = 200;\n const exponential = base * 2 ** attempt;\n const capped = Math.min(exponential, 5_000);\n const jitterAmount = capped * 0.25 * (jitter * 2 - 1);\n return Math.max(0, Math.round(capped + jitterAmount));\n}\n\nexport class ScoreQueue {\n private readonly pending: LangfuseScoreArgs[] = [];\n private timer: unknown = null;\n private flushing: Promise<void> | null = null;\n private readonly baseUrl: string;\n private readonly publicKey: string;\n private readonly secretKey: string;\n private readonly timeoutMs: number;\n private readonly batchSize: number;\n private readonly flushIntervalMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: typeof fetch;\n private readonly sleep: (ms: number) => Promise<void>;\n private readonly setTimer: (handler: () => void, ms: number) => unknown;\n private readonly clearTimer: (handle: unknown) => void;\n\n constructor(options: ScoreQueueOptions) {\n this.baseUrl = options.baseUrl;\n this.publicKey = options.publicKey;\n this.secretKey = options.secretKey;\n this.timeoutMs = options.timeoutMs;\n this.batchSize = options.batchSize;\n this.flushIntervalMs = options.flushIntervalMs;\n this.maxRetries = options.maxRetries;\n this.fetchImpl = options.fetchImpl ?? fetch;\n this.sleep = options.sleep ?? defaultSleep;\n this.setTimer = options.setTimer ?? defaultSetTimer;\n this.clearTimer = options.clearTimer ?? defaultClearTimer;\n }\n\n enqueue(score: LangfuseScoreArgs): void {\n this.pending.push(score);\n if (this.pending.length >= this.batchSize) {\n void this.flush();\n return;\n }\n this.scheduleTimer();\n }\n\n depth(): number {\n return this.pending.length;\n }\n\n async flush(): Promise<void> {\n if (this.flushing !== null) {\n await this.flushing;\n return;\n }\n if (this.pending.length === 0) {\n this.clearScheduledTimer();\n return;\n }\n const batch = this.pending.splice(0, this.pending.length);\n this.clearScheduledTimer();\n this.flushing = this.sendBatch(batch).finally(() => {\n this.flushing = null;\n });\n await this.flushing;\n }\n\n async shutdown(): Promise<void> {\n this.clearScheduledTimer();\n await this.flush();\n }\n\n private scheduleTimer(): void {\n if (this.timer !== null) {\n return;\n }\n this.timer = this.setTimer(() => {\n this.timer = null;\n void this.flush();\n }, this.flushIntervalMs);\n }\n\n private clearScheduledTimer(): void {\n if (this.timer !== null) {\n this.clearTimer(this.timer);\n this.timer = null;\n }\n }\n\n private async sendBatch(scores: LangfuseScoreArgs[]): Promise<void> {\n const body = scores.map((score) => buildScoreBody(score));\n let lastError: unknown;\n for (let attempt = 0; attempt < this.maxRetries; attempt += 1) {\n try {\n const response = await this.fetchImpl(`${this.baseUrl}/api/public/scores`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.publicKey}:${this.secretKey}`).toString(\"base64\")}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n if (response.ok) {\n return;\n }\n if (response.status === 429 || response.status >= 500) {\n lastError = new Error(`Langfuse score batch failed with HTTP ${response.status}`);\n } else {\n const text = await response.text();\n throw new LangfuseScoreError(\n `Langfuse score batch failed with HTTP ${response.status}: ${text}`,\n scores,\n );\n }\n } catch (error) {\n if (error instanceof LangfuseScoreError) {\n throw error;\n }\n lastError = error;\n }\n if (attempt < this.maxRetries - 1) {\n await this.sleep(computeBackoff(attempt));\n }\n }\n throw new LangfuseScoreError(\n `Langfuse score batch failed after ${this.maxRetries} attempts`,\n scores,\n lastError,\n );\n }\n}\n\nfunction buildScoreBody(score: LangfuseScoreArgs): Record<string, unknown> {\n const body: Record<string, unknown> = {\n traceId: score.traceId,\n name: score.name,\n value: score.value,\n };\n if (score.observationId !== undefined) body.observationId = score.observationId;\n if (score.dataType !== undefined) body.dataType = score.dataType;\n if (score.comment !== undefined) body.comment = score.comment;\n if (score.metadata !== undefined) body.metadata = score.metadata;\n const configId = score.configId ?? score.scoreConfigId;\n if (configId !== undefined) body.configId = configId;\n if (score.environment !== undefined) body.environment = score.environment;\n if (score.timestamp !== undefined) {\n body.timestamp =\n score.timestamp instanceof Date ? score.timestamp.toISOString() : score.timestamp;\n }\n return body;\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport { getResolvedLangfuseConfig, resolveLangfuseConfig } from \"./config.js\";\nimport { LangfuseScoreError } from \"./scoring.js\";\nimport type {\n LangfuseDataset,\n LangfuseDatasetClient,\n LangfuseDatasetClientOptions,\n LangfuseDatasetItem,\n LangfuseRunExperimentOptions,\n LangfuseRunExperimentResult,\n LangfuseRunItemError,\n LangfuseTracing,\n} from \"./types.js\";\n\nconst DEFAULT_PAGE_SIZE = 50;\nconst MAX_PAGINATION_PAGES = 100;\n\nexport function createLangfuseDatasetClient(\n tracing: Pick<LangfuseTracing, \"score\">,\n options: LangfuseDatasetClientOptions = {},\n): LangfuseDatasetClient {\n const resolvedConfig = resolveLangfuseConfig(options, getResolvedLangfuseConfig(tracing));\n const baseUrl = resolvedConfig.baseUrl;\n const publicKey = resolvedConfig.publicKey;\n const secretKey = resolvedConfig.secretKey;\n const pageSize = options.pageSize ?? DEFAULT_PAGE_SIZE;\n const timeoutMs = resolvedConfig.timeoutMs;\n\n const fetchImpl: typeof fetch = (...args) =>\n fetch(args[0], { ...(args[1] ?? {}), signal: AbortSignal.timeout(timeoutMs) });\n\n const authHeader = buildAuthHeader(publicKey, secretKey);\n\n async function request<T>(input: string, init: RequestInit): Promise<T> {\n const response = await fetchImpl(input, {\n ...init,\n headers: {\n ...(init.headers ?? {}),\n ...authHeader,\n \"Content-Type\": \"application/json\",\n },\n });\n if (!response.ok) {\n const body = await readErrorBody(response);\n throw new LangfuseScoreError(\n `Langfuse request failed: ${response.status} ${response.statusText}: ${body}`,\n [],\n );\n }\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n return {\n async createDataset(dataset) {\n const url = `${baseUrl}/api/public/datasets/${encodeURIComponent(dataset.name)}`;\n await request<unknown>(url, {\n method: \"PUT\",\n body: JSON.stringify({\n name: dataset.name,\n description: dataset.description,\n metadata: dataset.metadata,\n }),\n });\n return {\n name: dataset.name,\n ...(dataset.description === undefined ? {} : { description: dataset.description }),\n ...(dataset.metadata === undefined ? {} : { metadata: dataset.metadata }),\n items: [],\n };\n },\n\n async getDataset<Input, Expected>(name: string): Promise<LangfuseDataset<Input, Expected>> {\n const items: LangfuseDatasetItem<Input, Expected>[] = [];\n let description: string | undefined;\n let metadata: Record<string, JsonValue | undefined> | undefined;\n for (let page = 1; page <= MAX_PAGINATION_PAGES; page += 1) {\n const url = new URL(`${baseUrl}/api/public/datasets/${encodeURIComponent(name)}`);\n url.searchParams.set(\"page\", String(page));\n url.searchParams.set(\"limit\", String(pageSize));\n const response = await request<{\n name: string;\n description?: string | undefined;\n metadata?: Record<string, JsonValue | undefined> | undefined;\n items: Array<{\n id: string;\n input: Input;\n expected?: Expected | undefined;\n metadata?: Record<string, JsonValue | undefined> | undefined;\n }>;\n meta?: { totalPages?: number | undefined };\n }>(url.toString(), { method: \"GET\" });\n if (description === undefined && response.description !== undefined) {\n description = response.description;\n }\n if (metadata === undefined && response.metadata !== undefined) {\n metadata = response.metadata;\n }\n for (const item of response.items) {\n items.push({\n id: item.id,\n input: item.input,\n ...(item.expected === undefined ? {} : { expected: item.expected }),\n ...(item.metadata === undefined ? {} : { metadata: item.metadata }),\n });\n }\n const totalPages = response.meta?.totalPages;\n if (totalPages !== undefined && page >= totalPages) {\n break;\n }\n if (totalPages === undefined && response.items.length < pageSize) {\n break;\n }\n }\n const dataset: LangfuseDataset<Input, Expected> = {\n name,\n items,\n };\n if (description !== undefined) dataset.description = description;\n if (metadata !== undefined) dataset.metadata = metadata;\n return dataset;\n },\n\n async upsertItems<Input, Expected>(\n name: string,\n items: LangfuseDatasetItem<Input, Expected>[],\n ): Promise<void> {\n const url = `${baseUrl}/api/public/datasets/${encodeURIComponent(name)}/items`;\n await request<unknown>(url, {\n method: \"POST\",\n body: JSON.stringify({ items }),\n });\n },\n\n async runExperiment<Input, Output, Expected>(\n opts: LangfuseRunExperimentOptions<Input, Output, Expected>,\n ): Promise<LangfuseRunExperimentResult> {\n let items = opts.items;\n if (items === undefined) {\n const dataset = await this.getDataset<Input, Expected>(opts.datasetName);\n items = dataset.items;\n }\n if (items === undefined || items.length === 0) {\n return {\n runName: opts.runName,\n datasetName: opts.datasetName,\n posted: 0,\n errors: [],\n };\n }\n const datasetItemRuns: Array<{\n datasetItemId: string;\n traceId?: string;\n observationId?: string;\n output: JsonValue;\n }> = [];\n const errors: LangfuseRunItemError[] = [];\n for (const item of items) {\n try {\n const result = await opts.run(item);\n datasetItemRuns.push({\n datasetItemId: item.id,\n ...(result.trace?.traceId === undefined ? {} : { traceId: result.trace.traceId }),\n ...(result.trace?.observationId === undefined\n ? {}\n : { observationId: result.trace.observationId }),\n output: toJsonValue(result.output),\n });\n } catch (error) {\n errors.push({ itemId: item.id, error });\n }\n }\n const url = `${baseUrl}/api/public/dataset-run-items`;\n const body: Record<string, unknown> = {\n runName: opts.runName,\n datasetItemRuns,\n };\n if (opts.description !== undefined) body.runDescription = opts.description;\n if (opts.metadata !== undefined) body.metadata = opts.metadata;\n await request<unknown>(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n return {\n runName: opts.runName,\n datasetName: opts.datasetName,\n posted: datasetItemRuns.length,\n errors,\n };\n },\n };\n}\n\nfunction buildAuthHeader(\n publicKey: string | undefined,\n secretKey: string | undefined,\n): Record<string, string> {\n if (publicKey === undefined || secretKey === undefined) {\n return {};\n }\n const encoded = Buffer.from(`${publicKey}:${secretKey}`).toString(\"base64\");\n return { Authorization: `Basic ${encoded}` };\n}\n\nasync function readErrorBody(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (value === null) return null;\n if (typeof value === \"string\" || typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value;\n try {\n return JSON.parse(JSON.stringify(value)) as JsonValue;\n } catch {\n return String(value);\n }\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport type { EvalOutcome, EvalReportArgs, EvalReporter } from \"@anvia/core/evals\";\nimport type { AgentTraceInfo } from \"@anvia/core/observability\";\nimport type {\n LangfuseEvalReporterOptions,\n LangfuseScoreDataType,\n LangfuseTracing,\n} from \"./types.js\";\n\nconst DEFAULT_TRUNCATE_BYTES = 2048;\n\nexport function createLangfuseEvalReporter<Input = unknown, Output = unknown, Expected = unknown>(\n tracing: Pick<LangfuseTracing, \"score\">,\n options: LangfuseEvalReporterOptions = {},\n): EvalReporter<Input, Output, Expected> {\n const onMissingTrace = options.onMissingTrace ?? (options.strict === true ? \"throw\" : \"ignore\");\n const truncateAt = options.truncateInputAt ?? DEFAULT_TRUNCATE_BYTES;\n const includeMessages = options.includeMessages ?? true;\n\n return {\n async report(args) {\n if (args.outcome.outcome === \"invalid\" && options.publishInvalid !== true) {\n return;\n }\n\n const trace = traceFromEvalReport(args);\n if (trace?.traceId === undefined || trace.traceId.length === 0) {\n if (onMissingTrace === \"throw\") {\n throw new Error(\"Langfuse eval reporter requires traceId\");\n }\n if (onMissingTrace === \"warn\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"[anvia/langfuse] eval reporter dropped score because no traceId was found\",\n { caseId: args.case.id, metric: args.metric.name },\n );\n }\n return;\n }\n\n const scoreValue = buildScoreValue(args.outcome, args.metric.dataType);\n const metadata = buildScoreMetadata({\n args,\n truncateAt,\n includeMessages,\n });\n const comment = scoreComment(args.outcome);\n\n await tracing.score({\n traceId: trace.traceId,\n ...(trace.observationId === undefined ? {} : { observationId: trace.observationId }),\n name: args.metric.name,\n value: scoreValue,\n ...(args.metric.dataType === undefined ? {} : { dataType: args.metric.dataType }),\n ...(resolveConfigId(args.metric) === undefined\n ? {}\n : { configId: resolveConfigId(args.metric) as string }),\n ...(comment === undefined ? {} : { comment }),\n ...(metadata === undefined ? {} : { metadata }),\n });\n },\n };\n}\n\nfunction resolveConfigId(metric: {\n scoreConfigId?: string | undefined;\n configId?: string | undefined;\n}): string | undefined {\n return metric.configId ?? metric.scoreConfigId;\n}\n\nfunction buildScoreMetadata<Input, Output, Score, Expected>({\n args,\n truncateAt,\n includeMessages,\n}: {\n args: EvalReportArgs<Input, Output, Score, Expected>;\n truncateAt: number;\n includeMessages: boolean;\n}): Record<string, JsonValue | undefined> | undefined {\n const merged: Record<string, JsonValue | undefined> = {\n suiteName: args.suiteName,\n caseId: args.case.id,\n outcome: args.outcome.outcome,\n };\n mergeMetadata(merged, args.outcome.metadata);\n mergeMetadata(merged, args.metric.metadata);\n const inputSummary = truncateValue(args.case.input, truncateAt);\n if (inputSummary !== undefined) {\n merged.caseInputSummary = inputSummary;\n }\n if (args.case.expected !== undefined) {\n const expectedSummary = truncateValue(args.case.expected, truncateAt);\n if (expectedSummary !== undefined) {\n merged.caseExpectedSummary = expectedSummary;\n }\n }\n if (includeMessages) {\n const messages = readMessages(args.output);\n if (messages !== undefined) {\n merged.messages = messages;\n }\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeMetadata(\n target: Record<string, JsonValue | undefined>,\n source: Record<string, JsonValue | undefined> | undefined,\n): void {\n if (source === undefined) return;\n for (const [key, value] of Object.entries(source)) {\n target[key] = value;\n }\n}\n\nfunction truncateValue(value: unknown, maxBytes: number): string | undefined {\n if (value === undefined) return undefined;\n let serialized: string;\n try {\n serialized = typeof value === \"string\" ? value : JSON.stringify(value);\n } catch {\n return undefined;\n }\n if (serialized === undefined) return undefined;\n const encoder = new TextEncoder();\n const bytes = encoder.encode(serialized);\n if (bytes.length <= maxBytes) {\n return serialized;\n }\n // Truncate at byte boundary by slicing, then append the marker.\n const truncatedBytes = bytes.subarray(0, maxBytes);\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n return `${decoder.decode(truncatedBytes)}<truncated>`;\n}\n\nfunction readMessages(output: unknown): JsonValue[] | undefined {\n if (typeof output !== \"object\" || output === null) return undefined;\n const messages = (output as { messages?: unknown }).messages;\n if (!Array.isArray(messages)) return undefined;\n const serialized: JsonValue[] = [];\n for (const entry of messages) {\n if (entry === null || typeof entry !== \"object\") return undefined;\n try {\n // Round-trip via JSON to make sure we never put non-JSON values\n // into a JsonValue-typed slot.\n serialized.push(JSON.parse(JSON.stringify(entry)) as JsonValue);\n } catch {\n return undefined;\n }\n }\n return serialized;\n}\n\nfunction buildScoreValue(\n outcome: EvalOutcome,\n dataType: LangfuseScoreDataType | undefined,\n): number | string {\n if (dataType === \"CATEGORICAL\") {\n const score = (outcome as { score?: unknown }).score;\n if (typeof score === \"string\") return score;\n if (typeof score === \"number\") return String(score);\n if (typeof score === \"boolean\") return score ? \"true\" : \"false\";\n if (score === null || score === undefined) {\n return outcome.outcome === \"pass\" ? \"pass\" : outcome.outcome === \"fail\" ? \"fail\" : \"invalid\";\n }\n try {\n return JSON.stringify(score);\n } catch {\n return outcome.outcome === \"pass\" ? \"pass\" : outcome.outcome;\n }\n }\n if (dataType === \"BOOLEAN\") {\n const score = (outcome as { score?: unknown }).score;\n if (typeof score === \"boolean\") return score ? 1 : 0;\n if (typeof score === \"number\") return score === 0 ? 0 : 1;\n return outcome.outcome === \"pass\" ? 1 : 0;\n }\n // Numeric (default)\n if (typeof (outcome as { score?: unknown }).score === \"number\") {\n return (outcome as { score: number }).score;\n }\n if (typeof (outcome as { score?: unknown }).score === \"boolean\") {\n return (outcome as { score: boolean }).score ? 1 : 0;\n }\n if (\n typeof (outcome as { score?: unknown }).score === \"object\" &&\n (outcome as { score?: unknown }).score !== null &&\n \"score\" in ((outcome as { score?: unknown }).score as object) &&\n typeof ((outcome as { score?: unknown }).score as { score?: unknown }).score === \"number\"\n ) {\n return (outcome as { score: { score: number } }).score.score;\n }\n return outcome.outcome === \"pass\" ? 1 : 0;\n}\n\nfunction scoreComment(outcome: EvalOutcome): string | undefined {\n return outcome.comment ?? (outcome.outcome === \"invalid\" ? outcome.reason : undefined);\n}\n\nfunction traceFromEvalReport<Input, Output, Expected>(\n args: EvalReportArgs<Input, Output, unknown, Expected>,\n): AgentTraceInfo | undefined {\n const outputTrace = traceFromOutput(args.output);\n if (outputTrace !== undefined) {\n return outputTrace;\n }\n const inputTrace = traceFromInput(args.case.input);\n if (inputTrace !== undefined) {\n return inputTrace;\n }\n const traceId = args.case.metadata?.traceId;\n const observationId = args.case.metadata?.observationId;\n if (typeof traceId !== \"string\") {\n return undefined;\n }\n return {\n traceId,\n ...(typeof observationId === \"string\" ? { observationId } : {}),\n };\n}\n\nfunction traceFromOutput(output: unknown): AgentTraceInfo | undefined {\n if (typeof output !== \"object\" || output === null || !(\"trace\" in output)) {\n return undefined;\n }\n return readTrace((output as { trace?: unknown }).trace);\n}\n\nfunction traceFromInput(input: unknown): AgentTraceInfo | undefined {\n if (typeof input !== \"object\" || input === null || !(\"trace\" in input)) {\n return undefined;\n }\n return readTrace((input as { trace?: unknown }).trace);\n}\n\nfunction readTrace(trace: unknown): AgentTraceInfo | undefined {\n if (typeof trace !== \"object\" || trace === null) {\n return undefined;\n }\n const traceId = (trace as { traceId?: unknown }).traceId;\n const observationId = (trace as { observationId?: unknown }).observationId;\n if (typeof traceId !== \"string\") {\n return undefined;\n }\n return {\n traceId,\n ...(typeof observationId === \"string\" ? { observationId } : {}),\n };\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport type { EvalCaseResult, EvalSuiteResult, RunEvalSuiteOptions } from \"@anvia/core/evals\";\nimport { runEvalSuite } from \"@anvia/core/evals\";\nimport { createLangfuseDatasetClient } from \"./dataset-client.js\";\nimport type {\n LangfuseDatasetClient,\n LangfuseDatasetItem,\n LangfuseRunExperimentOptions,\n LangfuseRunExperimentResult,\n LangfuseTracing,\n} from \"./types.js\";\n\nexport type RunEvalAsExperimentOptions<Input, Output, Expected = unknown> = Omit<\n LangfuseRunExperimentOptions<Input, Output, Expected>,\n \"items\" | \"run\"\n> & {\n tracing: Pick<LangfuseTracing, \"score\">;\n client?: LangfuseDatasetClient;\n pageSize?: number | undefined;\n timeoutMs?: number | undefined;\n};\n\nexport type RunEvalAsExperimentResult<Input, Output, Expected = unknown> = {\n suite: EvalSuiteResult<Input, Output, Expected>;\n datasetRun: LangfuseRunExperimentResult;\n};\n\nexport async function runEvalAsExperiment<Input, Output, Expected = unknown>(\n evalOptions: RunEvalSuiteOptions<Input, Output, Expected>,\n experimentOptions: RunEvalAsExperimentOptions<Input, Output, Expected>,\n): Promise<RunEvalAsExperimentResult<Input, Output, Expected>> {\n const client =\n experimentOptions.client ??\n createLangfuseDatasetClient(experimentOptions.tracing, {\n ...(experimentOptions.pageSize === undefined ? {} : { pageSize: experimentOptions.pageSize }),\n ...(experimentOptions.timeoutMs === undefined\n ? {}\n : { timeoutMs: experimentOptions.timeoutMs }),\n });\n\n const suite = await runEvalSuite(evalOptions);\n\n const items: LangfuseDatasetItem<Input, Expected>[] = evalOptions.cases.map((testCase) => {\n const item: LangfuseDatasetItem<Input, Expected> = {\n id: testCase.id,\n input: testCase.input,\n };\n if (testCase.expected !== undefined) {\n item.expected = testCase.expected;\n }\n if (testCase.metadata !== undefined) {\n item.metadata = testCase.metadata as Record<string, JsonValue | undefined>;\n }\n return item;\n });\n\n const datasetItemMap = new Map<string, EvalCaseResult<Input, Output, Expected>>();\n for (const result of suite.results) {\n datasetItemMap.set(result.case.id, result);\n }\n\n const datasetRun = await client.runExperiment<Input, Output, Expected>({\n datasetName: experimentOptions.datasetName,\n runName: experimentOptions.runName,\n ...(experimentOptions.description === undefined\n ? {}\n : { description: experimentOptions.description }),\n ...(experimentOptions.metadata === undefined ? {} : { metadata: experimentOptions.metadata }),\n items,\n run: (item) => {\n const result = datasetItemMap.get(item.id);\n if (result === undefined) {\n return {\n output: undefined as Output,\n trace: undefined,\n };\n }\n const output = (result.output ?? undefined) as Output;\n const trace = readTraceFromOutput(result.output);\n return { output, trace };\n },\n });\n\n return { suite, datasetRun };\n}\n\nfunction readTraceFromOutput(\n output: unknown,\n): { traceId: string; observationId?: string | undefined } | undefined {\n if (typeof output !== \"object\" || output === null || !(\"trace\" in output)) {\n return undefined;\n }\n const trace = (output as { trace?: unknown }).trace;\n if (typeof trace !== \"object\" || trace === null) {\n return undefined;\n }\n const traceId = (trace as { traceId?: unknown }).traceId;\n if (typeof traceId !== \"string\") {\n return undefined;\n }\n const observationId = (trace as { observationId?: unknown }).observationId;\n if (typeof observationId === \"string\") {\n return { traceId, observationId };\n }\n return { traceId };\n}\n","import { getResolvedLangfuseConfig, resolveLangfuseConfig } from \"./config.js\";\nimport { LangfuseScoreError } from \"./scoring.js\";\nimport type {\n LangfuseChatMessage,\n LangfusePrompt,\n LangfusePromptClient,\n LangfusePromptClientOptions,\n LangfusePromptGetOptions,\n LangfuseTracing,\n} from \"./types.js\";\n\nconst DEFAULT_CACHE_TTL_MS = 60_000;\n\nexport function createLangfusePromptClient(\n tracing: Pick<LangfuseTracing, \"score\">,\n options: LangfusePromptClientOptions = {},\n): LangfusePromptClient {\n const resolvedConfig = resolveLangfuseConfig(options, getResolvedLangfuseConfig(tracing));\n const baseUrl = resolvedConfig.baseUrl;\n const publicKey = resolvedConfig.publicKey;\n const secretKey = resolvedConfig.secretKey;\n const defaultTtl = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n const timeoutMs = resolvedConfig.timeoutMs;\n\n const cache = new Map<string, { prompt: LangfusePrompt; expiresAt: number }>();\n const authHeader = buildAuthHeader(publicKey, secretKey);\n\n async function request<T>(input: string): Promise<T> {\n const response = await fetch(input, {\n method: \"GET\",\n headers: { ...authHeader },\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!response.ok) {\n const body = await readErrorBody(response);\n throw new LangfuseScoreError(\n `Langfuse request failed: ${response.status} ${response.statusText}: ${body}`,\n [],\n );\n }\n return (await response.json()) as T;\n }\n\n async function getPrompt(\n name: string,\n opts: LangfusePromptGetOptions = {},\n ): Promise<LangfusePrompt> {\n const key = `${name}::${opts.version ?? \"\"}::${opts.label ?? \"\"}`;\n const ttl = opts.cacheTtlMs ?? defaultTtl;\n if (opts.refresh !== true) {\n const cached = cache.get(key);\n if (cached !== undefined && cached.expiresAt > Date.now()) {\n return cached.prompt;\n }\n }\n const url = new URL(`${baseUrl}/api/public/v2/prompts/${encodeURIComponent(name)}`);\n if (opts.version !== undefined) {\n url.searchParams.set(\"version\", String(opts.version));\n }\n if (opts.label !== undefined) {\n url.searchParams.set(\"label\", opts.label);\n }\n const raw = await request<{\n name: string;\n version: number;\n labels?: string[];\n prompt: unknown;\n type: \"text\" | \"chat\";\n tags?: string[];\n }>(url.toString());\n const prompt: LangfusePrompt = {\n name: raw.name,\n version: raw.version,\n labels: raw.labels ?? [],\n prompt: normalizePrompt(raw.prompt, raw.type),\n type: raw.type,\n ...(raw.tags === undefined ? {} : { tags: raw.tags }),\n resolvedAt: new Date(),\n };\n cache.set(key, { prompt, expiresAt: Date.now() + ttl });\n return prompt;\n }\n\n function getPromptText(name: string, opts?: LangfusePromptGetOptions): Promise<string> {\n return getPrompt(name, opts).then((prompt) => {\n if (typeof prompt.prompt !== \"string\") {\n throw new Error(`Prompt ${name} is a chat prompt; expected text`);\n }\n return prompt.prompt;\n });\n }\n\n function getPromptChat(\n name: string,\n opts?: LangfusePromptGetOptions,\n ): Promise<LangfuseChatMessage[]> {\n return getPrompt(name, opts).then((prompt) => {\n if (typeof prompt.prompt === \"string\") {\n throw new Error(`Prompt ${name} is a text prompt; expected chat`);\n }\n return prompt.prompt;\n });\n }\n\n function refresh(): void {\n cache.clear();\n }\n\n return { getPrompt, getPromptText, getPromptChat, refresh };\n}\n\nfunction normalizePrompt(raw: unknown, type: \"text\" | \"chat\"): string | LangfuseChatMessage[] {\n if (type === \"text\") {\n if (typeof raw === \"string\") return raw;\n throw new Error(\"Expected text prompt to be a string\");\n }\n if (!Array.isArray(raw)) {\n throw new Error(\"Expected chat prompt to be an array of messages\");\n }\n return raw.map((entry) => {\n if (typeof entry !== \"object\" || entry === null) {\n throw new Error(\"Expected chat message to be an object\");\n }\n const role = (entry as { role?: unknown }).role;\n const content = (entry as { content?: unknown }).content;\n if (typeof content !== \"string\") {\n throw new Error(\"Expected chat message content to be a string\");\n }\n if (role !== \"system\" && role !== \"user\" && role !== \"assistant\" && role !== \"tool\") {\n throw new Error(`Unexpected chat message role: ${String(role)}`);\n }\n return { role, content };\n });\n}\n\nfunction buildAuthHeader(\n publicKey: string | undefined,\n secretKey: string | undefined,\n): Record<string, string> {\n if (publicKey === undefined || secretKey === undefined) {\n return {};\n }\n const encoded = Buffer.from(`${publicKey}:${secretKey}`).toString(\"base64\");\n return { Authorization: `Basic ${encoded}` };\n}\n\nasync function readErrorBody(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n","import type { Message } from \"@anvia/core/completion\";\n\nexport type RedactorPattern = {\n name: string;\n regex: RegExp;\n};\n\nexport type LangfuseRedactionOptions = {\n patterns?: RedactorPattern[];\n replacement?: string;\n};\n\nexport type PiiRedactor = {\n redactString(input: string): string;\n redactObject<T>(input: T): T;\n redactMessages(input: Message[]): Message[];\n patternNames(): string[];\n};\n\nconst DEFAULT_REPLACEMENT = \"[REDACTED]\";\nconst MAX_DEPTH = 16;\n\nexport function createPiiRedactor(options: LangfuseRedactionOptions = {}): PiiRedactor {\n const patterns = options.patterns ?? DEFAULT_PATTERNS;\n const replacement = options.replacement ?? DEFAULT_REPLACEMENT;\n const compiled = patterns.map((p) => ({\n name: p.name,\n regex: cloneRegex(p.regex, \"g\"),\n }));\n const patternNamesList = patterns.map((p) => p.name);\n\n function redactString(input: string): string {\n if (typeof input !== \"string\") return input;\n let out = input;\n for (const { name, regex } of compiled) {\n out = applyPattern(out, name, regex, replacement);\n }\n return out;\n }\n\n function redactObject<T>(input: T): T {\n return redactValue(input, 0, redactString) as T;\n }\n\n function redactMessages(input: Message[]): Message[] {\n return input.map((message) => redactMessage(message, redactString));\n }\n\n function patternNames(): string[] {\n return patternNamesList;\n }\n\n return { redactString, redactObject, redactMessages, patternNames };\n}\n\nexport const DEFAULT_PATTERNS: RedactorPattern[] = [\n { name: \"email\", regex: /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}/g },\n { name: \"creditCard\", regex: /\\b(?:\\d[ -]?){13,19}\\b/g },\n { name: \"ipv4\", regex: /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g },\n {\n name: \"phone\",\n regex:\n /(?<!\\d)(?:\\+\\d{1,3}[\\s.-]?)?(?:\\(\\d{2,4}\\)[\\s.-]?)?\\d{3,4}[\\s.-]?\\d{3,4}(?:[\\s.-]?\\d{3,4})?(?!\\d)/g,\n },\n { name: \"jwt\", regex: /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+/g },\n {\n name: \"apiKey\",\n regex: /\\b(?:sk|pk|api|key|token)[-_][A-Za-z0-9]{16,}\\b/gi,\n },\n];\n\nfunction applyPattern(input: string, name: string, regex: RegExp, replacement: string): string {\n if (name === \"creditCard\") {\n return redactCreditCards(input, replacement);\n }\n return input.replace(regex, replacement);\n}\n\nfunction redactCreditCards(input: string, replacement: string): string {\n let out = \"\";\n let i = 0;\n while (i < input.length) {\n const ch = input.charAt(i);\n if (/\\d/.test(ch)) {\n const { length, valid } = longestLuhnChunk(input.slice(i));\n if (valid) {\n out += replacement;\n i += length;\n continue;\n }\n }\n out += ch;\n i += 1;\n }\n return out;\n}\n\nfunction longestLuhnChunk(s: string): { length: number; valid: boolean } {\n let length = 0;\n let bestValid = 0;\n while (length < s.length && length < 40) {\n const ch = s.charAt(length);\n if (!/\\d/.test(ch) && ch !== \"-\") break;\n length += 1;\n const candidate = s.slice(0, length).replace(/\\D/g, \"\");\n if (candidate.length >= 13 && candidate.length <= 19) {\n if (startsWithKnownPrefix(candidate) && passesLuhn(candidate)) {\n bestValid = length;\n }\n }\n }\n return { length: bestValid, valid: bestValid > 0 };\n}\n\nfunction startsWithKnownPrefix(digits: string): boolean {\n if (digits.startsWith(\"4\")) return true;\n const two = digits.slice(0, 2);\n if (two === \"51\" || two === \"52\" || two === \"53\" || two === \"54\" || two === \"55\") return true;\n const four = digits.slice(0, 4);\n if (four === \"2221\" || four === \"2720\") return true;\n const twoAgain = digits.slice(0, 2);\n if (twoAgain === \"34\" || twoAgain === \"37\") return true;\n if (four === \"6011\" || twoAgain === \"65\") return true;\n return digits.startsWith(\"35\");\n}\n\nexport function passesLuhn(digits: string): boolean {\n if (!/^\\d+$/.test(digits)) return false;\n let sum = 0;\n let alt = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n const raw = digits.charCodeAt(i) - 48;\n let value = raw;\n if (alt) {\n value *= 2;\n if (value > 9) value -= 9;\n }\n sum += value;\n alt = !alt;\n }\n return sum % 10 === 0;\n}\n\nfunction cloneRegex(source: RegExp, flags: string): RegExp {\n return new RegExp(source.source, flags + source.flags.replace(/g/g, \"\"));\n}\n\nfunction redactValue(\n value: unknown,\n depth: number,\n redactStringFn: (s: string) => string,\n): unknown {\n if (depth > MAX_DEPTH) return value;\n if (typeof value === \"string\") return redactStringFn(value);\n if (Array.isArray(value))\n return value.map((entry) => redactValue(entry, depth + 1, redactStringFn));\n if (value !== null && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n out[key] = redactValue(entry, depth + 1, redactStringFn);\n }\n return out;\n }\n return value;\n}\n\nfunction redactMessage(message: Message, redactStringFn: (s: string) => string): Message {\n if (!Array.isArray(message.content)) return message;\n const newContent = message.content.map((part) => {\n if (part === null || typeof part !== \"object\") return part;\n const rec = part as Record<string, unknown>;\n if (rec.type === \"text\" && typeof rec.text === \"string\") {\n return { ...part, text: redactStringFn(rec.text) };\n }\n return part;\n });\n return { ...message, content: newContent as never };\n}\n","import { type Message, textFromAssistantContent } from \"@anvia/core/completion\";\nimport type {\n AgentGenerationEndArgs,\n AgentGenerationErrorArgs,\n AgentGenerationObserver,\n AgentGenerationStartArgs,\n AgentGenerationUpdateArgs,\n AgentRunEndArgs,\n AgentRunErrorArgs,\n AgentRunEventArgs,\n AgentRunObserver,\n AgentRunPromptRef,\n AgentRunStartArgs,\n AgentToolEndArgs,\n AgentToolErrorArgs,\n AgentToolObserver,\n AgentToolStartArgs,\n AgentToolStreamEventArgs,\n AgentTraceInfo,\n} from \"@anvia/core/observability\";\nimport { LangfuseSpanProcessor } from \"@langfuse/otel\";\nimport {\n type LangfuseAgent,\n type LangfuseGeneration,\n LangfuseOtelSpanAttributes,\n type LangfuseSpan,\n type LangfuseTool,\n startObservation,\n} from \"@langfuse/tracing\";\nimport { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport { SEMRESATTRS_SERVICE_NAME } from \"@opentelemetry/semantic-conventions\";\nimport {\n type LangfuseResolvedConfig,\n langfuseResolvedConfigSymbol,\n resolveLangfuseConfig,\n} from \"./config.js\";\nimport {\n agentLabel,\n childMetadata,\n errorMessage,\n generationKey,\n isRecord,\n modelInputMessage,\n modelInputMessages,\n modelParameters,\n usageDetails,\n usageDetailsFromRecord,\n} from \"./helpers.js\";\nimport { createPiiRedactor, type PiiRedactor } from \"./redaction.js\";\nimport { ScoreQueue } from \"./scoring.js\";\nimport type {\n LangfuseRedactionMode,\n LangfuseScoreArgs,\n LangfuseTraceHandle,\n LangfuseTracing,\n LangfuseTracingOptions,\n} from \"./types.js\";\n\nexport const langfuse = {\n create(options: LangfuseTracingOptions = {}): LangfuseTracing {\n return new LangfuseAgentObserver(options);\n },\n};\n\nclass LangfuseAgentObserver implements LangfuseTracing {\n private readonly processor: LangfuseSpanProcessor;\n private readonly sdk: NodeSDK;\n readonly [langfuseResolvedConfigSymbol]: LangfuseResolvedConfig;\n private readonly publicKey: string | undefined;\n private readonly secretKey: string | undefined;\n private readonly baseUrl: string;\n private readonly serviceName: string | undefined;\n private readonly timeoutMs: number;\n private readonly queue: ScoreQueue | null;\n private currentHandle: LangfuseTraceHandle | undefined;\n private readonly redactor: PiiRedactor | undefined;\n private readonly redactInputs: LangfuseRedactionMode | undefined;\n private readonly redactOutputs: LangfuseRedactionMode | undefined;\n\n constructor(options: LangfuseTracingOptions) {\n const resolvedConfig = resolveLangfuseConfig(options);\n this[langfuseResolvedConfigSymbol] = resolvedConfig;\n this.publicKey = resolvedConfig.publicKey;\n this.secretKey = resolvedConfig.secretKey;\n this.baseUrl = resolvedConfig.baseUrl;\n this.serviceName = resolvedConfig.serviceName;\n this.timeoutMs = resolvedConfig.timeoutMs;\n const processorOptions: ConstructorParameters<typeof LangfuseSpanProcessor>[0] = {\n baseUrl: this.baseUrl,\n };\n if (this.publicKey !== undefined) processorOptions.publicKey = this.publicKey;\n if (this.secretKey !== undefined) processorOptions.secretKey = this.secretKey;\n if (resolvedConfig.environment !== undefined) {\n processorOptions.environment = resolvedConfig.environment;\n }\n if (resolvedConfig.release !== undefined) processorOptions.release = resolvedConfig.release;\n this.processor = new LangfuseSpanProcessor(processorOptions);\n const sdkOptions: ConstructorParameters<typeof NodeSDK>[0] = {\n spanProcessors: [this.processor],\n };\n if (this.serviceName !== undefined) {\n sdkOptions.resource = resourceFromAttributes({\n [SEMRESATTRS_SERVICE_NAME]: this.serviceName,\n });\n }\n this.sdk = new NodeSDK(sdkOptions);\n this.sdk.start();\n const batchSize = options.scoreBatchSize ?? 0;\n this.queue =\n batchSize > 0 && this.publicKey !== undefined && this.secretKey !== undefined\n ? new ScoreQueue({\n baseUrl: this.baseUrl,\n publicKey: this.publicKey,\n secretKey: this.secretKey,\n timeoutMs: this.timeoutMs,\n batchSize,\n flushIntervalMs: options.scoreFlushIntervalMs ?? 250,\n maxRetries: options.scoreMaxRetries ?? 3,\n })\n : null;\n this.redactInputs = options.redactInputs;\n this.redactOutputs = options.redactOutputs;\n this.redactor =\n options.redactInputs !== undefined || options.redactOutputs !== undefined\n ? createPiiRedactor(options.redaction)\n : undefined;\n }\n\n async startRun(args: AgentRunStartArgs): Promise<AgentRunObserver> {\n const traceId = args.trace?.traceId;\n const redactedInput = this.maybeRedactInput({\n prompt: args.prompt,\n history: args.history,\n });\n const rootAttributes: Parameters<typeof startObservation>[1] = {\n input: redactedInput,\n metadata: {\n ...(this.serviceName !== undefined ? { serviceName: this.serviceName } : {}),\n agentName: args.agentName,\n agentDescription: args.agentDescription,\n maxTurns: args.maxTurns,\n ...(args.trace?.metadata ?? {}),\n },\n };\n if (args.trace?.version !== undefined) {\n rootAttributes.version = args.trace.version;\n }\n\n const root = startObservation(\n args.agentName ?? \"agent.run\",\n rootAttributes,\n traceId === undefined\n ? { asType: \"agent\" }\n : {\n asType: \"agent\",\n parentSpanContext: {\n traceId,\n spanId: \"0000000000000001\",\n traceFlags: 1,\n },\n },\n );\n applyTraceAttributes(root, args);\n\n const promptRef = resolvePromptRef(args);\n const runObserver = new LangfuseRunObserver(\n root,\n {\n traceId: root.traceId,\n observationId: root.id,\n },\n promptRef,\n {\n redactor: this.redactor,\n redactInputs: this.redactInputs,\n redactOutputs: this.redactOutputs,\n },\n );\n this.currentHandle = runObserver.getHandle();\n runObserver.setCurrentHandle = (handle) => {\n this.currentHandle = handle;\n };\n runObserver.clearCurrentHandle = () => {\n if (this.currentHandle === runObserver.getHandle()) {\n this.currentHandle = undefined;\n }\n };\n return runObserver;\n }\n\n async flush(): Promise<void> {\n await this.queue?.flush();\n await this.processor.forceFlush();\n }\n\n async shutdown(): Promise<void> {\n await this.queue?.shutdown();\n await this.sdk.shutdown();\n }\n\n async flushScores(): Promise<void> {\n await this.queue?.flush();\n }\n\n scoreQueueDepth(): number {\n return this.queue?.depth() ?? 0;\n }\n\n getCurrentTrace(): LangfuseTraceHandle | undefined {\n return this.currentHandle;\n }\n\n private maybeRedactInput<T>(value: T): T {\n if (this.redactor === undefined || this.redactInputs === undefined) return value;\n return applyRedaction(this.redactor, value, this.redactInputs);\n }\n\n private maybeRedactOutput<T>(value: T): T {\n if (this.redactor === undefined || this.redactOutputs === undefined) return value;\n return applyRedaction(this.redactor, value, this.redactOutputs);\n }\n\n async score(args: LangfuseScoreArgs): Promise<void> {\n if (args.traceId === undefined || args.traceId.length === 0) {\n throw new Error(\"Langfuse score requires traceId\");\n }\n if (this.publicKey === undefined || this.secretKey === undefined) {\n throw new Error(\"Langfuse score requires publicKey and secretKey\");\n }\n assertScoreValue(args.value, args.dataType);\n\n if (this.queue !== null) {\n this.queue.enqueue(args);\n return;\n }\n\n await this.sendScore(args);\n }\n\n private async sendScore(args: LangfuseScoreArgs): Promise<void> {\n const body = buildScoreBody(args);\n const response = await fetch(`${this.baseUrl}/api/public/scores`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.publicKey}:${this.secretKey}`).toString(\"base64\")}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n if (!response.ok) {\n throw new Error(\n `Langfuse score failed with HTTP ${response.status}: ${await response.text()}`,\n );\n }\n }\n}\n\nfunction assertScoreValue(value: number | string, dataType: LangfuseScoreArgs[\"dataType\"]): void {\n if (dataType === \"NUMERIC\") {\n if (typeof value !== \"number\") {\n throw new TypeError(`Langfuse score dataType=NUMERIC requires a number value`);\n }\n return;\n }\n if (dataType === \"CATEGORICAL\") {\n if (typeof value !== \"string\") {\n throw new TypeError(`Langfuse score dataType=CATEGORICAL requires a string value`);\n }\n return;\n }\n if (dataType === \"BOOLEAN\") {\n if (value !== 0 && value !== 1) {\n throw new TypeError(`Langfuse score dataType=BOOLEAN requires value 0 or 1`);\n }\n return;\n }\n}\n\nfunction buildScoreBody(score: LangfuseScoreArgs): Record<string, unknown> {\n const body: Record<string, unknown> = {\n traceId: score.traceId,\n name: score.name,\n value: score.value,\n };\n if (score.observationId !== undefined) body.observationId = score.observationId;\n if (score.dataType !== undefined) body.dataType = score.dataType;\n if (score.comment !== undefined) body.comment = score.comment;\n if (score.metadata !== undefined) body.metadata = score.metadata;\n const configId = score.configId ?? score.scoreConfigId;\n if (configId !== undefined) body.configId = configId;\n if (score.environment !== undefined) body.environment = score.environment;\n if (score.timestamp !== undefined) {\n body.timestamp =\n score.timestamp instanceof Date ? score.timestamp.toISOString() : score.timestamp;\n }\n return body;\n}\n\nfunction applyTraceAttributes(root: LangfuseAgent, args: AgentRunStartArgs): void {\n const traceName = args.trace?.name ?? args.agentName;\n if (traceName !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_NAME, traceName);\n }\n if (args.trace?.userId !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_USER_ID, args.trace.userId);\n }\n if (args.trace?.sessionId !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_SESSION_ID, args.trace.sessionId);\n }\n if (args.trace?.tags !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_TAGS, args.trace.tags);\n }\n for (const [key, value] of Object.entries(args.trace?.metadata ?? {})) {\n const serialized = serializeMetadataValue(value);\n if (serialized === undefined) {\n continue;\n }\n root.otelSpan.setAttribute(`${LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`, serialized);\n }\n const promptRef = resolvePromptRef(args);\n if (promptRef !== undefined) {\n root.otelSpan.setAttribute(\n `${LangfuseOtelSpanAttributes.TRACE_METADATA}.promptName`,\n promptRef.name,\n );\n if (promptRef.version !== undefined) {\n root.otelSpan.setAttribute(\n `${LangfuseOtelSpanAttributes.TRACE_METADATA}.promptVersion`,\n String(promptRef.version),\n );\n }\n }\n}\n\nfunction applyRedaction<T>(redactor: PiiRedactor, value: T, mode: LangfuseRedactionMode): T {\n if (mode === \"deep\") {\n return redactor.redactObject(value);\n }\n if (typeof value === \"string\") {\n return redactor.redactString(value) as unknown as T;\n }\n if (Array.isArray(value)) {\n return redactor.redactMessages(value as never) as unknown as T;\n }\n if (value !== null && typeof value === \"object\") {\n return redactor.redactObject(value);\n }\n return value;\n}\n\nfunction resolvePromptRef(args: AgentRunStartArgs): AgentRunPromptRef | undefined {\n if (args.promptRef !== undefined) {\n return args.promptRef;\n }\n const metadata = args.trace?.metadata;\n if (metadata === undefined) {\n return undefined;\n }\n const name = metadata.promptName;\n if (typeof name !== \"string\" || name.length === 0) {\n return undefined;\n }\n const rawVersion = metadata.promptVersion;\n if (rawVersion === undefined || rawVersion === null) {\n return { name };\n }\n const version =\n typeof rawVersion === \"number\"\n ? rawVersion\n : typeof rawVersion === \"string\" && rawVersion.trim().length > 0\n ? Number(rawVersion)\n : undefined;\n if (version === undefined || !Number.isFinite(version)) {\n return { name };\n }\n return { name, version };\n}\n\nfunction promptMetadata(\n ref: AgentRunPromptRef | undefined,\n): Record<string, string | number | undefined> {\n if (ref === undefined) {\n return {};\n }\n return {\n promptName: ref.name,\n ...(ref.version === undefined ? {} : { promptVersion: ref.version }),\n };\n}\n\nfunction serializeMetadataValue(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return \"<failed to serialize>\";\n }\n}\n\nclass LangfuseRunObserver implements AgentRunObserver {\n private readonly turnSpans = new Map<number, LangfuseSpan>();\n // Assigned by LangfuseAgentObserver.startRun so that the run can\n // publish trace-handle updates back to the agent observer.\n setCurrentHandle: ((handle: LangfuseTraceHandle) => void) | undefined;\n clearCurrentHandle: (() => void) | undefined;\n private handle: LangfuseTraceHandle;\n private readonly promptRef: AgentRunPromptRef | undefined;\n private readonly redactor: PiiRedactor | undefined;\n private readonly redactInputs: LangfuseRedactionMode | undefined;\n private readonly redactOutputs: LangfuseRedactionMode | undefined;\n\n constructor(\n private readonly root: LangfuseAgent,\n readonly trace: AgentTraceInfo,\n promptRef: AgentRunPromptRef | undefined,\n redaction: {\n redactor: PiiRedactor | undefined;\n redactInputs: LangfuseRedactionMode | undefined;\n redactOutputs: LangfuseRedactionMode | undefined;\n },\n ) {\n this.handle = this.buildHandle();\n this.promptRef = promptRef;\n this.redactor = redaction.redactor;\n this.redactInputs = redaction.redactInputs;\n this.redactOutputs = redaction.redactOutputs;\n }\n\n redactInputValue<T>(value: T): T {\n if (this.redactor === undefined || this.redactInputs === undefined) return value;\n return applyRedaction(this.redactor, value, this.redactInputs);\n }\n\n redactOutputValue<T>(value: T): T {\n if (this.redactor === undefined || this.redactOutputs === undefined) return value;\n return applyRedaction(this.redactor, value, this.redactOutputs);\n }\n\n startGeneration(args: AgentGenerationStartArgs): AgentGenerationObserver {\n this.closeEarlierTurns(args.turn);\n const turn = this.turnSpan(args.turn);\n const redactedChatHistory = this.redactInputValue(modelInputMessages(args.request.chatHistory));\n const generation = turn.startObservation(\n `model.turn.${args.turn}`,\n {\n input: redactedChatHistory,\n model: args.request.model ?? \"default\",\n modelParameters: modelParameters(args.request),\n metadata: {\n turn: args.turn,\n toolCount: args.request.tools.length,\n hasOutputSchema: args.request.outputSchema !== undefined,\n ...(args.providerRequest !== undefined ? { providerRequest: args.providerRequest } : {}),\n ...(args.modelInfo !== undefined\n ? {\n modelInfo: {\n provider: args.modelInfo.provider,\n defaultModel: args.modelInfo.defaultModel,\n ...(args.modelInfo.capabilities !== undefined\n ? { capabilities: args.modelInfo.capabilities }\n : {}),\n },\n }\n : {}),\n ...promptMetadata(this.promptRef),\n },\n },\n { asType: \"generation\" },\n );\n return new LangfuseGenerationObserver(generation, this);\n }\n\n startTool(args: AgentToolStartArgs): AgentToolObserver {\n const turn = this.turnSpan(args.turn);\n const redactedArgs = this.redactInputValue(args.args);\n const tool = turn.startObservation(\n `tool.${args.toolName}`,\n {\n input: {\n args: redactedArgs,\n toolCall: args.toolCall,\n },\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n ...(args.toolDefinition !== undefined ? { toolDefinition: args.toolDefinition } : {}),\n ...(args.toolMetadata !== undefined ? { toolMetadata: args.toolMetadata } : {}),\n },\n },\n { asType: \"tool\" },\n );\n return new LangfuseToolObserver(tool, this);\n }\n\n end(args: AgentRunEndArgs): void {\n this.closeAllTurns();\n const redactedOutput = this.redactOutputValue(args.output);\n this.root\n .update({\n output: redactedOutput,\n metadata: {\n usage: args.usage,\n messages: args.messages,\n },\n })\n .end();\n this.clearCurrentHandle?.();\n }\n\n error(args: AgentRunErrorArgs): void {\n this.closeAllTurns();\n this.root\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(args.error),\n output: {\n error: errorMessage(args.error),\n },\n metadata: {\n usage: args.usage,\n messages: args.messages,\n },\n })\n .end();\n this.clearCurrentHandle?.();\n }\n\n event(args: AgentRunEventArgs): void {\n const metadata: Record<string, unknown> = { ...(args.attributes ?? {}) };\n this.root.startObservation(args.name, { metadata }, { asType: \"event\" }).end();\n }\n\n getHandle(): LangfuseTraceHandle {\n return this.handle;\n }\n\n private buildHandle(): LangfuseTraceHandle {\n return {\n traceId: this.trace.traceId ?? \"\",\n observationId: this.trace.observationId ?? \"\",\n addAttributes: (attributes) => {\n this.root.update({ metadata: attributes });\n this.setCurrentHandle?.(this.handle);\n },\n addEvent: (name, attributes) => {\n const metadata: Record<string, unknown> = { ...(attributes ?? {}) };\n this.root.startObservation(name, { metadata }, { asType: \"event\" }).end();\n this.setCurrentHandle?.(this.handle);\n },\n };\n }\n\n private turnSpan(turn: number): LangfuseSpan {\n const existing = this.turnSpans.get(turn);\n if (existing !== undefined) {\n return existing;\n }\n\n const span = this.root.startObservation(\n `turn.${turn}`,\n {\n metadata: { turn },\n },\n { asType: \"span\" },\n );\n this.turnSpans.set(turn, span);\n return span;\n }\n\n private closeEarlierTurns(currentTurn: number): void {\n for (const [turn, span] of this.turnSpans) {\n if (turn < currentTurn) {\n span.end();\n this.turnSpans.delete(turn);\n }\n }\n }\n\n private closeAllTurns(): void {\n for (const span of this.turnSpans.values()) {\n span.end();\n }\n this.turnSpans.clear();\n }\n}\n\nclass LangfuseGenerationObserver implements AgentGenerationObserver {\n constructor(\n private readonly generation: LangfuseGeneration,\n private readonly run: LangfuseRunObserver,\n ) {}\n\n update(args: AgentGenerationUpdateArgs): void {\n this.generation.update({\n output: { delta: args.delta },\n });\n }\n\n end(args: AgentGenerationEndArgs): void {\n const redactedText = this.run.redactOutputValue(textFromAssistantContent(args.response.choice));\n const redactedChoice = this.run.redactOutputValue(args.response.choice);\n this.generation\n .update({\n output: {\n messageId: args.response.messageId,\n content: redactedChoice,\n text: redactedText,\n },\n usageDetails: usageDetails(args.response.usage),\n metadata: {\n turn: args.turn,\n ...(args.firstDeltaMs !== undefined ? { firstDeltaMs: args.firstDeltaMs } : {}),\n },\n })\n .end();\n }\n\n error(args: AgentGenerationErrorArgs): void {\n this.generation\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(args.error),\n output: { error: errorMessage(args.error) },\n metadata: { turn: args.turn },\n })\n .end();\n }\n}\n\nclass LangfuseToolObserver implements AgentToolObserver {\n private readonly childAgents = new Map<string, LangfuseAgent>();\n private readonly childGenerations = new Map<string, LangfuseGeneration>();\n private readonly childTools: Array<{\n agentId: string;\n toolName: string;\n toolCallId?: string;\n tool: LangfuseTool;\n ended: boolean;\n }> = [];\n\n constructor(\n private readonly tool: LangfuseTool,\n private readonly run: LangfuseRunObserver,\n ) {}\n\n streamEvent(args: AgentToolStreamEventArgs): void {\n const wrapper = args.event;\n const child = isRecord(wrapper.event) ? wrapper.event : undefined;\n if (child === undefined) {\n return;\n }\n\n const agentId = wrapper.agentId;\n const agentName = wrapper.agentName;\n const childTurn = typeof child.turn === \"number\" ? child.turn : args.turn;\n const agent = this.childAgent(agentId, agentName, args);\n\n if (child.type === \"turn_start\") {\n const generation = agent.startObservation(\n `${agentLabel(agentId, agentName)}.model.turn.${childTurn}`,\n {\n input: {\n prompt: modelInputMessage(child.prompt as Message),\n history: modelInputMessages(child.history as Message[]),\n },\n metadata: childMetadata(args, agentId, agentName, childTurn),\n },\n { asType: \"generation\" },\n );\n this.childGenerations.set(generationKey(agentId, childTurn), generation);\n return;\n }\n\n if (child.type === \"turn_end\") {\n const generation = this.childGenerations.get(generationKey(agentId, childTurn));\n if (generation !== undefined) {\n generation\n .update({\n output: child.response,\n ...(isRecord(child.response) && isRecord(child.response.usage)\n ? { usageDetails: usageDetailsFromRecord(child.response.usage) }\n : {}),\n metadata: childMetadata(args, agentId, agentName, childTurn),\n })\n .end();\n this.childGenerations.delete(generationKey(agentId, childTurn));\n }\n return;\n }\n\n if (child.type === \"tool_call\" && isRecord(child.toolCall)) {\n const toolCall = child.toolCall;\n const toolCallFunction = isRecord(toolCall.function) ? toolCall.function : undefined;\n const toolName = typeof toolCallFunction?.name === \"string\" ? toolCallFunction.name : \"tool\";\n const toolCallId =\n typeof toolCall.callId === \"string\"\n ? toolCall.callId\n : typeof toolCall.id === \"string\"\n ? toolCall.id\n : undefined;\n const childTool = agent.startObservation(\n `${agentLabel(agentId, agentName)}.${toolName}`,\n {\n input: {\n args: toolCallFunction?.arguments ?? {},\n toolCall,\n },\n metadata: {\n ...childMetadata(args, agentId, agentName, childTurn),\n toolName,\n toolCallId,\n },\n },\n { asType: \"tool\" },\n );\n this.childTools.push({\n agentId,\n toolName,\n ...(toolCallId === undefined ? {} : { toolCallId }),\n tool: childTool,\n ended: false,\n });\n return;\n }\n\n if (child.type === \"tool_result\") {\n const toolName = typeof child.toolName === \"string\" ? child.toolName : \"tool\";\n const toolCallId = typeof child.toolCallId === \"string\" ? child.toolCallId : undefined;\n const childTool = this.findChildTool(agentId, toolName, toolCallId);\n if (childTool !== undefined) {\n childTool.ended = true;\n childTool.tool\n .update({\n output: typeof child.result === \"string\" ? child.result : child,\n metadata: {\n ...childMetadata(args, agentId, agentName, childTurn),\n toolName,\n toolCallId,\n internalCallId:\n typeof child.internalCallId === \"string\" ? child.internalCallId : undefined,\n args: typeof child.args === \"string\" ? child.args : undefined,\n },\n })\n .end();\n }\n return;\n }\n\n if (child.type === \"final\") {\n agent\n .update({\n output: child.output,\n ...(isRecord(child.usage) ? { metadata: { usage: child.usage } } : {}),\n })\n .end();\n this.childAgents.delete(agentId);\n return;\n }\n\n if (child.type === \"error\") {\n agent\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(child.error),\n output: { error: errorMessage(child.error) },\n })\n .end();\n this.childAgents.delete(agentId);\n }\n }\n\n end(args: AgentToolEndArgs): void {\n this.endOpenChildren();\n const redactedResult = this.run.redactOutputValue(args.result);\n const redactedStructured = this.run.redactOutputValue(args.structuredResult);\n const attributes: Parameters<LangfuseTool[\"update\"]>[0] = {\n output: redactedResult,\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped: args.skipped,\n ...(redactedStructured !== undefined ? { structuredResult: redactedStructured } : {}),\n },\n level: args.skipped ? \"WARNING\" : \"DEFAULT\",\n };\n if (args.skipped) {\n attributes.statusMessage = \"Tool call skipped by hook\";\n }\n this.tool.update(attributes).end();\n }\n\n error(args: AgentToolErrorArgs): void {\n this.endOpenChildren();\n this.tool\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(args.error),\n output: { error: errorMessage(args.error) },\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n },\n })\n .end();\n }\n\n private childAgent(\n agentId: string,\n agentName: string | undefined,\n args: AgentToolStartArgs,\n ): LangfuseAgent {\n const existing = this.childAgents.get(agentId);\n if (existing !== undefined) {\n return existing;\n }\n const agent = this.tool.startObservation(\n `${agentLabel(agentId, agentName)}.run`,\n {\n metadata: childMetadata(args, agentId, agentName, args.turn),\n },\n { asType: \"agent\" },\n );\n this.childAgents.set(agentId, agent);\n return agent;\n }\n\n private findChildTool(\n agentId: string,\n toolName: string,\n toolCallId: string | undefined,\n ): (typeof this.childTools)[number] | undefined {\n for (let index = this.childTools.length - 1; index >= 0; index -= 1) {\n const childTool = this.childTools[index];\n if (\n childTool === undefined ||\n childTool.ended ||\n childTool.agentId !== agentId ||\n childTool.toolName !== toolName\n ) {\n continue;\n }\n if (toolCallId === undefined || childTool.toolCallId === toolCallId) {\n return childTool;\n }\n }\n return undefined;\n }\n\n private endOpenChildren(): void {\n for (const generation of this.childGenerations.values()) {\n generation.end();\n }\n this.childGenerations.clear();\n for (const tool of this.childTools) {\n if (!tool.ended) {\n tool.tool.end();\n tool.ended = true;\n }\n }\n for (const agent of this.childAgents.values()) {\n agent.end();\n }\n this.childAgents.clear();\n }\n}\n"],"mappings":"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","names":["buildAuthHeader","readErrorBody","buildScoreBody"]}
|
|
1
|
+
{"version":3,"sources":["../src/helpers.ts","../src/config.ts","../src/scoring.ts","../src/dataset-client.ts","../src/eval-reporter.ts","../src/experiment-runner.ts","../src/prompt-client.ts","../src/redaction.ts","../src/tracing.ts"],"sourcesContent":["import type { Message } from \"@anvia/core/completion\";\nimport type {\n AgentGenerationEndArgs,\n AgentGenerationStartArgs,\n AgentToolStartArgs,\n} from \"@anvia/core/observability\";\n\nexport function modelInputMessage(message: Message): Message {\n if (message.metadata === undefined) {\n return message;\n }\n const result: Message = { ...message };\n delete result.metadata;\n return result;\n}\n\nexport function modelInputMessages(messages: Message[]): Message[] {\n return messages.map(modelInputMessage);\n}\n\nexport function modelParameters(\n request: AgentGenerationStartArgs[\"request\"],\n): Record<string, string | number> {\n const params: Record<string, string | number> = {};\n if (request.temperature !== undefined) params.temperature = request.temperature;\n if (request.maxTokens !== undefined) params.maxTokens = request.maxTokens;\n if (request.toolChoice !== undefined) {\n params.toolChoice =\n typeof request.toolChoice === \"string\" ? request.toolChoice : request.toolChoice.name;\n }\n return params;\n}\n\nexport function usageDetails(\n usage: AgentGenerationEndArgs[\"response\"][\"usage\"],\n): Record<string, number> {\n return {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n cachedInputTokens: usage.cachedInputTokens,\n cacheCreationInputTokens: usage.cacheCreationInputTokens,\n };\n}\n\nexport function usageDetailsFromRecord(usage: Record<string, unknown>): Record<string, number> {\n return {\n inputTokens: numberValue(usage.inputTokens) ?? 0,\n outputTokens: numberValue(usage.outputTokens) ?? 0,\n totalTokens:\n numberValue(usage.totalTokens) ??\n (numberValue(usage.inputTokens) ?? 0) + (numberValue(usage.outputTokens) ?? 0),\n cachedInputTokens: numberValue(usage.cachedInputTokens) ?? 0,\n cacheCreationInputTokens: numberValue(usage.cacheCreationInputTokens) ?? 0,\n };\n}\n\nexport function childMetadata(\n args: AgentToolStartArgs,\n agentId: string,\n agentName: string | undefined,\n childTurn: number,\n): Record<string, unknown> {\n return {\n source: \"agent_tool_event\",\n childAgentId: agentId,\n childAgentName: agentName,\n childTurn,\n parentToolName: args.toolName,\n parentInternalCallId: args.internalCallId,\n parentToolCallId: args.toolCallId,\n };\n}\n\nexport function generationKey(agentId: string, turn: number): string {\n return `${agentId}:${turn}`;\n}\n\nexport function agentLabel(agentId: string, agentName: string | undefined): string {\n return (agentName ?? agentId).replaceAll(/\\s+/g, \"_\");\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nexport function emptyToUndefined(value: string | undefined): string | undefined {\n return value === undefined || value.length === 0 ? undefined : value;\n}\n\n/**\n * Resolve an option value: prefer the explicit option, fall back to the\n * env var, and treat empty strings as missing. Empty env vars are common\n * when a process inherits a process manager that injects blank values.\n */\nexport function resolveOption(\n option: string | undefined,\n envVar: string | undefined,\n): string | undefined {\n return emptyToUndefined(option) ?? emptyToUndefined(envVar);\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { emptyToUndefined } from \"./helpers.js\";\n\nexport const langfuseResolvedConfigSymbol: unique symbol = Symbol.for(\n \"@anvia/langfuse.resolvedConfig\",\n);\n\nexport type LangfuseResolvedConfig = {\n publicKey?: string | undefined;\n secretKey?: string | undefined;\n baseUrl: string;\n environment?: string | undefined;\n release?: string | undefined;\n serviceName?: string | undefined;\n timeoutMs: number;\n};\n\nexport type LangfuseConfigOptions = {\n publicKey?: string | undefined;\n secretKey?: string | undefined;\n baseUrl?: string | undefined;\n environment?: string | undefined;\n release?: string | undefined;\n serviceName?: string | undefined;\n timeoutMs?: number | undefined;\n};\n\nexport type LangfuseResolvedConfigCarrier = {\n [langfuseResolvedConfigSymbol]?: LangfuseResolvedConfig | undefined;\n};\n\nexport function resolveLangfuseConfig(\n options: LangfuseConfigOptions = {},\n fallback?: Partial<LangfuseResolvedConfig> | undefined,\n): LangfuseResolvedConfig {\n return {\n publicKey: resolveStringOption(\n options.publicKey,\n fallback?.publicKey,\n process.env.LANGFUSE_PUBLIC_KEY,\n ),\n secretKey: resolveStringOption(\n options.secretKey,\n fallback?.secretKey,\n process.env.LANGFUSE_SECRET_KEY,\n ),\n baseUrl:\n resolveStringOption(options.baseUrl, fallback?.baseUrl, process.env.LANGFUSE_BASE_URL) ??\n \"https://cloud.langfuse.com\",\n environment: resolveStringOption(\n options.environment,\n fallback?.environment,\n process.env.LANGFUSE_TRACING_ENVIRONMENT,\n ),\n release: resolveStringOption(options.release, fallback?.release, process.env.LANGFUSE_RELEASE),\n serviceName: resolveStringOption(\n options.serviceName,\n fallback?.serviceName,\n process.env.LANGFUSE_SERVICE_NAME,\n ),\n timeoutMs: options.timeoutMs ?? fallback?.timeoutMs ?? 30_000,\n };\n}\n\nexport function getResolvedLangfuseConfig(value: unknown): LangfuseResolvedConfig | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n return (value as LangfuseResolvedConfigCarrier)[langfuseResolvedConfigSymbol];\n}\n\nfunction resolveStringOption(\n option: string | undefined,\n fallback: string | undefined,\n envVar: string | undefined,\n): string | undefined {\n return emptyToUndefined(option) ?? emptyToUndefined(fallback) ?? emptyToUndefined(envVar);\n}\n","import type { LangfuseScoreArgs } from \"./types.js\";\n\nexport class LangfuseScoreError extends Error {\n readonly scores: LangfuseScoreArgs[];\n override readonly cause?: unknown;\n\n constructor(message: string, scores: LangfuseScoreArgs[], cause?: unknown) {\n super(message);\n this.name = \"LangfuseScoreError\";\n this.scores = scores;\n if (cause !== undefined) {\n this.cause = cause;\n }\n }\n}\n\nexport type ScoreQueueOptions = {\n baseUrl: string;\n publicKey: string;\n secretKey: string;\n timeoutMs: number;\n batchSize: number;\n flushIntervalMs: number;\n maxRetries: number;\n fetchImpl?: typeof fetch;\n sleep?: (ms: number) => Promise<void>;\n setTimer?: (handler: () => void, ms: number) => unknown;\n clearTimer?: (handle: unknown) => void;\n};\n\nconst defaultSleep = (ms: number): Promise<void> =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\nconst defaultSetTimer = (handler: () => void, ms: number): unknown => setTimeout(handler, ms);\nconst defaultClearTimer = (handle: unknown): void => {\n clearTimeout(handle as ReturnType<typeof setTimeout>);\n};\n\nexport function computeBackoff(attempt: number, jitter: number = Math.random()): number {\n const base = 200;\n const exponential = base * 2 ** attempt;\n const capped = Math.min(exponential, 5_000);\n const jitterAmount = capped * 0.25 * (jitter * 2 - 1);\n return Math.max(0, Math.round(capped + jitterAmount));\n}\n\nexport class ScoreQueue {\n private readonly pending: LangfuseScoreArgs[] = [];\n private timer: unknown = null;\n private flushing: Promise<void> | null = null;\n private readonly baseUrl: string;\n private readonly publicKey: string;\n private readonly secretKey: string;\n private readonly timeoutMs: number;\n private readonly batchSize: number;\n private readonly flushIntervalMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: typeof fetch;\n private readonly sleep: (ms: number) => Promise<void>;\n private readonly setTimer: (handler: () => void, ms: number) => unknown;\n private readonly clearTimer: (handle: unknown) => void;\n\n constructor(options: ScoreQueueOptions) {\n this.baseUrl = options.baseUrl;\n this.publicKey = options.publicKey;\n this.secretKey = options.secretKey;\n this.timeoutMs = options.timeoutMs;\n this.batchSize = options.batchSize;\n this.flushIntervalMs = options.flushIntervalMs;\n this.maxRetries = options.maxRetries;\n this.fetchImpl = options.fetchImpl ?? fetch;\n this.sleep = options.sleep ?? defaultSleep;\n this.setTimer = options.setTimer ?? defaultSetTimer;\n this.clearTimer = options.clearTimer ?? defaultClearTimer;\n }\n\n enqueue(score: LangfuseScoreArgs): void {\n this.pending.push(score);\n if (this.pending.length >= this.batchSize) {\n void this.flush();\n return;\n }\n this.scheduleTimer();\n }\n\n depth(): number {\n return this.pending.length;\n }\n\n async flush(): Promise<void> {\n if (this.flushing !== null) {\n await this.flushing;\n return;\n }\n if (this.pending.length === 0) {\n this.clearScheduledTimer();\n return;\n }\n const batch = this.pending.splice(0, this.pending.length);\n this.clearScheduledTimer();\n this.flushing = this.sendBatch(batch).finally(() => {\n this.flushing = null;\n });\n await this.flushing;\n }\n\n async shutdown(): Promise<void> {\n this.clearScheduledTimer();\n await this.flush();\n }\n\n private scheduleTimer(): void {\n if (this.timer !== null) {\n return;\n }\n this.timer = this.setTimer(() => {\n this.timer = null;\n void this.flush();\n }, this.flushIntervalMs);\n }\n\n private clearScheduledTimer(): void {\n if (this.timer !== null) {\n this.clearTimer(this.timer);\n this.timer = null;\n }\n }\n\n private async sendBatch(scores: LangfuseScoreArgs[]): Promise<void> {\n const body = scores.map((score) => buildScoreBody(score));\n let lastError: unknown;\n for (let attempt = 0; attempt < this.maxRetries; attempt += 1) {\n try {\n const response = await this.fetchImpl(`${this.baseUrl}/api/public/scores`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.publicKey}:${this.secretKey}`).toString(\"base64\")}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n if (response.ok) {\n return;\n }\n if (response.status === 429 || response.status >= 500) {\n lastError = new Error(`Langfuse score batch failed with HTTP ${response.status}`);\n } else {\n const text = await response.text();\n throw new LangfuseScoreError(\n `Langfuse score batch failed with HTTP ${response.status}: ${text}`,\n scores,\n );\n }\n } catch (error) {\n if (error instanceof LangfuseScoreError) {\n throw error;\n }\n lastError = error;\n }\n if (attempt < this.maxRetries - 1) {\n await this.sleep(computeBackoff(attempt));\n }\n }\n throw new LangfuseScoreError(\n `Langfuse score batch failed after ${this.maxRetries} attempts`,\n scores,\n lastError,\n );\n }\n}\n\nfunction buildScoreBody(score: LangfuseScoreArgs): Record<string, unknown> {\n const body: Record<string, unknown> = {\n traceId: score.traceId,\n name: score.name,\n value: score.value,\n };\n if (score.observationId !== undefined) body.observationId = score.observationId;\n if (score.dataType !== undefined) body.dataType = score.dataType;\n if (score.comment !== undefined) body.comment = score.comment;\n if (score.metadata !== undefined) body.metadata = score.metadata;\n const configId = score.configId ?? score.scoreConfigId;\n if (configId !== undefined) body.configId = configId;\n if (score.environment !== undefined) body.environment = score.environment;\n if (score.timestamp !== undefined) {\n body.timestamp =\n score.timestamp instanceof Date ? score.timestamp.toISOString() : score.timestamp;\n }\n return body;\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport { getResolvedLangfuseConfig, resolveLangfuseConfig } from \"./config.js\";\nimport { LangfuseScoreError } from \"./scoring.js\";\nimport type {\n LangfuseDataset,\n LangfuseDatasetClient,\n LangfuseDatasetClientOptions,\n LangfuseDatasetItem,\n LangfuseRunExperimentOptions,\n LangfuseRunExperimentResult,\n LangfuseRunItemError,\n LangfuseTracing,\n} from \"./types.js\";\n\nconst DEFAULT_PAGE_SIZE = 50;\nconst MAX_PAGINATION_PAGES = 100;\n\nexport function createLangfuseDatasetClient(\n tracing: Pick<LangfuseTracing, \"score\">,\n options: LangfuseDatasetClientOptions = {},\n): LangfuseDatasetClient {\n const resolvedConfig = resolveLangfuseConfig(options, getResolvedLangfuseConfig(tracing));\n const baseUrl = resolvedConfig.baseUrl;\n const publicKey = resolvedConfig.publicKey;\n const secretKey = resolvedConfig.secretKey;\n const pageSize = options.pageSize ?? DEFAULT_PAGE_SIZE;\n const timeoutMs = resolvedConfig.timeoutMs;\n\n const fetchImpl: typeof fetch = (...args) => {\n const init: RequestInit = {};\n Object.assign(init, args[1]);\n init.signal = AbortSignal.timeout(timeoutMs);\n return fetch(args[0], init);\n };\n\n const authHeader = buildAuthHeader(publicKey, secretKey);\n\n async function request<T>(input: string, init: RequestInit): Promise<T> {\n const headers: Record<string, string> = {};\n Object.assign(headers, init.headers, authHeader);\n headers[\"Content-Type\"] = \"application/json\";\n const response = await fetchImpl(input, {\n ...init,\n headers,\n });\n if (!response.ok) {\n const body = await readErrorBody(response);\n throw new LangfuseScoreError(\n `Langfuse request failed: ${response.status} ${response.statusText}: ${body}`,\n [],\n );\n }\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n return {\n async createDataset(dataset) {\n const url = `${baseUrl}/api/public/datasets/${encodeURIComponent(dataset.name)}`;\n await request<unknown>(url, {\n method: \"PUT\",\n body: JSON.stringify({\n name: dataset.name,\n description: dataset.description,\n metadata: dataset.metadata,\n }),\n });\n const result: LangfuseDataset<unknown, unknown> = {\n name: dataset.name,\n items: [],\n };\n if (dataset.description !== undefined) result.description = dataset.description;\n if (dataset.metadata !== undefined) result.metadata = dataset.metadata;\n return result;\n },\n\n async getDataset<Input, Expected>(name: string): Promise<LangfuseDataset<Input, Expected>> {\n const items: LangfuseDatasetItem<Input, Expected>[] = [];\n let description: string | undefined;\n let metadata: Record<string, JsonValue | undefined> | undefined;\n for (let page = 1; page <= MAX_PAGINATION_PAGES; page += 1) {\n const url = new URL(`${baseUrl}/api/public/datasets/${encodeURIComponent(name)}`);\n url.searchParams.set(\"page\", String(page));\n url.searchParams.set(\"limit\", String(pageSize));\n const response = await request<{\n name: string;\n description?: string | undefined;\n metadata?: Record<string, JsonValue | undefined> | undefined;\n items: Array<{\n id: string;\n input: Input;\n expected?: Expected | undefined;\n metadata?: Record<string, JsonValue | undefined> | undefined;\n }>;\n meta?: { totalPages?: number | undefined };\n }>(url.toString(), { method: \"GET\" });\n if (description === undefined && response.description !== undefined) {\n description = response.description;\n }\n if (metadata === undefined && response.metadata !== undefined) {\n metadata = response.metadata;\n }\n for (const item of response.items) {\n const normalized: LangfuseDatasetItem<Input, Expected> = {\n id: item.id,\n input: item.input,\n };\n if (item.expected !== undefined) normalized.expected = item.expected;\n if (item.metadata !== undefined) normalized.metadata = item.metadata;\n items.push(normalized);\n }\n const totalPages = response.meta?.totalPages;\n if (totalPages !== undefined && page >= totalPages) {\n break;\n }\n if (totalPages === undefined && response.items.length < pageSize) {\n break;\n }\n }\n const dataset: LangfuseDataset<Input, Expected> = {\n name,\n items,\n };\n if (description !== undefined) dataset.description = description;\n if (metadata !== undefined) dataset.metadata = metadata;\n return dataset;\n },\n\n async upsertItems<Input, Expected>(\n name: string,\n items: LangfuseDatasetItem<Input, Expected>[],\n ): Promise<void> {\n const url = `${baseUrl}/api/public/datasets/${encodeURIComponent(name)}/items`;\n await request<unknown>(url, {\n method: \"POST\",\n body: JSON.stringify({ items }),\n });\n },\n\n async runExperiment<Input, Output, Expected>(\n opts: LangfuseRunExperimentOptions<Input, Output, Expected>,\n ): Promise<LangfuseRunExperimentResult> {\n let items = opts.items;\n if (items === undefined) {\n const dataset = await this.getDataset<Input, Expected>(opts.datasetName);\n items = dataset.items;\n }\n if (items === undefined || items.length === 0) {\n return {\n runName: opts.runName,\n datasetName: opts.datasetName,\n posted: 0,\n errors: [],\n };\n }\n const datasetItemRuns: Array<{\n datasetItemId: string;\n traceId?: string;\n observationId?: string;\n output: JsonValue;\n }> = [];\n const errors: LangfuseRunItemError[] = [];\n for (const item of items) {\n try {\n const result = await opts.run(item);\n const datasetItemRun: (typeof datasetItemRuns)[number] = {\n datasetItemId: item.id,\n output: toJsonValue(result.output),\n };\n if (result.trace?.traceId !== undefined) datasetItemRun.traceId = result.trace.traceId;\n if (result.trace?.observationId !== undefined) {\n datasetItemRun.observationId = result.trace.observationId;\n }\n datasetItemRuns.push(datasetItemRun);\n } catch (error) {\n errors.push({ itemId: item.id, error });\n }\n }\n const url = `${baseUrl}/api/public/dataset-run-items`;\n const body: Record<string, unknown> = {\n runName: opts.runName,\n datasetItemRuns,\n };\n if (opts.description !== undefined) body.runDescription = opts.description;\n if (opts.metadata !== undefined) body.metadata = opts.metadata;\n await request<unknown>(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n return {\n runName: opts.runName,\n datasetName: opts.datasetName,\n posted: datasetItemRuns.length,\n errors,\n };\n },\n };\n}\n\nfunction buildAuthHeader(\n publicKey: string | undefined,\n secretKey: string | undefined,\n): Record<string, string> {\n if (publicKey === undefined || secretKey === undefined) {\n return {};\n }\n const encoded = Buffer.from(`${publicKey}:${secretKey}`).toString(\"base64\");\n return { Authorization: `Basic ${encoded}` };\n}\n\nasync function readErrorBody(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (value === null) return null;\n if (typeof value === \"string\" || typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value;\n try {\n return JSON.parse(JSON.stringify(value)) as JsonValue;\n } catch {\n return String(value);\n }\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport type { EvalOutcome, EvalReportArgs, EvalReporter } from \"@anvia/core/evals\";\nimport type { AgentTraceInfo } from \"@anvia/core/observability\";\nimport type {\n LangfuseEvalReporterOptions,\n LangfuseScoreArgs,\n LangfuseScoreDataType,\n LangfuseTracing,\n} from \"./types.js\";\n\nconst DEFAULT_TRUNCATE_BYTES = 2048;\n\nexport function createLangfuseEvalReporter<Input = unknown, Output = unknown, Expected = unknown>(\n tracing: Pick<LangfuseTracing, \"score\">,\n options: LangfuseEvalReporterOptions = {},\n): EvalReporter<Input, Output, Expected> {\n const onMissingTrace = options.onMissingTrace ?? (options.strict === true ? \"throw\" : \"ignore\");\n const truncateAt = options.truncateInputAt ?? DEFAULT_TRUNCATE_BYTES;\n const includeMessages = options.includeMessages ?? true;\n\n return {\n async report(args) {\n if (args.outcome.outcome === \"invalid\" && options.publishInvalid !== true) {\n return;\n }\n\n const trace = traceFromEvalReport(args);\n if (trace?.traceId === undefined || trace.traceId.length === 0) {\n if (onMissingTrace === \"throw\") {\n throw new Error(\"Langfuse eval reporter requires traceId\");\n }\n if (onMissingTrace === \"warn\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"[anvia/langfuse] eval reporter dropped score because no traceId was found\",\n { caseId: args.case.id, metric: args.metric.name },\n );\n }\n return;\n }\n\n const scoreValue = buildScoreValue(args.outcome, args.metric.dataType);\n const metadata = buildScoreMetadata({\n args,\n truncateAt,\n includeMessages,\n });\n const comment = scoreComment(args.outcome);\n const configId = resolveConfigId(args.metric);\n\n const score: LangfuseScoreArgs = {\n traceId: trace.traceId,\n name: args.metric.name,\n value: scoreValue,\n };\n if (trace.observationId !== undefined) score.observationId = trace.observationId;\n if (args.metric.dataType !== undefined) score.dataType = args.metric.dataType;\n if (configId !== undefined) score.configId = configId;\n if (comment !== undefined) score.comment = comment;\n if (metadata !== undefined) score.metadata = metadata;\n await tracing.score(score);\n },\n };\n}\n\nfunction resolveConfigId(metric: {\n scoreConfigId?: string | undefined;\n configId?: string | undefined;\n}): string | undefined {\n return metric.configId ?? metric.scoreConfigId;\n}\n\nfunction buildScoreMetadata<Input, Output, Score, Expected>({\n args,\n truncateAt,\n includeMessages,\n}: {\n args: EvalReportArgs<Input, Output, Score, Expected>;\n truncateAt: number;\n includeMessages: boolean;\n}): Record<string, JsonValue | undefined> | undefined {\n const merged: Record<string, JsonValue | undefined> = {\n suiteName: args.suiteName,\n caseId: args.case.id,\n outcome: args.outcome.outcome,\n };\n mergeMetadata(merged, args.outcome.metadata);\n mergeMetadata(merged, args.metric.metadata);\n const inputSummary = truncateValue(args.case.input, truncateAt);\n if (inputSummary !== undefined) {\n merged.caseInputSummary = inputSummary;\n }\n if (args.case.expected !== undefined) {\n const expectedSummary = truncateValue(args.case.expected, truncateAt);\n if (expectedSummary !== undefined) {\n merged.caseExpectedSummary = expectedSummary;\n }\n }\n if (includeMessages) {\n const messages = readMessages(args.output);\n if (messages !== undefined) {\n merged.messages = messages;\n }\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeMetadata(\n target: Record<string, JsonValue | undefined>,\n source: Record<string, JsonValue | undefined> | undefined,\n): void {\n if (source === undefined) return;\n for (const [key, value] of Object.entries(source)) {\n target[key] = value;\n }\n}\n\nfunction truncateValue(value: unknown, maxBytes: number): string | undefined {\n if (value === undefined) return undefined;\n let serialized: string;\n try {\n serialized = typeof value === \"string\" ? value : JSON.stringify(value);\n } catch {\n return undefined;\n }\n if (serialized === undefined) return undefined;\n const encoder = new TextEncoder();\n const bytes = encoder.encode(serialized);\n if (bytes.length <= maxBytes) {\n return serialized;\n }\n // Truncate at byte boundary by slicing, then append the marker.\n const truncatedBytes = bytes.subarray(0, maxBytes);\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n return `${decoder.decode(truncatedBytes)}<truncated>`;\n}\n\nfunction readMessages(output: unknown): JsonValue[] | undefined {\n if (typeof output !== \"object\" || output === null) return undefined;\n const messages = (output as { messages?: unknown }).messages;\n if (!Array.isArray(messages)) return undefined;\n const serialized: JsonValue[] = [];\n for (const entry of messages) {\n if (entry === null || typeof entry !== \"object\") return undefined;\n try {\n // Round-trip via JSON to make sure we never put non-JSON values\n // into a JsonValue-typed slot.\n serialized.push(JSON.parse(JSON.stringify(entry)) as JsonValue);\n } catch {\n return undefined;\n }\n }\n return serialized;\n}\n\nfunction buildScoreValue(\n outcome: EvalOutcome,\n dataType: LangfuseScoreDataType | undefined,\n): number | string {\n if (dataType === \"CATEGORICAL\") {\n const score = (outcome as { score?: unknown }).score;\n if (typeof score === \"string\") return score;\n if (typeof score === \"number\") return String(score);\n if (typeof score === \"boolean\") return score ? \"true\" : \"false\";\n if (score === null || score === undefined) {\n return outcome.outcome === \"pass\" ? \"pass\" : outcome.outcome === \"fail\" ? \"fail\" : \"invalid\";\n }\n try {\n return JSON.stringify(score);\n } catch {\n return outcome.outcome === \"pass\" ? \"pass\" : outcome.outcome;\n }\n }\n if (dataType === \"BOOLEAN\") {\n const score = (outcome as { score?: unknown }).score;\n if (typeof score === \"boolean\") return score ? 1 : 0;\n if (typeof score === \"number\") return score === 0 ? 0 : 1;\n return outcome.outcome === \"pass\" ? 1 : 0;\n }\n // Numeric (default)\n if (typeof (outcome as { score?: unknown }).score === \"number\") {\n return (outcome as { score: number }).score;\n }\n if (typeof (outcome as { score?: unknown }).score === \"boolean\") {\n return (outcome as { score: boolean }).score ? 1 : 0;\n }\n if (\n typeof (outcome as { score?: unknown }).score === \"object\" &&\n (outcome as { score?: unknown }).score !== null &&\n \"score\" in ((outcome as { score?: unknown }).score as object) &&\n typeof ((outcome as { score?: unknown }).score as { score?: unknown }).score === \"number\"\n ) {\n return (outcome as { score: { score: number } }).score.score;\n }\n return outcome.outcome === \"pass\" ? 1 : 0;\n}\n\nfunction scoreComment(outcome: EvalOutcome): string | undefined {\n return outcome.comment ?? (outcome.outcome === \"invalid\" ? outcome.reason : undefined);\n}\n\nfunction traceFromEvalReport<Input, Output, Expected>(\n args: EvalReportArgs<Input, Output, unknown, Expected>,\n): AgentTraceInfo | undefined {\n const outputTrace = traceFromOutput(args.output);\n if (outputTrace !== undefined) {\n return outputTrace;\n }\n const inputTrace = traceFromInput(args.case.input);\n if (inputTrace !== undefined) {\n return inputTrace;\n }\n const traceId = args.case.metadata?.traceId;\n const observationId = args.case.metadata?.observationId;\n if (typeof traceId !== \"string\") {\n return undefined;\n }\n const trace: AgentTraceInfo = { traceId };\n if (typeof observationId === \"string\") trace.observationId = observationId;\n return trace;\n}\n\nfunction traceFromOutput(output: unknown): AgentTraceInfo | undefined {\n if (typeof output !== \"object\" || output === null || !(\"trace\" in output)) {\n return undefined;\n }\n return readTrace((output as { trace?: unknown }).trace);\n}\n\nfunction traceFromInput(input: unknown): AgentTraceInfo | undefined {\n if (typeof input !== \"object\" || input === null || !(\"trace\" in input)) {\n return undefined;\n }\n return readTrace((input as { trace?: unknown }).trace);\n}\n\nfunction readTrace(trace: unknown): AgentTraceInfo | undefined {\n if (typeof trace !== \"object\" || trace === null) {\n return undefined;\n }\n const traceId = (trace as { traceId?: unknown }).traceId;\n const observationId = (trace as { observationId?: unknown }).observationId;\n if (typeof traceId !== \"string\") {\n return undefined;\n }\n const result: AgentTraceInfo = { traceId };\n if (typeof observationId === \"string\") result.observationId = observationId;\n return result;\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport type { EvalCaseResult, EvalSuiteResult, RunEvalSuiteOptions } from \"@anvia/core/evals\";\nimport { runEvalSuite } from \"@anvia/core/evals\";\nimport { createLangfuseDatasetClient } from \"./dataset-client.js\";\nimport type {\n LangfuseDatasetClient,\n LangfuseDatasetClientOptions,\n LangfuseDatasetItem,\n LangfuseRunExperimentOptions,\n LangfuseRunExperimentResult,\n LangfuseTracing,\n} from \"./types.js\";\n\nexport type RunEvalAsExperimentOptions<Input, Output, Expected = unknown> = Omit<\n LangfuseRunExperimentOptions<Input, Output, Expected>,\n \"items\" | \"run\"\n> & {\n tracing: Pick<LangfuseTracing, \"score\">;\n client?: LangfuseDatasetClient;\n pageSize?: number | undefined;\n timeoutMs?: number | undefined;\n};\n\nexport type RunEvalAsExperimentResult<Input, Output, Expected = unknown> = {\n suite: EvalSuiteResult<Input, Output, Expected>;\n datasetRun: LangfuseRunExperimentResult;\n};\n\nexport async function runEvalAsExperiment<Input, Output, Expected = unknown>(\n evalOptions: RunEvalSuiteOptions<Input, Output, Expected>,\n experimentOptions: RunEvalAsExperimentOptions<Input, Output, Expected>,\n): Promise<RunEvalAsExperimentResult<Input, Output, Expected>> {\n const clientOptions: LangfuseDatasetClientOptions = {};\n if (experimentOptions.pageSize !== undefined) clientOptions.pageSize = experimentOptions.pageSize;\n if (experimentOptions.timeoutMs !== undefined)\n clientOptions.timeoutMs = experimentOptions.timeoutMs;\n const client =\n experimentOptions.client ??\n createLangfuseDatasetClient(experimentOptions.tracing, clientOptions);\n\n const suite = await runEvalSuite(evalOptions);\n\n const items: LangfuseDatasetItem<Input, Expected>[] = evalOptions.cases.map((testCase) => {\n const item: LangfuseDatasetItem<Input, Expected> = {\n id: testCase.id,\n input: testCase.input,\n };\n if (testCase.expected !== undefined) {\n item.expected = testCase.expected;\n }\n if (testCase.metadata !== undefined) {\n item.metadata = testCase.metadata as Record<string, JsonValue | undefined>;\n }\n return item;\n });\n\n const datasetItemMap = new Map<string, EvalCaseResult<Input, Output, Expected>>();\n for (const result of suite.results) {\n datasetItemMap.set(result.case.id, result);\n }\n\n const runOptions: LangfuseRunExperimentOptions<Input, Output, Expected> = {\n datasetName: experimentOptions.datasetName,\n runName: experimentOptions.runName,\n items,\n run: (item) => {\n const result = datasetItemMap.get(item.id);\n if (result === undefined) {\n return {\n output: undefined as Output,\n trace: undefined,\n };\n }\n const output = (result.output ?? undefined) as Output;\n const trace = readTraceFromOutput(result.output);\n return { output, trace };\n },\n };\n if (experimentOptions.description !== undefined) {\n runOptions.description = experimentOptions.description;\n }\n if (experimentOptions.metadata !== undefined) runOptions.metadata = experimentOptions.metadata;\n const datasetRun = await client.runExperiment<Input, Output, Expected>(runOptions);\n\n return { suite, datasetRun };\n}\n\nfunction readTraceFromOutput(\n output: unknown,\n): { traceId: string; observationId?: string | undefined } | undefined {\n if (typeof output !== \"object\" || output === null || !(\"trace\" in output)) {\n return undefined;\n }\n const trace = (output as { trace?: unknown }).trace;\n if (typeof trace !== \"object\" || trace === null) {\n return undefined;\n }\n const traceId = (trace as { traceId?: unknown }).traceId;\n if (typeof traceId !== \"string\") {\n return undefined;\n }\n const observationId = (trace as { observationId?: unknown }).observationId;\n if (typeof observationId === \"string\") {\n return { traceId, observationId };\n }\n return { traceId };\n}\n","import { getResolvedLangfuseConfig, resolveLangfuseConfig } from \"./config.js\";\nimport { LangfuseScoreError } from \"./scoring.js\";\nimport type {\n LangfuseChatMessage,\n LangfusePrompt,\n LangfusePromptClient,\n LangfusePromptClientOptions,\n LangfusePromptGetOptions,\n LangfuseTracing,\n} from \"./types.js\";\n\nconst DEFAULT_CACHE_TTL_MS = 60_000;\n\nexport function createLangfusePromptClient(\n tracing: Pick<LangfuseTracing, \"score\">,\n options: LangfusePromptClientOptions = {},\n): LangfusePromptClient {\n const resolvedConfig = resolveLangfuseConfig(options, getResolvedLangfuseConfig(tracing));\n const baseUrl = resolvedConfig.baseUrl;\n const publicKey = resolvedConfig.publicKey;\n const secretKey = resolvedConfig.secretKey;\n const defaultTtl = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n const timeoutMs = resolvedConfig.timeoutMs;\n\n const cache = new Map<string, { prompt: LangfusePrompt; expiresAt: number }>();\n const authHeader = buildAuthHeader(publicKey, secretKey);\n\n async function request<T>(input: string): Promise<T> {\n const response = await fetch(input, {\n method: \"GET\",\n headers: { ...authHeader },\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!response.ok) {\n const body = await readErrorBody(response);\n throw new LangfuseScoreError(\n `Langfuse request failed: ${response.status} ${response.statusText}: ${body}`,\n [],\n );\n }\n return (await response.json()) as T;\n }\n\n async function getPrompt(\n name: string,\n opts: LangfusePromptGetOptions = {},\n ): Promise<LangfusePrompt> {\n const key = `${name}::${opts.version ?? \"\"}::${opts.label ?? \"\"}`;\n const ttl = opts.cacheTtlMs ?? defaultTtl;\n if (opts.refresh !== true) {\n const cached = cache.get(key);\n if (cached !== undefined && cached.expiresAt > Date.now()) {\n return cached.prompt;\n }\n }\n const url = new URL(`${baseUrl}/api/public/v2/prompts/${encodeURIComponent(name)}`);\n if (opts.version !== undefined) {\n url.searchParams.set(\"version\", String(opts.version));\n }\n if (opts.label !== undefined) {\n url.searchParams.set(\"label\", opts.label);\n }\n const raw = await request<{\n name: string;\n version: number;\n labels?: string[];\n prompt: unknown;\n type: \"text\" | \"chat\";\n tags?: string[];\n }>(url.toString());\n const prompt: LangfusePrompt = {\n name: raw.name,\n version: raw.version,\n labels: raw.labels ?? [],\n prompt: normalizePrompt(raw.prompt, raw.type),\n type: raw.type,\n resolvedAt: new Date(),\n };\n if (raw.tags !== undefined) prompt.tags = raw.tags;\n cache.set(key, { prompt, expiresAt: Date.now() + ttl });\n return prompt;\n }\n\n function getPromptText(name: string, opts?: LangfusePromptGetOptions): Promise<string> {\n return getPrompt(name, opts).then((prompt) => {\n if (typeof prompt.prompt !== \"string\") {\n throw new Error(`Prompt ${name} is a chat prompt; expected text`);\n }\n return prompt.prompt;\n });\n }\n\n function getPromptChat(\n name: string,\n opts?: LangfusePromptGetOptions,\n ): Promise<LangfuseChatMessage[]> {\n return getPrompt(name, opts).then((prompt) => {\n if (typeof prompt.prompt === \"string\") {\n throw new Error(`Prompt ${name} is a text prompt; expected chat`);\n }\n return prompt.prompt;\n });\n }\n\n function refresh(): void {\n cache.clear();\n }\n\n return { getPrompt, getPromptText, getPromptChat, refresh };\n}\n\nfunction normalizePrompt(raw: unknown, type: \"text\" | \"chat\"): string | LangfuseChatMessage[] {\n if (type === \"text\") {\n if (typeof raw === \"string\") return raw;\n throw new Error(\"Expected text prompt to be a string\");\n }\n if (!Array.isArray(raw)) {\n throw new Error(\"Expected chat prompt to be an array of messages\");\n }\n return raw.map((entry) => {\n if (typeof entry !== \"object\" || entry === null) {\n throw new Error(\"Expected chat message to be an object\");\n }\n const role = (entry as { role?: unknown }).role;\n const content = (entry as { content?: unknown }).content;\n if (typeof content !== \"string\") {\n throw new Error(\"Expected chat message content to be a string\");\n }\n if (role !== \"system\" && role !== \"user\" && role !== \"assistant\" && role !== \"tool\") {\n throw new Error(`Unexpected chat message role: ${String(role)}`);\n }\n return { role, content };\n });\n}\n\nfunction buildAuthHeader(\n publicKey: string | undefined,\n secretKey: string | undefined,\n): Record<string, string> {\n if (publicKey === undefined || secretKey === undefined) {\n return {};\n }\n const encoded = Buffer.from(`${publicKey}:${secretKey}`).toString(\"base64\");\n return { Authorization: `Basic ${encoded}` };\n}\n\nasync function readErrorBody(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"<unreadable>\";\n }\n}\n","import type { Message } from \"@anvia/core/completion\";\n\nexport type RedactorPattern = {\n name: string;\n regex: RegExp;\n};\n\nexport type LangfuseRedactionOptions = {\n patterns?: RedactorPattern[];\n replacement?: string;\n};\n\nexport type PiiRedactor = {\n redactString(input: string): string;\n redactObject<T>(input: T): T;\n redactMessages(input: Message[]): Message[];\n patternNames(): string[];\n};\n\nconst DEFAULT_REPLACEMENT = \"[REDACTED]\";\nconst MAX_DEPTH = 16;\n\nexport function createPiiRedactor(options: LangfuseRedactionOptions = {}): PiiRedactor {\n const patterns = options.patterns ?? DEFAULT_PATTERNS;\n const replacement = options.replacement ?? DEFAULT_REPLACEMENT;\n const compiled = patterns.map((p) => ({\n name: p.name,\n regex: cloneRegex(p.regex, \"g\"),\n }));\n const patternNamesList = patterns.map((p) => p.name);\n\n function redactString(input: string): string {\n if (typeof input !== \"string\") return input;\n let out = input;\n for (const { name, regex } of compiled) {\n out = applyPattern(out, name, regex, replacement);\n }\n return out;\n }\n\n function redactObject<T>(input: T): T {\n return redactValue(input, 0, redactString) as T;\n }\n\n function redactMessages(input: Message[]): Message[] {\n return input.map((message) => redactMessage(message, redactString));\n }\n\n function patternNames(): string[] {\n return patternNamesList;\n }\n\n return { redactString, redactObject, redactMessages, patternNames };\n}\n\nexport const DEFAULT_PATTERNS: RedactorPattern[] = [\n { name: \"email\", regex: /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}/g },\n { name: \"creditCard\", regex: /\\b(?:\\d[ -]?){13,19}\\b/g },\n { name: \"ipv4\", regex: /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g },\n {\n name: \"phone\",\n regex:\n /(?<!\\d)(?:\\+\\d{1,3}[\\s.-]?)?(?:\\(\\d{2,4}\\)[\\s.-]?)?\\d{3,4}[\\s.-]?\\d{3,4}(?:[\\s.-]?\\d{3,4})?(?!\\d)/g,\n },\n { name: \"jwt\", regex: /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+/g },\n {\n name: \"apiKey\",\n regex: /\\b(?:sk|pk|api|key|token)[-_][A-Za-z0-9]{16,}\\b/gi,\n },\n];\n\nfunction applyPattern(input: string, name: string, regex: RegExp, replacement: string): string {\n if (name === \"creditCard\") {\n return redactCreditCards(input, replacement);\n }\n return input.replace(regex, replacement);\n}\n\nfunction redactCreditCards(input: string, replacement: string): string {\n let out = \"\";\n let i = 0;\n while (i < input.length) {\n const ch = input.charAt(i);\n if (/\\d/.test(ch)) {\n const { length, valid } = longestLuhnChunk(input.slice(i));\n if (valid) {\n out += replacement;\n i += length;\n continue;\n }\n }\n out += ch;\n i += 1;\n }\n return out;\n}\n\nfunction longestLuhnChunk(s: string): { length: number; valid: boolean } {\n let length = 0;\n let bestValid = 0;\n while (length < s.length && length < 40) {\n const ch = s.charAt(length);\n if (!/\\d/.test(ch) && ch !== \"-\") break;\n length += 1;\n const candidate = s.slice(0, length).replace(/\\D/g, \"\");\n if (candidate.length >= 13 && candidate.length <= 19) {\n if (startsWithKnownPrefix(candidate) && passesLuhn(candidate)) {\n bestValid = length;\n }\n }\n }\n return { length: bestValid, valid: bestValid > 0 };\n}\n\nfunction startsWithKnownPrefix(digits: string): boolean {\n if (digits.startsWith(\"4\")) return true;\n const two = digits.slice(0, 2);\n if (two === \"51\" || two === \"52\" || two === \"53\" || two === \"54\" || two === \"55\") return true;\n const four = digits.slice(0, 4);\n if (four === \"2221\" || four === \"2720\") return true;\n const twoAgain = digits.slice(0, 2);\n if (twoAgain === \"34\" || twoAgain === \"37\") return true;\n if (four === \"6011\" || twoAgain === \"65\") return true;\n return digits.startsWith(\"35\");\n}\n\nexport function passesLuhn(digits: string): boolean {\n if (!/^\\d+$/.test(digits)) return false;\n let sum = 0;\n let alt = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n const raw = digits.charCodeAt(i) - 48;\n let value = raw;\n if (alt) {\n value *= 2;\n if (value > 9) value -= 9;\n }\n sum += value;\n alt = !alt;\n }\n return sum % 10 === 0;\n}\n\nfunction cloneRegex(source: RegExp, flags: string): RegExp {\n return new RegExp(source.source, flags + source.flags.replace(/g/g, \"\"));\n}\n\nfunction redactValue(\n value: unknown,\n depth: number,\n redactStringFn: (s: string) => string,\n): unknown {\n if (depth > MAX_DEPTH) return value;\n if (typeof value === \"string\") return redactStringFn(value);\n if (Array.isArray(value))\n return value.map((entry) => redactValue(entry, depth + 1, redactStringFn));\n if (value !== null && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n out[key] = redactValue(entry, depth + 1, redactStringFn);\n }\n return out;\n }\n return value;\n}\n\nfunction redactMessage(message: Message, redactStringFn: (s: string) => string): Message {\n if (!Array.isArray(message.content)) return message;\n const newContent = message.content.map((part) => {\n if (part === null || typeof part !== \"object\") return part;\n const rec = part as Record<string, unknown>;\n if (rec.type === \"text\" && typeof rec.text === \"string\") {\n return { ...part, text: redactStringFn(rec.text) };\n }\n return part;\n });\n return { ...message, content: newContent as never };\n}\n","import { type Message, textFromAssistantContent } from \"@anvia/core/completion\";\nimport type {\n AgentGenerationEndArgs,\n AgentGenerationErrorArgs,\n AgentGenerationObserver,\n AgentGenerationStartArgs,\n AgentGenerationUpdateArgs,\n AgentRunEndArgs,\n AgentRunErrorArgs,\n AgentRunEventArgs,\n AgentRunObserver,\n AgentRunPromptRef,\n AgentRunStartArgs,\n AgentToolEndArgs,\n AgentToolErrorArgs,\n AgentToolObserver,\n AgentToolStartArgs,\n AgentToolStreamEventArgs,\n AgentTraceInfo,\n} from \"@anvia/core/observability\";\nimport { LangfuseSpanProcessor } from \"@langfuse/otel\";\nimport {\n type LangfuseAgent,\n type LangfuseGeneration,\n LangfuseOtelSpanAttributes,\n type LangfuseSpan,\n type LangfuseTool,\n startObservation,\n} from \"@langfuse/tracing\";\nimport { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport { SEMRESATTRS_SERVICE_NAME } from \"@opentelemetry/semantic-conventions\";\nimport {\n type LangfuseResolvedConfig,\n langfuseResolvedConfigSymbol,\n resolveLangfuseConfig,\n} from \"./config.js\";\nimport {\n agentLabel,\n childMetadata,\n errorMessage,\n generationKey,\n isRecord,\n modelInputMessage,\n modelInputMessages,\n modelParameters,\n usageDetails,\n usageDetailsFromRecord,\n} from \"./helpers.js\";\nimport { createPiiRedactor, type PiiRedactor } from \"./redaction.js\";\nimport { ScoreQueue } from \"./scoring.js\";\nimport type {\n LangfuseRedactionMode,\n LangfuseScoreArgs,\n LangfuseTraceHandle,\n LangfuseTracing,\n LangfuseTracingOptions,\n} from \"./types.js\";\n\nexport const langfuse = {\n create(options: LangfuseTracingOptions = {}): LangfuseTracing {\n return new LangfuseAgentObserver(options);\n },\n};\n\nclass LangfuseAgentObserver implements LangfuseTracing {\n private readonly processor: LangfuseSpanProcessor;\n private readonly sdk: NodeSDK;\n readonly [langfuseResolvedConfigSymbol]: LangfuseResolvedConfig;\n private readonly publicKey: string | undefined;\n private readonly secretKey: string | undefined;\n private readonly baseUrl: string;\n private readonly serviceName: string | undefined;\n private readonly timeoutMs: number;\n private readonly queue: ScoreQueue | null;\n private currentHandle: LangfuseTraceHandle | undefined;\n private readonly redactor: PiiRedactor | undefined;\n private readonly redactInputs: LangfuseRedactionMode | undefined;\n private readonly redactOutputs: LangfuseRedactionMode | undefined;\n\n constructor(options: LangfuseTracingOptions) {\n const resolvedConfig = resolveLangfuseConfig(options);\n this[langfuseResolvedConfigSymbol] = resolvedConfig;\n this.publicKey = resolvedConfig.publicKey;\n this.secretKey = resolvedConfig.secretKey;\n this.baseUrl = resolvedConfig.baseUrl;\n this.serviceName = resolvedConfig.serviceName;\n this.timeoutMs = resolvedConfig.timeoutMs;\n const processorOptions: ConstructorParameters<typeof LangfuseSpanProcessor>[0] = {\n baseUrl: this.baseUrl,\n };\n if (this.publicKey !== undefined) processorOptions.publicKey = this.publicKey;\n if (this.secretKey !== undefined) processorOptions.secretKey = this.secretKey;\n if (resolvedConfig.environment !== undefined) {\n processorOptions.environment = resolvedConfig.environment;\n }\n if (resolvedConfig.release !== undefined) processorOptions.release = resolvedConfig.release;\n this.processor = new LangfuseSpanProcessor(processorOptions);\n const sdkOptions: ConstructorParameters<typeof NodeSDK>[0] = {\n spanProcessors: [this.processor],\n };\n if (this.serviceName !== undefined) {\n sdkOptions.resource = resourceFromAttributes({\n [SEMRESATTRS_SERVICE_NAME]: this.serviceName,\n });\n }\n this.sdk = new NodeSDK(sdkOptions);\n this.sdk.start();\n const batchSize = options.scoreBatchSize ?? 0;\n this.queue =\n batchSize > 0 && this.publicKey !== undefined && this.secretKey !== undefined\n ? new ScoreQueue({\n baseUrl: this.baseUrl,\n publicKey: this.publicKey,\n secretKey: this.secretKey,\n timeoutMs: this.timeoutMs,\n batchSize,\n flushIntervalMs: options.scoreFlushIntervalMs ?? 250,\n maxRetries: options.scoreMaxRetries ?? 3,\n })\n : null;\n this.redactInputs = options.redactInputs;\n this.redactOutputs = options.redactOutputs;\n this.redactor =\n options.redactInputs !== undefined || options.redactOutputs !== undefined\n ? createPiiRedactor(options.redaction)\n : undefined;\n }\n\n async startRun(args: AgentRunStartArgs): Promise<AgentRunObserver> {\n const traceId = args.trace?.traceId;\n const redactedInput = this.maybeRedactInput({\n prompt: args.prompt,\n history: args.history,\n });\n const metadata: Record<string, unknown> = {\n agentName: args.agentName,\n agentDescription: args.agentDescription,\n maxTurns: args.maxTurns,\n };\n if (this.serviceName !== undefined) metadata.serviceName = this.serviceName;\n Object.assign(metadata, args.trace?.metadata);\n const rootAttributes: Parameters<typeof startObservation>[1] = {\n input: redactedInput,\n metadata,\n };\n if (args.trace?.version !== undefined) {\n rootAttributes.version = args.trace.version;\n }\n\n const root = startObservation(\n args.agentName ?? \"agent.run\",\n rootAttributes,\n traceId === undefined\n ? { asType: \"agent\" }\n : {\n asType: \"agent\",\n parentSpanContext: {\n traceId,\n spanId: \"0000000000000001\",\n traceFlags: 1,\n },\n },\n );\n applyTraceAttributes(root, args);\n\n const promptRef = resolvePromptRef(args);\n const runObserver = new LangfuseRunObserver(\n root,\n {\n traceId: root.traceId,\n observationId: root.id,\n },\n promptRef,\n {\n redactor: this.redactor,\n redactInputs: this.redactInputs,\n redactOutputs: this.redactOutputs,\n },\n );\n this.currentHandle = runObserver.getHandle();\n runObserver.setCurrentHandle = (handle) => {\n this.currentHandle = handle;\n };\n runObserver.clearCurrentHandle = () => {\n if (this.currentHandle === runObserver.getHandle()) {\n this.currentHandle = undefined;\n }\n };\n return runObserver;\n }\n\n async flush(): Promise<void> {\n await this.queue?.flush();\n await this.processor.forceFlush();\n }\n\n async shutdown(): Promise<void> {\n await this.queue?.shutdown();\n await this.sdk.shutdown();\n }\n\n async flushScores(): Promise<void> {\n await this.queue?.flush();\n }\n\n scoreQueueDepth(): number {\n return this.queue?.depth() ?? 0;\n }\n\n getCurrentTrace(): LangfuseTraceHandle | undefined {\n return this.currentHandle;\n }\n\n private maybeRedactInput<T>(value: T): T {\n if (this.redactor === undefined || this.redactInputs === undefined) return value;\n return applyRedaction(this.redactor, value, this.redactInputs);\n }\n\n private maybeRedactOutput<T>(value: T): T {\n if (this.redactor === undefined || this.redactOutputs === undefined) return value;\n return applyRedaction(this.redactor, value, this.redactOutputs);\n }\n\n async score(args: LangfuseScoreArgs): Promise<void> {\n if (args.traceId === undefined || args.traceId.length === 0) {\n throw new Error(\"Langfuse score requires traceId\");\n }\n if (this.publicKey === undefined || this.secretKey === undefined) {\n throw new Error(\"Langfuse score requires publicKey and secretKey\");\n }\n assertScoreValue(args.value, args.dataType);\n\n if (this.queue !== null) {\n this.queue.enqueue(args);\n return;\n }\n\n await this.sendScore(args);\n }\n\n private async sendScore(args: LangfuseScoreArgs): Promise<void> {\n const body = buildScoreBody(args);\n const response = await fetch(`${this.baseUrl}/api/public/scores`, {\n method: \"POST\",\n headers: {\n Authorization: `Basic ${Buffer.from(`${this.publicKey}:${this.secretKey}`).toString(\"base64\")}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n if (!response.ok) {\n throw new Error(\n `Langfuse score failed with HTTP ${response.status}: ${await response.text()}`,\n );\n }\n }\n}\n\nfunction assertScoreValue(value: number | string, dataType: LangfuseScoreArgs[\"dataType\"]): void {\n if (dataType === \"NUMERIC\") {\n if (typeof value !== \"number\") {\n throw new TypeError(`Langfuse score dataType=NUMERIC requires a number value`);\n }\n return;\n }\n if (dataType === \"CATEGORICAL\") {\n if (typeof value !== \"string\") {\n throw new TypeError(`Langfuse score dataType=CATEGORICAL requires a string value`);\n }\n return;\n }\n if (dataType === \"BOOLEAN\") {\n if (value !== 0 && value !== 1) {\n throw new TypeError(`Langfuse score dataType=BOOLEAN requires value 0 or 1`);\n }\n return;\n }\n}\n\nfunction buildScoreBody(score: LangfuseScoreArgs): Record<string, unknown> {\n const body: Record<string, unknown> = {\n traceId: score.traceId,\n name: score.name,\n value: score.value,\n };\n if (score.observationId !== undefined) body.observationId = score.observationId;\n if (score.dataType !== undefined) body.dataType = score.dataType;\n if (score.comment !== undefined) body.comment = score.comment;\n if (score.metadata !== undefined) body.metadata = score.metadata;\n const configId = score.configId ?? score.scoreConfigId;\n if (configId !== undefined) body.configId = configId;\n if (score.environment !== undefined) body.environment = score.environment;\n if (score.timestamp !== undefined) {\n body.timestamp =\n score.timestamp instanceof Date ? score.timestamp.toISOString() : score.timestamp;\n }\n return body;\n}\n\nfunction applyTraceAttributes(root: LangfuseAgent, args: AgentRunStartArgs): void {\n const traceName = args.trace?.name ?? args.agentName;\n if (traceName !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_NAME, traceName);\n }\n if (args.trace?.userId !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_USER_ID, args.trace.userId);\n }\n if (args.trace?.sessionId !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_SESSION_ID, args.trace.sessionId);\n }\n if (args.trace?.tags !== undefined) {\n root.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_TAGS, args.trace.tags);\n }\n for (const [key, value] of Object.entries(args.trace?.metadata ?? {})) {\n const serialized = serializeMetadataValue(value);\n if (serialized === undefined) {\n continue;\n }\n root.otelSpan.setAttribute(`${LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`, serialized);\n }\n const promptRef = resolvePromptRef(args);\n if (promptRef !== undefined) {\n root.otelSpan.setAttribute(\n `${LangfuseOtelSpanAttributes.TRACE_METADATA}.promptName`,\n promptRef.name,\n );\n if (promptRef.version !== undefined) {\n root.otelSpan.setAttribute(\n `${LangfuseOtelSpanAttributes.TRACE_METADATA}.promptVersion`,\n String(promptRef.version),\n );\n }\n }\n}\n\nfunction applyRedaction<T>(redactor: PiiRedactor, value: T, mode: LangfuseRedactionMode): T {\n if (mode === \"deep\") {\n return redactor.redactObject(value);\n }\n if (typeof value === \"string\") {\n return redactor.redactString(value) as unknown as T;\n }\n if (Array.isArray(value)) {\n return redactor.redactMessages(value as never) as unknown as T;\n }\n if (value !== null && typeof value === \"object\") {\n return redactor.redactObject(value);\n }\n return value;\n}\n\nfunction resolvePromptRef(args: AgentRunStartArgs): AgentRunPromptRef | undefined {\n if (args.promptRef !== undefined) {\n return args.promptRef;\n }\n const metadata = args.trace?.metadata;\n if (metadata === undefined) {\n return undefined;\n }\n const name = metadata.promptName;\n if (typeof name !== \"string\" || name.length === 0) {\n return undefined;\n }\n const rawVersion = metadata.promptVersion;\n if (rawVersion === undefined || rawVersion === null) {\n return { name };\n }\n const version =\n typeof rawVersion === \"number\"\n ? rawVersion\n : typeof rawVersion === \"string\" && rawVersion.trim().length > 0\n ? Number(rawVersion)\n : undefined;\n if (version === undefined || !Number.isFinite(version)) {\n return { name };\n }\n return { name, version };\n}\n\nfunction promptMetadata(\n ref: AgentRunPromptRef | undefined,\n): Record<string, string | number | undefined> {\n if (ref === undefined) {\n return {};\n }\n const metadata: Record<string, string | number | undefined> = {\n promptName: ref.name,\n };\n if (ref.version !== undefined) metadata.promptVersion = ref.version;\n return metadata;\n}\n\nfunction serializeMetadataValue(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return \"<failed to serialize>\";\n }\n}\n\nclass LangfuseRunObserver implements AgentRunObserver {\n private readonly turnSpans = new Map<number, LangfuseSpan>();\n // Assigned by LangfuseAgentObserver.startRun so that the run can\n // publish trace-handle updates back to the agent observer.\n setCurrentHandle: ((handle: LangfuseTraceHandle) => void) | undefined;\n clearCurrentHandle: (() => void) | undefined;\n private handle: LangfuseTraceHandle;\n private readonly promptRef: AgentRunPromptRef | undefined;\n private readonly redactor: PiiRedactor | undefined;\n private readonly redactInputs: LangfuseRedactionMode | undefined;\n private readonly redactOutputs: LangfuseRedactionMode | undefined;\n\n constructor(\n private readonly root: LangfuseAgent,\n readonly trace: AgentTraceInfo,\n promptRef: AgentRunPromptRef | undefined,\n redaction: {\n redactor: PiiRedactor | undefined;\n redactInputs: LangfuseRedactionMode | undefined;\n redactOutputs: LangfuseRedactionMode | undefined;\n },\n ) {\n this.handle = this.buildHandle();\n this.promptRef = promptRef;\n this.redactor = redaction.redactor;\n this.redactInputs = redaction.redactInputs;\n this.redactOutputs = redaction.redactOutputs;\n }\n\n redactInputValue<T>(value: T): T {\n if (this.redactor === undefined || this.redactInputs === undefined) return value;\n return applyRedaction(this.redactor, value, this.redactInputs);\n }\n\n redactOutputValue<T>(value: T): T {\n if (this.redactor === undefined || this.redactOutputs === undefined) return value;\n return applyRedaction(this.redactor, value, this.redactOutputs);\n }\n\n startGeneration(args: AgentGenerationStartArgs): AgentGenerationObserver {\n this.closeEarlierTurns(args.turn);\n const turn = this.turnSpan(args.turn);\n const redactedChatHistory = this.redactInputValue(modelInputMessages(args.request.chatHistory));\n const metadata: Record<string, unknown> = {\n turn: args.turn,\n toolCount: args.request.tools.length,\n hasOutputSchema: args.request.outputSchema !== undefined,\n };\n if (args.providerRequest !== undefined) metadata.providerRequest = args.providerRequest;\n if (args.modelInfo !== undefined) {\n const modelInfo: Record<string, unknown> = {\n provider: args.modelInfo.provider,\n defaultModel: args.modelInfo.defaultModel,\n };\n if (args.modelInfo.capabilities !== undefined) {\n modelInfo.capabilities = args.modelInfo.capabilities;\n }\n metadata.modelInfo = modelInfo;\n }\n Object.assign(metadata, promptMetadata(this.promptRef));\n const generation = turn.startObservation(\n `model.turn.${args.turn}`,\n {\n input: redactedChatHistory,\n model: args.request.model ?? \"default\",\n modelParameters: modelParameters(args.request),\n metadata,\n },\n { asType: \"generation\" },\n );\n return new LangfuseGenerationObserver(generation, this);\n }\n\n startTool(args: AgentToolStartArgs): AgentToolObserver {\n const turn = this.turnSpan(args.turn);\n const redactedArgs = this.redactInputValue(args.args);\n const metadata: Record<string, unknown> = {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n };\n if (args.toolDefinition !== undefined) metadata.toolDefinition = args.toolDefinition;\n if (args.toolMetadata !== undefined) metadata.toolMetadata = args.toolMetadata;\n const tool = turn.startObservation(\n `tool.${args.toolName}`,\n {\n input: {\n args: redactedArgs,\n toolCall: args.toolCall,\n },\n metadata,\n },\n { asType: \"tool\" },\n );\n return new LangfuseToolObserver(tool, this);\n }\n\n end(args: AgentRunEndArgs): void {\n this.closeAllTurns();\n const redactedOutput = this.redactOutputValue(args.output);\n this.root\n .update({\n output: redactedOutput,\n metadata: {\n usage: args.usage,\n messages: args.messages,\n },\n })\n .end();\n this.clearCurrentHandle?.();\n }\n\n error(args: AgentRunErrorArgs): void {\n this.closeAllTurns();\n this.root\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(args.error),\n output: {\n error: errorMessage(args.error),\n },\n metadata: {\n usage: args.usage,\n messages: args.messages,\n },\n })\n .end();\n this.clearCurrentHandle?.();\n }\n\n event(args: AgentRunEventArgs): void {\n const metadata: Record<string, unknown> = {};\n Object.assign(metadata, args.attributes);\n this.root.startObservation(args.name, { metadata }, { asType: \"event\" }).end();\n }\n\n getHandle(): LangfuseTraceHandle {\n return this.handle;\n }\n\n private buildHandle(): LangfuseTraceHandle {\n return {\n traceId: this.trace.traceId ?? \"\",\n observationId: this.trace.observationId ?? \"\",\n addAttributes: (attributes) => {\n this.root.update({ metadata: attributes });\n this.setCurrentHandle?.(this.handle);\n },\n addEvent: (name, attributes) => {\n const metadata: Record<string, unknown> = {};\n Object.assign(metadata, attributes);\n this.root.startObservation(name, { metadata }, { asType: \"event\" }).end();\n this.setCurrentHandle?.(this.handle);\n },\n };\n }\n\n private turnSpan(turn: number): LangfuseSpan {\n const existing = this.turnSpans.get(turn);\n if (existing !== undefined) {\n return existing;\n }\n\n const span = this.root.startObservation(\n `turn.${turn}`,\n {\n metadata: { turn },\n },\n { asType: \"span\" },\n );\n this.turnSpans.set(turn, span);\n return span;\n }\n\n private closeEarlierTurns(currentTurn: number): void {\n for (const [turn, span] of this.turnSpans) {\n if (turn < currentTurn) {\n span.end();\n this.turnSpans.delete(turn);\n }\n }\n }\n\n private closeAllTurns(): void {\n for (const span of this.turnSpans.values()) {\n span.end();\n }\n this.turnSpans.clear();\n }\n}\n\nclass LangfuseGenerationObserver implements AgentGenerationObserver {\n constructor(\n private readonly generation: LangfuseGeneration,\n private readonly run: LangfuseRunObserver,\n ) {}\n\n update(args: AgentGenerationUpdateArgs): void {\n this.generation.update({\n output: { delta: args.delta },\n });\n }\n\n end(args: AgentGenerationEndArgs): void {\n const redactedText = this.run.redactOutputValue(textFromAssistantContent(args.response.choice));\n const redactedChoice = this.run.redactOutputValue(args.response.choice);\n const metadata: Record<string, unknown> = { turn: args.turn };\n if (args.firstDeltaMs !== undefined) metadata.firstDeltaMs = args.firstDeltaMs;\n this.generation\n .update({\n output: {\n messageId: args.response.messageId,\n content: redactedChoice,\n text: redactedText,\n },\n usageDetails: usageDetails(args.response.usage),\n metadata,\n })\n .end();\n }\n\n error(args: AgentGenerationErrorArgs): void {\n this.generation\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(args.error),\n output: { error: errorMessage(args.error) },\n metadata: { turn: args.turn },\n })\n .end();\n }\n}\n\nclass LangfuseToolObserver implements AgentToolObserver {\n private readonly childAgents = new Map<string, LangfuseAgent>();\n private readonly childGenerations = new Map<string, LangfuseGeneration>();\n private readonly childTools: Array<{\n agentId: string;\n toolName: string;\n toolCallId?: string;\n tool: LangfuseTool;\n ended: boolean;\n }> = [];\n\n constructor(\n private readonly tool: LangfuseTool,\n private readonly run: LangfuseRunObserver,\n ) {}\n\n streamEvent(args: AgentToolStreamEventArgs): void {\n const wrapper = args.event;\n const child = isRecord(wrapper.event) ? wrapper.event : undefined;\n if (child === undefined) {\n return;\n }\n\n const agentId = wrapper.agentId;\n const agentName = wrapper.agentName;\n const childTurn = typeof child.turn === \"number\" ? child.turn : args.turn;\n const agent = this.childAgent(agentId, agentName, args);\n\n if (child.type === \"turn_start\") {\n const generation = agent.startObservation(\n `${agentLabel(agentId, agentName)}.model.turn.${childTurn}`,\n {\n input: {\n prompt: modelInputMessage(child.prompt as Message),\n history: modelInputMessages(child.history as Message[]),\n },\n metadata: childMetadata(args, agentId, agentName, childTurn),\n },\n { asType: \"generation\" },\n );\n this.childGenerations.set(generationKey(agentId, childTurn), generation);\n return;\n }\n\n if (child.type === \"turn_end\") {\n const generation = this.childGenerations.get(generationKey(agentId, childTurn));\n if (generation !== undefined) {\n const update: Parameters<LangfuseGeneration[\"update\"]>[0] = {\n output: child.response,\n metadata: childMetadata(args, agentId, agentName, childTurn),\n };\n if (isRecord(child.response) && isRecord(child.response.usage)) {\n update.usageDetails = usageDetailsFromRecord(child.response.usage);\n }\n generation.update(update).end();\n this.childGenerations.delete(generationKey(agentId, childTurn));\n }\n return;\n }\n\n if (child.type === \"tool_call\" && isRecord(child.toolCall)) {\n const toolCall = child.toolCall;\n const toolCallFunction = isRecord(toolCall.function) ? toolCall.function : undefined;\n const toolName = typeof toolCallFunction?.name === \"string\" ? toolCallFunction.name : \"tool\";\n const toolCallId =\n typeof toolCall.callId === \"string\"\n ? toolCall.callId\n : typeof toolCall.id === \"string\"\n ? toolCall.id\n : undefined;\n const childTool = agent.startObservation(\n `${agentLabel(agentId, agentName)}.${toolName}`,\n {\n input: {\n args: toolCallFunction?.arguments ?? {},\n toolCall,\n },\n metadata: {\n ...childMetadata(args, agentId, agentName, childTurn),\n toolName,\n toolCallId,\n },\n },\n { asType: \"tool\" },\n );\n const childToolRecord: (typeof this.childTools)[number] = {\n agentId,\n toolName,\n tool: childTool,\n ended: false,\n };\n if (toolCallId !== undefined) childToolRecord.toolCallId = toolCallId;\n this.childTools.push(childToolRecord);\n return;\n }\n\n if (child.type === \"tool_result\") {\n const toolName = typeof child.toolName === \"string\" ? child.toolName : \"tool\";\n const toolCallId = typeof child.toolCallId === \"string\" ? child.toolCallId : undefined;\n const childTool = this.findChildTool(agentId, toolName, toolCallId);\n if (childTool !== undefined) {\n childTool.ended = true;\n childTool.tool\n .update({\n output: typeof child.result === \"string\" ? child.result : child,\n metadata: {\n ...childMetadata(args, agentId, agentName, childTurn),\n toolName,\n toolCallId,\n internalCallId:\n typeof child.internalCallId === \"string\" ? child.internalCallId : undefined,\n args: typeof child.args === \"string\" ? child.args : undefined,\n },\n })\n .end();\n }\n return;\n }\n\n if (child.type === \"final\") {\n const update: Parameters<LangfuseAgent[\"update\"]>[0] = { output: child.output };\n if (isRecord(child.usage)) update.metadata = { usage: child.usage };\n agent.update(update).end();\n this.childAgents.delete(agentId);\n return;\n }\n\n if (child.type === \"error\") {\n const update: Parameters<LangfuseAgent[\"update\"]>[0] = {\n level: \"ERROR\",\n statusMessage: errorMessage(child.error),\n output: { error: errorMessage(child.error) },\n };\n if (isRecord(child.usage)) update.metadata = { usage: child.usage };\n agent.update(update).end();\n this.childAgents.delete(agentId);\n }\n }\n\n end(args: AgentToolEndArgs): void {\n this.endOpenChildren();\n const redactedResult = this.run.redactOutputValue(args.result);\n const redactedStructured = this.run.redactOutputValue(args.structuredResult);\n const metadata: Record<string, unknown> = {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n skipped: args.skipped,\n };\n if (redactedStructured !== undefined) metadata.structuredResult = redactedStructured;\n const attributes: Parameters<LangfuseTool[\"update\"]>[0] = {\n output: redactedResult,\n metadata,\n level: args.skipped ? \"WARNING\" : \"DEFAULT\",\n };\n if (args.skipped) {\n attributes.statusMessage = \"Tool call skipped by hook\";\n }\n this.tool.update(attributes).end();\n }\n\n error(args: AgentToolErrorArgs): void {\n this.endOpenChildren();\n this.tool\n .update({\n level: \"ERROR\",\n statusMessage: errorMessage(args.error),\n output: { error: errorMessage(args.error) },\n metadata: {\n turn: args.turn,\n internalCallId: args.internalCallId,\n toolCallId: args.toolCallId,\n },\n })\n .end();\n }\n\n private childAgent(\n agentId: string,\n agentName: string | undefined,\n args: AgentToolStartArgs,\n ): LangfuseAgent {\n const existing = this.childAgents.get(agentId);\n if (existing !== undefined) {\n return existing;\n }\n const agent = this.tool.startObservation(\n `${agentLabel(agentId, agentName)}.run`,\n {\n metadata: childMetadata(args, agentId, agentName, args.turn),\n },\n { asType: \"agent\" },\n );\n this.childAgents.set(agentId, agent);\n return agent;\n }\n\n private findChildTool(\n agentId: string,\n toolName: string,\n toolCallId: string | undefined,\n ): (typeof this.childTools)[number] | undefined {\n for (let index = this.childTools.length - 1; index >= 0; index -= 1) {\n const childTool = this.childTools[index];\n if (\n childTool === undefined ||\n childTool.ended ||\n childTool.agentId !== agentId ||\n childTool.toolName !== toolName\n ) {\n continue;\n }\n if (toolCallId === undefined || childTool.toolCallId === toolCallId) {\n return childTool;\n }\n }\n return undefined;\n }\n\n private endOpenChildren(): void {\n for (const generation of this.childGenerations.values()) {\n generation.end();\n }\n this.childGenerations.clear();\n for (const tool of this.childTools) {\n if (!tool.ended) {\n tool.tool.end();\n tool.ended = true;\n }\n }\n for (const agent of this.childAgents.values()) {\n agent.end();\n }\n this.childAgents.clear();\n }\n}\n"],"mappings":"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","names":["buildAuthHeader","readErrorBody","buildScoreBody"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anvia/langfuse",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.8",
|
|
4
4
|
"description": "Langfuse tracing adapter for Anvia.",
|
|
5
5
|
"author": "anvia",
|
|
6
6
|
"maintainer": "Indra Zulfi",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"tsup": "^8.5.0",
|
|
38
38
|
"typescript": "^5.9.3",
|
|
39
39
|
"vitest": "^4.0.8",
|
|
40
|
-
"@anvia/core": "0.
|
|
40
|
+
"@anvia/core": "0.14.0"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"@anvia/core": ">=0.7.1 <1.0.0"
|