@librechat/agents 3.8.0 → 3.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +13 -3
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/graphs/Graph.cjs +174 -53
  4. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  5. package/dist/cjs/graphs/MultiAgentGraph.cjs +15 -5
  6. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  7. package/dist/cjs/langfuse.cjs +42 -0
  8. package/dist/cjs/langfuse.cjs.map +1 -1
  9. package/dist/cjs/langfuseToolOutputTracing.cjs +42 -0
  10. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  11. package/dist/cjs/langfuseTraceShaping.cjs +7 -1
  12. package/dist/cjs/langfuseTraceShaping.cjs.map +1 -1
  13. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +5 -9
  14. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  15. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +2 -7
  16. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  17. package/dist/cjs/llm/contextPressureMeter.cjs +51 -10
  18. package/dist/cjs/llm/contextPressureMeter.cjs.map +1 -1
  19. package/dist/cjs/llm/init.cjs +1 -1
  20. package/dist/cjs/llm/invoke.cjs +2 -2
  21. package/dist/cjs/llm/openai/index.cjs +4 -3
  22. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  23. package/dist/cjs/llm/openai/utils/index.cjs +5 -4
  24. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  25. package/dist/cjs/llm/preempt.cjs +3 -2
  26. package/dist/cjs/llm/preempt.cjs.map +1 -1
  27. package/dist/cjs/llm/prepareProviderRequest.cjs +9 -7
  28. package/dist/cjs/llm/prepareProviderRequest.cjs.map +1 -1
  29. package/dist/cjs/llm/providers.cjs +1 -1
  30. package/dist/cjs/main.cjs +11 -5
  31. package/dist/cjs/messages/alternation.cjs +1 -5
  32. package/dist/cjs/messages/alternation.cjs.map +1 -1
  33. package/dist/cjs/messages/budget.cjs +206 -7
  34. package/dist/cjs/messages/budget.cjs.map +1 -1
  35. package/dist/cjs/messages/cache.cjs +3 -9
  36. package/dist/cjs/messages/cache.cjs.map +1 -1
  37. package/dist/cjs/messages/core.cjs +25 -37
  38. package/dist/cjs/messages/core.cjs.map +1 -1
  39. package/dist/cjs/messages/format.cjs +131 -42
  40. package/dist/cjs/messages/format.cjs.map +1 -1
  41. package/dist/cjs/messages/index.cjs +2 -0
  42. package/dist/cjs/messages/prune.cjs +12 -7
  43. package/dist/cjs/messages/prune.cjs.map +1 -1
  44. package/dist/cjs/messages/reasoningTypes.cjs +21 -0
  45. package/dist/cjs/messages/reasoningTypes.cjs.map +1 -0
  46. package/dist/cjs/messages/recency.cjs +15 -94
  47. package/dist/cjs/messages/recency.cjs.map +1 -1
  48. package/dist/cjs/messages/toolHistoryProjection.cjs +243 -0
  49. package/dist/cjs/messages/toolHistoryProjection.cjs.map +1 -0
  50. package/dist/cjs/messages/toolResultTypes.cjs +145 -4
  51. package/dist/cjs/messages/toolResultTypes.cjs.map +1 -1
  52. package/dist/cjs/run.cjs +5 -4
  53. package/dist/cjs/run.cjs.map +1 -1
  54. package/dist/cjs/session/AgentSession.cjs +6 -4
  55. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  56. package/dist/cjs/session/JsonlSessionStore.cjs +3 -0
  57. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
  58. package/dist/cjs/session/index.cjs +1 -1
  59. package/dist/cjs/session/sessionProjection.cjs +75 -0
  60. package/dist/cjs/session/sessionProjection.cjs.map +1 -0
  61. package/dist/cjs/stream.cjs +18 -17
  62. package/dist/cjs/stream.cjs.map +1 -1
  63. package/dist/cjs/summarization/index.cjs.map +1 -1
  64. package/dist/cjs/summarization/node.cjs +18 -8
  65. package/dist/cjs/summarization/node.cjs.map +1 -1
  66. package/dist/cjs/summarization/shared.cjs +9 -0
  67. package/dist/cjs/summarization/shared.cjs.map +1 -1
  68. package/dist/cjs/tools/local/CompileCheckTool.cjs +1 -1
  69. package/dist/cjs/tools/local/LocalCodingTools.cjs +1 -1
  70. package/dist/cjs/utils/events.cjs +13 -0
  71. package/dist/cjs/utils/events.cjs.map +1 -1
  72. package/dist/cjs/utils/tokens.cjs +105 -0
  73. package/dist/cjs/utils/tokens.cjs.map +1 -1
  74. package/dist/esm/agents/AgentContext.mjs +13 -3
  75. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  76. package/dist/esm/graphs/Graph.mjs +176 -55
  77. package/dist/esm/graphs/Graph.mjs.map +1 -1
  78. package/dist/esm/graphs/MultiAgentGraph.mjs +15 -5
  79. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  80. package/dist/esm/langfuse.mjs +43 -2
  81. package/dist/esm/langfuse.mjs.map +1 -1
  82. package/dist/esm/langfuseToolOutputTracing.mjs +41 -1
  83. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  84. package/dist/esm/langfuseTraceShaping.mjs +7 -1
  85. package/dist/esm/langfuseTraceShaping.mjs.map +1 -1
  86. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +5 -9
  87. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  88. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +2 -7
  89. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  90. package/dist/esm/llm/contextPressureMeter.mjs +52 -11
  91. package/dist/esm/llm/contextPressureMeter.mjs.map +1 -1
  92. package/dist/esm/llm/init.mjs +1 -1
  93. package/dist/esm/llm/invoke.mjs +2 -2
  94. package/dist/esm/llm/openai/index.mjs +2 -1
  95. package/dist/esm/llm/openai/index.mjs.map +1 -1
  96. package/dist/esm/llm/openai/utils/index.mjs +5 -4
  97. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  98. package/dist/esm/llm/preempt.mjs +2 -1
  99. package/dist/esm/llm/preempt.mjs.map +1 -1
  100. package/dist/esm/llm/prepareProviderRequest.mjs +9 -7
  101. package/dist/esm/llm/prepareProviderRequest.mjs.map +1 -1
  102. package/dist/esm/llm/providers.mjs +1 -1
  103. package/dist/esm/main.mjs +10 -7
  104. package/dist/esm/messages/alternation.mjs +2 -6
  105. package/dist/esm/messages/alternation.mjs.map +1 -1
  106. package/dist/esm/messages/budget.mjs +206 -8
  107. package/dist/esm/messages/budget.mjs.map +1 -1
  108. package/dist/esm/messages/cache.mjs +3 -9
  109. package/dist/esm/messages/cache.mjs.map +1 -1
  110. package/dist/esm/messages/core.mjs +23 -33
  111. package/dist/esm/messages/core.mjs.map +1 -1
  112. package/dist/esm/messages/format.mjs +132 -43
  113. package/dist/esm/messages/format.mjs.map +1 -1
  114. package/dist/esm/messages/index.mjs +2 -0
  115. package/dist/esm/messages/prune.mjs +12 -7
  116. package/dist/esm/messages/prune.mjs.map +1 -1
  117. package/dist/esm/messages/reasoningTypes.mjs +20 -0
  118. package/dist/esm/messages/reasoningTypes.mjs.map +1 -0
  119. package/dist/esm/messages/recency.mjs +16 -95
  120. package/dist/esm/messages/recency.mjs.map +1 -1
  121. package/dist/esm/messages/toolHistoryProjection.mjs +237 -0
  122. package/dist/esm/messages/toolHistoryProjection.mjs.map +1 -0
  123. package/dist/esm/messages/toolResultTypes.mjs +141 -4
  124. package/dist/esm/messages/toolResultTypes.mjs.map +1 -1
  125. package/dist/esm/run.mjs +5 -4
  126. package/dist/esm/run.mjs.map +1 -1
  127. package/dist/esm/session/AgentSession.mjs +6 -4
  128. package/dist/esm/session/AgentSession.mjs.map +1 -1
  129. package/dist/esm/session/JsonlSessionStore.mjs +3 -0
  130. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  131. package/dist/esm/session/index.mjs +1 -1
  132. package/dist/esm/session/sessionProjection.mjs +72 -0
  133. package/dist/esm/session/sessionProjection.mjs.map +1 -0
  134. package/dist/esm/stream.mjs +15 -14
  135. package/dist/esm/stream.mjs.map +1 -1
  136. package/dist/esm/summarization/index.mjs.map +1 -1
  137. package/dist/esm/summarization/node.mjs +19 -9
  138. package/dist/esm/summarization/node.mjs.map +1 -1
  139. package/dist/esm/summarization/shared.mjs +9 -1
  140. package/dist/esm/summarization/shared.mjs.map +1 -1
  141. package/dist/esm/tools/local/CompileCheckTool.mjs +1 -1
  142. package/dist/esm/tools/local/LocalCodingTools.mjs +1 -1
  143. package/dist/esm/utils/events.mjs +13 -0
  144. package/dist/esm/utils/events.mjs.map +1 -1
  145. package/dist/esm/utils/tokens.mjs +105 -1
  146. package/dist/esm/utils/tokens.mjs.map +1 -1
  147. package/dist/types/agents/AgentContext.d.ts +13 -1
  148. package/dist/types/graphs/Graph.d.ts +27 -0
  149. package/dist/types/hooks/types.d.ts +4 -2
  150. package/dist/types/index.d.ts +1 -0
  151. package/dist/types/langfuse.d.ts +5 -0
  152. package/dist/types/langfuseToolOutputTracing.d.ts +2 -0
  153. package/dist/types/llm/contextPressureMeter.d.ts +2 -1
  154. package/dist/types/llm/prepareProviderRequest.d.ts +7 -1
  155. package/dist/types/messages/budget.d.ts +15 -10
  156. package/dist/types/messages/core.d.ts +8 -17
  157. package/dist/types/messages/format.d.ts +3 -2
  158. package/dist/types/messages/index.d.ts +1 -1
  159. package/dist/types/messages/prune.d.ts +1 -1
  160. package/dist/types/messages/reasoningTypes.d.ts +7 -0
  161. package/dist/types/messages/recency.d.ts +3 -0
  162. package/dist/types/messages/toolHistoryProjection.d.ts +65 -0
  163. package/dist/types/messages/toolResultTypes.d.ts +31 -1
  164. package/dist/types/session/sessionProjection.d.ts +10 -0
  165. package/dist/types/summarization/index.d.ts +2 -1
  166. package/dist/types/summarization/node.d.ts +1 -0
  167. package/dist/types/summarization/shared.d.ts +12 -0
  168. package/dist/types/types/graph.d.ts +20 -0
  169. package/dist/types/types/run.d.ts +4 -0
  170. package/dist/types/types/summarize.d.ts +4 -1
  171. package/dist/types/utils/tokens.d.ts +2 -1
  172. package/package.json +1 -1
  173. package/src/agents/AgentContext.ts +34 -3
  174. package/src/graphs/Graph.ts +465 -147
  175. package/src/graphs/MultiAgentGraph.ts +28 -6
  176. package/src/hooks/types.ts +4 -1
  177. package/src/index.ts +1 -0
  178. package/src/langfuse.ts +67 -9
  179. package/src/langfuseToolOutputTracing.ts +91 -0
  180. package/src/langfuseTraceShaping.ts +17 -4
  181. package/src/llm/anthropic/utils/message_inputs.ts +5 -10
  182. package/src/llm/bedrock/utils/message_inputs.ts +2 -8
  183. package/src/llm/contextPressureMeter.ts +80 -12
  184. package/src/llm/openai/utils/index.ts +5 -4
  185. package/src/llm/prepareProviderRequest.ts +21 -16
  186. package/src/messages/alternation.ts +2 -15
  187. package/src/messages/budget.ts +439 -23
  188. package/src/messages/cache.ts +8 -9
  189. package/src/messages/core.ts +65 -95
  190. package/src/messages/format.ts +262 -78
  191. package/src/messages/index.ts +1 -1
  192. package/src/messages/prune.ts +31 -12
  193. package/src/messages/reasoningTypes.ts +23 -0
  194. package/src/messages/recency.ts +35 -179
  195. package/src/messages/toolHistoryProjection.ts +460 -0
  196. package/src/messages/toolResultTypes.ts +331 -100
  197. package/src/run.ts +10 -2
  198. package/src/session/AgentSession.ts +33 -16
  199. package/src/session/JsonlSessionStore.ts +6 -0
  200. package/src/session/sessionProjection.ts +126 -0
  201. package/src/stream.ts +14 -19
  202. package/src/summarization/index.ts +2 -0
  203. package/src/summarization/node.ts +62 -13
  204. package/src/summarization/shared.ts +23 -0
  205. package/src/types/graph.ts +20 -0
  206. package/src/types/run.ts +4 -0
  207. package/src/types/summarize.ts +4 -1
  208. package/src/utils/events.ts +19 -0
  209. package/src/utils/tokens.ts +183 -0
