@librechat/agents 3.2.43 → 3.2.45
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/cjs/graphs/Graph.cjs +17 -8
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs +20 -21
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/langfuse.cjs +65 -13
- package/dist/cjs/langfuse.cjs.map +1 -1
- package/dist/cjs/langfuseConfig.cjs +106 -0
- package/dist/cjs/langfuseConfig.cjs.map +1 -0
- package/dist/cjs/langfuseRuntimeContext.cjs +48 -0
- package/dist/cjs/langfuseRuntimeContext.cjs.map +1 -0
- package/dist/cjs/langfuseRuntimeScope.cjs +57 -0
- package/dist/cjs/langfuseRuntimeScope.cjs.map +1 -0
- package/dist/cjs/langfuseToolOutputTracing.cjs +14 -119
- package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
- package/dist/cjs/main.cjs +1 -0
- package/dist/cjs/messages/reducer.cjs +15 -2
- package/dist/cjs/messages/reducer.cjs.map +1 -1
- package/dist/cjs/run.cjs +25 -12
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +5 -2
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/utils/misc.cjs +17 -0
- package/dist/cjs/utils/misc.cjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +16 -7
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs +22 -22
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/langfuse.mjs +65 -14
- package/dist/esm/langfuse.mjs.map +1 -1
- package/dist/esm/langfuseConfig.mjs +102 -0
- package/dist/esm/langfuseConfig.mjs.map +1 -0
- package/dist/esm/langfuseRuntimeContext.mjs +44 -0
- package/dist/esm/langfuseRuntimeContext.mjs.map +1 -0
- package/dist/esm/langfuseRuntimeScope.mjs +53 -0
- package/dist/esm/langfuseRuntimeScope.mjs.map +1 -0
- package/dist/esm/langfuseToolOutputTracing.mjs +13 -115
- package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
- package/dist/esm/main.mjs +2 -2
- package/dist/esm/messages/reducer.mjs +15 -2
- package/dist/esm/messages/reducer.mjs.map +1 -1
- package/dist/esm/run.mjs +21 -8
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +5 -2
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/utils/misc.mjs +17 -1
- package/dist/esm/utils/misc.mjs.map +1 -1
- package/dist/types/instrumentation.d.ts +0 -1
- package/dist/types/langfuse.d.ts +5 -1
- package/dist/types/langfuseConfig.d.ts +7 -0
- package/dist/types/langfuseRuntimeContext.d.ts +26 -0
- package/dist/types/langfuseRuntimeScope.d.ts +17 -0
- package/dist/types/langfuseToolOutputTracing.d.ts +4 -11
- package/dist/types/types/graph.d.ts +6 -0
- package/dist/types/utils/misc.d.ts +1 -0
- package/package.json +1 -1
- package/src/graphs/Graph.ts +20 -13
- package/src/instrumentation.ts +33 -29
- package/src/langfuse.ts +114 -7
- package/src/langfuseConfig.ts +214 -0
- package/src/langfuseRuntimeContext.ts +93 -0
- package/src/langfuseRuntimeScope.ts +135 -0
- package/src/langfuseToolOutputTracing.ts +25 -263
- package/src/messages/reducer.spec.ts +32 -0
- package/src/messages/reducer.ts +23 -7
- package/src/run.ts +44 -34
- package/src/specs/deterministic-trace-id.test.ts +4 -11
- package/src/specs/langfuse-callbacks.test.ts +278 -22
- package/src/specs/langfuse-config.test.ts +10 -3
- package/src/specs/langfuse-instrumentation.test.ts +32 -12
- package/src/specs/langfuse-routing.integration.test.ts +543 -0
- package/src/specs/langfuse-runtime-context.test.ts +92 -0
- package/src/specs/langfuse-tool-output-tracing.test.ts +353 -5
- package/src/tools/ToolNode.ts +10 -5
- package/src/tools/__tests__/ToolNode.langfuse.test.ts +21 -11
- package/src/types/graph.ts +9 -0
- package/src/utils/misc.ts +18 -0
package/dist/cjs/utils/misc.cjs
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
function isPresent(value) {
|
|
3
3
|
return value != null && value !== "";
|
|
4
4
|
}
|
|
5
|
+
function parseBooleanEnv(value) {
|
|
6
|
+
if (value == null) return;
|
|
7
|
+
const normalized = value.trim().toLowerCase();
|
|
8
|
+
if ([
|
|
9
|
+
"1",
|
|
10
|
+
"true",
|
|
11
|
+
"yes",
|
|
12
|
+
"on"
|
|
13
|
+
].includes(normalized)) return true;
|
|
14
|
+
if ([
|
|
15
|
+
"0",
|
|
16
|
+
"false",
|
|
17
|
+
"no",
|
|
18
|
+
"off"
|
|
19
|
+
].includes(normalized)) return false;
|
|
20
|
+
}
|
|
5
21
|
/**
|
|
6
22
|
* Unescapes a c-escaped string
|
|
7
23
|
* @param str The string to unescape
|
|
@@ -35,6 +51,7 @@ function unescapeObject(obj, key) {
|
|
|
35
51
|
}
|
|
36
52
|
//#endregion
|
|
37
53
|
exports.isPresent = isPresent;
|
|
54
|
+
exports.parseBooleanEnv = parseBooleanEnv;
|
|
38
55
|
exports.unescapeObject = unescapeObject;
|
|
39
56
|
|
|
40
57
|
//# sourceMappingURL=misc.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.cjs","names":[],"sources":["../../../src/utils/misc.ts"],"sourcesContent":["export function isPresent(value: string | null | undefined): value is string {\n return value != null && value !== '';\n}\n\n/**\n * Unescapes a c-escaped string\n * @param str The string to unescape\n * @returns The unescaped string\n */\nconst unescapeString = (string: string): string =>\n string.replace(/\\\\(.)/g, (_, char) => {\n switch (char) {\n case 'n':\n return '\\n';\n case 't':\n return '\\t';\n case 'r':\n return '\\r';\n case '\"':\n return '\"';\n case '\\'':\n return '\\'';\n case '\\\\':\n return '\\\\';\n default:\n return char;\n }\n });\n\n/**\n * Recursively unescapes all string values in an object\n * @param obj The object to unescape\n * @returns The unescaped object\n */\nexport function unescapeObject(obj: unknown, key?: string): unknown {\n if (typeof obj === 'string') {\n let unescaped = unescapeString(obj);\n if (key === 'filePath' && unescaped.match(/^\"(.+)\"$/)) {\n unescaped = unescaped.substring(1, unescaped.length - 1);\n }\n return unescaped;\n }\n if (Array.isArray(obj)) {\n return obj.map((value) =>\n unescapeObject(value, key === 'contextPaths' ? 'filePath' : '')\n );\n }\n if (typeof obj === 'object' && obj !== null) {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [\n key,\n unescapeObject(value, key),\n ])\n );\n }\n return obj;\n}\n"],"mappings":";AAAA,SAAgB,UAAU,OAAmD;CAC3E,OAAO,SAAS,QAAQ,UAAU;AACpC;;;;;;AAOA,MAAM,kBAAkB,WACtB,OAAO,QAAQ,WAAW,GAAG,SAAS;CACpC,QAAQ,MAAR;EACA,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,SACE,OAAO;CACT;AACF,CAAC;;;;;;AAOH,SAAgB,eAAe,KAAc,KAAuB;CAClE,IAAI,OAAO,QAAQ,UAAU;EAC3B,IAAI,YAAY,eAAe,GAAG;EAClC,IAAI,QAAQ,cAAc,UAAU,MAAM,UAAU,GAClD,YAAY,UAAU,UAAU,GAAG,UAAU,SAAS,CAAC;EAEzD,OAAO;CACT;CACA,IAAI,MAAM,QAAQ,GAAG,GACnB,OAAO,IAAI,KAAK,UACd,eAAe,OAAO,QAAQ,iBAAiB,aAAa,EAAE,CAChE;CAEF,IAAI,OAAO,QAAQ,YAAY,QAAQ,MACrC,OAAO,OAAO,YACZ,OAAO,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CACxC,KACA,eAAe,OAAO,GAAG,CAC3B,CAAC,CACH;CAEF,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"misc.cjs","names":[],"sources":["../../../src/utils/misc.ts"],"sourcesContent":["export function isPresent(value: string | null | undefined): value is string {\n return value != null && value !== '';\n}\n\nexport function parseBooleanEnv(\n value: string | undefined\n): boolean | undefined {\n if (value == null) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n if (['1', 'true', 'yes', 'on'].includes(normalized)) {\n return true;\n }\n if (['0', 'false', 'no', 'off'].includes(normalized)) {\n return false;\n }\n\n return undefined;\n}\n\n/**\n * Unescapes a c-escaped string\n * @param str The string to unescape\n * @returns The unescaped string\n */\nconst unescapeString = (string: string): string =>\n string.replace(/\\\\(.)/g, (_, char) => {\n switch (char) {\n case 'n':\n return '\\n';\n case 't':\n return '\\t';\n case 'r':\n return '\\r';\n case '\"':\n return '\"';\n case '\\'':\n return '\\'';\n case '\\\\':\n return '\\\\';\n default:\n return char;\n }\n });\n\n/**\n * Recursively unescapes all string values in an object\n * @param obj The object to unescape\n * @returns The unescaped object\n */\nexport function unescapeObject(obj: unknown, key?: string): unknown {\n if (typeof obj === 'string') {\n let unescaped = unescapeString(obj);\n if (key === 'filePath' && unescaped.match(/^\"(.+)\"$/)) {\n unescaped = unescaped.substring(1, unescaped.length - 1);\n }\n return unescaped;\n }\n if (Array.isArray(obj)) {\n return obj.map((value) =>\n unescapeObject(value, key === 'contextPaths' ? 'filePath' : '')\n );\n }\n if (typeof obj === 'object' && obj !== null) {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [\n key,\n unescapeObject(value, key),\n ])\n );\n }\n return obj;\n}\n"],"mappings":";AAAA,SAAgB,UAAU,OAAmD;CAC3E,OAAO,SAAS,QAAQ,UAAU;AACpC;AAEA,SAAgB,gBACd,OACqB;CACrB,IAAI,SAAS,MACX;CAGF,MAAM,aAAa,MAAM,KAAK,CAAC,CAAC,YAAY;CAC5C,IAAI;EAAC;EAAK;EAAQ;EAAO;CAAI,CAAC,CAAC,SAAS,UAAU,GAChD,OAAO;CAET,IAAI;EAAC;EAAK;EAAS;EAAM;CAAK,CAAC,CAAC,SAAS,UAAU,GACjD,OAAO;AAIX;;;;;;AAOA,MAAM,kBAAkB,WACtB,OAAO,QAAQ,WAAW,GAAG,SAAS;CACpC,QAAQ,MAAR;EACA,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,MACH,OAAO;EACT,SACE,OAAO;CACT;AACF,CAAC;;;;;;AAOH,SAAgB,eAAe,KAAc,KAAuB;CAClE,IAAI,OAAO,QAAQ,UAAU;EAC3B,IAAI,YAAY,eAAe,GAAG;EAClC,IAAI,QAAQ,cAAc,UAAU,MAAM,UAAU,GAClD,YAAY,UAAU,UAAU,GAAG,UAAU,SAAS,CAAC;EAEzD,OAAO;CACT;CACA,IAAI,MAAM,QAAQ,GAAG,GACnB,OAAO,IAAI,KAAK,UACd,eAAe,OAAO,QAAQ,iBAAiB,aAAa,EAAE,CAChE;CAEF,IAAI,OAAO,QAAQ,YAAY,QAAQ,MACrC,OAAO,OAAO,YACZ,OAAO,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CACxC,KACA,eAAe,OAAO,GAAG,CAC3B,CAAC,CACH;CAEF,OAAO;AACT"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import { resolveLangfuseConfig } from "../langfuseConfig.mjs";
|
|
2
|
+
import { resolveLangfuseRuntimeScope, withLangfuseRuntimeScope } from "../langfuseRuntimeScope.mjs";
|
|
1
3
|
import { createLangfuseHandler, createLangfuseTraceMetadata, disposeLangfuseHandler, isLangfuseCallbackHandler } from "../langfuse.mjs";
|
|
2
|
-
import { resolveLangfuseConfig, shouldTraceToolNodeForLangfuse, withLangfuseToolOutputTracingConfig } from "../langfuseToolOutputTracing.mjs";
|
|
3
4
|
import { appendCallbacks, findCallback } from "../utils/callbacks.mjs";
|
|
4
5
|
import { GraphNodeKeys } from "../common/enum.mjs";
|
|
5
6
|
import "../common/index.mjs";
|
|
6
|
-
import { initializeLangfuseTracing } from "../instrumentation.mjs";
|
|
7
7
|
import { apportionTokenCounts } from "../utils/tokens.mjs";
|
|
8
|
+
import { shouldTraceToolNodeForLangfuse } from "../langfuseToolOutputTracing.mjs";
|
|
9
|
+
import { initializeLangfuseTracing } from "../instrumentation.mjs";
|
|
8
10
|
import { convertMessagesToContent, formatAnthropicArtifactContent, formatArtifactPayload } from "../messages/core.mjs";
|
|
9
11
|
import { getMessageId } from "../messages/ids.mjs";
|
|
10
12
|
import { createPruneMessages, enforceOriginalContentCap, sanitizeOrphanToolBlocks } from "../messages/prune.mjs";
|
|
@@ -1065,7 +1067,8 @@ var StandardGraph = class StandardGraph extends Graph {
|
|
|
1065
1067
|
userId: config.configurable?.user_id,
|
|
1066
1068
|
sessionId: config.configurable?.thread_id,
|
|
1067
1069
|
traceMetadata,
|
|
1068
|
-
tags: ["librechat", "agent"]
|
|
1070
|
+
tags: ["librechat", "agent"],
|
|
1071
|
+
traceIdSeed: langfuse?.deterministicTraceId === true ? this.runId : void 0
|
|
1069
1072
|
});
|
|
1070
1073
|
if (langfuseHandler != null) invokeConfig = {
|
|
1071
1074
|
...invokeConfig,
|
|
@@ -1074,25 +1077,31 @@ var StandardGraph = class StandardGraph extends Graph {
|
|
|
1074
1077
|
}
|
|
1075
1078
|
const metadata = config.metadata;
|
|
1076
1079
|
try {
|
|
1077
|
-
result = await
|
|
1080
|
+
result = await withLangfuseRuntimeScope(resolveLangfuseRuntimeScope({
|
|
1081
|
+
runLangfuse: this.langfuse,
|
|
1082
|
+
langfuseOverlay: agentContext.langfuse
|
|
1083
|
+
}), () => attemptInvoke({
|
|
1078
1084
|
model: this.overrideModel ?? model,
|
|
1079
1085
|
messages: finalMessages,
|
|
1080
1086
|
provider: agentContext.provider,
|
|
1081
1087
|
context: this
|
|
1082
|
-
}, invokeConfig)
|
|
1088
|
+
}, invokeConfig));
|
|
1083
1089
|
} catch (primaryError) {
|
|
1084
1090
|
clearCurrentDeltaStepMarkers({
|
|
1085
1091
|
graph: this,
|
|
1086
1092
|
metadata
|
|
1087
1093
|
});
|
|
1088
|
-
result = await
|
|
1094
|
+
result = await withLangfuseRuntimeScope(resolveLangfuseRuntimeScope({
|
|
1095
|
+
runLangfuse: this.langfuse,
|
|
1096
|
+
langfuseOverlay: agentContext.langfuse
|
|
1097
|
+
}), () => tryFallbackProviders({
|
|
1089
1098
|
fallbacks,
|
|
1090
1099
|
tools: agentContext.tools,
|
|
1091
1100
|
messages: finalMessages,
|
|
1092
1101
|
config: invokeConfig,
|
|
1093
1102
|
primaryError,
|
|
1094
1103
|
context: this
|
|
1095
|
-
})
|
|
1104
|
+
}));
|
|
1096
1105
|
} finally {
|
|
1097
1106
|
await disposeLangfuseHandler(langfuseHandler);
|
|
1098
1107
|
}
|