@langchain/langgraph 1.3.7 → 1.4.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 (215) hide show
  1. package/dist/channels/base.cjs +78 -2
  2. package/dist/channels/base.cjs.map +1 -1
  3. package/dist/channels/base.d.cts +35 -2
  4. package/dist/channels/base.d.cts.map +1 -1
  5. package/dist/channels/base.d.ts +35 -2
  6. package/dist/channels/base.d.ts.map +1 -1
  7. package/dist/channels/base.js +77 -4
  8. package/dist/channels/base.js.map +1 -1
  9. package/dist/channels/delta.cjs +136 -0
  10. package/dist/channels/delta.cjs.map +1 -0
  11. package/dist/channels/delta.d.cts +99 -0
  12. package/dist/channels/delta.d.cts.map +1 -0
  13. package/dist/channels/delta.d.ts +99 -0
  14. package/dist/channels/delta.d.ts.map +1 -0
  15. package/dist/channels/delta.js +136 -0
  16. package/dist/channels/delta.js.map +1 -0
  17. package/dist/channels/index.cjs +5 -0
  18. package/dist/channels/index.d.cts +3 -2
  19. package/dist/channels/index.d.ts +3 -2
  20. package/dist/channels/index.js +3 -2
  21. package/dist/constants.cjs +63 -4
  22. package/dist/constants.cjs.map +1 -1
  23. package/dist/constants.d.cts +33 -2
  24. package/dist/constants.d.cts.map +1 -1
  25. package/dist/constants.d.ts +33 -2
  26. package/dist/constants.d.ts.map +1 -1
  27. package/dist/constants.js +59 -5
  28. package/dist/constants.js.map +1 -1
  29. package/dist/errors.cjs +128 -0
  30. package/dist/errors.cjs.map +1 -1
  31. package/dist/errors.d.cts +86 -1
  32. package/dist/errors.d.cts.map +1 -1
  33. package/dist/errors.d.ts +86 -1
  34. package/dist/errors.d.ts.map +1 -1
  35. package/dist/errors.js +123 -1
  36. package/dist/errors.js.map +1 -1
  37. package/dist/func/index.cjs +9 -2
  38. package/dist/func/index.cjs.map +1 -1
  39. package/dist/func/index.d.cts +14 -0
  40. package/dist/func/index.d.cts.map +1 -1
  41. package/dist/func/index.d.ts +14 -0
  42. package/dist/func/index.d.ts.map +1 -1
  43. package/dist/func/index.js +9 -2
  44. package/dist/func/index.js.map +1 -1
  45. package/dist/graph/graph.cjs +44 -7
  46. package/dist/graph/graph.cjs.map +1 -1
  47. package/dist/graph/graph.d.cts +24 -2
  48. package/dist/graph/graph.d.cts.map +1 -1
  49. package/dist/graph/graph.d.ts +24 -2
  50. package/dist/graph/graph.d.ts.map +1 -1
  51. package/dist/graph/graph.js +44 -7
  52. package/dist/graph/graph.js.map +1 -1
  53. package/dist/graph/index.d.ts +3 -3
  54. package/dist/graph/messages_reducer.cjs +55 -0
  55. package/dist/graph/messages_reducer.cjs.map +1 -1
  56. package/dist/graph/messages_reducer.d.cts +28 -1
  57. package/dist/graph/messages_reducer.d.cts.map +1 -1
  58. package/dist/graph/messages_reducer.d.ts +28 -1
  59. package/dist/graph/messages_reducer.d.ts.map +1 -1
  60. package/dist/graph/messages_reducer.js +56 -2
  61. package/dist/graph/messages_reducer.js.map +1 -1
  62. package/dist/graph/state.cjs +208 -12
  63. package/dist/graph/state.cjs.map +1 -1
  64. package/dist/graph/state.d.cts +193 -17
  65. package/dist/graph/state.d.cts.map +1 -1
  66. package/dist/graph/state.d.ts +193 -17
  67. package/dist/graph/state.d.ts.map +1 -1
  68. package/dist/graph/state.js +210 -14
  69. package/dist/graph/state.js.map +1 -1
  70. package/dist/graph/zod/schema.cjs +5 -0
  71. package/dist/graph/zod/schema.cjs.map +1 -1
  72. package/dist/graph/zod/schema.d.cts.map +1 -1
  73. package/dist/graph/zod/schema.d.ts.map +1 -1
  74. package/dist/graph/zod/schema.js +5 -0
  75. package/dist/graph/zod/schema.js.map +1 -1
  76. package/dist/index.cjs +11 -0
  77. package/dist/index.cjs.map +1 -1
  78. package/dist/index.d.cts +11 -8
  79. package/dist/index.d.ts +11 -8
  80. package/dist/index.js +5 -3
  81. package/dist/index.js.map +1 -1
  82. package/dist/prebuilt/react_agent_executor.d.cts +1 -1
  83. package/dist/prebuilt/tool_node.cjs +69 -6
  84. package/dist/prebuilt/tool_node.cjs.map +1 -1
  85. package/dist/prebuilt/tool_node.d.cts +55 -3
  86. package/dist/prebuilt/tool_node.d.cts.map +1 -1
  87. package/dist/prebuilt/tool_node.d.ts +55 -3
  88. package/dist/prebuilt/tool_node.d.ts.map +1 -1
  89. package/dist/prebuilt/tool_node.js +69 -6
  90. package/dist/prebuilt/tool_node.js.map +1 -1
  91. package/dist/pregel/algo.cjs +182 -21
  92. package/dist/pregel/algo.cjs.map +1 -1
  93. package/dist/pregel/algo.d.cts +1 -1
  94. package/dist/pregel/algo.d.cts.map +1 -1
  95. package/dist/pregel/algo.d.ts +1 -1
  96. package/dist/pregel/algo.d.ts.map +1 -1
  97. package/dist/pregel/algo.js +185 -25
  98. package/dist/pregel/algo.js.map +1 -1
  99. package/dist/pregel/call.cjs +2 -1
  100. package/dist/pregel/call.cjs.map +1 -1
  101. package/dist/pregel/call.js +2 -1
  102. package/dist/pregel/call.js.map +1 -1
  103. package/dist/pregel/index.cjs +15 -3
  104. package/dist/pregel/index.cjs.map +1 -1
  105. package/dist/pregel/index.d.cts.map +1 -1
  106. package/dist/pregel/index.d.ts.map +1 -1
  107. package/dist/pregel/index.js +17 -5
  108. package/dist/pregel/index.js.map +1 -1
  109. package/dist/pregel/loop.cjs +362 -41
  110. package/dist/pregel/loop.cjs.map +1 -1
  111. package/dist/pregel/loop.js +365 -44
  112. package/dist/pregel/loop.js.map +1 -1
  113. package/dist/pregel/messages-v2.cjs +1 -1
  114. package/dist/pregel/messages-v2.js +1 -1
  115. package/dist/pregel/messages.cjs +1 -1
  116. package/dist/pregel/messages.js +1 -1
  117. package/dist/pregel/read.cjs +15 -5
  118. package/dist/pregel/read.cjs.map +1 -1
  119. package/dist/pregel/read.d.cts +9 -0
  120. package/dist/pregel/read.d.cts.map +1 -1
  121. package/dist/pregel/read.d.ts +9 -0
  122. package/dist/pregel/read.d.ts.map +1 -1
  123. package/dist/pregel/read.js +15 -5
  124. package/dist/pregel/read.js.map +1 -1
  125. package/dist/pregel/remote-run-stream.cjs +107 -0
  126. package/dist/pregel/remote-run-stream.cjs.map +1 -0
  127. package/dist/pregel/remote-run-stream.d.cts +33 -0
  128. package/dist/pregel/remote-run-stream.d.cts.map +1 -0
  129. package/dist/pregel/remote-run-stream.d.ts +33 -0
  130. package/dist/pregel/remote-run-stream.d.ts.map +1 -0
  131. package/dist/pregel/remote-run-stream.js +107 -0
  132. package/dist/pregel/remote-run-stream.js.map +1 -0
  133. package/dist/pregel/remote.cjs +61 -1
  134. package/dist/pregel/remote.cjs.map +1 -1
  135. package/dist/pregel/remote.d.cts +17 -0
  136. package/dist/pregel/remote.d.cts.map +1 -1
  137. package/dist/pregel/remote.d.ts +17 -0
  138. package/dist/pregel/remote.d.ts.map +1 -1
  139. package/dist/pregel/remote.js +61 -1
  140. package/dist/pregel/remote.js.map +1 -1
  141. package/dist/pregel/replay.cjs +62 -0
  142. package/dist/pregel/replay.cjs.map +1 -0
  143. package/dist/pregel/replay.js +62 -0
  144. package/dist/pregel/replay.js.map +1 -0
  145. package/dist/pregel/retry.cjs +8 -6
  146. package/dist/pregel/retry.cjs.map +1 -1
  147. package/dist/pregel/retry.js +8 -6
  148. package/dist/pregel/retry.js.map +1 -1
  149. package/dist/pregel/runnable_types.d.cts +20 -0
  150. package/dist/pregel/runnable_types.d.cts.map +1 -1
  151. package/dist/pregel/runnable_types.d.ts +20 -0
  152. package/dist/pregel/runnable_types.d.ts.map +1 -1
  153. package/dist/pregel/runner.cjs +48 -7
  154. package/dist/pregel/runner.cjs.map +1 -1
  155. package/dist/pregel/runner.js +50 -9
  156. package/dist/pregel/runner.js.map +1 -1
  157. package/dist/pregel/runtime.cjs +64 -0
  158. package/dist/pregel/runtime.cjs.map +1 -0
  159. package/dist/pregel/runtime.d.cts +57 -0
  160. package/dist/pregel/runtime.d.cts.map +1 -0
  161. package/dist/pregel/runtime.d.ts +57 -0
  162. package/dist/pregel/runtime.d.ts.map +1 -0
  163. package/dist/pregel/runtime.js +64 -0
  164. package/dist/pregel/runtime.js.map +1 -0
  165. package/dist/pregel/stream.cjs +2 -0
  166. package/dist/pregel/stream.cjs.map +1 -1
  167. package/dist/pregel/stream.js +2 -0
  168. package/dist/pregel/stream.js.map +1 -1
  169. package/dist/pregel/timeout.cjs +216 -0
  170. package/dist/pregel/timeout.cjs.map +1 -0
  171. package/dist/pregel/timeout.js +216 -0
  172. package/dist/pregel/timeout.js.map +1 -0
  173. package/dist/pregel/types.cjs +3 -1
  174. package/dist/pregel/types.cjs.map +1 -1
  175. package/dist/pregel/types.d.cts +13 -0
  176. package/dist/pregel/types.d.cts.map +1 -1
  177. package/dist/pregel/types.d.ts +14 -1
  178. package/dist/pregel/types.d.ts.map +1 -1
  179. package/dist/pregel/types.js +3 -1
  180. package/dist/pregel/types.js.map +1 -1
  181. package/dist/pregel/utils/config.cjs +18 -2
  182. package/dist/pregel/utils/config.cjs.map +1 -1
  183. package/dist/pregel/utils/config.d.cts +15 -1
  184. package/dist/pregel/utils/config.d.cts.map +1 -1
  185. package/dist/pregel/utils/config.d.ts +15 -1
  186. package/dist/pregel/utils/config.d.ts.map +1 -1
  187. package/dist/pregel/utils/config.js +18 -2
  188. package/dist/pregel/utils/config.js.map +1 -1
  189. package/dist/pregel/utils/index.cjs +1 -0
  190. package/dist/pregel/utils/index.cjs.map +1 -1
  191. package/dist/pregel/utils/index.d.cts +6 -1
  192. package/dist/pregel/utils/index.d.cts.map +1 -1
  193. package/dist/pregel/utils/index.d.ts +6 -1
  194. package/dist/pregel/utils/index.d.ts.map +1 -1
  195. package/dist/pregel/utils/index.js +1 -0
  196. package/dist/pregel/utils/index.js.map +1 -1
  197. package/dist/pregel/utils/timeout.cjs +34 -0
  198. package/dist/pregel/utils/timeout.cjs.map +1 -0
  199. package/dist/pregel/utils/timeout.d.cts +45 -0
  200. package/dist/pregel/utils/timeout.d.cts.map +1 -0
  201. package/dist/pregel/utils/timeout.d.ts +45 -0
  202. package/dist/pregel/utils/timeout.d.ts.map +1 -0
  203. package/dist/pregel/utils/timeout.js +34 -0
  204. package/dist/pregel/utils/timeout.js.map +1 -0
  205. package/dist/state/schema.cjs +12 -2
  206. package/dist/state/schema.cjs.map +1 -1
  207. package/dist/state/schema.d.cts.map +1 -1
  208. package/dist/state/schema.d.ts.map +1 -1
  209. package/dist/state/schema.js +12 -2
  210. package/dist/state/schema.js.map +1 -1
  211. package/dist/web.cjs +11 -0
  212. package/dist/web.d.cts +11 -8
  213. package/dist/web.d.ts +11 -8
  214. package/dist/web.js +5 -3
  215. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"graph.cjs","names":["Runnable","ChannelWrite","RunnableCallable","NodeInterrupt","_isSend","InvalidUpdateError","isPregelLike","START","END","EphemeralValue","UnreachableNodeError","Pregel","PregelNode","PASSTHROUGH","TAG_HIDDEN","Channel","DrawableGraph","z","gatherIterator","gatherIteratorSync"],"sources":["../../src/graph/graph.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n _coerceToRunnable,\n Runnable,\n RunnableConfig,\n RunnableInterface,\n RunnableIOSchema,\n type RunnableLike as LangChainRunnableLike,\n} from \"@langchain/core/runnables\";\nimport {\n Node as DrawableGraphNode,\n Graph as DrawableGraph,\n} from \"@langchain/core/runnables/graph\";\nimport { All, BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport { z } from \"zod/v4\";\nimport { validate as isUuid } from \"uuid\";\nimport type {\n RunnableLike,\n LangGraphRunnableConfig,\n} from \"../pregel/runnable_types.js\";\nimport { PregelNode } from \"../pregel/read.js\";\nimport { Channel, Pregel } from \"../pregel/index.js\";\nimport type { PregelOptions, PregelParams } from \"../pregel/types.js\";\nimport { BaseChannel } from \"../channels/base.js\";\nimport { EphemeralValue } from \"../channels/ephemeral_value.js\";\nimport { ChannelWrite, PASSTHROUGH } from \"../pregel/write.js\";\nimport {\n _isSend,\n CHECKPOINT_NAMESPACE_END,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n END,\n Send,\n START,\n TAG_HIDDEN,\n} from \"../constants.js\";\nimport {\n gatherIterator,\n gatherIteratorSync,\n RunnableCallable,\n} from \"../utils.js\";\nimport {\n InvalidUpdateError,\n NodeInterrupt,\n UnreachableNodeError,\n} from \"../errors.js\";\nimport { StateDefinition, StateType } from \"./annotation.js\";\nimport { isPregelLike } from \"../pregel/utils/subgraph.js\";\nimport type { StreamTransformer } from \"../stream/types.js\";\n\nexport interface BranchOptions<\n IO,\n N extends string,\n CallOptions extends LangGraphRunnableConfig = LangGraphRunnableConfig,\n> {\n source: N;\n path: RunnableLike<IO, BranchPathReturnValue, CallOptions>;\n pathMap?: Record<string, N | typeof END> | (N | typeof END)[];\n}\n\nexport type BranchPathReturnValue =\n | string\n | Send\n | (string | Send)[]\n | Promise<string | Send | (string | Send)[]>;\n\ntype CompiledGraphTypeNode<Spec> = Spec extends { node: infer N extends string }\n ? N\n : any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\ntype CompiledGraphTypeContext<Spec> = Spec extends {\n context: infer Context extends Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n ? Context\n : Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\ntype CompiledGraphTypeStreamTransformers<Spec> = Spec extends {\n streamTransformers: infer Transformers;\n}\n ? Transformers extends ReadonlyArray<\n () => StreamTransformer<any> // eslint-disable-line @typescript-eslint/no-explicit-any\n >\n ? Transformers\n : Transformers extends ReadonlyArray<\n StreamTransformer<any> // eslint-disable-line @typescript-eslint/no-explicit-any\n >\n ? { readonly [K in keyof Transformers]: () => Transformers[K] }\n : Transformers extends StreamTransformer<any> // eslint-disable-line @typescript-eslint/no-explicit-any\n ? readonly [() => Transformers]\n : []\n : [];\n\n/**\n * Convenience type for referencing a compiled graph by named type slots.\n *\n * @example\n * ```ts\n * type MyCompiledGraph = CompiledGraphType<{\n * state: State;\n * update: Update;\n * streamTransformers: [\n * StreamTransformer<Extensions>,\n * StreamTransformer<MoreExtensions>,\n * ];\n * }>;\n * ```\n */\nexport type CompiledGraphType<Spec extends object = object> = CompiledGraph<\n CompiledGraphTypeNode<Spec>,\n Spec extends { state: infer State } ? State : any, // eslint-disable-line @typescript-eslint/no-explicit-any\n Spec extends { update: infer Update } ? Update : any, // eslint-disable-line @typescript-eslint/no-explicit-any\n CompiledGraphTypeContext<Spec>,\n Spec extends { input: infer Input } ? Input : any, // eslint-disable-line @typescript-eslint/no-explicit-any\n Spec extends { output: infer Output } ? Output : any, // eslint-disable-line @typescript-eslint/no-explicit-any\n Spec extends { nodeReturn: infer NodeReturn } ? NodeReturn : unknown,\n Spec extends { command: infer Command } ? Command : unknown,\n Spec extends { streamCustom: infer StreamCustom } ? StreamCustom : any, // eslint-disable-line @typescript-eslint/no-explicit-any\n CompiledGraphTypeStreamTransformers<Spec>\n>;\n\ntype NodeAction<S, U, C extends StateDefinition> = RunnableLike<\n S,\n U extends object ? U & Record<string, any> : U, // eslint-disable-line @typescript-eslint/no-explicit-any\n LangGraphRunnableConfig<StateType<C>>\n>;\n\nexport class Branch<\n IO,\n N extends string,\n CallOptions extends LangGraphRunnableConfig = LangGraphRunnableConfig,\n> {\n path: Runnable<IO, BranchPathReturnValue>;\n\n ends?: Record<string, N | typeof END>;\n\n constructor(options: Omit<BranchOptions<IO, N, CallOptions>, \"source\">) {\n if (Runnable.isRunnable(options.path)) {\n this.path = options.path as Runnable<IO, BranchPathReturnValue>;\n } else {\n this.path = _coerceToRunnable(\n options.path as LangChainRunnableLike<IO, BranchPathReturnValue>\n );\n }\n this.ends = Array.isArray(options.pathMap)\n ? options.pathMap.reduce(\n (acc, n) => {\n acc[n] = n;\n return acc;\n },\n {} as Record<string, N | typeof END>\n )\n : options.pathMap;\n }\n\n run(\n writer: (\n dests: (string | Send)[],\n config: LangGraphRunnableConfig\n ) => Runnable | void | Promise<void>,\n reader?: (config: CallOptions) => IO\n ) {\n return ChannelWrite.registerWriter(\n new RunnableCallable({\n name: \"<branch_run>\",\n trace: false,\n func: async (input: IO, config: CallOptions) => {\n try {\n return await this._route(input, config, writer, reader);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n // Detect & warn if NodeInterrupt is thrown in a conditional edge\n if (e.name === NodeInterrupt.unminifiable_name) {\n console.warn(\n \"[WARN]: 'NodeInterrupt' thrown in conditional edge. This is likely a bug in your graph implementation.\\n\" +\n \"NodeInterrupt should only be thrown inside a node, not in edge conditions.\"\n );\n }\n throw e;\n }\n },\n })\n );\n }\n\n async _route(\n input: IO,\n config: CallOptions,\n writer: (\n dests: (string | Send)[],\n config: LangGraphRunnableConfig\n ) => Runnable | void | Promise<void>,\n reader?: (config: CallOptions) => IO\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<Runnable | any> {\n let result = await this.path.invoke(\n reader ? reader(config) : input,\n config\n );\n if (!Array.isArray(result)) {\n result = [result];\n }\n\n let destinations: (string | Send)[];\n if (this.ends) {\n destinations = result.map((r) => (_isSend(r) ? r : this.ends![r]));\n } else {\n destinations = result;\n }\n if (destinations.some((dest) => !dest)) {\n throw new Error(\"Branch condition returned unknown or null destination\");\n }\n if (destinations.filter(_isSend).some((packet) => packet.node === END)) {\n throw new InvalidUpdateError(\"Cannot send a packet to the END node\");\n }\n const writeResult = await writer(destinations, config);\n return writeResult ?? input;\n }\n}\n\nexport type NodeSpec<RunInput, RunOutput> = {\n runnable: Runnable<RunInput, RunOutput>;\n metadata?: Record<string, unknown>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n subgraphs?: Pregel<any, any>[];\n ends?: string[];\n defer?: boolean;\n};\n\nexport type AddNodeOptions<Nodes extends string = string> = {\n metadata?: Record<string, unknown>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n subgraphs?: Pregel<any, any>[];\n ends?: Nodes[];\n defer?: boolean;\n};\n\nexport class Graph<\n N extends string = typeof START | typeof END,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput = any,\n NodeSpecType extends NodeSpec<RunInput, RunOutput> = NodeSpec<\n RunInput,\n RunOutput\n >,\n C extends StateDefinition = StateDefinition,\n> {\n nodes: Record<N, NodeSpecType>;\n\n edges: Set<[N | typeof START, N | typeof END]>;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n branches: Record<string, Record<string, Branch<RunInput, N, any>>>;\n\n entryPoint?: string;\n\n compiled = false;\n\n constructor() {\n this.nodes = {} as Record<N, NodeSpecType>;\n this.edges = new Set();\n this.branches = {};\n }\n\n protected warnIfCompiled(message: string): void {\n if (this.compiled) {\n console.warn(message);\n }\n }\n\n get allEdges(): Set<[string, string]> {\n return this.edges;\n }\n\n addNode<K extends string, NodeInput = RunInput, NodeOutput = RunOutput>(\n nodes:\n | Record<K, NodeAction<NodeInput, NodeOutput, C>>\n | [\n key: K,\n action: NodeAction<NodeInput, NodeOutput, C>,\n options?: AddNodeOptions,\n ][]\n ): Graph<N | K, RunInput, RunOutput>;\n\n addNode<K extends string, NodeInput = RunInput, NodeOutput = RunOutput>(\n key: K,\n action: NodeAction<NodeInput, NodeOutput, C>,\n options?: AddNodeOptions\n ): Graph<N | K, RunInput, RunOutput>;\n\n addNode<K extends string, NodeInput = RunInput, NodeOutput = RunOutput>(\n ...args:\n | [\n key: K,\n action: NodeAction<NodeInput, NodeOutput, C>,\n options?: AddNodeOptions,\n ]\n | [\n nodes:\n | Record<K, NodeAction<NodeInput, NodeOutput, C>>\n | [\n key: K,\n action: NodeAction<NodeInput, NodeOutput, C>,\n options?: AddNodeOptions,\n ][],\n ]\n ): Graph<N | K, RunInput, RunOutput> {\n function isMutlipleNodes(\n args: unknown[]\n ): args is [\n nodes:\n | Record<K, NodeAction<NodeInput, RunOutput, C>>\n | [\n key: K,\n action: NodeAction<NodeInput, RunOutput, C>,\n options?: AddNodeOptions,\n ][],\n options?: AddNodeOptions,\n ] {\n return args.length >= 1 && typeof args[0] !== \"string\";\n }\n\n const nodes = (\n isMutlipleNodes(args) // eslint-disable-line no-nested-ternary\n ? Array.isArray(args[0])\n ? args[0]\n : Object.entries(args[0])\n : [[args[0], args[1], args[2]]]\n ) as [K, NodeAction<NodeInput, RunOutput, C>, AddNodeOptions][];\n\n if (nodes.length === 0) {\n throw new Error(\"No nodes provided in `addNode`\");\n }\n\n for (const [key, action, options] of nodes) {\n for (const reservedChar of [\n CHECKPOINT_NAMESPACE_SEPARATOR,\n CHECKPOINT_NAMESPACE_END,\n ]) {\n if (key.includes(reservedChar)) {\n throw new Error(\n `\"${reservedChar}\" is a reserved character and is not allowed in node names.`\n );\n }\n }\n this.warnIfCompiled(\n `Adding a node to a graph that has already been compiled. This will not be reflected in the compiled graph.`\n );\n\n if (key in this.nodes) {\n throw new Error(`Node \\`${key}\\` already present.`);\n }\n if (key === END) {\n throw new Error(`Node \\`${key}\\` is reserved.`);\n }\n\n const runnable = _coerceToRunnable<RunInput, RunOutput>(\n // Account for arbitrary state due to Send API\n action as RunnableLike<RunInput, RunOutput>\n );\n\n this.nodes[key as unknown as N] = {\n runnable,\n metadata: options?.metadata,\n subgraphs: isPregelLike(runnable) ? [runnable] : options?.subgraphs,\n ends: options?.ends,\n } as NodeSpecType;\n }\n\n return this as Graph<N | K, RunInput, RunOutput, NodeSpecType>;\n }\n\n addEdge(startKey: N | typeof START, endKey: N | typeof END): this {\n this.warnIfCompiled(\n `Adding an edge to a graph that has already been compiled. This will not be reflected in the compiled graph.`\n );\n\n if (startKey === END) {\n throw new Error(\"END cannot be a start node\");\n }\n if (endKey === START) {\n throw new Error(\"START cannot be an end node\");\n }\n if (\n Array.from(this.edges).some(([start]) => start === startKey) &&\n !(\"channels\" in this)\n ) {\n throw new Error(\n `Already found path for ${startKey}. For multiple edges, use StateGraph.`\n );\n }\n\n this.edges.add([startKey, endKey]);\n\n return this;\n }\n\n addConditionalEdges(\n source: BranchOptions<RunInput, N, LangGraphRunnableConfig<StateType<C>>>\n ): this;\n\n addConditionalEdges(\n source: N,\n path: RunnableLike<\n RunInput,\n BranchPathReturnValue,\n LangGraphRunnableConfig<StateType<C>>\n >,\n pathMap?: BranchOptions<\n RunInput,\n N,\n LangGraphRunnableConfig<StateType<C>>\n >[\"pathMap\"]\n ): this;\n\n addConditionalEdges(\n source:\n | N\n | BranchOptions<RunInput, N, LangGraphRunnableConfig<StateType<C>>>,\n path?: RunnableLike<\n RunInput,\n BranchPathReturnValue,\n LangGraphRunnableConfig<StateType<C>>\n >,\n pathMap?: BranchOptions<\n RunInput,\n N,\n LangGraphRunnableConfig<StateType<C>>\n >[\"pathMap\"]\n ): this {\n const options: BranchOptions<\n RunInput,\n N,\n LangGraphRunnableConfig<StateType<C>>\n > = typeof source === \"object\" ? source : { source, path: path!, pathMap };\n\n this.warnIfCompiled(\n \"Adding an edge to a graph that has already been compiled. This will not be reflected in the compiled graph.\"\n );\n if (!Runnable.isRunnable(options.path)) {\n options.path = _coerceToRunnable(\n options.path as LangChainRunnableLike<RunInput, BranchPathReturnValue>\n );\n }\n // find a name for condition\n const name =\n options.path.getName() === \"RunnableLambda\"\n ? \"condition\"\n : options.path.getName();\n // validate condition\n if (this.branches[options.source] && this.branches[options.source][name]) {\n throw new Error(\n `Condition \\`${name}\\` already present for node \\`${source}\\``\n );\n }\n // save it\n this.branches[options.source] ??= {};\n this.branches[options.source][name] = new Branch(options);\n return this;\n }\n\n /**\n * @deprecated use `addEdge(START, key)` instead\n */\n setEntryPoint(key: N): this {\n this.warnIfCompiled(\n \"Setting the entry point of a graph that has already been compiled. This will not be reflected in the compiled graph.\"\n );\n\n return this.addEdge(START, key);\n }\n\n /**\n * @deprecated use `addEdge(key, END)` instead\n */\n setFinishPoint(key: N): this {\n this.warnIfCompiled(\n \"Setting a finish point of a graph that has already been compiled. This will not be reflected in the compiled graph.\"\n );\n\n return this.addEdge(key, END);\n }\n\n compile<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const TTransformers extends ReadonlyArray<() => StreamTransformer<any>> =\n [],\n >({\n checkpointer,\n interruptBefore,\n interruptAfter,\n name,\n transformers,\n }: {\n checkpointer?: BaseCheckpointSaver | false;\n interruptBefore?: N[] | All;\n interruptAfter?: N[] | All;\n name?: string;\n /**\n * Stream transformer factories baked into the compiled graph. These run\n * automatically for every `streamEvents(..., { version: \"v3\" })` call,\n * before any call-site transformers.\n */\n transformers?: TTransformers;\n } = {}): CompiledGraph<\n N,\n RunInput,\n RunOutput,\n Record<string, any>,\n any,\n any,\n unknown,\n unknown,\n any,\n TTransformers\n > {\n // eslint-disable-line @typescript-eslint/no-explicit-any\n // validate the graph\n this.validate([\n ...(Array.isArray(interruptBefore) ? interruptBefore : []),\n ...(Array.isArray(interruptAfter) ? interruptAfter : []),\n ]);\n\n // create empty compiled graph\n const compiled = new CompiledGraph({\n builder: this,\n checkpointer,\n interruptAfter,\n interruptBefore,\n autoValidate: false,\n nodes: {} as Record<N | typeof START, PregelNode<RunInput, RunOutput>>,\n channels: {\n [START]: new EphemeralValue(),\n [END]: new EphemeralValue(),\n } as Record<N | typeof START | typeof END | string, BaseChannel>,\n inputChannels: START,\n outputChannels: END,\n streamChannels: [] as N[],\n streamMode: \"values\",\n name,\n streamTransformers: transformers,\n });\n\n // attach nodes, edges and branches\n for (const [key, node] of Object.entries<NodeSpec<RunInput, RunOutput>>(\n this.nodes\n )) {\n compiled.attachNode(key as N, node);\n }\n for (const [start, end] of this.edges) {\n compiled.attachEdge(start, end);\n }\n for (const [start, branches] of Object.entries(this.branches)) {\n for (const [name, branch] of Object.entries(branches)) {\n compiled.attachBranch(start as N, name, branch);\n }\n }\n\n return compiled.validate();\n }\n\n validate(interrupt?: string[]): void {\n // assemble sources\n const allSources = new Set([...this.allEdges].map(([src, _]) => src));\n for (const [start] of Object.entries(this.branches)) {\n allSources.add(start);\n }\n\n // validate sources\n for (const source of allSources) {\n if (source !== START && !(source in this.nodes)) {\n throw new Error(`Found edge starting at unknown node \\`${source}\\``);\n }\n }\n\n // assemble targets\n const allTargets = new Set([...this.allEdges].map(([_, target]) => target));\n for (const [start, branches] of Object.entries(this.branches)) {\n for (const branch of Object.values(branches)) {\n if (branch.ends != null) {\n for (const end of Object.values(branch.ends)) {\n allTargets.add(end);\n }\n } else {\n allTargets.add(END);\n for (const node of Object.keys(this.nodes)) {\n if (node !== start) {\n allTargets.add(node);\n }\n }\n }\n }\n }\n for (const node of Object.values<NodeSpecType>(this.nodes)) {\n for (const target of node.ends ?? []) {\n allTargets.add(target);\n }\n }\n // validate targets\n for (const node of Object.keys(this.nodes)) {\n if (!allTargets.has(node)) {\n throw new UnreachableNodeError(\n [\n `Node \\`${node}\\` is not reachable.`,\n \"\",\n \"If you are returning Command objects from your node,\",\n 'make sure you are passing names of potential destination nodes as an \"ends\" array',\n 'into \".addNode(..., { ends: [\"node1\", \"node2\"] })\".',\n ].join(\"\\n\"),\n {\n lc_error_code: \"UNREACHABLE_NODE\",\n }\n );\n }\n }\n for (const target of allTargets) {\n if (target !== END && !(target in this.nodes)) {\n throw new Error(`Found edge ending at unknown node \\`${target}\\``);\n }\n }\n\n // validate interrupts\n if (interrupt) {\n for (const node of interrupt) {\n if (!(node in this.nodes)) {\n throw new Error(`Interrupt node \\`${node}\\` is not present`);\n }\n }\n }\n\n this.compiled = true;\n }\n}\n\nexport class CompiledGraph<\n N extends string,\n State = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n Update = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ContextType extends Record<string, any> = Record<string, any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n InputType = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n OutputType = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n NodeReturnType = unknown,\n CommandType = unknown,\n StreamCustomType = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n TStreamTransformers extends ReadonlyArray<() => StreamTransformer<any>> = [], // eslint-disable-line @typescript-eslint/no-explicit-any\n> extends Pregel<\n Record<N | typeof START, PregelNode<State, Update>>,\n Record<N | typeof START | typeof END | string, BaseChannel>,\n ContextType & Record<string, any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n InputType,\n OutputType,\n InputType,\n OutputType,\n NodeReturnType,\n CommandType,\n StreamCustomType,\n TStreamTransformers\n> {\n declare \"~NodeType\": N;\n\n declare \"~NodeReturnType\": NodeReturnType;\n\n declare \"~RunInput\": Update;\n\n declare \"~RunOutput\": State;\n\n builder: Graph<N, State, Update>;\n\n constructor({\n builder,\n ...rest\n }: { builder: Graph<N, State, Update> } & PregelParams<\n Record<N | typeof START, PregelNode<State, Update>>,\n Record<N | typeof START | typeof END | string, BaseChannel>,\n TStreamTransformers\n >) {\n super(rest);\n this.builder = builder;\n }\n\n override withConfig<\n const TTransformers extends ReadonlyArray<() => StreamTransformer<any>> =\n [],\n >(\n config: Omit<LangGraphRunnableConfig, \"store\" | \"writer\" | \"interrupt\"> & {\n streamTransformers: TTransformers;\n }\n ): CompiledGraph<\n N,\n State,\n Update,\n ContextType,\n InputType,\n OutputType,\n NodeReturnType,\n CommandType,\n StreamCustomType,\n readonly [...TStreamTransformers, ...TTransformers]\n >;\n\n override withConfig(\n config: PregelOptions<\n Record<N | typeof START, PregelNode<State, Update>>,\n Record<N | typeof START | typeof END | string, BaseChannel>,\n ContextType & Record<string, any>\n >\n ): this;\n\n override withConfig(\n config: Omit<LangGraphRunnableConfig, \"store\" | \"writer\" | \"interrupt\"> & {\n streamTransformers?: ReadonlyArray<() => StreamTransformer<any>>;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): any {\n return (super.withConfig as any)(config) as unknown as CompiledGraph<\n N,\n State,\n Update,\n ContextType,\n InputType,\n OutputType,\n NodeReturnType,\n CommandType,\n StreamCustomType,\n ReadonlyArray<() => StreamTransformer<any>>\n >;\n }\n\n attachNode(key: N, node: NodeSpec<State, Update>): void {\n this.channels[key] = new EphemeralValue();\n this.nodes[key] = new PregelNode({\n channels: [],\n triggers: [],\n metadata: node.metadata,\n subgraphs: node.subgraphs,\n ends: node.ends,\n })\n .pipe(node.runnable)\n .pipe(\n new ChannelWrite([{ channel: key, value: PASSTHROUGH }], [TAG_HIDDEN])\n );\n (this.streamChannels as N[]).push(key);\n }\n\n attachEdge(start: N | typeof START, end: N | typeof END): void {\n if (end === END) {\n if (start === START) {\n throw new Error(\"Cannot have an edge from START to END\");\n }\n this.nodes[start].writers.push(\n new ChannelWrite([{ channel: END, value: PASSTHROUGH }], [TAG_HIDDEN])\n );\n } else {\n this.nodes[end].triggers.push(start);\n (this.nodes[end].channels as string[]).push(start);\n }\n }\n\n attachBranch(\n start: N | typeof START,\n name: string,\n branch: Branch<State, N>\n ) {\n // add hidden start node\n if (start === START && !this.nodes[START]) {\n this.nodes[START] = Channel.subscribeTo(START, { tags: [TAG_HIDDEN] });\n }\n\n // attach branch writer\n this.nodes[start].pipe(\n branch.run((dests) => {\n const writes = dests.map((dest) => {\n if (_isSend(dest)) {\n return dest;\n }\n return {\n channel: dest === END ? END : `branch:${start}:${name}:${dest}`,\n value: PASSTHROUGH,\n };\n });\n return new ChannelWrite(writes, [TAG_HIDDEN]);\n })\n );\n\n // attach branch readers\n const ends = branch.ends\n ? Object.values(branch.ends)\n : (Object.keys(this.nodes) as N[]);\n for (const end of ends) {\n if (end !== END) {\n const channelName = `branch:${start}:${name}:${end}`;\n (this.channels as Record<string, BaseChannel>)[channelName] =\n new EphemeralValue();\n this.nodes[end].triggers.push(channelName);\n (this.nodes[end].channels as string[]).push(channelName);\n }\n }\n }\n\n /**\n * Returns a drawable representation of the computation graph.\n */\n override async getGraphAsync(\n config?: RunnableConfig & { xray?: boolean | number }\n ): Promise<DrawableGraph> {\n const xray = config?.xray;\n const graph = new DrawableGraph();\n const startNodes: Record<string, DrawableGraphNode> = {\n [START]: graph.addNode({ schema: z.any() }, START),\n };\n const endNodes: Record<string, DrawableGraphNode> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let subgraphs: Record<string, CompiledGraph<any>> = {};\n if (xray) {\n subgraphs = Object.fromEntries(\n (await gatherIterator(this.getSubgraphsAsync())).filter(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (x): x is [string, CompiledGraph<any>] => isCompiledGraph(x[1])\n )\n );\n }\n\n function addEdge(\n start: string,\n end: string,\n label?: string,\n conditional = false\n ) {\n if (end === END && endNodes[END] === undefined) {\n endNodes[END] = graph.addNode({ schema: z.any() }, END);\n }\n if (startNodes[start] === undefined) {\n return;\n }\n if (endNodes[end] === undefined) {\n throw new Error(`End node ${end} not found!`);\n }\n return graph.addEdge(\n startNodes[start],\n endNodes[end],\n label !== end ? label : undefined,\n conditional\n );\n }\n\n for (const [key, nodeSpec] of Object.entries(this.builder.nodes) as [\n N,\n NodeSpec<State, Update>,\n ][]) {\n const displayKey = _escapeMermaidKeywords(key);\n const node = nodeSpec.runnable;\n const metadata = nodeSpec.metadata ?? {};\n if (\n this.interruptBefore?.includes(key) &&\n this.interruptAfter?.includes(key)\n ) {\n metadata.__interrupt = \"before,after\";\n } else if (this.interruptBefore?.includes(key)) {\n metadata.__interrupt = \"before\";\n } else if (this.interruptAfter?.includes(key)) {\n metadata.__interrupt = \"after\";\n }\n if (xray) {\n const newXrayValue = typeof xray === \"number\" ? xray - 1 : xray;\n const drawableSubgraph =\n subgraphs[key] !== undefined\n ? await subgraphs[key].getGraphAsync({\n ...config,\n xray: newXrayValue,\n })\n : node.getGraph(config);\n\n drawableSubgraph.trimFirstNode();\n drawableSubgraph.trimLastNode();\n\n if (Object.keys(drawableSubgraph.nodes).length > 1) {\n const [e, s] = graph.extend(drawableSubgraph, displayKey);\n if (e === undefined) {\n throw new Error(\n `Could not extend subgraph \"${key}\" due to missing entrypoint.`\n );\n }\n\n // TODO: Remove default name once we stop supporting core 0.2.0\n // eslint-disable-next-line no-inner-declarations\n function _isRunnableInterface(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n thing: any\n ): thing is RunnableInterface {\n return thing ? thing.lc_runnable : false;\n }\n // eslint-disable-next-line no-inner-declarations\n function _nodeDataStr(\n id: string | undefined,\n data: RunnableInterface | RunnableIOSchema\n ): string {\n if (id !== undefined && !isUuid(id)) {\n return id;\n } else if (_isRunnableInterface(data)) {\n try {\n let dataStr = data.getName();\n dataStr = dataStr.startsWith(\"Runnable\")\n ? dataStr.slice(\"Runnable\".length)\n : dataStr;\n return dataStr;\n } catch {\n return data.getName();\n }\n } else {\n return data.name ?? \"UnknownSchema\";\n }\n }\n // TODO: Remove casts when we stop supporting core 0.2.0\n if (s !== undefined) {\n startNodes[displayKey] = {\n name: _nodeDataStr(s.id, s.data),\n ...s,\n } as DrawableGraphNode;\n }\n endNodes[displayKey] = {\n name: _nodeDataStr(e.id, e.data),\n ...e,\n } as DrawableGraphNode;\n } else {\n // TODO: Remove when we stop supporting core 0.2.0\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const newNode = graph.addNode(node, displayKey, metadata);\n startNodes[displayKey] = newNode;\n endNodes[displayKey] = newNode;\n }\n } else {\n // TODO: Remove when we stop supporting core 0.2.0\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const newNode = graph.addNode(node, displayKey, metadata);\n startNodes[displayKey] = newNode;\n endNodes[displayKey] = newNode;\n }\n }\n const sortedEdges = [...this.builder.allEdges].sort(([a], [b]) => {\n if (a < b) {\n return -1;\n } else if (b > a) {\n return 1;\n } else {\n return 0;\n }\n });\n for (const [start, end] of sortedEdges) {\n addEdge(_escapeMermaidKeywords(start), _escapeMermaidKeywords(end));\n }\n for (const [start, branches] of Object.entries(this.builder.branches)) {\n const defaultEnds: Record<string, string> = {\n ...Object.fromEntries(\n Object.keys(this.builder.nodes)\n .filter((k) => k !== start)\n .map((k) => [_escapeMermaidKeywords(k), _escapeMermaidKeywords(k)])\n ),\n [END]: END,\n };\n for (const branch of Object.values(branches)) {\n let ends;\n if (branch.ends !== undefined) {\n ends = branch.ends;\n } else {\n ends = defaultEnds;\n }\n for (const [label, end] of Object.entries(ends)) {\n addEdge(\n _escapeMermaidKeywords(start),\n _escapeMermaidKeywords(end),\n label,\n true\n );\n }\n }\n }\n for (const [key, node] of Object.entries(this.builder.nodes) as [\n N,\n NodeSpec<State, Update>,\n ][]) {\n if (node.ends !== undefined) {\n for (const end of node.ends) {\n addEdge(\n _escapeMermaidKeywords(key),\n _escapeMermaidKeywords(end),\n undefined,\n true\n );\n }\n }\n }\n return graph;\n }\n\n /**\n * Returns a drawable representation of the computation graph.\n *\n * @deprecated Use getGraphAsync instead. The async method will be the default in the next minor core release.\n */\n override getGraph(\n config?: RunnableConfig & { xray?: boolean | number }\n ): DrawableGraph {\n const xray = config?.xray;\n const graph = new DrawableGraph();\n const startNodes: Record<string, DrawableGraphNode> = {\n [START]: graph.addNode(\n {\n schema: z.any(),\n },\n START\n ),\n };\n const endNodes: Record<string, DrawableGraphNode> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let subgraphs: Record<string, CompiledGraph<any>> = {};\n if (xray) {\n subgraphs = Object.fromEntries(\n gatherIteratorSync(this.getSubgraphs()).filter(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (x): x is [string, CompiledGraph<any>] => isCompiledGraph(x[1])\n )\n );\n }\n\n function addEdge(\n start: string,\n end: string,\n label?: string,\n conditional = false\n ) {\n if (end === END && endNodes[END] === undefined) {\n endNodes[END] = graph.addNode({ schema: z.any() }, END);\n }\n return graph.addEdge(\n startNodes[start],\n endNodes[end],\n label !== end ? label : undefined,\n conditional\n );\n }\n\n for (const [key, nodeSpec] of Object.entries(this.builder.nodes) as [\n N,\n NodeSpec<State, Update>,\n ][]) {\n const displayKey = _escapeMermaidKeywords(key);\n const node = nodeSpec.runnable;\n const metadata = nodeSpec.metadata ?? {};\n if (\n this.interruptBefore?.includes(key) &&\n this.interruptAfter?.includes(key)\n ) {\n metadata.__interrupt = \"before,after\";\n } else if (this.interruptBefore?.includes(key)) {\n metadata.__interrupt = \"before\";\n } else if (this.interruptAfter?.includes(key)) {\n metadata.__interrupt = \"after\";\n }\n if (xray) {\n const newXrayValue = typeof xray === \"number\" ? xray - 1 : xray;\n const drawableSubgraph =\n subgraphs[key] !== undefined\n ? subgraphs[key].getGraph({\n ...config,\n xray: newXrayValue,\n })\n : node.getGraph(config);\n drawableSubgraph.trimFirstNode();\n drawableSubgraph.trimLastNode();\n if (Object.keys(drawableSubgraph.nodes).length > 1) {\n const [e, s] = graph.extend(drawableSubgraph, displayKey);\n if (e === undefined) {\n throw new Error(\n `Could not extend subgraph \"${key}\" due to missing entrypoint.`\n );\n }\n\n // TODO: Remove default name once we stop supporting core 0.2.0\n // eslint-disable-next-line no-inner-declarations\n function _isRunnableInterface(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n thing: any\n ): thing is RunnableInterface {\n return thing ? thing.lc_runnable : false;\n }\n // eslint-disable-next-line no-inner-declarations\n function _nodeDataStr(\n id: string | undefined,\n data: RunnableInterface | RunnableIOSchema\n ): string {\n if (id !== undefined && !isUuid(id)) {\n return id;\n } else if (_isRunnableInterface(data)) {\n try {\n let dataStr = data.getName();\n dataStr = dataStr.startsWith(\"Runnable\")\n ? dataStr.slice(\"Runnable\".length)\n : dataStr;\n return dataStr;\n } catch {\n return data.getName();\n }\n } else {\n return data.name ?? \"UnknownSchema\";\n }\n }\n // TODO: Remove casts when we stop supporting core 0.2.0\n if (s !== undefined) {\n startNodes[displayKey] = {\n name: _nodeDataStr(s.id, s.data),\n ...s,\n } as DrawableGraphNode;\n }\n endNodes[displayKey] = {\n name: _nodeDataStr(e.id, e.data),\n ...e,\n } as DrawableGraphNode;\n } else {\n // TODO: Remove when we stop supporting core 0.2.0\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const newNode = graph.addNode(node, displayKey, metadata);\n startNodes[displayKey] = newNode;\n endNodes[displayKey] = newNode;\n }\n } else {\n // TODO: Remove when we stop supporting core 0.2.0\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const newNode = graph.addNode(node, displayKey, metadata);\n startNodes[displayKey] = newNode;\n endNodes[displayKey] = newNode;\n }\n }\n const sortedEdges = [...this.builder.allEdges].sort(([a], [b]) => {\n if (a < b) {\n return -1;\n } else if (b > a) {\n return 1;\n } else {\n return 0;\n }\n });\n for (const [start, end] of sortedEdges) {\n addEdge(_escapeMermaidKeywords(start), _escapeMermaidKeywords(end));\n }\n for (const [start, branches] of Object.entries(this.builder.branches)) {\n const defaultEnds: Record<string, string> = {\n ...Object.fromEntries(\n Object.keys(this.builder.nodes)\n .filter((k) => k !== start)\n .map((k) => [_escapeMermaidKeywords(k), _escapeMermaidKeywords(k)])\n ),\n [END]: END,\n };\n for (const branch of Object.values(branches)) {\n let ends;\n if (branch.ends !== undefined) {\n ends = branch.ends;\n } else {\n ends = defaultEnds;\n }\n for (const [label, end] of Object.entries(ends)) {\n addEdge(\n _escapeMermaidKeywords(start),\n _escapeMermaidKeywords(end),\n label,\n true\n );\n }\n }\n }\n return graph;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isCompiledGraph(x: unknown): x is CompiledGraph<any> {\n return (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (x as CompiledGraph<any>).attachNode === \"function\" &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (x as CompiledGraph<any>).attachEdge === \"function\"\n );\n}\n\nfunction _escapeMermaidKeywords(key: string) {\n if (key === \"subgraph\") {\n return `\"${key}\"`;\n }\n return key;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"graph.cjs","names":["Runnable","ChannelWrite","RunnableCallable","NodeInterrupt","_isSend","InvalidUpdateError","isPregelLike","START","END","EphemeralValue","UnreachableNodeError","Pregel","PregelNode","PASSTHROUGH","TAG_HIDDEN","Channel","DrawableGraph","z","gatherIterator","gatherIteratorSync"],"sources":["../../src/graph/graph.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n _coerceToRunnable,\n Runnable,\n RunnableConfig,\n RunnableInterface,\n RunnableIOSchema,\n type RunnableLike as LangChainRunnableLike,\n} from \"@langchain/core/runnables\";\nimport {\n Node as DrawableGraphNode,\n Graph as DrawableGraph,\n} from \"@langchain/core/runnables/graph\";\nimport { All, BaseCheckpointSaver } from \"@langchain/langgraph-checkpoint\";\nimport { z } from \"zod/v4\";\nimport { validate as isUuid } from \"uuid\";\nimport type {\n RunnableLike,\n LangGraphRunnableConfig,\n} from \"../pregel/runnable_types.js\";\nimport { PregelNode } from \"../pregel/read.js\";\nimport { Channel, Pregel } from \"../pregel/index.js\";\nimport type { PregelOptions, PregelParams } from \"../pregel/types.js\";\nimport { BaseChannel } from \"../channels/base.js\";\nimport { EphemeralValue } from \"../channels/ephemeral_value.js\";\nimport { ChannelWrite, PASSTHROUGH } from \"../pregel/write.js\";\nimport {\n _isSend,\n CHECKPOINT_NAMESPACE_END,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n END,\n Send,\n START,\n TAG_HIDDEN,\n} from \"../constants.js\";\nimport {\n gatherIterator,\n gatherIteratorSync,\n RunnableCallable,\n} from \"../utils.js\";\nimport {\n InvalidUpdateError,\n NodeError,\n NodeInterrupt,\n UnreachableNodeError,\n} from \"../errors.js\";\nimport { StateDefinition, StateType } from \"./annotation.js\";\nimport { isPregelLike } from \"../pregel/utils/subgraph.js\";\nimport type { StreamTransformer } from \"../stream/types.js\";\nimport type { GraphNodeReturnValue } from \"./types.js\";\n\nexport interface BranchOptions<\n IO,\n N extends string,\n CallOptions extends LangGraphRunnableConfig = LangGraphRunnableConfig,\n> {\n source: N;\n path: RunnableLike<IO, BranchPathReturnValue, CallOptions>;\n pathMap?: Record<string, N | typeof END> | (N | typeof END)[];\n}\n\nexport type BranchPathReturnValue =\n | string\n | Send\n | (string | Send)[]\n | Promise<string | Send | (string | Send)[]>;\n\ntype CompiledGraphTypeNode<Spec> = Spec extends { node: infer N extends string }\n ? N\n : any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\ntype CompiledGraphTypeContext<Spec> = Spec extends {\n context: infer Context extends Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n ? Context\n : Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\ntype CompiledGraphTypeStreamTransformers<Spec> = Spec extends {\n streamTransformers: infer Transformers;\n}\n ? Transformers extends ReadonlyArray<\n () => StreamTransformer<any> // eslint-disable-line @typescript-eslint/no-explicit-any\n >\n ? Transformers\n : Transformers extends ReadonlyArray<\n StreamTransformer<any> // eslint-disable-line @typescript-eslint/no-explicit-any\n >\n ? { readonly [K in keyof Transformers]: () => Transformers[K] }\n : Transformers extends StreamTransformer<any> // eslint-disable-line @typescript-eslint/no-explicit-any\n ? readonly [() => Transformers]\n : []\n : [];\n\n/**\n * Convenience type for referencing a compiled graph by named type slots.\n *\n * @example\n * ```ts\n * type MyCompiledGraph = CompiledGraphType<{\n * state: State;\n * update: Update;\n * streamTransformers: [\n * StreamTransformer<Extensions>,\n * StreamTransformer<MoreExtensions>,\n * ];\n * }>;\n * ```\n */\nexport type CompiledGraphType<Spec extends object = object> = CompiledGraph<\n CompiledGraphTypeNode<Spec>,\n Spec extends { state: infer State } ? State : any, // eslint-disable-line @typescript-eslint/no-explicit-any\n Spec extends { update: infer Update } ? Update : any, // eslint-disable-line @typescript-eslint/no-explicit-any\n CompiledGraphTypeContext<Spec>,\n Spec extends { input: infer Input } ? Input : any, // eslint-disable-line @typescript-eslint/no-explicit-any\n Spec extends { output: infer Output } ? Output : any, // eslint-disable-line @typescript-eslint/no-explicit-any\n Spec extends { nodeReturn: infer NodeReturn } ? NodeReturn : unknown,\n Spec extends { command: infer Command } ? Command : unknown,\n Spec extends { streamCustom: infer StreamCustom } ? StreamCustom : any, // eslint-disable-line @typescript-eslint/no-explicit-any\n CompiledGraphTypeStreamTransformers<Spec>\n>;\n\ntype NodeAction<S, U, C extends StateDefinition> = RunnableLike<\n S,\n U extends object ? U & Record<string, any> : U, // eslint-disable-line @typescript-eslint/no-explicit-any\n LangGraphRunnableConfig<StateType<C>>\n>;\n\nexport class Branch<\n IO,\n N extends string,\n CallOptions extends LangGraphRunnableConfig = LangGraphRunnableConfig,\n> {\n path: Runnable<IO, BranchPathReturnValue>;\n\n ends?: Record<string, N | typeof END>;\n\n constructor(options: Omit<BranchOptions<IO, N, CallOptions>, \"source\">) {\n if (Runnable.isRunnable(options.path)) {\n this.path = options.path as Runnable<IO, BranchPathReturnValue>;\n } else {\n this.path = _coerceToRunnable(\n options.path as LangChainRunnableLike<IO, BranchPathReturnValue>\n );\n }\n this.ends = Array.isArray(options.pathMap)\n ? options.pathMap.reduce(\n (acc, n) => {\n acc[n] = n;\n return acc;\n },\n {} as Record<string, N | typeof END>\n )\n : options.pathMap;\n }\n\n run(\n writer: (\n dests: (string | Send)[],\n config: LangGraphRunnableConfig\n ) => Runnable | void | Promise<void>,\n reader?: (config: CallOptions) => IO\n ) {\n return ChannelWrite.registerWriter(\n new RunnableCallable({\n name: \"<branch_run>\",\n trace: false,\n func: async (input: IO, config: CallOptions) => {\n try {\n return await this._route(input, config, writer, reader);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n // Detect & warn if NodeInterrupt is thrown in a conditional edge\n if (e.name === NodeInterrupt.unminifiable_name) {\n console.warn(\n \"[WARN]: 'NodeInterrupt' thrown in conditional edge. This is likely a bug in your graph implementation.\\n\" +\n \"NodeInterrupt should only be thrown inside a node, not in edge conditions.\"\n );\n }\n throw e;\n }\n },\n })\n );\n }\n\n async _route(\n input: IO,\n config: CallOptions,\n writer: (\n dests: (string | Send)[],\n config: LangGraphRunnableConfig\n ) => Runnable | void | Promise<void>,\n reader?: (config: CallOptions) => IO\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): Promise<Runnable | any> {\n let result = await this.path.invoke(\n reader ? reader(config) : input,\n config\n );\n if (!Array.isArray(result)) {\n result = [result];\n }\n\n let destinations: (string | Send)[];\n if (this.ends) {\n destinations = result.map((r) => (_isSend(r) ? r : this.ends![r]));\n } else {\n destinations = result;\n }\n if (destinations.some((dest) => !dest)) {\n throw new Error(\"Branch condition returned unknown or null destination\");\n }\n if (destinations.filter(_isSend).some((packet) => packet.node === END)) {\n throw new InvalidUpdateError(\"Cannot send a packet to the END node\");\n }\n const writeResult = await writer(destinations, config);\n return writeResult ?? input;\n }\n}\n\nexport type NodeSpec<RunInput, RunOutput> = {\n runnable: Runnable<RunInput, RunOutput>;\n metadata?: Record<string, unknown>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n subgraphs?: Pregel<any, any>[];\n ends?: string[];\n defer?: boolean;\n /** Whether this node is an auto-generated node-level error handler. */\n isErrorHandler?: boolean;\n /** Name of the auto-generated error handler node to run on failure. */\n errorHandlerNode?: string;\n};\n\n/**\n * Return value type for node-level error handlers.\n *\n * Handlers may return a partial state update, a `Command`, or a Promise of either.\n *\n * @template Update - The update type (what fields can be returned)\n * @template Nodes - Union of valid node names for Command.goto\n */\nexport type NodeErrorHandlerReturnValue<\n Update,\n Nodes extends string = string,\n> = GraphNodeReturnValue<Update, Nodes>;\n\n/**\n * A node-level error handler callable.\n *\n * Invoked with the node input state, a {@link NodeError} describing the failed\n * node and thrown error, and the runnable config. The handler runs ONLY after\n * the failing node's {@link RetryPolicy} is exhausted. It may return a state\n * update or a `Command` (to route via `goto`).\n */\nexport type NodeErrorHandler<\n TState = unknown,\n TUpdate = Partial<TState>,\n Nodes extends string = string,\n> = (\n state: TState,\n error: NodeError,\n config?: LangGraphRunnableConfig\n) => NodeErrorHandlerReturnValue<TUpdate, Nodes>;\n\nexport type AddNodeOptions<Nodes extends string = string> = {\n metadata?: Record<string, unknown>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n subgraphs?: Pregel<any, any>[];\n ends?: Nodes[];\n defer?: boolean;\n};\n\nexport class Graph<\n N extends string = typeof START | typeof END,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput = any,\n NodeSpecType extends NodeSpec<RunInput, RunOutput> = NodeSpec<\n RunInput,\n RunOutput\n >,\n C extends StateDefinition = StateDefinition,\n> {\n nodes: Record<N, NodeSpecType>;\n\n edges: Set<[N | typeof START, N | typeof END]>;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n branches: Record<string, Record<string, Branch<RunInput, N, any>>>;\n\n entryPoint?: string;\n\n compiled = false;\n\n constructor() {\n this.nodes = {} as Record<N, NodeSpecType>;\n this.edges = new Set();\n this.branches = {};\n }\n\n protected warnIfCompiled(message: string): void {\n if (this.compiled) {\n console.warn(message);\n }\n }\n\n get allEdges(): Set<[string, string]> {\n return this.edges;\n }\n\n addNode<K extends string, NodeInput = RunInput, NodeOutput = RunOutput>(\n nodes:\n | Record<K, NodeAction<NodeInput, NodeOutput, C>>\n | [\n key: K,\n action: NodeAction<NodeInput, NodeOutput, C>,\n options?: AddNodeOptions,\n ][]\n ): Graph<N | K, RunInput, RunOutput>;\n\n addNode<K extends string, NodeInput = RunInput, NodeOutput = RunOutput>(\n key: K,\n action: NodeAction<NodeInput, NodeOutput, C>,\n options?: AddNodeOptions\n ): Graph<N | K, RunInput, RunOutput>;\n\n addNode<K extends string, NodeInput = RunInput, NodeOutput = RunOutput>(\n ...args:\n | [\n key: K,\n action: NodeAction<NodeInput, NodeOutput, C>,\n options?: AddNodeOptions,\n ]\n | [\n nodes:\n | Record<K, NodeAction<NodeInput, NodeOutput, C>>\n | [\n key: K,\n action: NodeAction<NodeInput, NodeOutput, C>,\n options?: AddNodeOptions,\n ][],\n ]\n ): Graph<N | K, RunInput, RunOutput> {\n function isMutlipleNodes(\n args: unknown[]\n ): args is [\n nodes:\n | Record<K, NodeAction<NodeInput, RunOutput, C>>\n | [\n key: K,\n action: NodeAction<NodeInput, RunOutput, C>,\n options?: AddNodeOptions,\n ][],\n options?: AddNodeOptions,\n ] {\n return args.length >= 1 && typeof args[0] !== \"string\";\n }\n\n const nodes = (\n isMutlipleNodes(args) // eslint-disable-line no-nested-ternary\n ? Array.isArray(args[0])\n ? args[0]\n : Object.entries(args[0])\n : [[args[0], args[1], args[2]]]\n ) as [K, NodeAction<NodeInput, RunOutput, C>, AddNodeOptions][];\n\n if (nodes.length === 0) {\n throw new Error(\"No nodes provided in `addNode`\");\n }\n\n for (const [key, action, options] of nodes) {\n for (const reservedChar of [\n CHECKPOINT_NAMESPACE_SEPARATOR,\n CHECKPOINT_NAMESPACE_END,\n ]) {\n if (key.includes(reservedChar)) {\n throw new Error(\n `\"${reservedChar}\" is a reserved character and is not allowed in node names.`\n );\n }\n }\n this.warnIfCompiled(\n `Adding a node to a graph that has already been compiled. This will not be reflected in the compiled graph.`\n );\n\n if (key in this.nodes) {\n throw new Error(`Node \\`${key}\\` already present.`);\n }\n if (key === END) {\n throw new Error(`Node \\`${key}\\` is reserved.`);\n }\n\n const runnable = _coerceToRunnable<RunInput, RunOutput>(\n // Account for arbitrary state due to Send API\n action as RunnableLike<RunInput, RunOutput>\n );\n\n this.nodes[key as unknown as N] = {\n runnable,\n metadata: options?.metadata,\n subgraphs: isPregelLike(runnable) ? [runnable] : options?.subgraphs,\n ends: options?.ends,\n } as NodeSpecType;\n }\n\n return this as Graph<N | K, RunInput, RunOutput, NodeSpecType>;\n }\n\n addEdge(startKey: N | typeof START, endKey: N | typeof END): this {\n this.warnIfCompiled(\n `Adding an edge to a graph that has already been compiled. This will not be reflected in the compiled graph.`\n );\n\n if (startKey === END) {\n throw new Error(\"END cannot be a start node\");\n }\n if (endKey === START) {\n throw new Error(\"START cannot be an end node\");\n }\n if (\n Array.from(this.edges).some(([start]) => start === startKey) &&\n !(\"channels\" in this)\n ) {\n throw new Error(\n `Already found path for ${startKey}. For multiple edges, use StateGraph.`\n );\n }\n\n this.edges.add([startKey, endKey]);\n\n return this;\n }\n\n addConditionalEdges(\n source: BranchOptions<RunInput, N, LangGraphRunnableConfig<StateType<C>>>\n ): this;\n\n addConditionalEdges(\n source: N,\n path: RunnableLike<\n RunInput,\n BranchPathReturnValue,\n LangGraphRunnableConfig<StateType<C>>\n >,\n pathMap?: BranchOptions<\n RunInput,\n N,\n LangGraphRunnableConfig<StateType<C>>\n >[\"pathMap\"]\n ): this;\n\n addConditionalEdges(\n source:\n | N\n | BranchOptions<RunInput, N, LangGraphRunnableConfig<StateType<C>>>,\n path?: RunnableLike<\n RunInput,\n BranchPathReturnValue,\n LangGraphRunnableConfig<StateType<C>>\n >,\n pathMap?: BranchOptions<\n RunInput,\n N,\n LangGraphRunnableConfig<StateType<C>>\n >[\"pathMap\"]\n ): this {\n const options: BranchOptions<\n RunInput,\n N,\n LangGraphRunnableConfig<StateType<C>>\n > = typeof source === \"object\" ? source : { source, path: path!, pathMap };\n\n this.warnIfCompiled(\n \"Adding an edge to a graph that has already been compiled. This will not be reflected in the compiled graph.\"\n );\n if (!Runnable.isRunnable(options.path)) {\n options.path = _coerceToRunnable(\n options.path as LangChainRunnableLike<RunInput, BranchPathReturnValue>\n );\n }\n // find a name for condition\n const name =\n options.path.getName() === \"RunnableLambda\"\n ? \"condition\"\n : options.path.getName();\n // validate condition\n if (this.branches[options.source] && this.branches[options.source][name]) {\n throw new Error(\n `Condition \\`${name}\\` already present for node \\`${source}\\``\n );\n }\n // save it\n this.branches[options.source] ??= {};\n this.branches[options.source][name] = new Branch(options);\n return this;\n }\n\n /**\n * @deprecated use `addEdge(START, key)` instead\n */\n setEntryPoint(key: N): this {\n this.warnIfCompiled(\n \"Setting the entry point of a graph that has already been compiled. This will not be reflected in the compiled graph.\"\n );\n\n return this.addEdge(START, key);\n }\n\n /**\n * @deprecated use `addEdge(key, END)` instead\n */\n setFinishPoint(key: N): this {\n this.warnIfCompiled(\n \"Setting a finish point of a graph that has already been compiled. This will not be reflected in the compiled graph.\"\n );\n\n return this.addEdge(key, END);\n }\n\n compile<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const TTransformers extends ReadonlyArray<() => StreamTransformer<any>> =\n [],\n >({\n checkpointer,\n interruptBefore,\n interruptAfter,\n name,\n transformers,\n }: {\n checkpointer?: BaseCheckpointSaver | false;\n interruptBefore?: N[] | All;\n interruptAfter?: N[] | All;\n name?: string;\n /**\n * Stream transformer factories baked into the compiled graph. These run\n * automatically for every `streamEvents(..., { version: \"v3\" })` call,\n * before any call-site transformers.\n */\n transformers?: TTransformers;\n } = {}): CompiledGraph<\n N,\n RunInput,\n RunOutput,\n Record<string, any>,\n any,\n any,\n unknown,\n unknown,\n any,\n TTransformers\n > {\n // eslint-disable-line @typescript-eslint/no-explicit-any\n // validate the graph\n this.validate([\n ...(Array.isArray(interruptBefore) ? interruptBefore : []),\n ...(Array.isArray(interruptAfter) ? interruptAfter : []),\n ]);\n\n // create empty compiled graph\n const compiled = new CompiledGraph({\n builder: this,\n checkpointer,\n interruptAfter,\n interruptBefore,\n autoValidate: false,\n nodes: {} as Record<N | typeof START, PregelNode<RunInput, RunOutput>>,\n channels: {\n [START]: new EphemeralValue(),\n [END]: new EphemeralValue(),\n } as Record<N | typeof START | typeof END | string, BaseChannel>,\n inputChannels: START,\n outputChannels: END,\n streamChannels: [] as N[],\n streamMode: \"values\",\n name,\n streamTransformers: transformers,\n });\n\n // attach nodes, edges and branches\n for (const [key, node] of Object.entries<NodeSpec<RunInput, RunOutput>>(\n this.nodes\n )) {\n compiled.attachNode(key as N, node);\n }\n for (const [start, end] of this.edges) {\n compiled.attachEdge(start, end);\n }\n for (const [start, branches] of Object.entries(this.branches)) {\n for (const [name, branch] of Object.entries(branches)) {\n compiled.attachBranch(start as N, name, branch);\n }\n }\n\n return compiled.validate();\n }\n\n validate(interrupt?: string[]): void {\n // assemble sources\n const allSources = new Set([...this.allEdges].map(([src, _]) => src));\n for (const [start] of Object.entries(this.branches)) {\n allSources.add(start);\n }\n\n // validate sources\n for (const source of allSources) {\n if (source !== START && !(source in this.nodes)) {\n throw new Error(`Found edge starting at unknown node \\`${source}\\``);\n }\n }\n\n // assemble targets\n const allTargets = new Set([...this.allEdges].map(([_, target]) => target));\n for (const [start, branches] of Object.entries(this.branches)) {\n for (const branch of Object.values(branches)) {\n if (branch.ends != null) {\n for (const end of Object.values(branch.ends)) {\n allTargets.add(end);\n }\n } else {\n allTargets.add(END);\n for (const node of Object.keys(this.nodes)) {\n if (node !== start) {\n allTargets.add(node);\n }\n }\n }\n }\n }\n for (const node of Object.values<NodeSpecType>(this.nodes)) {\n for (const target of node.ends ?? []) {\n allTargets.add(target);\n }\n }\n // Node-level error handlers can route to any node via `Command({ goto })`\n // (saga / compensation flows), so treat them like an open-ended branch:\n // any node may be a recovery target reachable from a handler.\n const hasErrorHandler = Object.values<NodeSpecType>(this.nodes).some(\n (node) => node.isErrorHandler\n );\n if (hasErrorHandler) {\n for (const node of Object.keys(this.nodes)) {\n allTargets.add(node);\n }\n }\n // validate targets\n for (const node of Object.keys(this.nodes)) {\n // auto-generated error handler nodes are reachable only on failure of\n // their source node, so they are exempt from the reachability check.\n if (this.nodes[node as N].isErrorHandler) {\n continue;\n }\n if (!allTargets.has(node)) {\n throw new UnreachableNodeError(\n [\n `Node \\`${node}\\` is not reachable.`,\n \"\",\n \"If you are returning Command objects from your node,\",\n 'make sure you are passing names of potential destination nodes as an \"ends\" array',\n 'into \".addNode(..., { ends: [\"node1\", \"node2\"] })\".',\n ].join(\"\\n\"),\n {\n lc_error_code: \"UNREACHABLE_NODE\",\n }\n );\n }\n }\n for (const target of allTargets) {\n if (target !== END && !(target in this.nodes)) {\n throw new Error(`Found edge ending at unknown node \\`${target}\\``);\n }\n }\n\n // validate interrupts\n if (interrupt) {\n for (const node of interrupt) {\n if (!(node in this.nodes)) {\n throw new Error(`Interrupt node \\`${node}\\` is not present`);\n }\n }\n }\n\n this.compiled = true;\n }\n}\n\nexport class CompiledGraph<\n N extends string,\n State = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n Update = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ContextType extends Record<string, any> = Record<string, any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n InputType = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n OutputType = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n NodeReturnType = unknown,\n CommandType = unknown,\n StreamCustomType = any, // eslint-disable-line @typescript-eslint/no-explicit-any\n TStreamTransformers extends ReadonlyArray<() => StreamTransformer<any>> = [], // eslint-disable-line @typescript-eslint/no-explicit-any\n> extends Pregel<\n Record<N | typeof START, PregelNode<State, Update>>,\n Record<N | typeof START | typeof END | string, BaseChannel>,\n ContextType & Record<string, any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n InputType,\n OutputType,\n InputType,\n OutputType,\n NodeReturnType,\n CommandType,\n StreamCustomType,\n TStreamTransformers\n> {\n declare \"~NodeType\": N;\n\n declare \"~NodeReturnType\": NodeReturnType;\n\n declare \"~RunInput\": Update;\n\n declare \"~RunOutput\": State;\n\n builder: Graph<N, State, Update>;\n\n constructor({\n builder,\n ...rest\n }: { builder: Graph<N, State, Update> } & PregelParams<\n Record<N | typeof START, PregelNode<State, Update>>,\n Record<N | typeof START | typeof END | string, BaseChannel>,\n TStreamTransformers\n >) {\n super(rest);\n this.builder = builder;\n }\n\n override withConfig<\n const TTransformers extends ReadonlyArray<() => StreamTransformer<any>> =\n [],\n >(\n config: Omit<LangGraphRunnableConfig, \"store\" | \"writer\" | \"interrupt\"> & {\n streamTransformers: TTransformers;\n }\n ): CompiledGraph<\n N,\n State,\n Update,\n ContextType,\n InputType,\n OutputType,\n NodeReturnType,\n CommandType,\n StreamCustomType,\n readonly [...TStreamTransformers, ...TTransformers]\n >;\n\n override withConfig(\n config: PregelOptions<\n Record<N | typeof START, PregelNode<State, Update>>,\n Record<N | typeof START | typeof END | string, BaseChannel>,\n ContextType & Record<string, any>\n >\n ): this;\n\n override withConfig(\n config: Omit<LangGraphRunnableConfig, \"store\" | \"writer\" | \"interrupt\"> & {\n streamTransformers?: ReadonlyArray<() => StreamTransformer<any>>;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): any {\n return (super.withConfig as any)(config) as unknown as CompiledGraph<\n N,\n State,\n Update,\n ContextType,\n InputType,\n OutputType,\n NodeReturnType,\n CommandType,\n StreamCustomType,\n ReadonlyArray<() => StreamTransformer<any>>\n >;\n }\n\n attachNode(key: N, node: NodeSpec<State, Update>): void {\n this.channels[key] = new EphemeralValue();\n this.nodes[key] = new PregelNode({\n channels: [],\n triggers: [],\n metadata: node.metadata,\n subgraphs: node.subgraphs,\n ends: node.ends,\n })\n .pipe(node.runnable)\n .pipe(\n new ChannelWrite([{ channel: key, value: PASSTHROUGH }], [TAG_HIDDEN])\n );\n (this.streamChannels as N[]).push(key);\n }\n\n attachEdge(start: N | typeof START, end: N | typeof END): void {\n if (end === END) {\n if (start === START) {\n throw new Error(\"Cannot have an edge from START to END\");\n }\n this.nodes[start].writers.push(\n new ChannelWrite([{ channel: END, value: PASSTHROUGH }], [TAG_HIDDEN])\n );\n } else {\n this.nodes[end].triggers.push(start);\n (this.nodes[end].channels as string[]).push(start);\n }\n }\n\n attachBranch(\n start: N | typeof START,\n name: string,\n branch: Branch<State, N>\n ) {\n // add hidden start node\n if (start === START && !this.nodes[START]) {\n this.nodes[START] = Channel.subscribeTo(START, { tags: [TAG_HIDDEN] });\n }\n\n // attach branch writer\n this.nodes[start].pipe(\n branch.run((dests) => {\n const writes = dests.map((dest) => {\n if (_isSend(dest)) {\n return dest;\n }\n return {\n channel: dest === END ? END : `branch:${start}:${name}:${dest}`,\n value: PASSTHROUGH,\n };\n });\n return new ChannelWrite(writes, [TAG_HIDDEN]);\n })\n );\n\n // attach branch readers\n const ends = branch.ends\n ? Object.values(branch.ends)\n : (Object.keys(this.nodes) as N[]);\n for (const end of ends) {\n if (end !== END) {\n const channelName = `branch:${start}:${name}:${end}`;\n (this.channels as Record<string, BaseChannel>)[channelName] =\n new EphemeralValue();\n this.nodes[end].triggers.push(channelName);\n (this.nodes[end].channels as string[]).push(channelName);\n }\n }\n }\n\n /**\n * Returns a drawable representation of the computation graph.\n */\n override async getGraphAsync(\n config?: RunnableConfig & { xray?: boolean | number }\n ): Promise<DrawableGraph> {\n const xray = config?.xray;\n const graph = new DrawableGraph();\n const startNodes: Record<string, DrawableGraphNode> = {\n [START]: graph.addNode({ schema: z.any() }, START),\n };\n const endNodes: Record<string, DrawableGraphNode> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let subgraphs: Record<string, CompiledGraph<any>> = {};\n if (xray) {\n subgraphs = Object.fromEntries(\n (await gatherIterator(this.getSubgraphsAsync())).filter(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (x): x is [string, CompiledGraph<any>] => isCompiledGraph(x[1])\n )\n );\n }\n\n const discoveredEdges: DiscoveredGraphEdge[] = [];\n\n function addEdge(\n start: string,\n end: string,\n label?: string,\n conditional = false\n ) {\n if (end === END && endNodes[END] === undefined) {\n endNodes[END] = graph.addNode({ schema: z.any() }, END);\n }\n if (startNodes[start] === undefined) {\n return;\n }\n if (endNodes[end] === undefined) {\n throw new Error(`End node ${end} not found!`);\n }\n discoveredEdges.push({ src: start, dest: end, conditional });\n return graph.addEdge(\n startNodes[start],\n endNodes[end],\n label !== end ? label : undefined,\n conditional\n );\n }\n\n for (const [key, nodeSpec] of Object.entries(this.builder.nodes) as [\n N,\n NodeSpec<State, Update>,\n ][]) {\n const displayKey = _escapeMermaidKeywords(key);\n const node = nodeSpec.runnable;\n const metadata = nodeSpec.metadata ?? {};\n if (\n this.interruptBefore?.includes(key) &&\n this.interruptAfter?.includes(key)\n ) {\n metadata.__interrupt = \"before,after\";\n } else if (this.interruptBefore?.includes(key)) {\n metadata.__interrupt = \"before\";\n } else if (this.interruptAfter?.includes(key)) {\n metadata.__interrupt = \"after\";\n }\n if (xray) {\n const newXrayValue = typeof xray === \"number\" ? xray - 1 : xray;\n const drawableSubgraph =\n subgraphs[key] !== undefined\n ? await subgraphs[key].getGraphAsync({\n ...config,\n xray: newXrayValue,\n })\n : node.getGraph(config);\n\n drawableSubgraph.trimFirstNode();\n drawableSubgraph.trimLastNode();\n\n if (Object.keys(drawableSubgraph.nodes).length > 1) {\n const [e, s] = graph.extend(drawableSubgraph, displayKey);\n if (e === undefined) {\n throw new Error(\n `Could not extend subgraph \"${key}\" due to missing entrypoint.`\n );\n }\n\n // TODO: Remove default name once we stop supporting core 0.2.0\n // eslint-disable-next-line no-inner-declarations\n function _isRunnableInterface(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n thing: any\n ): thing is RunnableInterface {\n return thing ? thing.lc_runnable : false;\n }\n // eslint-disable-next-line no-inner-declarations\n function _nodeDataStr(\n id: string | undefined,\n data: RunnableInterface | RunnableIOSchema\n ): string {\n if (id !== undefined && !isUuid(id)) {\n return id;\n } else if (_isRunnableInterface(data)) {\n try {\n let dataStr = data.getName();\n dataStr = dataStr.startsWith(\"Runnable\")\n ? dataStr.slice(\"Runnable\".length)\n : dataStr;\n return dataStr;\n } catch {\n return data.getName();\n }\n } else {\n return data.name ?? \"UnknownSchema\";\n }\n }\n // TODO: Remove casts when we stop supporting core 0.2.0\n if (s !== undefined) {\n startNodes[displayKey] = {\n name: _nodeDataStr(s.id, s.data),\n ...s,\n } as DrawableGraphNode;\n }\n endNodes[displayKey] = {\n name: _nodeDataStr(e.id, e.data),\n ...e,\n } as DrawableGraphNode;\n } else {\n // TODO: Remove when we stop supporting core 0.2.0\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const newNode = graph.addNode(node, displayKey, metadata);\n startNodes[displayKey] = newNode;\n endNodes[displayKey] = newNode;\n }\n } else {\n // TODO: Remove when we stop supporting core 0.2.0\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const newNode = graph.addNode(node, displayKey, metadata);\n startNodes[displayKey] = newNode;\n endNodes[displayKey] = newNode;\n }\n }\n const sortedEdges = [...this.builder.allEdges].sort(([a], [b]) => {\n if (a < b) {\n return -1;\n } else if (b > a) {\n return 1;\n } else {\n return 0;\n }\n });\n for (const [start, end] of sortedEdges) {\n addEdge(_escapeMermaidKeywords(start), _escapeMermaidKeywords(end));\n }\n for (const [start, branches] of Object.entries(this.builder.branches)) {\n const defaultEnds: Record<string, string> = {\n ...Object.fromEntries(\n Object.keys(this.builder.nodes)\n .filter((k) => k !== start)\n .map((k) => [_escapeMermaidKeywords(k), _escapeMermaidKeywords(k)])\n ),\n [END]: END,\n };\n for (const branch of Object.values(branches)) {\n let ends;\n if (branch.ends !== undefined) {\n ends = branch.ends;\n } else {\n ends = defaultEnds;\n }\n for (const [label, end] of Object.entries(ends)) {\n addEdge(\n _escapeMermaidKeywords(start),\n _escapeMermaidKeywords(end),\n label,\n true\n );\n }\n }\n }\n for (const [key, node] of Object.entries(this.builder.nodes) as [\n N,\n NodeSpec<State, Update>,\n ][]) {\n if (node.ends !== undefined) {\n for (const end of node.ends) {\n addEdge(\n _escapeMermaidKeywords(key),\n _escapeMermaidKeywords(end),\n undefined,\n true\n );\n }\n }\n }\n addImplicitTerminalEndEdges(this.builder.nodes, discoveredEdges, addEdge);\n return graph;\n }\n\n /**\n * Returns a drawable representation of the computation graph.\n *\n * @deprecated Use getGraphAsync instead. The async method will be the default in the next minor core release.\n */\n override getGraph(\n config?: RunnableConfig & { xray?: boolean | number }\n ): DrawableGraph {\n const xray = config?.xray;\n const graph = new DrawableGraph();\n const startNodes: Record<string, DrawableGraphNode> = {\n [START]: graph.addNode(\n {\n schema: z.any(),\n },\n START\n ),\n };\n const endNodes: Record<string, DrawableGraphNode> = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let subgraphs: Record<string, CompiledGraph<any>> = {};\n if (xray) {\n subgraphs = Object.fromEntries(\n gatherIteratorSync(this.getSubgraphs()).filter(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (x): x is [string, CompiledGraph<any>] => isCompiledGraph(x[1])\n )\n );\n }\n\n const discoveredEdges: DiscoveredGraphEdge[] = [];\n\n function addEdge(\n start: string,\n end: string,\n label?: string,\n conditional = false\n ) {\n if (end === END && endNodes[END] === undefined) {\n endNodes[END] = graph.addNode({ schema: z.any() }, END);\n }\n if (startNodes[start] === undefined) {\n return;\n }\n if (endNodes[end] === undefined) {\n throw new Error(`End node ${end} not found!`);\n }\n discoveredEdges.push({ src: start, dest: end, conditional });\n return graph.addEdge(\n startNodes[start],\n endNodes[end],\n label !== end ? label : undefined,\n conditional\n );\n }\n\n for (const [key, nodeSpec] of Object.entries(this.builder.nodes) as [\n N,\n NodeSpec<State, Update>,\n ][]) {\n const displayKey = _escapeMermaidKeywords(key);\n const node = nodeSpec.runnable;\n const metadata = nodeSpec.metadata ?? {};\n if (\n this.interruptBefore?.includes(key) &&\n this.interruptAfter?.includes(key)\n ) {\n metadata.__interrupt = \"before,after\";\n } else if (this.interruptBefore?.includes(key)) {\n metadata.__interrupt = \"before\";\n } else if (this.interruptAfter?.includes(key)) {\n metadata.__interrupt = \"after\";\n }\n if (xray) {\n const newXrayValue = typeof xray === \"number\" ? xray - 1 : xray;\n const drawableSubgraph =\n subgraphs[key] !== undefined\n ? subgraphs[key].getGraph({\n ...config,\n xray: newXrayValue,\n })\n : node.getGraph(config);\n drawableSubgraph.trimFirstNode();\n drawableSubgraph.trimLastNode();\n if (Object.keys(drawableSubgraph.nodes).length > 1) {\n const [e, s] = graph.extend(drawableSubgraph, displayKey);\n if (e === undefined) {\n throw new Error(\n `Could not extend subgraph \"${key}\" due to missing entrypoint.`\n );\n }\n\n // TODO: Remove default name once we stop supporting core 0.2.0\n // eslint-disable-next-line no-inner-declarations\n function _isRunnableInterface(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n thing: any\n ): thing is RunnableInterface {\n return thing ? thing.lc_runnable : false;\n }\n // eslint-disable-next-line no-inner-declarations\n function _nodeDataStr(\n id: string | undefined,\n data: RunnableInterface | RunnableIOSchema\n ): string {\n if (id !== undefined && !isUuid(id)) {\n return id;\n } else if (_isRunnableInterface(data)) {\n try {\n let dataStr = data.getName();\n dataStr = dataStr.startsWith(\"Runnable\")\n ? dataStr.slice(\"Runnable\".length)\n : dataStr;\n return dataStr;\n } catch {\n return data.getName();\n }\n } else {\n return data.name ?? \"UnknownSchema\";\n }\n }\n // TODO: Remove casts when we stop supporting core 0.2.0\n if (s !== undefined) {\n startNodes[displayKey] = {\n name: _nodeDataStr(s.id, s.data),\n ...s,\n } as DrawableGraphNode;\n }\n endNodes[displayKey] = {\n name: _nodeDataStr(e.id, e.data),\n ...e,\n } as DrawableGraphNode;\n } else {\n // TODO: Remove when we stop supporting core 0.2.0\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const newNode = graph.addNode(node, displayKey, metadata);\n startNodes[displayKey] = newNode;\n endNodes[displayKey] = newNode;\n }\n } else {\n // TODO: Remove when we stop supporting core 0.2.0\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const newNode = graph.addNode(node, displayKey, metadata);\n startNodes[displayKey] = newNode;\n endNodes[displayKey] = newNode;\n }\n }\n const sortedEdges = [...this.builder.allEdges].sort(([a], [b]) => {\n if (a < b) {\n return -1;\n } else if (b > a) {\n return 1;\n } else {\n return 0;\n }\n });\n for (const [start, end] of sortedEdges) {\n addEdge(_escapeMermaidKeywords(start), _escapeMermaidKeywords(end));\n }\n for (const [start, branches] of Object.entries(this.builder.branches)) {\n const defaultEnds: Record<string, string> = {\n ...Object.fromEntries(\n Object.keys(this.builder.nodes)\n .filter((k) => k !== start)\n .map((k) => [_escapeMermaidKeywords(k), _escapeMermaidKeywords(k)])\n ),\n [END]: END,\n };\n for (const branch of Object.values(branches)) {\n let ends;\n if (branch.ends !== undefined) {\n ends = branch.ends;\n } else {\n ends = defaultEnds;\n }\n for (const [label, end] of Object.entries(ends)) {\n addEdge(\n _escapeMermaidKeywords(start),\n _escapeMermaidKeywords(end),\n label,\n true\n );\n }\n }\n }\n for (const [key, node] of Object.entries(this.builder.nodes) as [\n N,\n NodeSpec<State, Update>,\n ][]) {\n if (node.ends !== undefined) {\n for (const end of node.ends) {\n addEdge(\n _escapeMermaidKeywords(key),\n _escapeMermaidKeywords(end),\n undefined,\n true\n );\n }\n }\n }\n addImplicitTerminalEndEdges(this.builder.nodes, discoveredEdges, addEdge);\n return graph;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isCompiledGraph(x: unknown): x is CompiledGraph<any> {\n return (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (x as CompiledGraph<any>).attachNode === \"function\" &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (x as CompiledGraph<any>).attachEdge === \"function\"\n );\n}\n\nfunction _escapeMermaidKeywords(key: string) {\n if (key === \"subgraph\") {\n return `\"${key}\"`;\n }\n return key;\n}\n\n/**\n * An edge collected while building a {@link DrawableGraph} from a compiled\n * {@link StateGraph}.\n *\n * Used by {@link addImplicitTerminalEndEdges} to detect nodes that should\n * receive an implicit edge to {@link END} (terminal nodes with no outgoing\n * edges in the drawable view).\n *\n * @internal\n */\ntype DiscoveredGraphEdge = {\n /** Display name of the source node (Mermaid-escaped). */\n src: string;\n /** Display name of the target node (Mermaid-escaped), or {@link END}. */\n dest: string;\n /**\n * Whether the edge comes from a conditional branch or `node.ends` declaration.\n * Non-conditional edges alone determine implicit terminal `→ END` links.\n */\n conditional: boolean;\n};\n\n/**\n * Add implicit edges to END for terminal nodes (targets with no outgoing edges).\n *\n * Only nodes reached by a non-conditional edge are considered, so\n * conditional-branch targets are not treated as implicit sinks.\n */\nfunction addImplicitTerminalEndEdges<N extends string>(\n nodes: Record<N, NodeSpec<unknown, unknown>>,\n discovered: DiscoveredGraphEdge[],\n addEdge: (\n start: string,\n end: string,\n label?: string,\n conditional?: boolean\n ) => void\n): void {\n const sources = new Set(discovered.map((e) => e.src));\n const nonConditionalDestinations = [\n ...new Set(\n discovered\n .filter((e) => !e.conditional && e.dest !== END)\n .map((e) => e.dest)\n ),\n ].sort();\n\n for (const displayDest of nonConditionalDestinations) {\n if (sources.has(displayDest)) continue;\n const rawKey = (Object.keys(nodes) as N[]).find(\n (k) => _escapeMermaidKeywords(k) === displayDest\n );\n if (rawKey !== undefined && nodes[rawKey]?.isErrorHandler) continue;\n addEdge(displayDest, END);\n }\n}\n"],"mappings":"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"}