@@ -16,6 +16,7 @@ export type UnsafeTokenMeasurementReason =
16
16
  | 'content_proxy'
17
17
  | 'metadata_proxy'
18
18
  | 'metadata_accessor'
19
+ | 'metadata_limit'
19
20
  | 'invalid_count';
20
21
 
21
22
  export class UnsafeTokenMeasurementError extends Error {
@@ -121,6 +122,7 @@ const MAX_STRUCTURED_TOKENIZATION_CHARS = 200_000;
121
122
  /** One UTF-16 character can encode to several tokenizer pieces. */
122
123
  const MAX_TOKENS_PER_OMITTED_STRUCTURED_CHAR = 4;
123
124
  const MAX_STRUCTURED_SAFETY_INSPECTION_WORK = 10_000;
125
+ const MAX_RAW_TOOL_CALLS = MAX_STRUCTURED_SAFETY_INSPECTION_WORK;
124
126
  /** Bounds BPE work per plain-text segment without omitting any text. */
125
127
  const MAX_TEXT_TOKENIZATION_CHARS = 8_192;
126
128
  /** Covers tokenizer segmentation changes on both sides of a chunk boundary. */
@@ -946,6 +948,63 @@ function getBoundedStructuredTokenCount(
946
948
  );
947
949
  }
