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