@@ -7,6 +7,8 @@ import { PregelNode } from "../pregel/read.cjs";
7
7
  import { StreamTransformer } from "../stream/types.cjs";
8
8
  import { PregelOptions, PregelParams } from "../pregel/types.cjs";
9
9
  import { Pregel } from "../pregel/index.cjs";
10
+ import { NodeError } from "../errors.cjs";
11
+ import { GraphNodeReturnValue } from "./types.cjs";
10
12
  import { All, BaseCheckpointSaver } from "@langchain/langgraph-checkpoint";
11
13
  import { Runnable, RunnableConfig } from "@langchain/core/runnables";
12
14
  import { Graph } from "@langchain/core/runnables/graph";
@@ -70,8 +72,28 @@ type NodeSpec<RunInput, RunOutput> = {
70
72
  metadata?: Record<string, unknown>;
71
73
  subgraphs?: Pregel<any, any>[];
72
74
  ends?: string[];
73
- defer?: boolean;
75
+ defer?: boolean; /** Whether this node is an auto-generated node-level error handler. */
76
+ isErrorHandler?: boolean; /** Name of the auto-generated error handler node to run on failure. */
77
+ errorHandlerNode?: string;
74
78
  };
79
+ /**
80
+ * Return value type for node-level error handlers.
81
+ *
82
+ * Handlers may return a partial state update, a `Command`, or a Promise of either.
83
+ *
84
+ * @template Update - The update type (what fields can be returned)
85
+ * @template Nodes - Union of valid node names for Command.goto
86
+ */
87
+ type NodeErrorHandlerReturnValue<Update, Nodes extends string = string> = GraphNodeReturnValue<Update, Nodes>;
88
+ /**
89
+ * A node-level error handler callable.
90
+ *
91
+ * Invoked with the node input state, a {@link NodeError} describing the failed
92
+ * node and thrown error, and the runnable config. The handler runs ONLY after
93
+ * the failing node's {@link RetryPolicy} is exhausted. It may return a state
94
+ * update or a `Command` (to route via `goto`).
95
+ */
96
+ type NodeErrorHandler<TState = unknown, TUpdate = Partial<TState>, Nodes extends string = string> = (state: TState, error: NodeError, config?: LangGraphRunnableConfig) => NodeErrorHandlerReturnValue<TUpdate, Nodes>;
75
97
  type AddNodeOptions<Nodes extends string = string> = {
76
98
  metadata?: Record<string, unknown>;
77
99
  subgraphs?: Pregel<any, any>[];
@@ -155,5 +177,5 @@ declare class CompiledGraph<N extends string, State = any, Update = any, Context
155
177
  }): Graph;