948
950
 
951
+ export function readTokenMetadataProperty(
952
+ value: object,
953
+ key: PropertyKey,
954
+ path: string
955
+ ): unknown {
956
+ const seen = new Set<object>();
957
+ let current: object | null = value;
958
+ for (let depth = 0; current != null && depth < 100; depth++) {
959
+ if (isProxy(current)) {
960
+ throw new UnsafeTokenMeasurementError({
961
+ reason: 'metadata_proxy',
962
+ path,
963
+ });
964
+ }
965
+ if (seen.has(current)) {
966
+ throw new UnsafeTokenMeasurementError({
967
+ reason: 'metadata_accessor',
968
+ path,
969
+ });
970
+ }
971
+ seen.add(current);
972
+ let descriptor: PropertyDescriptor | undefined;
973
+ try {
974
+ descriptor = Object.getOwnPropertyDescriptor(current, key);
975
+ } catch {
976
+ throw new UnsafeTokenMeasurementError({
977
+ reason: 'metadata_accessor',
978
+ path,
979
+ });
980
+ }
981
+ if (descriptor != null) {
982
+ if (!('value' in descriptor)) {
983
+ throw new UnsafeTokenMeasurementError({
984
+ reason: 'metadata_accessor',
985
+ path,
986
+ });
987
+ }
988
+ return descriptor.value;
989
+ }
990
+ try {
991
+ current = Object.getPrototypeOf(current) as object | null;
992
+ } catch {
993
+ throw new UnsafeTokenMeasurementError({
994
+ reason: 'metadata_accessor',
995
+ path,
996
+ });
997
+ }
998
+ }
999
+ if (current != null) {
1000
+ throw new UnsafeTokenMeasurementError({
1001
+ reason: 'metadata_accessor',
1002
+ path,
1003
+ });
1004
+ }
1005
+ return undefined;
1006
+ }
1007
+
949
1008
  export function getTokenCountForMessage(
950
1009
  message: BaseMessage,
951
1010
  getTokenCount: (text: string) => number,
@@ -1187,6 +1246,130 @@ export function getTokenCountForMessage(
1187
1246
  : getBoundedStructuredTokenCount(args, countText);
1188
1247
  }
1189
1248
  }
