@agent-inspect/langchain 1.6.0 → 1.8.0

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.mjs CHANGED
@@ -109,6 +109,71 @@ function safePreview(value, maxChars) {
109
109
  }
110
110
  }
111
111
  var MAX_METADATA_KEYS = 40;
112
+ var LANGGRAPH_ALIASES = [
113
+ { out: "graphId", aliases: ["graphId", "graph_id", "langgraph_graph_id"] },
114
+ { out: "graphName", aliases: ["graphName", "graph_name", "langgraph_graph_name"] },
115
+ { out: "nodeId", aliases: ["nodeId", "node_id", "langgraph_node_id"] },
116
+ { out: "nodeName", aliases: ["nodeName", "node_name", "langgraph_node"] },
117
+ { out: "subgraphId", aliases: ["subgraphId", "subgraph_id", "langgraph_subgraph_id"] },
118
+ { out: "subgraphName", aliases: ["subgraphName", "subgraph_name", "langgraph_subgraph"] },
119
+ { out: "taskId", aliases: ["taskId", "task_id", "langgraph_task_id"] },
120
+ { out: "taskName", aliases: ["taskName", "task_name", "langgraph_task"] },
121
+ { out: "branch", aliases: ["branch", "branchName", "branch_name", "langgraph_branch"] },
122
+ { out: "branchPath", aliases: ["branchPath", "branch_path", "langgraph_path"] },
123
+ { out: "checkpointId", aliases: ["checkpointId", "checkpoint_id", "langgraph_checkpoint_id"] },
124
+ {
125
+ out: "checkpointNamespace",
126
+ aliases: ["checkpointNamespace", "checkpoint_ns", "langgraph_checkpoint_ns"]
127
+ },
128
+ { out: "threadId", aliases: ["threadId", "thread_id", "langgraph_thread_id"] },
129
+ { out: "sessionId", aliases: ["sessionId", "session_id", "langgraph_session_id"] },
130
+ { out: "retryAttempt", aliases: ["retryAttempt", "retry_attempt", "attempt"] },
131
+ { out: "handoffFrom", aliases: ["handoffFrom", "handoff_from", "langgraph_handoff_from"] },
132
+ { out: "handoffTo", aliases: ["handoffTo", "handoff_to", "langgraph_handoff_to"] }
133
+ ];
134
+ var LANGGRAPH_SUMMARY_ALIASES = [
135
+ { out: "checkpointSummary", aliases: ["checkpoint", "langgraph_checkpoint"] },
136
+ { out: "branchSummary", aliases: ["branches", "langgraph_branches", "langgraph_triggers"] },
137
+ { out: "taskSummary", aliases: ["tasks", "langgraph_tasks"] }
138
+ ];
139
+ function boundedValue(value) {
140
+ if (value === null) return null;
141
+ if (typeof value === "string") return value.length <= 200 ? value : `${value.slice(0, 200)}\u2026`;
142
+ if (typeof value === "number" || typeof value === "boolean") return value;
143
+ if (typeof value === "bigint") return value.toString();
144
+ if (Array.isArray(value)) {
145
+ const items = value.slice(0, 10).map((item) => {
146
+ if (item === null) return null;
147
+ if (typeof item === "string" || typeof item === "number" || typeof item === "boolean") {
148
+ return item;
149
+ }
150
+ if (typeof item === "bigint") return item.toString();
151
+ return summarizeValue(item);
152
+ });
153
+ return {
154
+ type: "array",
155
+ itemCount: value.length,
156
+ items,
157
+ truncated: value.length > items.length ? true : void 0
158
+ };
159
+ }
160
+ return summarizeValue(value);
161
+ }
162
+ function summarizeValue(value) {
163
+ if (Array.isArray(value)) return { type: "array", itemCount: value.length };
164
+ if (isRecord(value)) return { type: "object", keyCount: Object.keys(value).length };
165
+ return { type: typeof value };
166
+ }
167
+ function getAliasValue(sources, aliases) {
168
+ for (const source of sources) {
169
+ for (const alias of aliases) {
170
+ if (Object.prototype.hasOwnProperty.call(source, alias)) {
171
+ return source[alias];
172
+ }
173
+ }
174
+ }
175
+ return void 0;
176
+ }
112
177
  function toPlainMetadata(value) {
113
178
  try {
114
179
  if (!isRecord(value)) return {};
@@ -145,6 +210,32 @@ function toPlainMetadata(value) {
145
210
  return {};
146
211
  }
147
212
  }
213
+ function extractLangGraphMetadata(value) {
214
+ try {
215
+ if (!isRecord(value)) return void 0;
216
+ const sources = [value];
217
+ for (const key of ["langgraph", "configurable"]) {
218
+ const nested = value[key];
219
+ if (isRecord(nested)) sources.push(nested);
220
+ }
221
+ const config = value.config;
222
+ if (isRecord(config) && isRecord(config.configurable)) {
223
+ sources.push(config.configurable);
224
+ }
225
+ const out = {};
226
+ for (const { out: outKey, aliases } of LANGGRAPH_ALIASES) {
227
+ const raw = getAliasValue(sources, aliases);
228
+ if (raw !== void 0) out[outKey] = boundedValue(raw);
229
+ }
230
+ for (const { out: outKey, aliases } of LANGGRAPH_SUMMARY_ALIASES) {
231
+ const raw = getAliasValue(sources, aliases);
232
+ if (raw !== void 0) out[outKey] = summarizeValue(raw);
233
+ }
234
+ return Object.keys(out).length > 0 ? out : void 0;
235
+ } catch {
236
+ return void 0;
237
+ }
238
+ }
148
239
 
149
240
  // packages/langchain/src/streaming-metadata.ts
150
241
  function createLlmStreamState() {
@@ -284,6 +375,11 @@ var LangChainTracePersistence = class {
284
375
  const stepId = createStepId();
285
376
  this.#lcToStepId.set(params.lcRunId, stepId);
286
377
  const parentId = this.resolveParentId(params.lcParentRunId);
378
+ const metadata = toStepMetadata(params.attributes);
379
+ if (params.lcParentRunId && !parentId) {
380
+ metadata.parentMapping = "unresolved";
381
+ metadata.unresolvedParentRunId = params.lcParentRunId;
382
+ }
287
383
  const event = {
288
384
  schemaVersion: "0.1",
289
385
  event: "step_started",
@@ -294,7 +390,7 @@ var LangChainTracePersistence = class {
294
390
  name: params.name,
295
391
  type: kindToStepType(params.kind),
296
392
  startTime: params.startTime,
297
- metadata: toStepMetadata(params.attributes)
393
+ metadata
298
394
  };
299
395
  await this.#write(event);
300
396
  } catch (err) {
@@ -308,6 +404,11 @@ var LangChainTracePersistence = class {
308
404
  stepId = createStepId();
309
405
  this.#lcToStepId.set(params.lcRunId, stepId);
310
406
  const parentId = this.resolveParentId(params.lcParentRunId);
407
+ const metadata = toStepMetadata(params.completionAttributes);
408
+ if (params.lcParentRunId && !parentId) {
409
+ metadata.parentMapping = "unresolved";
410
+ metadata.unresolvedParentRunId = params.lcParentRunId;
411
+ }
311
412
  const startTime = params.endTime - (params.durationMs ?? 0);
312
413
  const started = {
313
414
  schemaVersion: "0.1",
@@ -321,7 +422,7 @@ var LangChainTracePersistence = class {
321
422
  params.completionAttributes.kind ?? "LLM"
322
423
  ),
323
424
  startTime,
324
- metadata: toStepMetadata(params.completionAttributes)
425
+ metadata
325
426
  };
326
427
  await this.#write(started);
327
428
  }
@@ -360,6 +461,11 @@ var LangChainTracePersistence = class {
360
461
  const stepId = createStepId();
361
462
  this.#lcToStepId.set(params.lcRunId, stepId);
362
463
  const parentId = this.resolveParentId(params.lcParentRunId);
464
+ const metadata = toStepMetadata(params.attributes);
465
+ if (params.lcParentRunId && !parentId) {
466
+ metadata.parentMapping = "unresolved";
467
+ metadata.unresolvedParentRunId = params.lcParentRunId;
468
+ }
363
469
  const started = {
364
470
  schemaVersion: "0.1",
365
471
  event: "step_started",
@@ -370,7 +476,7 @@ var LangChainTracePersistence = class {
370
476
  name: params.name,
371
477
  type: kindToStepType(params.kind),
372
478
  startTime: params.timestamp,
373
- metadata: toStepMetadata(params.attributes)
479
+ metadata
374
480
  };
375
481
  await this.#write(started);
376
482
  const completed = {
@@ -441,6 +547,9 @@ var LangChainTracePersistence = class {
441
547
  };
442
548
 
443
549
  // packages/langchain/src/agent-inspect-callback.ts
550
+ function isRecord2(v) {
551
+ return typeof v === "object" && v !== null && !Array.isArray(v);
552
+ }
444
553
  function serializedLabel(s) {
445
554
  if (typeof s.name === "string" && s.name.trim()) return s.name;
446
555
  if (Array.isArray(s.id) && s.id.length > 0) return s.id[s.id.length - 1];
@@ -574,6 +683,15 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
574
683
  #rememberStart(lcRunId, kind) {
575
684
  this.#starts.set(lcRunId, { ts: Date.now(), kind });
576
685
  }
686
+ #rememberStartMetadata(lcRunId, attrs) {
687
+ const start = this.#starts.get(lcRunId);
688
+ if (!start || !isRecord2(attrs.langGraph)) return;
689
+ this.#starts.set(lcRunId, { ...start, langGraph: { ...attrs.langGraph } });
690
+ }
691
+ #attachStartMetadata(attrs, lcRunId) {
692
+ const langGraph = this.#starts.get(lcRunId)?.langGraph;
693
+ if (langGraph && !attrs.langGraph) attrs.langGraph = { ...langGraph };
694
+ }
577
695
  #clearStart(lcRunId) {
578
696
  this.#starts.delete(lcRunId);
579
697
  }
@@ -592,6 +710,8 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
592
710
  #mergeMetadata(attrs, metadata) {
593
711
  if (this.#opts.capture === "none" || !metadata) return;
594
712
  attrs.metadata = this.#redactor.redactRecord(toPlainMetadata(metadata));
713
+ const langGraph = extractLangGraphMetadata(metadata);
714
+ if (langGraph) attrs.langGraph = this.#redactor.redactRecord(langGraph);
595
715
  }
596
716
  #applyPreview(attrs, previews) {
597
717
  if (this.#opts.capture !== "preview") return;
@@ -655,6 +775,7 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
655
775
  };
656
776
  this.#mergeMetadata(attrs, metadata);
657
777
  this.#applyPreview(attrs, previews);
778
+ this.#rememberStartMetadata(runId, attrs);
658
779
  const ts = Date.now();
659
780
  this.#pushEvent({
660
781
  eventId: `${runId}:CHAIN:start`,
@@ -673,12 +794,13 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
673
794
  async handleChainEnd(outputs, runId, parentRunId, tags, _kwargs) {
674
795
  this.#ensureRoot(runId, parentRunId);
675
796
  const durationMs = this.#durationFor(runId);
676
- this.#clearStart(runId);
677
797
  const previews = {};
678
798
  if (this.#opts.capture === "preview") previews.outputPreview = outputs;
679
799
  const attrs = {
680
800
  ...this.#baseAttrs(runId, parentRunId, tags, void 0)
681
801
  };
802
+ this.#attachStartMetadata(attrs, runId);
803
+ this.#clearStart(runId);
682
804
  this.#applyPreview(attrs, previews);
683
805
  const ts = Date.now();
684
806
  this.#pushEvent({
@@ -699,13 +821,14 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
699
821
  async handleChainError(err, runId, parentRunId, tags, _kwargs) {
700
822
  this.#ensureRoot(runId, parentRunId);
701
823
  const durationMs = this.#durationFor(runId);
702
- this.#clearStart(runId);
703
824
  const { errorName, errorMessage } = errorShape(err);
704
825
  const attrs = {
705
826
  ...this.#baseAttrs(runId, parentRunId, tags, void 0),
706
827
  errorName,
707
828
  errorMessage
708
829
  };
830
+ this.#attachStartMetadata(attrs, runId);
831
+ this.#clearStart(runId);
709
832
  const ts = Date.now();
710
833
  this.#pushEvent({
711
834
  eventId: `${runId}:CHAIN:error`,
@@ -737,6 +860,7 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
737
860
  this.#mergeMetadata(attrs, metadata);
738
861
  this.#mergeCorrelation(attrs);
739
862
  this.#applyPreview(attrs, previews);
863
+ this.#rememberStartMetadata(runId, attrs);
740
864
  const ts = Date.now();
741
865
  const stepName = `llm:${model ?? "llm"}`;
742
866
  this.#pushEvent({
@@ -766,6 +890,7 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
766
890
  this.#mergeMetadata(attrs, metadata);
767
891
  this.#mergeCorrelation(attrs);
768
892
  this.#applyPreview(attrs, previews);
893
+ this.#rememberStartMetadata(runId, attrs);
769
894
  const ts = Date.now();
770
895
  const stepName = `llm:${model ?? "llm"}`;
771
896
  this.#pushEvent({
@@ -800,7 +925,6 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
800
925
  async handleLLMEnd(output, runId, parentRunId, tags, _extraParams) {
801
926
  this.#ensureRoot(runId, parentRunId);
802
927
  const durationMs = this.#durationFor(runId);
803
- this.#clearStart(runId);
804
928
  const tokens = extractTokenUsage(output);
805
929
  const model = extractModelName(output);
806
930
  const previews = {};
@@ -810,6 +934,8 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
810
934
  };
811
935
  if (model && this.#opts.capture !== "none") attrs.model = model;
812
936
  if (tokens && this.#opts.capture !== "none") attrs.tokens = tokens;
937
+ this.#attachStartMetadata(attrs, runId);
938
+ this.#clearStart(runId);
813
939
  this.#attachStreamMetadata(attrs, runId);
814
940
  this.#mergeCorrelation(attrs);
815
941
  this.#applyPreview(attrs, previews);
@@ -838,13 +964,14 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
838
964
  async handleLLMError(err, runId, parentRunId, tags, _extraParams) {
839
965
  this.#ensureRoot(runId, parentRunId);
840
966
  const durationMs = this.#durationFor(runId);
841
- this.#clearStart(runId);
842
967
  const { errorName, errorMessage } = errorShape(err);
843
968
  const attrs = {
844
969
  ...this.#baseAttrs(runId, parentRunId, tags, void 0),
845
970
  errorName,
846
971
  errorMessage
847
972
  };
973
+ this.#attachStartMetadata(attrs, runId);
974
+ this.#clearStart(runId);
848
975
  this.#attachStreamMetadata(attrs, runId);
849
976
  this.#mergeCorrelation(attrs);
850
977
  const ts = Date.now();
@@ -881,6 +1008,7 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
881
1008
  };
882
1009
  this.#mergeMetadata(attrs, metadata);
883
1010
  this.#applyPreview(attrs, previews);
1011
+ this.#rememberStartMetadata(runId, attrs);
884
1012
  const ts = Date.now();
885
1013
  const stepName = `tool:${toolName}`;
886
1014
  this.#pushEvent({
@@ -900,12 +1028,13 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
900
1028
  async handleToolEnd(output, runId, parentRunId, tags) {
901
1029
  this.#ensureRoot(runId, parentRunId);
902
1030
  const durationMs = this.#durationFor(runId);
903
- this.#clearStart(runId);
904
1031
  const previews = {};
905
1032
  if (this.#opts.capture === "preview") previews.outputPreview = output;
906
1033
  const attrs = {
907
1034
  ...this.#baseAttrs(runId, parentRunId, tags, void 0)
908
1035
  };
1036
+ this.#attachStartMetadata(attrs, runId);
1037
+ this.#clearStart(runId);
909
1038
  this.#applyPreview(attrs, previews);
910
1039
  const ts = Date.now();
911
1040
  this.#pushEvent({
@@ -926,13 +1055,14 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
926
1055
  async handleToolError(err, runId, parentRunId, tags) {
927
1056
  this.#ensureRoot(runId, parentRunId);
928
1057
  const durationMs = this.#durationFor(runId);
929
- this.#clearStart(runId);
930
1058
  const { errorName, errorMessage } = errorShape(err);
931
1059
  const attrs = {
932
1060
  ...this.#baseAttrs(runId, parentRunId, tags, void 0),
933
1061
  errorName,
934
1062
  errorMessage
935
1063
  };
1064
+ this.#attachStartMetadata(attrs, runId);
1065
+ this.#clearStart(runId);
936
1066
  const ts = Date.now();
937
1067
  this.#pushEvent({
938
1068
  eventId: `${runId}:TOOL:error`,
@@ -958,6 +1088,7 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
958
1088
  retriever: rname
959
1089
  };
960
1090
  this.#mergeMetadata(attrs, metadata);
1091
+ this.#rememberStartMetadata(runId, attrs);
961
1092
  const ts = Date.now();
962
1093
  const stepName = `retriever:${rname}`;
963
1094
  this.#pushEvent({
@@ -977,7 +1108,6 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
977
1108
  async handleRetrieverEnd(documents, runId, parentRunId, tags) {
978
1109
  this.#ensureRoot(runId, parentRunId);
979
1110
  const durationMs = this.#durationFor(runId);
980
- this.#clearStart(runId);
981
1111
  const previews = {};
982
1112
  if (this.#opts.capture === "preview" && documents.length > 0) {
983
1113
  previews.documentPreview = documents.slice(0, 3);
@@ -986,6 +1116,8 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
986
1116
  ...this.#baseAttrs(runId, parentRunId, tags, void 0),
987
1117
  documentCount: documents.length
988
1118
  };
1119
+ this.#attachStartMetadata(attrs, runId);
1120
+ this.#clearStart(runId);
989
1121
  this.#applyPreview(attrs, previews);
990
1122
  const ts = Date.now();
991
1123
  this.#pushEvent({
@@ -1006,13 +1138,14 @@ var AgentInspectCallback = class extends BaseCallbackHandler {
1006
1138
  async handleRetrieverError(err, runId, parentRunId, tags) {
1007
1139
  this.#ensureRoot(runId, parentRunId);
1008
1140
  const durationMs = this.#durationFor(runId);
1009
- this.#clearStart(runId);
1010
1141
  const { errorName, errorMessage } = errorShape(err);
1011
1142
  const attrs = {
1012
1143
  ...this.#baseAttrs(runId, parentRunId, tags, void 0),
1013
1144
  errorName,
1014
1145
  errorMessage
1015
1146
  };
1147
+ this.#attachStartMetadata(attrs, runId);
1148
+ this.#clearStart(runId);
1016
1149
  const ts = Date.now();
1017
1150
  this.#pushEvent({
1018
1151
  eventId: `${runId}:RETRIEVER:error`,