156
178
  }
157
179
  //#endregion
158
- export { AddNodeOptions, Branch, CompiledGraph, CompiledGraphType, Graph$1 as Graph, NodeSpec };
180
+ export { AddNodeOptions, Branch, CompiledGraph, CompiledGraphType, Graph$1 as Graph, NodeErrorHandler, NodeSpec };
159
181
  //# sourceMappingURL=graph.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph.d.cts","names":[],"sources":["../../src/graph/graph.ts"],"mappings":"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"}
1
+ {"version":3,"file":"graph.d.cts","names":[],"sources":["../../src/graph/graph.ts"],"mappings":"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"}
@@ -7,6 +7,8 @@ import { PregelNode } from "../pregel/read.js";
7
7
  import { StreamTransformer } from "../stream/types.js";
8
8
  import { PregelOptions, PregelParams } from "../pregel/types.js";
9
9
  import { Pregel } from "../pregel/index.js";
10
+ import { NodeError } from "../errors.js";
11
+ import { GraphNodeReturnValue } from "./types.js";
10
12
  import { All, BaseCheckpointSaver } from "@langchain/langgraph-checkpoint";
11
13
  import { Runnable, RunnableConfig } from "@langchain/core/runnables";
12
14
  import { Graph } from "@langchain/core/runnables/graph";
