@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.
Files changed (76) hide show
  1. package/dist/cjs/graphs/Graph.cjs +17 -8
  2. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  3. package/dist/cjs/instrumentation.cjs +20 -21
  4. package/dist/cjs/instrumentation.cjs.map +1 -1
  5. package/dist/cjs/langfuse.cjs +65 -13
  6. package/dist/cjs/langfuse.cjs.map +1 -1
  7. package/dist/cjs/langfuseConfig.cjs +106 -0
  8. package/dist/cjs/langfuseConfig.cjs.map +1 -0
  9. package/dist/cjs/langfuseRuntimeContext.cjs +48 -0
  10. package/dist/cjs/langfuseRuntimeContext.cjs.map +1 -0
  11. package/dist/cjs/langfuseRuntimeScope.cjs +57 -0
  12. package/dist/cjs/langfuseRuntimeScope.cjs.map +1 -0
  13. package/dist/cjs/langfuseToolOutputTracing.cjs +14 -119
  14. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  15. package/dist/cjs/main.cjs +1 -0
  16. package/dist/cjs/messages/reducer.cjs +15 -2
  17. package/dist/cjs/messages/reducer.cjs.map +1 -1
  18. package/dist/cjs/run.cjs +25 -12
  19. package/dist/cjs/run.cjs.map +1 -1
  20. package/dist/cjs/tools/ToolNode.cjs +5 -2
  21. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  22. package/dist/cjs/utils/misc.cjs +17 -0
  23. package/dist/cjs/utils/misc.cjs.map +1 -1
  24. package/dist/esm/graphs/Graph.mjs +16 -7
  25. package/dist/esm/graphs/Graph.mjs.map +1 -1
  26. package/dist/esm/instrumentation.mjs +22 -22
  27. package/dist/esm/instrumentation.mjs.map +1 -1
  28. package/dist/esm/langfuse.mjs +65 -14
  29. package/dist/esm/langfuse.mjs.map +1 -1
  30. package/dist/esm/langfuseConfig.mjs +102 -0
  31. package/dist/esm/langfuseConfig.mjs.map +1 -0
  32. package/dist/esm/langfuseRuntimeContext.mjs +44 -0
  33. package/dist/esm/langfuseRuntimeContext.mjs.map +1 -0
  34. package/dist/esm/langfuseRuntimeScope.mjs +53 -0
  35. package/dist/esm/langfuseRuntimeScope.mjs.map +1 -0
  36. package/dist/esm/langfuseToolOutputTracing.mjs +13 -115
  37. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  38. package/dist/esm/main.mjs +2 -2
  39. package/dist/esm/messages/reducer.mjs +15 -2
  40. package/dist/esm/messages/reducer.mjs.map +1 -1
  41. package/dist/esm/run.mjs +21 -8
  42. package/dist/esm/run.mjs.map +1 -1
  43. package/dist/esm/tools/ToolNode.mjs +5 -2
  44. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  45. package/dist/esm/utils/misc.mjs +17 -1
  46. package/dist/esm/utils/misc.mjs.map +1 -1
  47. package/dist/types/instrumentation.d.ts +0 -1
  48. package/dist/types/langfuse.d.ts +5 -1
  49. package/dist/types/langfuseConfig.d.ts +7 -0
  50. package/dist/types/langfuseRuntimeContext.d.ts +26 -0
  51. package/dist/types/langfuseRuntimeScope.d.ts +17 -0
  52. package/dist/types/langfuseToolOutputTracing.d.ts +4 -11
  53. package/dist/types/types/graph.d.ts +6 -0
  54. package/dist/types/utils/misc.d.ts +1 -0
  55. package/package.json +1 -1
  56. package/src/graphs/Graph.ts +20 -13
  57. package/src/instrumentation.ts +33 -29
  58. package/src/langfuse.ts +114 -7
  59. package/src/langfuseConfig.ts +214 -0
  60. package/src/langfuseRuntimeContext.ts +93 -0
  61. package/src/langfuseRuntimeScope.ts +135 -0
  62. package/src/langfuseToolOutputTracing.ts +25 -263
  63. package/src/messages/reducer.spec.ts +32 -0
  64. package/src/messages/reducer.ts +23 -7
  65. package/src/run.ts +44 -34
  66. package/src/specs/deterministic-trace-id.test.ts +4 -11
  67. package/src/specs/langfuse-callbacks.test.ts +278 -22
  68. package/src/specs/langfuse-config.test.ts +10 -3
  69. package/src/specs/langfuse-instrumentation.test.ts +32 -12
  70. package/src/specs/langfuse-routing.integration.test.ts +543 -0
  71. package/src/specs/langfuse-runtime-context.test.ts +92 -0
  72. package/src/specs/langfuse-tool-output-tracing.test.ts +353 -5
  73. package/src/tools/ToolNode.ts +10 -5
  74. package/src/tools/__tests__/ToolNode.langfuse.test.ts +21 -11
  75. package/src/types/graph.ts +9 -0
  76. package/src/utils/misc.ts +18 -0
@@ -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 withLangfuseToolOutputTracingConfig(this.langfuse, () => attemptInvoke({
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), agentContext.langfuse);
1088
+ }, invokeConfig));
1083
1089
  } catch (primaryError) {
1084
1090
  clearCurrentDeltaStepMarkers({
1085
1091
  graph: this,
1086
1092
  metadata
1087
1093
  });
1088
- result = await withLangfuseToolOutputTracingConfig(this.langfuse, () => tryFallbackProviders({
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
- }), agentContext.langfuse);
1104
+ }));
1096
1105
  } finally {
1097
1106
  await disposeLangfuseHandler(langfuseHandler);
1098
1107
  }