1249
+ const rawCalls =
1250
+ toolCalls.length > 0 || additionalKwargs == null
1251
+ ? undefined
1252
+ : readTokenMetadataProperty(
1253
+ additionalKwargs,
1254
+ 'tool_calls',
1255
+ 'additional_kwargs.tool_calls'
1256
+ );
1257
+ if (rawCalls != null) {
1258
+ if (isProxy(rawCalls)) {
1259
+ throw new UnsafeTokenMeasurementError({
1260
+ reason: 'metadata_proxy',
1261
+ path: 'additional_kwargs.tool_calls',
1262
+ });
1263
+ }
1264
+ if (!Array.isArray(rawCalls)) {
1265
+ throw new UnsafeTokenMeasurementError({
1266
+ reason: 'metadata_accessor',
1267
+ path: 'additional_kwargs.tool_calls',
1268
+ });
1269
+ }
1270
+ if (rawCalls.length > MAX_RAW_TOOL_CALLS) {
1271
+ throw new UnsafeTokenMeasurementError({
1272
+ reason: 'metadata_limit',
1273
+ path: 'additional_kwargs.tool_calls',
1274
+ });
1275
+ }
1276
+ for (let i = 0; i < rawCalls.length; i++) {
1277
+ const rawCall = readTokenMetadataProperty(
1278
+ rawCalls,
1279
+ String(i),
1280
+ `additional_kwargs.tool_calls[${i}]`
1281
+ );
1282
+ if (
1283
+ rawCall == null ||
1284
+ typeof rawCall !== 'object' ||
1285
+ isProxy(rawCall)
1286
+ ) {
1287
+ throw new UnsafeTokenMeasurementError({
1288
+ reason: 'metadata_proxy',
1289
+ path: `additional_kwargs.tool_calls[${i}]`,
1290
+ });
1291
+ }
1292
+ const callPath = `additional_kwargs.tool_calls[${i}]`;
1293
+ if (hasUnsafeStructuredSerialization(rawCall)) {
1294
+ throw new UnsafeTokenMeasurementError({
1295
+ reason: 'metadata_accessor',
1296
+ path: callPath,
1297
+ });
1298
+ }
1299
+ const callId = readTokenMetadataProperty(
1300
+ rawCall,
1301
+ 'id',
1302
+ `${callPath}.id`
1303
+ );
1304
+ const callType = readTokenMetadataProperty(
1305
+ rawCall,
1306
+ 'type',
1307
+ `${callPath}.type`
1308
+ );
1309
+ const rawFunction = readTokenMetadataProperty(
1310
+ rawCall,
1311
+ 'function',
1312
+ `${callPath}.function`
1313
+ );
1314
+ const rawCustom = readTokenMetadataProperty(
1315
+ rawCall,
1316
+ 'custom',
1317
+ `${callPath}.custom`
1318
+ );
1319
+ let projectedFunction = rawFunction;
1320
+ if (rawFunction != null && typeof rawFunction === 'object') {
1321
+ if (hasUnsafeStructuredSerialization(rawFunction)) {
1322
+ throw new UnsafeTokenMeasurementError({
1323
+ reason: 'metadata_accessor',
1324
+ path: `${callPath}.function`,
1325
+ });
1326
+ }
1327
+ const name = readTokenMetadataProperty(
1328
+ rawFunction,
1329
+ 'name',
1330
+ `${callPath}.function.name`
1331
+ );
1332
+ const args = readTokenMetadataProperty(
1333
+ rawFunction,
1334
+ 'arguments',
1335
+ `${callPath}.function.arguments`
1336
+ );
1337
+ projectedFunction = { name, arguments: args };
1338
+ }
1339
+ let projectedCustom = rawCustom;
1340
+ if (rawCustom != null && typeof rawCustom === 'object') {
1341
+ if (hasUnsafeStructuredSerialization(rawCustom)) {
1342
+ throw new UnsafeTokenMeasurementError({
1343
+ reason: 'metadata_accessor',
1344
+ path: `${callPath}.custom`,
1345
+ });
1346
+ }
1347
+ const name = readTokenMetadataProperty(
1348
+ rawCustom,
1349
+ 'name',
1350
+ `${callPath}.custom.name`
1351
+ );
1352
+ const input = readTokenMetadataProperty(
1353
+ rawCustom,
1354
+ 'input',
1355
+ `${callPath}.custom.input`
1356
+ );
1357
+ projectedCustom = { name, input };
1358
+ }
1359
+ if (typeof callId === 'string' && representedToolCallIds.has(callId)) {
1360
+ continue;
1361
+ }
1362
+ numTokens += getBoundedStructuredTokenCount(
1363
+ {
1364
+ id: callId,
1365
+ type: callType,
1366
+ custom: projectedCustom,
1367
+ function: projectedFunction,
1368
+ },
1369
+ countText
1370
+ );
1371
+ }
1372
+ }
1190
1373
  let legacyFunctionCall: PropertyDescriptor | undefined;
1191
1374
  try {
1192
1375
  legacyFunctionCall =