@@ -70,8 +72,28 @@ type NodeSpec<RunInput, RunOutput> = {
70
72
  metadata?: Record<string, unknown>;
71
73
  subgraphs?: Pregel<any, any>[];
72
74
  ends?: string[];
73
- defer?: boolean;
75
+ defer?: boolean; /** Whether this node is an auto-generated node-level error handler. */
76
+ isErrorHandler?: boolean; /** Name of the auto-generated error handler node to run on failure. */
77
+ errorHandlerNode?: string;
74
78
  };
79
+ /**
80
+ * Return value type for node-level error handlers.
81
+ *
82
+ * Handlers may return a partial state update, a `Command`, or a Promise of either.
83
+ *
84
+ * @template Update - The update type (what fields can be returned)
85
+ * @template Nodes - Union of valid node names for Command.goto
86
+ */
87
+ type NodeErrorHandlerReturnValue<Update, Nodes extends string = string> = GraphNodeReturnValue<Update, Nodes>;
88
+ /**
89
+ * A node-level error handler callable.
90
+ *
91
+ * Invoked with the node input state, a {@link NodeError} describing the failed
92
+ * node and thrown error, and the runnable config. The handler runs ONLY after
93
+ * the failing node's {@link RetryPolicy} is exhausted. It may return a state
94
+ * update or a `Command` (to route via `goto`).
95
+ */
96
+ type NodeErrorHandler<TState = unknown, TUpdate = Partial<TState>, Nodes extends string = string> = (state: TState, error: NodeError, config?: LangGraphRunnableConfig) => NodeErrorHandlerReturnValue<TUpdate, Nodes>;
75
97
  type AddNodeOptions<Nodes extends string = string> = {
76
98
  metadata?: Record<string, unknown>;
77
99
  subgraphs?: Pregel<any, any>[];
@@ -155,5 +177,5 @@ declare class CompiledGraph<N extends string, State = any, Update = any, Context
155
177
  }): Graph;
156
178
  }
157
179
  //#endregion
158
- export { AddNodeOptions, Branch, CompiledGraph, CompiledGraphType, Graph$1 as Graph, NodeSpec };
180
+ export { AddNodeOptions, Branch, CompiledGraph, CompiledGraphType, Graph$1 as Graph, NodeErrorHandler, NodeErrorHandlerReturnValue, NodeSpec };
159
181
  //# sourceMappingURL=graph.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph.d.ts","names":[],"sources":["../../src/graph/graph.ts"],"mappings":"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"}
1
+ {"version":3,"file":"graph.d.ts","names":[],"sources":["../../src/graph/graph.ts"],"mappings":"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"}
@@ -161,13 +161,17 @@ var Graph$1 = class {
161
161
  for (const node of Object.keys(this.nodes)) if (node !== start) allTargets.add(node);
162
162
  }
163
163
  for (const node of Object.values(this.nodes)) for (const target of node.ends ?? []) allTargets.add(target);
164
- for (const node of Object.keys(this.nodes)) if (!allTargets.has(node)) throw new UnreachableNodeError([
165
- `Node \`${node}\` is not reachable.`,
166
- "",
167
- "If you are returning Command objects from your node,",
168
- "make sure you are passing names of potential destination nodes as an \"ends\" array",
169
- "into \".addNode(..., { ends: [\"node1\", \"node2\"] })\"."
170
- ].join("\n"), { lc_error_code: "UNREACHABLE_NODE" });
164
+ if (Object.values(this.nodes).some((node) => node.isErrorHandler)) for (const node of Object.keys(this.nodes)) allTargets.add(node);
165
+ for (const node of Object.keys(this.nodes)) {
166
+ if (this.nodes[node].isErrorHandler) continue;
167
+ if (!allTargets.has(node)) throw new UnreachableNodeError([
168
+ `Node \`${node}\` is not reachable.`,
169
+ "",
170
+ "If you are returning Command objects from your node,",
171
+ "make sure you are passing names of potential destination nodes as an \"ends\" array",
172
+ "into \".addNode(..., { ends: [\"node1\", \"node2\"] })\"."
173
+ ].join("\n"), { lc_error_code: "UNREACHABLE_NODE" });
174
+ }
171
175
  for (const target of allTargets) if (target !== "__end__" && !(target in this.nodes)) throw new Error(`Found edge ending at unknown node \`${target}\``);
172
176
  if (interrupt) {
173
177
  for (const node of interrupt) if (!(node in this.nodes)) throw new Error(`Interrupt node \`${node}\` is not present`);
@@ -239,10 +243,16 @@ var CompiledGraph = class extends Pregel {
239
243
  const endNodes = {};
240
244
  let subgraphs = {};
241
245
  if (xray) subgraphs = Object.fromEntries((await gatherIterator(this.getSubgraphsAsync())).filter((x) => isCompiledGraph(x[1])));
246
+ const discoveredEdges = [];
242
247
  function addEdge(start, end, label, conditional = false) {
243
248
  if (end === "__end__" && endNodes["__end__"] === void 0) endNodes[END] = graph.addNode({ schema: z.any() }, END);
244
249
  if (startNodes[start] === void 0) return;
245
250
  if (endNodes[end] === void 0) throw new Error(`End node ${end} not found!`);
251
+ discoveredEdges.push({
252
+ src: start,
253
+ dest: end,
254
+ conditional
255
+ });
246
256
  return graph.addEdge(startNodes[start], endNodes[end], label !== end ? label : void 0, conditional);
247
257
  }
248
258
  for (const [key, nodeSpec] of Object.entries(this.builder.nodes)) {
@@ -315,6 +325,7 @@ var CompiledGraph = class extends Pregel {
315
325
  }
316
326
  }
317
327
  for (const [key, node] of Object.entries(this.builder.nodes)) if (node.ends !== void 0) for (const end of node.ends) addEdge(_escapeMermaidKeywords(key), _escapeMermaidKeywords(end), void 0, true);
328
+ addImplicitTerminalEndEdges(this.builder.nodes, discoveredEdges, addEdge);
318
329
  return graph;
319
330
  }
320
331
  /**
@@ -329,8 +340,16 @@ var CompiledGraph = class extends Pregel {
329
340
  const endNodes = {};
330
341
  let subgraphs = {};
331
342
  if (xray) subgraphs = Object.fromEntries(gatherIteratorSync(this.getSubgraphs()).filter((x) => isCompiledGraph(x[1])));
343
+ const discoveredEdges = [];
332
344
  function addEdge(start, end, label, conditional = false) {
333
345
  if (end === "__end__" && endNodes["__end__"] === void 0) endNodes[END] = graph.addNode({ schema: z.any() }, END);
346
+ if (startNodes[start] === void 0) return;
347
+ if (endNodes[end] === void 0) throw new Error(`End node ${end} not found!`);
348
+ discoveredEdges.push({
349
+ src: start,
350
+ dest: end,
351
+ conditional
352
+ });
334
353
  return graph.addEdge(startNodes[start], endNodes[end], label !== end ? label : void 0, conditional);
335
354
  }
336
355
  for (const [key, nodeSpec] of Object.entries(this.builder.nodes)) {
@@ -402,6 +421,8 @@ var CompiledGraph = class extends Pregel {
402
421
  for (const [label, end] of Object.entries(ends)) addEdge(_escapeMermaidKeywords(start), _escapeMermaidKeywords(end), label, true);
403
422
  }
404
423
  }
424
+ for (const [key, node] of Object.entries(this.builder.nodes)) if (node.ends !== void 0) for (const end of node.ends) addEdge(_escapeMermaidKeywords(key), _escapeMermaidKeywords(end), void 0, true);
425
+ addImplicitTerminalEndEdges(this.builder.nodes, discoveredEdges, addEdge);
405
426
  return graph;
406
427
  }
407
428
  };
@@ -412,6 +433,22 @@ function _escapeMermaidKeywords(key) {
412
433
  if (key === "subgraph") return `"${key}"`;
413
434
  return key;
414
435
  }
436
+ /**
437
+ * Add implicit edges to END for terminal nodes (targets with no outgoing edges).
438
+ *
439
+ * Only nodes reached by a non-conditional edge are considered, so
440
+ * conditional-branch targets are not treated as implicit sinks.
441
+ */
442
+ function addImplicitTerminalEndEdges(nodes, discovered, addEdge) {
443
+ const sources = new Set(discovered.map((e) => e.src));
444
+ const nonConditionalDestinations = [...new Set(discovered.filter((e) => !e.conditional && e.dest !== "__end__").map((e) => e.dest))].sort();
445
+ for (const displayDest of nonConditionalDestinations) {
446
+ if (sources.has(displayDest)) continue;
447
+ const rawKey = Object.keys(nodes).find((k) => _escapeMermaidKeywords(k) === displayDest);
448
+ if (rawKey !== void 0 && nodes[rawKey]?.isErrorHandler) continue;
449
+ addEdge(displayDest, END);
450
+ }
451
+ }
415
452
  //#endregion
416
453
  export { Branch, CompiledGraph, Graph$1 as Graph };
417
454