@langchain/langgraph 1.1.5 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/dist/channels/binop.cjs +13 -2
  2. package/dist/channels/binop.cjs.map +1 -1
  3. package/dist/channels/binop.d.cts +4 -2
  4. package/dist/channels/binop.d.cts.map +1 -1
  5. package/dist/channels/binop.d.ts +4 -2
  6. package/dist/channels/binop.d.ts.map +1 -1
  7. package/dist/channels/binop.js +14 -3
  8. package/dist/channels/binop.js.map +1 -1
  9. package/dist/constants.cjs +78 -0
  10. package/dist/constants.cjs.map +1 -1
  11. package/dist/constants.d.cts +49 -1
  12. package/dist/constants.d.cts.map +1 -1
  13. package/dist/constants.d.ts +49 -1
  14. package/dist/constants.d.ts.map +1 -1
  15. package/dist/constants.js +76 -1
  16. package/dist/constants.js.map +1 -1
  17. package/dist/func/index.cjs +1 -1
  18. package/dist/func/index.d.cts +1 -1
  19. package/dist/func/index.d.ts +1 -1
  20. package/dist/func/index.js +1 -1
  21. package/dist/graph/annotation.cjs.map +1 -1
  22. package/dist/graph/annotation.d.cts +3 -2
  23. package/dist/graph/annotation.d.cts.map +1 -1
  24. package/dist/graph/annotation.d.ts +3 -2
  25. package/dist/graph/annotation.d.ts.map +1 -1
  26. package/dist/graph/annotation.js.map +1 -1
  27. package/dist/graph/graph.cjs +3 -6
  28. package/dist/graph/graph.cjs.map +1 -1
  29. package/dist/graph/graph.d.cts +2 -2
  30. package/dist/graph/graph.d.cts.map +1 -1
  31. package/dist/graph/graph.d.ts +2 -2
  32. package/dist/graph/graph.d.ts.map +1 -1
  33. package/dist/graph/graph.js +3 -6
  34. package/dist/graph/graph.js.map +1 -1
  35. package/dist/graph/index.cjs +1 -1
  36. package/dist/graph/index.d.ts +1 -1
  37. package/dist/graph/index.js +1 -1
  38. package/dist/graph/messages_annotation.d.cts +3 -2
  39. package/dist/graph/messages_annotation.d.cts.map +1 -1
  40. package/dist/graph/messages_annotation.d.ts +3 -2
  41. package/dist/graph/messages_annotation.d.ts.map +1 -1
  42. package/dist/graph/state.cjs +1 -1
  43. package/dist/graph/state.d.cts +1 -1
  44. package/dist/graph/state.d.ts +1 -1
  45. package/dist/graph/state.js +1 -1
  46. package/dist/graph/types.cjs +1 -1
  47. package/dist/graph/types.d.cts +1 -1
  48. package/dist/graph/types.d.ts +1 -1
  49. package/dist/graph/types.js +1 -1
  50. package/dist/graph/zod/meta.cjs.map +1 -1
  51. package/dist/graph/zod/meta.d.cts +3 -2
  52. package/dist/graph/zod/meta.d.cts.map +1 -1
  53. package/dist/graph/zod/meta.d.ts +3 -2
  54. package/dist/graph/zod/meta.d.ts.map +1 -1
  55. package/dist/graph/zod/meta.js.map +1 -1
  56. package/dist/index.cjs +2 -1
  57. package/dist/index.d.cts +2 -2
  58. package/dist/index.d.ts +2 -2
  59. package/dist/index.js +2 -2
  60. package/dist/interrupt.cjs +1 -1
  61. package/dist/interrupt.js +1 -1
  62. package/dist/prebuilt/react_agent_executor.cjs +1 -1
  63. package/dist/prebuilt/react_agent_executor.d.cts +5 -5
  64. package/dist/prebuilt/react_agent_executor.d.cts.map +1 -1
  65. package/dist/prebuilt/react_agent_executor.d.ts +5 -5
  66. package/dist/prebuilt/react_agent_executor.d.ts.map +1 -1
  67. package/dist/prebuilt/react_agent_executor.js +1 -1
  68. package/dist/prebuilt/tool_node.cjs +1 -1
  69. package/dist/prebuilt/tool_node.d.cts +1 -1
  70. package/dist/prebuilt/tool_node.d.ts +1 -1
  71. package/dist/prebuilt/tool_node.js +1 -1
  72. package/dist/pregel/algo.cjs +1 -1
  73. package/dist/pregel/algo.d.ts +1 -1
  74. package/dist/pregel/algo.js +1 -1
  75. package/dist/pregel/index.cjs +13 -1
  76. package/dist/pregel/index.cjs.map +1 -1
  77. package/dist/pregel/index.d.cts +2 -1
  78. package/dist/pregel/index.d.cts.map +1 -1
  79. package/dist/pregel/index.d.ts +2 -1
  80. package/dist/pregel/index.d.ts.map +1 -1
  81. package/dist/pregel/index.js +14 -2
  82. package/dist/pregel/index.js.map +1 -1
  83. package/dist/pregel/io.cjs +1 -1
  84. package/dist/pregel/io.js +1 -1
  85. package/dist/pregel/loop.cjs +1 -1
  86. package/dist/pregel/loop.js +1 -1
  87. package/dist/pregel/read.cjs +4 -1
  88. package/dist/pregel/read.cjs.map +1 -1
  89. package/dist/pregel/read.d.cts.map +1 -1
  90. package/dist/pregel/read.d.ts.map +1 -1
  91. package/dist/pregel/read.js +4 -1
  92. package/dist/pregel/read.js.map +1 -1
  93. package/dist/pregel/remote.cjs +1 -1
  94. package/dist/pregel/remote.js +1 -1
  95. package/dist/pregel/retry.cjs +1 -1
  96. package/dist/pregel/retry.js +1 -1
  97. package/dist/pregel/runner.cjs +1 -1
  98. package/dist/pregel/runner.js +1 -1
  99. package/dist/pregel/stream.cjs +81 -0
  100. package/dist/pregel/stream.cjs.map +1 -1
  101. package/dist/pregel/stream.d.ts +2 -1
  102. package/dist/pregel/stream.js +81 -1
  103. package/dist/pregel/stream.js.map +1 -1
  104. package/dist/pregel/types.cjs.map +1 -1
  105. package/dist/pregel/types.d.cts +27 -2
  106. package/dist/pregel/types.d.cts.map +1 -1
  107. package/dist/pregel/types.d.ts +27 -2
  108. package/dist/pregel/types.d.ts.map +1 -1
  109. package/dist/pregel/types.js.map +1 -1
  110. package/dist/pregel/write.cjs +2 -1
  111. package/dist/pregel/write.cjs.map +1 -1
  112. package/dist/pregel/write.d.cts +1 -1
  113. package/dist/pregel/write.d.cts.map +1 -1
  114. package/dist/pregel/write.d.ts +1 -1
  115. package/dist/pregel/write.d.ts.map +1 -1
  116. package/dist/pregel/write.js +2 -1
  117. package/dist/pregel/write.js.map +1 -1
  118. package/dist/state/schema.cjs.map +1 -1
  119. package/dist/state/schema.d.cts +3 -2
  120. package/dist/state/schema.d.cts.map +1 -1
  121. package/dist/state/schema.d.ts +3 -2
  122. package/dist/state/schema.d.ts.map +1 -1
  123. package/dist/state/schema.js.map +1 -1
  124. package/dist/web.cjs +2 -1
  125. package/dist/web.d.cts +2 -2
  126. package/dist/web.d.ts +2 -2
  127. package/dist/web.js +2 -2
  128. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"read.cjs","names":["RunnableCallable","CONFIG_KEY_READ","RunnablePassthrough","RunnableBinding","ChannelWrite","RunnableSequence"],"sources":["../../src/pregel/read.ts"],"sourcesContent":["import {\n Runnable,\n RunnableBinding,\n RunnableBindingArgs,\n RunnableConfig,\n RunnablePassthrough,\n RunnableSequence,\n _coerceToRunnable,\n type RunnableLike,\n} from \"@langchain/core/runnables\";\nimport { CONFIG_KEY_READ } from \"../constants.js\";\nimport { ChannelWrite } from \"./write.js\";\nimport { RunnableCallable } from \"../utils.js\";\nimport type { CachePolicy, RetryPolicy } from \"./utils/index.js\";\n\nexport class ChannelRead<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput = any\n> extends RunnableCallable {\n lc_graph_name = \"ChannelRead\";\n\n channel: string | Array<string>;\n\n fresh: boolean = false;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(\n channel: string | Array<string>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any,\n fresh: boolean = false\n ) {\n super({\n func: (_: RunInput, config: RunnableConfig) =>\n ChannelRead.doRead(config, this.channel, this.fresh, this.mapper),\n });\n this.fresh = fresh;\n this.mapper = mapper;\n this.channel = channel;\n this.name = Array.isArray(channel)\n ? `ChannelRead<${channel.join(\",\")}>`\n : `ChannelRead<${channel}>`;\n }\n\n static doRead<T = unknown>(\n config: RunnableConfig,\n channel: string | Array<string>,\n fresh: boolean,\n mapper?: (args: unknown) => unknown\n ): T {\n const read: (arg: string | string[], fresh: boolean) => unknown =\n config.configurable?.[CONFIG_KEY_READ];\n if (!read) {\n throw new Error(\n \"Runnable is not configured with a read function. Make sure to call in the context of a Pregel process\"\n );\n }\n if (mapper) {\n return mapper(read(channel, fresh)) as T;\n } else {\n return read(channel, fresh) as T;\n }\n }\n}\n\nconst defaultRunnableBound =\n /* #__PURE__ */ new RunnablePassthrough<PregelNodeInputType>();\n\ninterface PregelNodeArgs<RunInput, RunOutput>\n extends Partial<RunnableBindingArgs<RunInput, RunOutput>> {\n channels: Record<string, string> | string[];\n triggers: Array<string>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n writers?: Runnable<RunOutput, unknown>[];\n tags?: string[];\n bound?: Runnable<RunInput, RunOutput>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs?: Record<string, any>;\n config?: RunnableConfig;\n metadata?: Record<string, unknown>;\n retryPolicy?: RetryPolicy;\n cachePolicy?: CachePolicy;\n subgraphs?: Runnable[];\n ends?: string[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PregelNodeInputType = any;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PregelNodeOutputType = any;\n\nexport class PregelNode<\n RunInput = PregelNodeInputType,\n RunOutput = PregelNodeOutputType\n> extends RunnableBinding<RunInput, RunOutput, RunnableConfig> {\n lc_graph_name = \"PregelNode\";\n\n channels: Record<string, string> | string[];\n\n triggers: string[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n\n writers: Runnable[] = [];\n\n bound: Runnable<RunInput, RunOutput> = defaultRunnableBound;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs: Record<string, any> = {};\n\n metadata: Record<string, unknown> = {};\n\n tags: string[] = [];\n\n retryPolicy?: RetryPolicy;\n\n cachePolicy?: CachePolicy;\n\n subgraphs?: Runnable[];\n\n ends?: string[];\n\n constructor(fields: PregelNodeArgs<RunInput, RunOutput>) {\n const {\n channels,\n triggers,\n mapper,\n writers,\n bound,\n kwargs,\n metadata,\n retryPolicy,\n cachePolicy,\n tags,\n subgraphs,\n ends,\n } = fields;\n const mergedTags = [\n ...(fields.config?.tags ? fields.config.tags : []),\n ...(tags ?? []),\n ];\n\n super({\n ...fields,\n bound:\n fields.bound ??\n (defaultRunnableBound as unknown as Runnable<RunInput, RunOutput>),\n config: {\n ...(fields.config ? fields.config : {}),\n tags: mergedTags,\n },\n });\n\n this.channels = channels;\n this.triggers = triggers;\n this.mapper = mapper;\n this.writers = writers ?? this.writers;\n this.bound = bound ?? this.bound;\n this.kwargs = kwargs ?? this.kwargs;\n this.metadata = metadata ?? this.metadata;\n this.tags = mergedTags;\n this.retryPolicy = retryPolicy;\n this.cachePolicy = cachePolicy;\n this.subgraphs = subgraphs;\n this.ends = ends;\n }\n\n getWriters(): Array<Runnable> {\n const newWriters = [...this.writers];\n while (\n newWriters.length > 1 &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n newWriters[newWriters.length - 1] instanceof ChannelWrite &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n newWriters[newWriters.length - 2] instanceof ChannelWrite\n ) {\n // we can combine writes if they are consecutive\n // careful to not modify the original writers list or ChannelWrite\n const endWriters = newWriters.slice(-2) as ChannelWrite[];\n const combinedWrites = endWriters[0].writes.concat(endWriters[1].writes);\n newWriters[newWriters.length - 2] = new ChannelWrite(\n combinedWrites,\n endWriters[0].config?.tags\n );\n newWriters.pop();\n }\n return newWriters;\n }\n\n getNode(): Runnable<RunInput, RunOutput> | undefined {\n const writers = this.getWriters();\n if (this.bound === defaultRunnableBound && writers.length === 0) {\n return undefined;\n } else if (this.bound === defaultRunnableBound && writers.length === 1) {\n return writers[0];\n } else if (this.bound === defaultRunnableBound) {\n return new RunnableSequence({\n first: writers[0],\n middle: writers.slice(1, writers.length - 1),\n last: writers[writers.length - 1],\n omitSequenceTags: true,\n });\n } else if (writers.length > 0) {\n return new RunnableSequence({\n first: this.bound,\n middle: writers.slice(0, writers.length - 1),\n last: writers[writers.length - 1],\n omitSequenceTags: true,\n });\n } else {\n return this.bound;\n }\n }\n\n join(channels: Array<string>): PregelNode<RunInput, RunOutput> {\n if (!Array.isArray(channels)) {\n throw new Error(\"channels must be a list\");\n }\n if (typeof this.channels !== \"object\") {\n throw new Error(\"all channels must be named when using .join()\");\n }\n\n return new PregelNode<RunInput, RunOutput>({\n channels: {\n ...this.channels,\n ...Object.fromEntries(channels.map((chan) => [chan, chan])),\n },\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: this.bound,\n kwargs: this.kwargs,\n config: this.config,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n }\n\n pipe<NewRunOutput>(\n coerceable: RunnableLike\n ): PregelNode<RunInput, Exclude<NewRunOutput, Error>> {\n if (ChannelWrite.isWriter(coerceable)) {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: [...this.writers, coerceable],\n bound: this.bound as unknown as PregelNode<\n RunInput,\n Exclude<NewRunOutput, Error>\n >,\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n } else if (this.bound === defaultRunnableBound) {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: _coerceToRunnable<RunInput, NewRunOutput>(coerceable),\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n } else {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: this.bound.pipe(coerceable),\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"read.cjs","names":["RunnableCallable","CONFIG_KEY_READ","RunnablePassthrough","RunnableBinding","ChannelWrite","RunnableSequence"],"sources":["../../src/pregel/read.ts"],"sourcesContent":["import {\n Runnable,\n RunnableBinding,\n RunnableBindingArgs,\n RunnableConfig,\n RunnablePassthrough,\n RunnableSequence,\n _coerceToRunnable,\n type RunnableLike,\n} from \"@langchain/core/runnables\";\nimport { CONFIG_KEY_READ } from \"../constants.js\";\nimport { ChannelWrite } from \"./write.js\";\nimport { RunnableCallable } from \"../utils.js\";\nimport type { CachePolicy, RetryPolicy } from \"./utils/index.js\";\n\nexport class ChannelRead<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput = any\n> extends RunnableCallable {\n lc_graph_name = \"ChannelRead\";\n\n channel: string | Array<string>;\n\n fresh: boolean = false;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(\n channel: string | Array<string>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any,\n fresh: boolean = false\n ) {\n super({\n trace: false,\n func: (_: RunInput, config: RunnableConfig) =>\n ChannelRead.doRead(config, this.channel, this.fresh, this.mapper),\n });\n this.fresh = fresh;\n this.mapper = mapper;\n this.channel = channel;\n this.name = Array.isArray(channel)\n ? `ChannelRead<${channel.join(\",\")}>`\n : `ChannelRead<${channel}>`;\n }\n\n static doRead<T = unknown>(\n config: RunnableConfig,\n channel: string | Array<string>,\n fresh: boolean,\n mapper?: (args: unknown) => unknown\n ): T {\n const read: (arg: string | string[], fresh: boolean) => unknown =\n config.configurable?.[CONFIG_KEY_READ];\n if (!read) {\n throw new Error(\n \"Runnable is not configured with a read function. Make sure to call in the context of a Pregel process\"\n );\n }\n if (mapper) {\n return mapper(read(channel, fresh)) as T;\n } else {\n return read(channel, fresh) as T;\n }\n }\n}\n\nconst defaultRunnableBound =\n /* #__PURE__ */ new RunnablePassthrough<PregelNodeInputType>();\n\ninterface PregelNodeArgs<RunInput, RunOutput>\n extends Partial<RunnableBindingArgs<RunInput, RunOutput>> {\n channels: Record<string, string> | string[];\n triggers: Array<string>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n writers?: Runnable<RunOutput, unknown>[];\n tags?: string[];\n bound?: Runnable<RunInput, RunOutput>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs?: Record<string, any>;\n config?: RunnableConfig;\n metadata?: Record<string, unknown>;\n retryPolicy?: RetryPolicy;\n cachePolicy?: CachePolicy;\n subgraphs?: Runnable[];\n ends?: string[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PregelNodeInputType = any;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PregelNodeOutputType = any;\n\nexport class PregelNode<\n RunInput = PregelNodeInputType,\n RunOutput = PregelNodeOutputType\n> extends RunnableBinding<RunInput, RunOutput, RunnableConfig> {\n lc_graph_name = \"PregelNode\";\n\n channels: Record<string, string> | string[];\n\n triggers: string[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n\n writers: Runnable[] = [];\n\n bound: Runnable<RunInput, RunOutput> = defaultRunnableBound;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs: Record<string, any> = {};\n\n metadata: Record<string, unknown> = {};\n\n tags: string[] = [];\n\n retryPolicy?: RetryPolicy;\n\n cachePolicy?: CachePolicy;\n\n subgraphs?: Runnable[];\n\n ends?: string[];\n\n constructor(fields: PregelNodeArgs<RunInput, RunOutput>) {\n const {\n channels,\n triggers,\n mapper,\n writers,\n bound,\n kwargs,\n metadata,\n retryPolicy,\n cachePolicy,\n tags,\n subgraphs,\n ends,\n } = fields;\n const mergedTags = [\n ...(fields.config?.tags ? fields.config.tags : []),\n ...(tags ?? []),\n ];\n\n super({\n ...fields,\n bound:\n fields.bound ??\n (defaultRunnableBound as unknown as Runnable<RunInput, RunOutput>),\n config: {\n ...(fields.config ? fields.config : {}),\n tags: mergedTags,\n },\n });\n\n this.channels = channels;\n this.triggers = triggers;\n this.mapper = mapper;\n this.writers = writers ?? this.writers;\n this.bound = bound ?? this.bound;\n this.kwargs = kwargs ?? this.kwargs;\n this.metadata = metadata ?? this.metadata;\n this.tags = mergedTags;\n this.retryPolicy = retryPolicy;\n this.cachePolicy = cachePolicy;\n this.subgraphs = subgraphs;\n this.ends = ends;\n }\n\n getWriters(): Array<Runnable> {\n const newWriters = [...this.writers];\n while (\n newWriters.length > 1 &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n newWriters[newWriters.length - 1] instanceof ChannelWrite &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n newWriters[newWriters.length - 2] instanceof ChannelWrite\n ) {\n // we can combine writes if they are consecutive\n // careful to not modify the original writers list or ChannelWrite\n const endWriters = newWriters.slice(-2) as ChannelWrite[];\n const combinedWrites = endWriters[0].writes.concat(endWriters[1].writes);\n newWriters[newWriters.length - 2] = new ChannelWrite(\n combinedWrites,\n endWriters[0].config?.tags\n );\n newWriters.pop();\n }\n return newWriters;\n }\n\n getNode(): Runnable<RunInput, RunOutput> | undefined {\n const writers = this.getWriters();\n if (this.bound === defaultRunnableBound && writers.length === 0) {\n return undefined;\n } else if (this.bound === defaultRunnableBound && writers.length === 1) {\n return writers[0];\n } else if (this.bound === defaultRunnableBound) {\n return new RunnableSequence({\n first: writers[0],\n middle: writers.slice(1, writers.length - 1),\n last: writers[writers.length - 1],\n omitSequenceTags: true,\n });\n } else if (writers.length > 0) {\n return new RunnableSequence({\n first: this.bound,\n middle: writers.slice(0, writers.length - 1),\n last: writers[writers.length - 1],\n omitSequenceTags: true,\n });\n } else {\n return this.bound;\n }\n }\n\n join(channels: Array<string>): PregelNode<RunInput, RunOutput> {\n if (!Array.isArray(channels)) {\n throw new Error(\"channels must be a list\");\n }\n if (typeof this.channels !== \"object\") {\n throw new Error(\"all channels must be named when using .join()\");\n }\n\n return new PregelNode<RunInput, RunOutput>({\n channels: {\n ...this.channels,\n ...Object.fromEntries(channels.map((chan) => [chan, chan])),\n },\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: this.bound,\n kwargs: this.kwargs,\n config: this.config,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n }\n\n pipe<NewRunOutput>(\n coerceable: RunnableLike\n ): PregelNode<RunInput, Exclude<NewRunOutput, Error>> {\n if (ChannelWrite.isWriter(coerceable)) {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: [...this.writers, coerceable],\n bound: this.bound as unknown as PregelNode<\n RunInput,\n Exclude<NewRunOutput, Error>\n >,\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n } else if (this.bound === defaultRunnableBound) {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: _coerceToRunnable<RunInput, NewRunOutput>(coerceable),\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n } else {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: this.bound.pipe(coerceable),\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.cts","names":[],"sources":["../../src/pregel/read.ts"],"mappings":";;;;UAuEU,cAAA,8BACA,OAAA,CAAQ,mBAAA,CAAoB,QAAA,EAAU,SAAA;EAC9C,QAAA,EAAU,MAAA;EACV,QAAA,EAAU,KAAA;EAEV,MAAA,IAAU,IAAA;EACV,OAAA,GAAU,QAAA,CAAS,SAAA;EACnB,IAAA;EACA,KAAA,GAAQ,QAAA,CAAS,QAAA,EAAU,SAAA;EAE3B,MAAA,GAAS,MAAA;EACT,MAAA,GAAS,cAAA;EACT,QAAA,GAAW,MAAA;EACX,WAAA,GAAc,WAAA;EACd,WAAA,GAAc,WAAA;EACd,SAAA,GAAY,QAAA;EACZ,IAAA;AAAA;AAAA,KAIU,mBAAA;AAAA,KAGA,oBAAA;AAAA,cAEC,UAAA,YACA,mBAAA,cACC,oBAAA,UACJ,eAAA,CAAgB,QAAA,EAAU,SAAA,EAAW,cAAA;EAC7C,aAAA;EAEA,QAAA,EAAU,MAAA;EAEV,QAAA;EAGA,MAAA,IAAU,IAAA;EAEV,OAAA,EAAS,QAAA;EAET,KAAA,EAAO,QAAA,CAAS,QAAA,EAAU,SAAA;EAG1B,MAAA,EAAQ,MAAA;EAER,QAAA,EAAU,MAAA;EAEV,IAAA;EAEA,WAAA,GAAc,WAAA;EAEd,WAAA,GAAc,WAAA;EAEd,SAAA,GAAY,QAAA;EAEZ,IAAA;EAEA,WAAA,CAAY,MAAA,EAAQ,cAAA,CAAe,QAAA,EAAU,SAAA;EA6C7C,UAAA,CAAA,GAAc,KAAA,CAAM,QAAA;EAsBpB,OAAA,CAAA,GAAW,QAAA,CAAS,QAAA,EAAU,SAAA;EAyB9B,IAAA,CAAK,QAAA,EAAU,KAAA,WAAgB,UAAA,CAAW,QAAA,EAAU,SAAA;EAwBpD,IAAA,cAAA,CACE,UAAA,EAAY,YAAA,GACX,UAAA,CAAW,QAAA,EAAU,OAAA,CAAQ,YAAA,EAAc,KAAA;AAAA"}
1
+ {"version":3,"file":"read.d.cts","names":[],"sources":["../../src/pregel/read.ts"],"mappings":";;;;UAwEU,cAAA,8BACA,OAAA,CAAQ,mBAAA,CAAoB,QAAA,EAAU,SAAA;EAC9C,QAAA,EAAU,MAAA;EACV,QAAA,EAAU,KAAA;EAEV,MAAA,IAAU,IAAA;EACV,OAAA,GAAU,QAAA,CAAS,SAAA;EACnB,IAAA;EACA,KAAA,GAAQ,QAAA,CAAS,QAAA,EAAU,SAAA;EAE3B,MAAA,GAAS,MAAA;EACT,MAAA,GAAS,cAAA;EACT,QAAA,GAAW,MAAA;EACX,WAAA,GAAc,WAAA;EACd,WAAA,GAAc,WAAA;EACd,SAAA,GAAY,QAAA;EACZ,IAAA;AAAA;AAAA,KAIU,mBAAA;AAAA,KAGA,oBAAA;AAAA,cAEC,UAAA,YACA,mBAAA,cACC,oBAAA,UACJ,eAAA,CAAgB,QAAA,EAAU,SAAA,EAAW,cAAA;EAC7C,aAAA;EAEA,QAAA,EAAU,MAAA;EAEV,QAAA;EAGA,MAAA,IAAU,IAAA;EAEV,OAAA,EAAS,QAAA;EAET,KAAA,EAAO,QAAA,CAAS,QAAA,EAAU,SAAA;EAG1B,MAAA,EAAQ,MAAA;EAER,QAAA,EAAU,MAAA;EAEV,IAAA;EAEA,WAAA,GAAc,WAAA;EAEd,WAAA,GAAc,WAAA;EAEd,SAAA,GAAY,QAAA;EAEZ,IAAA;EAEA,WAAA,CAAY,MAAA,EAAQ,cAAA,CAAe,QAAA,EAAU,SAAA;EA6C7C,UAAA,CAAA,GAAc,KAAA,CAAM,QAAA;EAsBpB,OAAA,CAAA,GAAW,QAAA,CAAS,QAAA,EAAU,SAAA;EAyB9B,IAAA,CAAK,QAAA,EAAU,KAAA,WAAgB,UAAA,CAAW,QAAA,EAAU,SAAA;EAwBpD,IAAA,cAAA,CACE,UAAA,EAAY,YAAA,GACX,UAAA,CAAW,QAAA,EAAU,OAAA,CAAQ,YAAA,EAAc,KAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","names":[],"sources":["../../src/pregel/read.ts"],"mappings":";;;;;UAuEU,cAAA,8BACA,OAAA,CAAQ,mBAAA,CAAoB,QAAA,EAAU,SAAA;EAC9C,QAAA,EAAU,MAAA;EACV,QAAA,EAAU,KAAA;EAEV,MAAA,IAAU,IAAA;EACV,OAAA,GAAU,QAAA,CAAS,SAAA;EACnB,IAAA;EACA,KAAA,GAAQ,QAAA,CAAS,QAAA,EAAU,SAAA;EAE3B,MAAA,GAAS,MAAA;EACT,MAAA,GAAS,cAAA;EACT,QAAA,GAAW,MAAA;EACX,WAAA,GAAc,WAAA;EACd,WAAA,GAAc,WAAA;EACd,SAAA,GAAY,QAAA;EACZ,IAAA;AAAA;AAAA,KAIU,mBAAA;AAAA,KAGA,oBAAA;AAAA,cAEC,UAAA,YACA,mBAAA,cACC,oBAAA,UACJ,eAAA,CAAgB,QAAA,EAAU,SAAA,EAAW,cAAA;EAC7C,aAAA;EAEA,QAAA,EAAU,MAAA;EAEV,QAAA;EAGA,MAAA,IAAU,IAAA;EAEV,OAAA,EAAS,QAAA;EAET,KAAA,EAAO,QAAA,CAAS,QAAA,EAAU,SAAA;EAG1B,MAAA,EAAQ,MAAA;EAER,QAAA,EAAU,MAAA;EAEV,IAAA;EAEA,WAAA,GAAc,WAAA;EAEd,WAAA,GAAc,WAAA;EAEd,SAAA,GAAY,QAAA;EAEZ,IAAA;EAEA,WAAA,CAAY,MAAA,EAAQ,cAAA,CAAe,QAAA,EAAU,SAAA;EA6C7C,UAAA,CAAA,GAAc,KAAA,CAAM,QAAA;EAsBpB,OAAA,CAAA,GAAW,QAAA,CAAS,QAAA,EAAU,SAAA;EAyB9B,IAAA,CAAK,QAAA,EAAU,KAAA,WAAgB,UAAA,CAAW,QAAA,EAAU,SAAA;EAwBpD,IAAA,cAAA,CACE,UAAA,EAAY,YAAA,GACX,UAAA,CAAW,QAAA,EAAU,OAAA,CAAQ,YAAA,EAAc,KAAA;AAAA"}
1
+ {"version":3,"file":"read.d.ts","names":[],"sources":["../../src/pregel/read.ts"],"mappings":";;;;;UAwEU,cAAA,8BACA,OAAA,CAAQ,mBAAA,CAAoB,QAAA,EAAU,SAAA;EAC9C,QAAA,EAAU,MAAA;EACV,QAAA,EAAU,KAAA;EAEV,MAAA,IAAU,IAAA;EACV,OAAA,GAAU,QAAA,CAAS,SAAA;EACnB,IAAA;EACA,KAAA,GAAQ,QAAA,CAAS,QAAA,EAAU,SAAA;EAE3B,MAAA,GAAS,MAAA;EACT,MAAA,GAAS,cAAA;EACT,QAAA,GAAW,MAAA;EACX,WAAA,GAAc,WAAA;EACd,WAAA,GAAc,WAAA;EACd,SAAA,GAAY,QAAA;EACZ,IAAA;AAAA;AAAA,KAIU,mBAAA;AAAA,KAGA,oBAAA;AAAA,cAEC,UAAA,YACA,mBAAA,cACC,oBAAA,UACJ,eAAA,CAAgB,QAAA,EAAU,SAAA,EAAW,cAAA;EAC7C,aAAA;EAEA,QAAA,EAAU,MAAA;EAEV,QAAA;EAGA,MAAA,IAAU,IAAA;EAEV,OAAA,EAAS,QAAA;EAET,KAAA,EAAO,QAAA,CAAS,QAAA,EAAU,SAAA;EAG1B,MAAA,EAAQ,MAAA;EAER,QAAA,EAAU,MAAA;EAEV,IAAA;EAEA,WAAA,GAAc,WAAA;EAEd,WAAA,GAAc,WAAA;EAEd,SAAA,GAAY,QAAA;EAEZ,IAAA;EAEA,WAAA,CAAY,MAAA,EAAQ,cAAA,CAAe,QAAA,EAAU,SAAA;EA6C7C,UAAA,CAAA,GAAc,KAAA,CAAM,QAAA;EAsBpB,OAAA,CAAA,GAAW,QAAA,CAAS,QAAA,EAAU,SAAA;EAyB9B,IAAA,CAAK,QAAA,EAAU,KAAA,WAAgB,UAAA,CAAW,QAAA,EAAU,SAAA;EAwBpD,IAAA,cAAA,CACE,UAAA,EAAY,YAAA,GACX,UAAA,CAAW,QAAA,EAAU,OAAA,CAAQ,YAAA,EAAc,KAAA;AAAA"}
@@ -10,7 +10,10 @@ var ChannelRead = class ChannelRead extends RunnableCallable {
10
10
  fresh = false;
11
11
  mapper;
12
12
  constructor(channel, mapper, fresh = false) {
13
- super({ func: (_, config) => ChannelRead.doRead(config, this.channel, this.fresh, this.mapper) });
13
+ super({
14
+ trace: false,
15
+ func: (_, config) => ChannelRead.doRead(config, this.channel, this.fresh, this.mapper)
16
+ });
14
17
  this.fresh = fresh;
15
18
  this.mapper = mapper;
16
19
  this.channel = channel;
@@ -1 +1 @@
1
- {"version":3,"file":"read.js","names":[],"sources":["../../src/pregel/read.ts"],"sourcesContent":["import {\n Runnable,\n RunnableBinding,\n RunnableBindingArgs,\n RunnableConfig,\n RunnablePassthrough,\n RunnableSequence,\n _coerceToRunnable,\n type RunnableLike,\n} from \"@langchain/core/runnables\";\nimport { CONFIG_KEY_READ } from \"../constants.js\";\nimport { ChannelWrite } from \"./write.js\";\nimport { RunnableCallable } from \"../utils.js\";\nimport type { CachePolicy, RetryPolicy } from \"./utils/index.js\";\n\nexport class ChannelRead<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput = any\n> extends RunnableCallable {\n lc_graph_name = \"ChannelRead\";\n\n channel: string | Array<string>;\n\n fresh: boolean = false;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(\n channel: string | Array<string>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any,\n fresh: boolean = false\n ) {\n super({\n func: (_: RunInput, config: RunnableConfig) =>\n ChannelRead.doRead(config, this.channel, this.fresh, this.mapper),\n });\n this.fresh = fresh;\n this.mapper = mapper;\n this.channel = channel;\n this.name = Array.isArray(channel)\n ? `ChannelRead<${channel.join(\",\")}>`\n : `ChannelRead<${channel}>`;\n }\n\n static doRead<T = unknown>(\n config: RunnableConfig,\n channel: string | Array<string>,\n fresh: boolean,\n mapper?: (args: unknown) => unknown\n ): T {\n const read: (arg: string | string[], fresh: boolean) => unknown =\n config.configurable?.[CONFIG_KEY_READ];\n if (!read) {\n throw new Error(\n \"Runnable is not configured with a read function. Make sure to call in the context of a Pregel process\"\n );\n }\n if (mapper) {\n return mapper(read(channel, fresh)) as T;\n } else {\n return read(channel, fresh) as T;\n }\n }\n}\n\nconst defaultRunnableBound =\n /* #__PURE__ */ new RunnablePassthrough<PregelNodeInputType>();\n\ninterface PregelNodeArgs<RunInput, RunOutput>\n extends Partial<RunnableBindingArgs<RunInput, RunOutput>> {\n channels: Record<string, string> | string[];\n triggers: Array<string>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n writers?: Runnable<RunOutput, unknown>[];\n tags?: string[];\n bound?: Runnable<RunInput, RunOutput>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs?: Record<string, any>;\n config?: RunnableConfig;\n metadata?: Record<string, unknown>;\n retryPolicy?: RetryPolicy;\n cachePolicy?: CachePolicy;\n subgraphs?: Runnable[];\n ends?: string[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PregelNodeInputType = any;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PregelNodeOutputType = any;\n\nexport class PregelNode<\n RunInput = PregelNodeInputType,\n RunOutput = PregelNodeOutputType\n> extends RunnableBinding<RunInput, RunOutput, RunnableConfig> {\n lc_graph_name = \"PregelNode\";\n\n channels: Record<string, string> | string[];\n\n triggers: string[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n\n writers: Runnable[] = [];\n\n bound: Runnable<RunInput, RunOutput> = defaultRunnableBound;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs: Record<string, any> = {};\n\n metadata: Record<string, unknown> = {};\n\n tags: string[] = [];\n\n retryPolicy?: RetryPolicy;\n\n cachePolicy?: CachePolicy;\n\n subgraphs?: Runnable[];\n\n ends?: string[];\n\n constructor(fields: PregelNodeArgs<RunInput, RunOutput>) {\n const {\n channels,\n triggers,\n mapper,\n writers,\n bound,\n kwargs,\n metadata,\n retryPolicy,\n cachePolicy,\n tags,\n subgraphs,\n ends,\n } = fields;\n const mergedTags = [\n ...(fields.config?.tags ? fields.config.tags : []),\n ...(tags ?? []),\n ];\n\n super({\n ...fields,\n bound:\n fields.bound ??\n (defaultRunnableBound as unknown as Runnable<RunInput, RunOutput>),\n config: {\n ...(fields.config ? fields.config : {}),\n tags: mergedTags,\n },\n });\n\n this.channels = channels;\n this.triggers = triggers;\n this.mapper = mapper;\n this.writers = writers ?? this.writers;\n this.bound = bound ?? this.bound;\n this.kwargs = kwargs ?? this.kwargs;\n this.metadata = metadata ?? this.metadata;\n this.tags = mergedTags;\n this.retryPolicy = retryPolicy;\n this.cachePolicy = cachePolicy;\n this.subgraphs = subgraphs;\n this.ends = ends;\n }\n\n getWriters(): Array<Runnable> {\n const newWriters = [...this.writers];\n while (\n newWriters.length > 1 &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n newWriters[newWriters.length - 1] instanceof ChannelWrite &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n newWriters[newWriters.length - 2] instanceof ChannelWrite\n ) {\n // we can combine writes if they are consecutive\n // careful to not modify the original writers list or ChannelWrite\n const endWriters = newWriters.slice(-2) as ChannelWrite[];\n const combinedWrites = endWriters[0].writes.concat(endWriters[1].writes);\n newWriters[newWriters.length - 2] = new ChannelWrite(\n combinedWrites,\n endWriters[0].config?.tags\n );\n newWriters.pop();\n }\n return newWriters;\n }\n\n getNode(): Runnable<RunInput, RunOutput> | undefined {\n const writers = this.getWriters();\n if (this.bound === defaultRunnableBound && writers.length === 0) {\n return undefined;\n } else if (this.bound === defaultRunnableBound && writers.length === 1) {\n return writers[0];\n } else if (this.bound === defaultRunnableBound) {\n return new RunnableSequence({\n first: writers[0],\n middle: writers.slice(1, writers.length - 1),\n last: writers[writers.length - 1],\n omitSequenceTags: true,\n });\n } else if (writers.length > 0) {\n return new RunnableSequence({\n first: this.bound,\n middle: writers.slice(0, writers.length - 1),\n last: writers[writers.length - 1],\n omitSequenceTags: true,\n });\n } else {\n return this.bound;\n }\n }\n\n join(channels: Array<string>): PregelNode<RunInput, RunOutput> {\n if (!Array.isArray(channels)) {\n throw new Error(\"channels must be a list\");\n }\n if (typeof this.channels !== \"object\") {\n throw new Error(\"all channels must be named when using .join()\");\n }\n\n return new PregelNode<RunInput, RunOutput>({\n channels: {\n ...this.channels,\n ...Object.fromEntries(channels.map((chan) => [chan, chan])),\n },\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: this.bound,\n kwargs: this.kwargs,\n config: this.config,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n }\n\n pipe<NewRunOutput>(\n coerceable: RunnableLike\n ): PregelNode<RunInput, Exclude<NewRunOutput, Error>> {\n if (ChannelWrite.isWriter(coerceable)) {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: [...this.writers, coerceable],\n bound: this.bound as unknown as PregelNode<\n RunInput,\n Exclude<NewRunOutput, Error>\n >,\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n } else if (this.bound === defaultRunnableBound) {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: _coerceToRunnable<RunInput, NewRunOutput>(coerceable),\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n } else {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: this.bound.pipe(coerceable),\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"read.js","names":[],"sources":["../../src/pregel/read.ts"],"sourcesContent":["import {\n Runnable,\n RunnableBinding,\n RunnableBindingArgs,\n RunnableConfig,\n RunnablePassthrough,\n RunnableSequence,\n _coerceToRunnable,\n type RunnableLike,\n} from \"@langchain/core/runnables\";\nimport { CONFIG_KEY_READ } from \"../constants.js\";\nimport { ChannelWrite } from \"./write.js\";\nimport { RunnableCallable } from \"../utils.js\";\nimport type { CachePolicy, RetryPolicy } from \"./utils/index.js\";\n\nexport class ChannelRead<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput = any\n> extends RunnableCallable {\n lc_graph_name = \"ChannelRead\";\n\n channel: string | Array<string>;\n\n fresh: boolean = false;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(\n channel: string | Array<string>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any,\n fresh: boolean = false\n ) {\n super({\n trace: false,\n func: (_: RunInput, config: RunnableConfig) =>\n ChannelRead.doRead(config, this.channel, this.fresh, this.mapper),\n });\n this.fresh = fresh;\n this.mapper = mapper;\n this.channel = channel;\n this.name = Array.isArray(channel)\n ? `ChannelRead<${channel.join(\",\")}>`\n : `ChannelRead<${channel}>`;\n }\n\n static doRead<T = unknown>(\n config: RunnableConfig,\n channel: string | Array<string>,\n fresh: boolean,\n mapper?: (args: unknown) => unknown\n ): T {\n const read: (arg: string | string[], fresh: boolean) => unknown =\n config.configurable?.[CONFIG_KEY_READ];\n if (!read) {\n throw new Error(\n \"Runnable is not configured with a read function. Make sure to call in the context of a Pregel process\"\n );\n }\n if (mapper) {\n return mapper(read(channel, fresh)) as T;\n } else {\n return read(channel, fresh) as T;\n }\n }\n}\n\nconst defaultRunnableBound =\n /* #__PURE__ */ new RunnablePassthrough<PregelNodeInputType>();\n\ninterface PregelNodeArgs<RunInput, RunOutput>\n extends Partial<RunnableBindingArgs<RunInput, RunOutput>> {\n channels: Record<string, string> | string[];\n triggers: Array<string>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n writers?: Runnable<RunOutput, unknown>[];\n tags?: string[];\n bound?: Runnable<RunInput, RunOutput>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs?: Record<string, any>;\n config?: RunnableConfig;\n metadata?: Record<string, unknown>;\n retryPolicy?: RetryPolicy;\n cachePolicy?: CachePolicy;\n subgraphs?: Runnable[];\n ends?: string[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PregelNodeInputType = any;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PregelNodeOutputType = any;\n\nexport class PregelNode<\n RunInput = PregelNodeInputType,\n RunOutput = PregelNodeOutputType\n> extends RunnableBinding<RunInput, RunOutput, RunnableConfig> {\n lc_graph_name = \"PregelNode\";\n\n channels: Record<string, string> | string[];\n\n triggers: string[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mapper?: (args: any) => any;\n\n writers: Runnable[] = [];\n\n bound: Runnable<RunInput, RunOutput> = defaultRunnableBound;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n kwargs: Record<string, any> = {};\n\n metadata: Record<string, unknown> = {};\n\n tags: string[] = [];\n\n retryPolicy?: RetryPolicy;\n\n cachePolicy?: CachePolicy;\n\n subgraphs?: Runnable[];\n\n ends?: string[];\n\n constructor(fields: PregelNodeArgs<RunInput, RunOutput>) {\n const {\n channels,\n triggers,\n mapper,\n writers,\n bound,\n kwargs,\n metadata,\n retryPolicy,\n cachePolicy,\n tags,\n subgraphs,\n ends,\n } = fields;\n const mergedTags = [\n ...(fields.config?.tags ? fields.config.tags : []),\n ...(tags ?? []),\n ];\n\n super({\n ...fields,\n bound:\n fields.bound ??\n (defaultRunnableBound as unknown as Runnable<RunInput, RunOutput>),\n config: {\n ...(fields.config ? fields.config : {}),\n tags: mergedTags,\n },\n });\n\n this.channels = channels;\n this.triggers = triggers;\n this.mapper = mapper;\n this.writers = writers ?? this.writers;\n this.bound = bound ?? this.bound;\n this.kwargs = kwargs ?? this.kwargs;\n this.metadata = metadata ?? this.metadata;\n this.tags = mergedTags;\n this.retryPolicy = retryPolicy;\n this.cachePolicy = cachePolicy;\n this.subgraphs = subgraphs;\n this.ends = ends;\n }\n\n getWriters(): Array<Runnable> {\n const newWriters = [...this.writers];\n while (\n newWriters.length > 1 &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n newWriters[newWriters.length - 1] instanceof ChannelWrite &&\n // eslint-disable-next-line no-instanceof/no-instanceof\n newWriters[newWriters.length - 2] instanceof ChannelWrite\n ) {\n // we can combine writes if they are consecutive\n // careful to not modify the original writers list or ChannelWrite\n const endWriters = newWriters.slice(-2) as ChannelWrite[];\n const combinedWrites = endWriters[0].writes.concat(endWriters[1].writes);\n newWriters[newWriters.length - 2] = new ChannelWrite(\n combinedWrites,\n endWriters[0].config?.tags\n );\n newWriters.pop();\n }\n return newWriters;\n }\n\n getNode(): Runnable<RunInput, RunOutput> | undefined {\n const writers = this.getWriters();\n if (this.bound === defaultRunnableBound && writers.length === 0) {\n return undefined;\n } else if (this.bound === defaultRunnableBound && writers.length === 1) {\n return writers[0];\n } else if (this.bound === defaultRunnableBound) {\n return new RunnableSequence({\n first: writers[0],\n middle: writers.slice(1, writers.length - 1),\n last: writers[writers.length - 1],\n omitSequenceTags: true,\n });\n } else if (writers.length > 0) {\n return new RunnableSequence({\n first: this.bound,\n middle: writers.slice(0, writers.length - 1),\n last: writers[writers.length - 1],\n omitSequenceTags: true,\n });\n } else {\n return this.bound;\n }\n }\n\n join(channels: Array<string>): PregelNode<RunInput, RunOutput> {\n if (!Array.isArray(channels)) {\n throw new Error(\"channels must be a list\");\n }\n if (typeof this.channels !== \"object\") {\n throw new Error(\"all channels must be named when using .join()\");\n }\n\n return new PregelNode<RunInput, RunOutput>({\n channels: {\n ...this.channels,\n ...Object.fromEntries(channels.map((chan) => [chan, chan])),\n },\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: this.bound,\n kwargs: this.kwargs,\n config: this.config,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n }\n\n pipe<NewRunOutput>(\n coerceable: RunnableLike\n ): PregelNode<RunInput, Exclude<NewRunOutput, Error>> {\n if (ChannelWrite.isWriter(coerceable)) {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: [...this.writers, coerceable],\n bound: this.bound as unknown as PregelNode<\n RunInput,\n Exclude<NewRunOutput, Error>\n >,\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n } else if (this.bound === defaultRunnableBound) {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: _coerceToRunnable<RunInput, NewRunOutput>(coerceable),\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n } else {\n return new PregelNode<RunInput, Exclude<NewRunOutput, Error>>({\n channels: this.channels,\n triggers: this.triggers,\n mapper: this.mapper,\n writers: this.writers,\n bound: this.bound.pipe(coerceable),\n config: this.config,\n kwargs: this.kwargs,\n retryPolicy: this.retryPolicy,\n cachePolicy: this.cachePolicy,\n });\n }\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- const require_errors = require('../errors.cjs');
2
1
  const require_constants = require('../constants.cjs');
2
+ const require_errors = require('../errors.cjs');
3
3
  require('../web.cjs');
4
4
  let _langchain_core_runnables = require("@langchain/core/runnables");
5
5
  let _langchain_core_runnables_graph = require("@langchain/core/runnables/graph");
@@ -1,5 +1,5 @@
1
- import { GraphInterrupt, RemoteException } from "../errors.js";
2
1
  import { CHECKPOINT_NAMESPACE_SEPARATOR, CONFIG_KEY_STREAM, INTERRUPT, isCommand } from "../constants.js";
2
+ import { GraphInterrupt, RemoteException } from "../errors.js";
3
3
  import "../web.js";
4
4
  import { Runnable, mergeConfigs } from "@langchain/core/runnables";
5
5
  import { Graph } from "@langchain/core/runnables/graph";
@@ -1,5 +1,5 @@
1
- const require_errors = require('../errors.cjs');
2
1
  const require_constants = require('../constants.cjs');
2
+ const require_errors = require('../errors.cjs');
3
3
  const require_config = require('./utils/config.cjs');
4
4
  const require_index = require('./utils/index.cjs');
5
5
 
@@ -1,5 +1,5 @@
1
- import { isGraphBubbleUp, isParentCommand } from "../errors.js";
2
1
  import { CONFIG_KEY_RESUMING, Command } from "../constants.js";
2
+ import { isGraphBubbleUp, isParentCommand } from "../errors.js";
3
3
  import { getParentCheckpointNamespace } from "./utils/config.js";
4
4
  import { patchConfigurable } from "./utils/index.js";
5
5
 
@@ -1,5 +1,5 @@
1
- const require_errors = require('../errors.cjs');
2
1
  const require_constants = require('../constants.cjs');
2
+ const require_errors = require('../errors.cjs');
3
3
  const require_types = require('./types.cjs');
4
4
  const require_index = require('./utils/index.cjs');
5
5
  const require_retry = require('./retry.cjs');
@@ -1,5 +1,5 @@
1
- import { isGraphBubbleUp, isGraphInterrupt } from "../errors.js";
2
1
  import { CONFIG_KEY_ABORT_SIGNALS, CONFIG_KEY_CALL, CONFIG_KEY_SCRATCHPAD, ERROR, INTERRUPT, NO_WRITES, RESUME, RETURN, TAG_HIDDEN } from "../constants.js";
2
+ import { isGraphBubbleUp, isGraphInterrupt } from "../errors.js";
3
3
  import { Call } from "./types.js";
4
4
  import { combineAbortSignals, patchConfigurable } from "./utils/index.js";
5
5
  import { _runWithRetry } from "./retry.js";
@@ -1,4 +1,6 @@
1
+ const require_constants = require('../constants.cjs');
1
2
  let _langchain_core_utils_stream = require("@langchain/core/utils/stream");
3
+ let _langchain_core_callbacks_base = require("@langchain/core/callbacks/base");
2
4
 
3
5
  //#region src/pregel/stream.ts
4
6
  /**
@@ -84,6 +86,84 @@ var IterableReadableWritableStream = class extends _langchain_core_utils_stream.
84
86
  this.controller.error(e);
85
87
  }
86
88
  };
89
+ /**
90
+ * A callback handler that implements stream_mode=tools.
91
+ * Emits on_tool_start, on_tool_event, on_tool_end, on_tool_error events.
92
+ */
93
+ var StreamToolsHandler = class extends _langchain_core_callbacks_base.BaseCallbackHandler {
94
+ name = "StreamToolsHandler";
95
+ streamFn;
96
+ runs = {};
97
+ constructor(streamFn) {
98
+ super();
99
+ this.streamFn = streamFn;
100
+ }
101
+ handleToolStart(_tool, input, runId, _parentRunId, tags, metadata, runName, toolCallId) {
102
+ if (!metadata || tags && tags.includes(require_constants.TAG_HIDDEN)) return;
103
+ const ns = metadata.langgraph_checkpoint_ns?.split("|") ?? [];
104
+ const info = {
105
+ ns,
106
+ toolCallId,
107
+ toolName: runName ?? "unknown",
108
+ input
109
+ };
110
+ this.runs[runId] = info;
111
+ this.streamFn([
112
+ ns,
113
+ "tools",
114
+ {
115
+ event: "on_tool_start",
116
+ toolCallId: info.toolCallId,
117
+ name: info.toolName,
118
+ input
119
+ }
120
+ ]);
121
+ }
122
+ handleToolEvent(chunk, runId) {
123
+ const info = this.runs[runId];
124
+ if (!info) return;
125
+ this.streamFn([
126
+ info.ns,
127
+ "tools",
128
+ {
129
+ event: "on_tool_event",
130
+ toolCallId: info.toolCallId,
131
+ name: info.toolName,
132
+ data: chunk
133
+ }
134
+ ]);
135
+ }
136
+ handleToolEnd(output, runId) {
137
+ const info = this.runs[runId];
138
+ delete this.runs[runId];
139
+ if (!info) return;
140
+ this.streamFn([
141
+ info.ns,
142
+ "tools",
143
+ {
144
+ event: "on_tool_end",
145
+ toolCallId: info.toolCallId,
146
+ name: info.toolName,
147
+ output
148
+ }
149
+ ]);
150
+ }
151
+ handleToolError(err, runId) {
152
+ const info = this.runs[runId];
153
+ delete this.runs[runId];
154
+ if (!info) return;
155
+ this.streamFn([
156
+ info.ns,
157
+ "tools",
158
+ {
159
+ event: "on_tool_error",
160
+ toolCallId: info.toolCallId,
161
+ name: info.toolName,
162
+ error: err
163
+ }
164
+ ]);
165
+ }
166
+ };
87
167
  function _stringifyAsDict(obj) {
88
168
  return JSON.stringify(obj, function(key, value) {
89
169
  const rawValue = this[key];
@@ -193,5 +273,6 @@ function toEventStream(stream) {
193
273
  //#endregion
194
274
  exports.IterableReadableStreamWithAbortSignal = IterableReadableStreamWithAbortSignal;
195
275
  exports.IterableReadableWritableStream = IterableReadableWritableStream;
276
+ exports.StreamToolsHandler = StreamToolsHandler;
196
277
  exports.toEventStream = toEventStream;
197
278
  //# sourceMappingURL=stream.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream.cjs","names":["IterableReadableStream"],"sources":["../../src/pregel/stream.ts"],"sourcesContent":["import { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport type { StreamMode, StreamOutputMap } from \"./types.js\";\n\n// [namespace, streamMode, payload]\nexport type StreamChunk = [string[], StreamMode, unknown];\n\ntype StreamCheckpointsOutput<StreamValues> = StreamOutputMap<\n \"checkpoints\",\n false,\n StreamValues,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype AnyStreamOutput = StreamOutputMap<\n StreamMode[],\n true,\n unknown,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\n/**\n * A wrapper around an IterableReadableStream that allows for aborting the stream when\n * {@link cancel} is called.\n */\nexport class IterableReadableStreamWithAbortSignal<\n T\n> extends IterableReadableStream<T> {\n protected _abortController: AbortController;\n\n protected _innerReader: ReadableStreamDefaultReader<T>;\n\n /**\n * @param readableStream - The stream to wrap.\n * @param abortController - The abort controller to use. Optional. One will be created if not provided.\n */\n constructor(\n readableStream: ReadableStream<T>,\n abortController?: AbortController\n ) {\n const reader = readableStream.getReader();\n const ac = abortController ?? new AbortController();\n super({\n start(controller: ReadableStreamDefaultController<T>) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n });\n this._abortController = ac;\n this._innerReader = reader;\n }\n\n /**\n * Aborts the stream, abandoning any pending operations in progress. Calling this triggers an\n * {@link AbortSignal} that is propagated to the tasks that are producing the data for this stream.\n * @param reason - The reason for aborting the stream. Optional.\n */\n override async cancel(reason?: unknown) {\n this._abortController.abort(reason);\n this._innerReader.releaseLock();\n }\n\n /**\n * The {@link AbortSignal} for the stream. Aborted when {@link cancel} is called.\n */\n get signal() {\n return this._abortController.signal;\n }\n}\n\nexport class IterableReadableWritableStream extends IterableReadableStream<StreamChunk> {\n modes: Set<StreamMode>;\n\n private controller: ReadableStreamDefaultController;\n\n private passthroughFn?: (chunk: StreamChunk) => void;\n\n private _closed: boolean = false;\n\n get closed() {\n return this._closed;\n }\n\n constructor(params: {\n passthroughFn?: (chunk: StreamChunk) => void;\n modes: Set<StreamMode>;\n }) {\n let streamControllerPromiseResolver: (\n controller: ReadableStreamDefaultController\n ) => void;\n const streamControllerPromise: Promise<ReadableStreamDefaultController> =\n new Promise<ReadableStreamDefaultController>((resolve) => {\n streamControllerPromiseResolver = resolve;\n });\n\n super({\n start: (controller) => {\n streamControllerPromiseResolver!(controller);\n },\n });\n\n // .start() will always be called before the stream can be interacted\n // with anyway\n void streamControllerPromise.then((controller) => {\n this.controller = controller;\n });\n\n this.passthroughFn = params.passthroughFn;\n this.modes = params.modes;\n }\n\n push(chunk: StreamChunk) {\n this.passthroughFn?.(chunk);\n this.controller.enqueue(chunk);\n }\n\n close() {\n try {\n this.controller.close();\n } catch (e) {\n // pass\n } finally {\n this._closed = true;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(e: any) {\n this.controller.error(e);\n }\n}\n\nfunction _stringifyAsDict(obj: unknown) {\n return JSON.stringify(obj, function (key: string | number, value: unknown) {\n const rawValue = this[key];\n if (\n rawValue != null &&\n typeof rawValue === \"object\" &&\n \"toDict\" in rawValue &&\n typeof rawValue.toDict === \"function\"\n ) {\n const { type, data } = rawValue.toDict();\n return { ...data, type };\n }\n\n return value;\n });\n}\n\nfunction _serializeError(error: unknown) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (error instanceof Error) {\n return { error: error.name, message: error.message };\n }\n return { error: \"Error\", message: JSON.stringify(error) };\n}\n\nfunction _isRunnableConfig(\n config: unknown\n): config is RunnableConfig & { configurable: Record<string, unknown> } {\n if (typeof config !== \"object\" || config == null) return false;\n return (\n \"configurable\" in config &&\n typeof config.configurable === \"object\" &&\n config.configurable != null\n );\n}\n\nfunction _extractCheckpointFromConfig(\n config: RunnableConfig | null | undefined\n) {\n if (!_isRunnableConfig(config) || !config.configurable.thread_id) {\n return null;\n }\n\n return {\n thread_id: config.configurable.thread_id,\n checkpoint_ns: config.configurable.checkpoint_ns || \"\",\n checkpoint_id: config.configurable.checkpoint_id || null,\n checkpoint_map: config.configurable.checkpoint_map || null,\n };\n}\n\nfunction _serializeConfig(config: unknown) {\n if (_isRunnableConfig(config)) {\n const configurable = Object.fromEntries(\n Object.entries(config.configurable).filter(\n ([key]) => !key.startsWith(\"__\")\n )\n );\n\n const newConfig = { ...config, configurable };\n delete newConfig.callbacks;\n return newConfig;\n }\n\n return config;\n}\n\nfunction _serializeCheckpoint(payload: StreamCheckpointsOutput<unknown>) {\n const result: Record<string, unknown> = {\n ...payload,\n checkpoint: _extractCheckpointFromConfig(payload.config),\n parent_checkpoint: _extractCheckpointFromConfig(payload.parentConfig),\n\n config: _serializeConfig(payload.config),\n parent_config: _serializeConfig(payload.parentConfig),\n\n tasks: payload.tasks.map((task) => {\n if (_isRunnableConfig(task.state)) {\n const checkpoint = _extractCheckpointFromConfig(task.state);\n if (checkpoint != null) {\n const cloneTask: Record<string, unknown> = { ...task, checkpoint };\n delete cloneTask.state;\n return cloneTask;\n }\n }\n\n return task;\n }),\n };\n\n delete result.parentConfig;\n return result;\n}\n\nexport function toEventStream(stream: AsyncGenerator) {\n const encoder = new TextEncoder();\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const enqueueChunk = (sse: {\n id?: string;\n event: string;\n data: unknown;\n }) => {\n controller.enqueue(\n encoder.encode(\n `event: ${sse.event}\\ndata: ${_stringifyAsDict(sse.data)}\\n\\n`\n )\n );\n };\n\n try {\n for await (const payload of stream) {\n const [ns, mode, chunk] = payload as AnyStreamOutput;\n\n let data: unknown = chunk;\n if (mode === \"debug\") {\n const debugChunk = chunk;\n\n if (debugChunk.type === \"checkpoint\") {\n data = {\n ...debugChunk,\n payload: _serializeCheckpoint(debugChunk.payload),\n };\n }\n }\n\n if (mode === \"checkpoints\") {\n data = _serializeCheckpoint(chunk);\n }\n\n const event = ns?.length ? `${mode}|${ns.join(\"|\")}` : mode;\n enqueueChunk({ event, data });\n }\n } catch (error) {\n enqueueChunk({ event: \"error\", data: _serializeError(error) });\n }\n\n controller.close();\n },\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stream.cjs","names":["IterableReadableStream","BaseCallbackHandler","TAG_HIDDEN"],"sources":["../../src/pregel/stream.ts"],"sourcesContent":["import { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\nimport type { StreamMode, StreamOutputMap } from \"./types.js\";\nimport { TAG_HIDDEN } from \"../constants.js\";\n\n// [namespace, streamMode, payload]\nexport type StreamChunk = [string[], StreamMode, unknown];\n\ntype StreamCheckpointsOutput<StreamValues> = StreamOutputMap<\n \"checkpoints\",\n false,\n StreamValues,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype AnyStreamOutput = StreamOutputMap<\n StreamMode[],\n true,\n unknown,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype ToolRunInfo = {\n ns: string[];\n toolCallId?: string;\n toolName: string;\n input: unknown;\n};\n\n/**\n * A wrapper around an IterableReadableStream that allows for aborting the stream when\n * {@link cancel} is called.\n */\nexport class IterableReadableStreamWithAbortSignal<\n T\n> extends IterableReadableStream<T> {\n protected _abortController: AbortController;\n\n protected _innerReader: ReadableStreamDefaultReader<T>;\n\n /**\n * @param readableStream - The stream to wrap.\n * @param abortController - The abort controller to use. Optional. One will be created if not provided.\n */\n constructor(\n readableStream: ReadableStream<T>,\n abortController?: AbortController\n ) {\n const reader = readableStream.getReader();\n const ac = abortController ?? new AbortController();\n super({\n start(controller: ReadableStreamDefaultController<T>) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n });\n this._abortController = ac;\n this._innerReader = reader;\n }\n\n /**\n * Aborts the stream, abandoning any pending operations in progress. Calling this triggers an\n * {@link AbortSignal} that is propagated to the tasks that are producing the data for this stream.\n * @param reason - The reason for aborting the stream. Optional.\n */\n override async cancel(reason?: unknown) {\n this._abortController.abort(reason);\n this._innerReader.releaseLock();\n }\n\n /**\n * The {@link AbortSignal} for the stream. Aborted when {@link cancel} is called.\n */\n get signal() {\n return this._abortController.signal;\n }\n}\n\nexport class IterableReadableWritableStream extends IterableReadableStream<StreamChunk> {\n modes: Set<StreamMode>;\n\n private controller: ReadableStreamDefaultController;\n\n private passthroughFn?: (chunk: StreamChunk) => void;\n\n private _closed: boolean = false;\n\n get closed() {\n return this._closed;\n }\n\n constructor(params: {\n passthroughFn?: (chunk: StreamChunk) => void;\n modes: Set<StreamMode>;\n }) {\n let streamControllerPromiseResolver: (\n controller: ReadableStreamDefaultController\n ) => void;\n const streamControllerPromise: Promise<ReadableStreamDefaultController> =\n new Promise<ReadableStreamDefaultController>((resolve) => {\n streamControllerPromiseResolver = resolve;\n });\n\n super({\n start: (controller) => {\n streamControllerPromiseResolver!(controller);\n },\n });\n\n // .start() will always be called before the stream can be interacted\n // with anyway\n void streamControllerPromise.then((controller) => {\n this.controller = controller;\n });\n\n this.passthroughFn = params.passthroughFn;\n this.modes = params.modes;\n }\n\n push(chunk: StreamChunk) {\n this.passthroughFn?.(chunk);\n this.controller.enqueue(chunk);\n }\n\n close() {\n try {\n this.controller.close();\n } catch (e) {\n // pass\n } finally {\n this._closed = true;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(e: any) {\n this.controller.error(e);\n }\n}\n\n/**\n * A callback handler that implements stream_mode=tools.\n * Emits on_tool_start, on_tool_event, on_tool_end, on_tool_error events.\n */\nexport class StreamToolsHandler extends BaseCallbackHandler {\n name = \"StreamToolsHandler\";\n\n streamFn: (streamChunk: StreamChunk) => void;\n\n runs: Record<string, ToolRunInfo | undefined> = {};\n\n constructor(streamFn: (streamChunk: StreamChunk) => void) {\n super();\n this.streamFn = streamFn;\n }\n\n handleToolStart(\n _tool: Serialized,\n input: string,\n runId: string,\n _parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string,\n toolCallId?: string\n ) {\n if (!metadata || (tags && tags.includes(TAG_HIDDEN))) return;\n\n const ns = (metadata.langgraph_checkpoint_ns as string)?.split(\"|\") ?? [];\n const info: ToolRunInfo = {\n ns,\n toolCallId,\n toolName: runName ?? \"unknown\",\n input,\n };\n this.runs[runId] = info;\n\n this.streamFn([\n ns,\n \"tools\",\n {\n event: \"on_tool_start\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n input,\n },\n ]);\n }\n\n handleToolEvent(chunk: unknown, runId: string) {\n const info = this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_event\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n data: chunk,\n },\n ]);\n }\n\n handleToolEnd(output: unknown, runId: string) {\n const info = this.runs[runId];\n delete this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_end\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n output,\n },\n ]);\n }\n\n handleToolError(err: unknown, runId: string) {\n const info = this.runs[runId];\n delete this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_error\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n error: err,\n },\n ]);\n }\n}\n\nfunction _stringifyAsDict(obj: unknown) {\n return JSON.stringify(obj, function (key: string | number, value: unknown) {\n const rawValue = this[key];\n if (\n rawValue != null &&\n typeof rawValue === \"object\" &&\n \"toDict\" in rawValue &&\n typeof rawValue.toDict === \"function\"\n ) {\n const { type, data } = rawValue.toDict();\n return { ...data, type };\n }\n\n return value;\n });\n}\n\nfunction _serializeError(error: unknown) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (error instanceof Error) {\n return { error: error.name, message: error.message };\n }\n return { error: \"Error\", message: JSON.stringify(error) };\n}\n\nfunction _isRunnableConfig(\n config: unknown\n): config is RunnableConfig & { configurable: Record<string, unknown> } {\n if (typeof config !== \"object\" || config == null) return false;\n return (\n \"configurable\" in config &&\n typeof config.configurable === \"object\" &&\n config.configurable != null\n );\n}\n\nfunction _extractCheckpointFromConfig(\n config: RunnableConfig | null | undefined\n) {\n if (!_isRunnableConfig(config) || !config.configurable.thread_id) {\n return null;\n }\n\n return {\n thread_id: config.configurable.thread_id,\n checkpoint_ns: config.configurable.checkpoint_ns || \"\",\n checkpoint_id: config.configurable.checkpoint_id || null,\n checkpoint_map: config.configurable.checkpoint_map || null,\n };\n}\n\nfunction _serializeConfig(config: unknown) {\n if (_isRunnableConfig(config)) {\n const configurable = Object.fromEntries(\n Object.entries(config.configurable).filter(\n ([key]) => !key.startsWith(\"__\")\n )\n );\n\n const newConfig = { ...config, configurable };\n delete newConfig.callbacks;\n return newConfig;\n }\n\n return config;\n}\n\nfunction _serializeCheckpoint(payload: StreamCheckpointsOutput<unknown>) {\n const result: Record<string, unknown> = {\n ...payload,\n checkpoint: _extractCheckpointFromConfig(payload.config),\n parent_checkpoint: _extractCheckpointFromConfig(payload.parentConfig),\n\n config: _serializeConfig(payload.config),\n parent_config: _serializeConfig(payload.parentConfig),\n\n tasks: payload.tasks.map((task) => {\n if (_isRunnableConfig(task.state)) {\n const checkpoint = _extractCheckpointFromConfig(task.state);\n if (checkpoint != null) {\n const cloneTask: Record<string, unknown> = { ...task, checkpoint };\n delete cloneTask.state;\n return cloneTask;\n }\n }\n\n return task;\n }),\n };\n\n delete result.parentConfig;\n return result;\n}\n\nexport function toEventStream(stream: AsyncGenerator) {\n const encoder = new TextEncoder();\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const enqueueChunk = (sse: {\n id?: string;\n event: string;\n data: unknown;\n }) => {\n controller.enqueue(\n encoder.encode(\n `event: ${sse.event}\\ndata: ${_stringifyAsDict(sse.data)}\\n\\n`\n )\n );\n };\n\n try {\n for await (const payload of stream) {\n const [ns, mode, chunk] = payload as AnyStreamOutput;\n\n let data: unknown = chunk;\n if (mode === \"debug\") {\n const debugChunk = chunk;\n\n if (debugChunk.type === \"checkpoint\") {\n data = {\n ...debugChunk,\n payload: _serializeCheckpoint(debugChunk.payload),\n };\n }\n }\n\n if (mode === \"checkpoints\") {\n data = _serializeCheckpoint(chunk);\n }\n\n const event = ns?.length ? `${mode}|${ns.join(\"|\")}` : mode;\n enqueueChunk({ event, data });\n }\n } catch (error) {\n enqueueChunk({ event: \"error\", data: _serializeError(error) });\n }\n\n controller.close();\n },\n });\n}\n"],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  import "./types.js";
2
- import { IterableReadableStream } from "@langchain/core/utils/stream";
2
+ import { IterableReadableStream } from "@langchain/core/utils/stream";
3
+ import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
@@ -1,4 +1,6 @@
1
+ import { TAG_HIDDEN } from "../constants.js";
1
2
  import { IterableReadableStream } from "@langchain/core/utils/stream";
3
+ import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
2
4
 
3
5
  //#region src/pregel/stream.ts
4
6
  /**
@@ -84,6 +86,84 @@ var IterableReadableWritableStream = class extends IterableReadableStream {
84
86
  this.controller.error(e);
85
87
  }
86
88
  };
89
+ /**
90
+ * A callback handler that implements stream_mode=tools.
91
+ * Emits on_tool_start, on_tool_event, on_tool_end, on_tool_error events.
92
+ */
93
+ var StreamToolsHandler = class extends BaseCallbackHandler {
94
+ name = "StreamToolsHandler";
95
+ streamFn;
96
+ runs = {};
97
+ constructor(streamFn) {
98
+ super();
99
+ this.streamFn = streamFn;
100
+ }
101
+ handleToolStart(_tool, input, runId, _parentRunId, tags, metadata, runName, toolCallId) {
102
+ if (!metadata || tags && tags.includes(TAG_HIDDEN)) return;
103
+ const ns = metadata.langgraph_checkpoint_ns?.split("|") ?? [];
104
+ const info = {
105
+ ns,
106
+ toolCallId,
107
+ toolName: runName ?? "unknown",
108
+ input
109
+ };
110
+ this.runs[runId] = info;
111
+ this.streamFn([
112
+ ns,
113
+ "tools",
114
+ {
115
+ event: "on_tool_start",
116
+ toolCallId: info.toolCallId,
117
+ name: info.toolName,
118
+ input
119
+ }
120
+ ]);
121
+ }
122
+ handleToolEvent(chunk, runId) {
123
+ const info = this.runs[runId];
124
+ if (!info) return;
125
+ this.streamFn([
126
+ info.ns,
127
+ "tools",
128
+ {
129
+ event: "on_tool_event",
130
+ toolCallId: info.toolCallId,
131
+ name: info.toolName,
132
+ data: chunk
133
+ }
134
+ ]);
135
+ }
136
+ handleToolEnd(output, runId) {
137
+ const info = this.runs[runId];
138
+ delete this.runs[runId];
139
+ if (!info) return;
140
+ this.streamFn([
141
+ info.ns,
142
+ "tools",
143
+ {
144
+ event: "on_tool_end",
145
+ toolCallId: info.toolCallId,
146
+ name: info.toolName,
147
+ output
148
+ }
149
+ ]);
150
+ }
151
+ handleToolError(err, runId) {
152
+ const info = this.runs[runId];
153
+ delete this.runs[runId];
154
+ if (!info) return;
155
+ this.streamFn([
156
+ info.ns,
157
+ "tools",
158
+ {
159
+ event: "on_tool_error",
160
+ toolCallId: info.toolCallId,
161
+ name: info.toolName,
162
+ error: err
163
+ }
164
+ ]);
165
+ }
166
+ };
87
167
  function _stringifyAsDict(obj) {
88
168
  return JSON.stringify(obj, function(key, value) {
89
169
  const rawValue = this[key];
@@ -191,5 +271,5 @@ function toEventStream(stream) {
191
271
  }
192
272
 
193
273
  //#endregion
194
- export { IterableReadableStreamWithAbortSignal, IterableReadableWritableStream, toEventStream };
274
+ export { IterableReadableStreamWithAbortSignal, IterableReadableWritableStream, StreamToolsHandler, toEventStream };
195
275
  //# sourceMappingURL=stream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","names":[],"sources":["../../src/pregel/stream.ts"],"sourcesContent":["import { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport type { StreamMode, StreamOutputMap } from \"./types.js\";\n\n// [namespace, streamMode, payload]\nexport type StreamChunk = [string[], StreamMode, unknown];\n\ntype StreamCheckpointsOutput<StreamValues> = StreamOutputMap<\n \"checkpoints\",\n false,\n StreamValues,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype AnyStreamOutput = StreamOutputMap<\n StreamMode[],\n true,\n unknown,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\n/**\n * A wrapper around an IterableReadableStream that allows for aborting the stream when\n * {@link cancel} is called.\n */\nexport class IterableReadableStreamWithAbortSignal<\n T\n> extends IterableReadableStream<T> {\n protected _abortController: AbortController;\n\n protected _innerReader: ReadableStreamDefaultReader<T>;\n\n /**\n * @param readableStream - The stream to wrap.\n * @param abortController - The abort controller to use. Optional. One will be created if not provided.\n */\n constructor(\n readableStream: ReadableStream<T>,\n abortController?: AbortController\n ) {\n const reader = readableStream.getReader();\n const ac = abortController ?? new AbortController();\n super({\n start(controller: ReadableStreamDefaultController<T>) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n });\n this._abortController = ac;\n this._innerReader = reader;\n }\n\n /**\n * Aborts the stream, abandoning any pending operations in progress. Calling this triggers an\n * {@link AbortSignal} that is propagated to the tasks that are producing the data for this stream.\n * @param reason - The reason for aborting the stream. Optional.\n */\n override async cancel(reason?: unknown) {\n this._abortController.abort(reason);\n this._innerReader.releaseLock();\n }\n\n /**\n * The {@link AbortSignal} for the stream. Aborted when {@link cancel} is called.\n */\n get signal() {\n return this._abortController.signal;\n }\n}\n\nexport class IterableReadableWritableStream extends IterableReadableStream<StreamChunk> {\n modes: Set<StreamMode>;\n\n private controller: ReadableStreamDefaultController;\n\n private passthroughFn?: (chunk: StreamChunk) => void;\n\n private _closed: boolean = false;\n\n get closed() {\n return this._closed;\n }\n\n constructor(params: {\n passthroughFn?: (chunk: StreamChunk) => void;\n modes: Set<StreamMode>;\n }) {\n let streamControllerPromiseResolver: (\n controller: ReadableStreamDefaultController\n ) => void;\n const streamControllerPromise: Promise<ReadableStreamDefaultController> =\n new Promise<ReadableStreamDefaultController>((resolve) => {\n streamControllerPromiseResolver = resolve;\n });\n\n super({\n start: (controller) => {\n streamControllerPromiseResolver!(controller);\n },\n });\n\n // .start() will always be called before the stream can be interacted\n // with anyway\n void streamControllerPromise.then((controller) => {\n this.controller = controller;\n });\n\n this.passthroughFn = params.passthroughFn;\n this.modes = params.modes;\n }\n\n push(chunk: StreamChunk) {\n this.passthroughFn?.(chunk);\n this.controller.enqueue(chunk);\n }\n\n close() {\n try {\n this.controller.close();\n } catch (e) {\n // pass\n } finally {\n this._closed = true;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(e: any) {\n this.controller.error(e);\n }\n}\n\nfunction _stringifyAsDict(obj: unknown) {\n return JSON.stringify(obj, function (key: string | number, value: unknown) {\n const rawValue = this[key];\n if (\n rawValue != null &&\n typeof rawValue === \"object\" &&\n \"toDict\" in rawValue &&\n typeof rawValue.toDict === \"function\"\n ) {\n const { type, data } = rawValue.toDict();\n return { ...data, type };\n }\n\n return value;\n });\n}\n\nfunction _serializeError(error: unknown) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (error instanceof Error) {\n return { error: error.name, message: error.message };\n }\n return { error: \"Error\", message: JSON.stringify(error) };\n}\n\nfunction _isRunnableConfig(\n config: unknown\n): config is RunnableConfig & { configurable: Record<string, unknown> } {\n if (typeof config !== \"object\" || config == null) return false;\n return (\n \"configurable\" in config &&\n typeof config.configurable === \"object\" &&\n config.configurable != null\n );\n}\n\nfunction _extractCheckpointFromConfig(\n config: RunnableConfig | null | undefined\n) {\n if (!_isRunnableConfig(config) || !config.configurable.thread_id) {\n return null;\n }\n\n return {\n thread_id: config.configurable.thread_id,\n checkpoint_ns: config.configurable.checkpoint_ns || \"\",\n checkpoint_id: config.configurable.checkpoint_id || null,\n checkpoint_map: config.configurable.checkpoint_map || null,\n };\n}\n\nfunction _serializeConfig(config: unknown) {\n if (_isRunnableConfig(config)) {\n const configurable = Object.fromEntries(\n Object.entries(config.configurable).filter(\n ([key]) => !key.startsWith(\"__\")\n )\n );\n\n const newConfig = { ...config, configurable };\n delete newConfig.callbacks;\n return newConfig;\n }\n\n return config;\n}\n\nfunction _serializeCheckpoint(payload: StreamCheckpointsOutput<unknown>) {\n const result: Record<string, unknown> = {\n ...payload,\n checkpoint: _extractCheckpointFromConfig(payload.config),\n parent_checkpoint: _extractCheckpointFromConfig(payload.parentConfig),\n\n config: _serializeConfig(payload.config),\n parent_config: _serializeConfig(payload.parentConfig),\n\n tasks: payload.tasks.map((task) => {\n if (_isRunnableConfig(task.state)) {\n const checkpoint = _extractCheckpointFromConfig(task.state);\n if (checkpoint != null) {\n const cloneTask: Record<string, unknown> = { ...task, checkpoint };\n delete cloneTask.state;\n return cloneTask;\n }\n }\n\n return task;\n }),\n };\n\n delete result.parentConfig;\n return result;\n}\n\nexport function toEventStream(stream: AsyncGenerator) {\n const encoder = new TextEncoder();\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const enqueueChunk = (sse: {\n id?: string;\n event: string;\n data: unknown;\n }) => {\n controller.enqueue(\n encoder.encode(\n `event: ${sse.event}\\ndata: ${_stringifyAsDict(sse.data)}\\n\\n`\n )\n );\n };\n\n try {\n for await (const payload of stream) {\n const [ns, mode, chunk] = payload as AnyStreamOutput;\n\n let data: unknown = chunk;\n if (mode === \"debug\") {\n const debugChunk = chunk;\n\n if (debugChunk.type === \"checkpoint\") {\n data = {\n ...debugChunk,\n payload: _serializeCheckpoint(debugChunk.payload),\n };\n }\n }\n\n if (mode === \"checkpoints\") {\n data = _serializeCheckpoint(chunk);\n }\n\n const event = ns?.length ? `${mode}|${ns.join(\"|\")}` : mode;\n enqueueChunk({ event, data });\n }\n } catch (error) {\n enqueueChunk({ event: \"error\", data: _serializeError(error) });\n }\n\n controller.close();\n },\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stream.js","names":[],"sources":["../../src/pregel/stream.ts"],"sourcesContent":["import { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\nimport type { StreamMode, StreamOutputMap } from \"./types.js\";\nimport { TAG_HIDDEN } from \"../constants.js\";\n\n// [namespace, streamMode, payload]\nexport type StreamChunk = [string[], StreamMode, unknown];\n\ntype StreamCheckpointsOutput<StreamValues> = StreamOutputMap<\n \"checkpoints\",\n false,\n StreamValues,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype AnyStreamOutput = StreamOutputMap<\n StreamMode[],\n true,\n unknown,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype ToolRunInfo = {\n ns: string[];\n toolCallId?: string;\n toolName: string;\n input: unknown;\n};\n\n/**\n * A wrapper around an IterableReadableStream that allows for aborting the stream when\n * {@link cancel} is called.\n */\nexport class IterableReadableStreamWithAbortSignal<\n T\n> extends IterableReadableStream<T> {\n protected _abortController: AbortController;\n\n protected _innerReader: ReadableStreamDefaultReader<T>;\n\n /**\n * @param readableStream - The stream to wrap.\n * @param abortController - The abort controller to use. Optional. One will be created if not provided.\n */\n constructor(\n readableStream: ReadableStream<T>,\n abortController?: AbortController\n ) {\n const reader = readableStream.getReader();\n const ac = abortController ?? new AbortController();\n super({\n start(controller: ReadableStreamDefaultController<T>) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n });\n this._abortController = ac;\n this._innerReader = reader;\n }\n\n /**\n * Aborts the stream, abandoning any pending operations in progress. Calling this triggers an\n * {@link AbortSignal} that is propagated to the tasks that are producing the data for this stream.\n * @param reason - The reason for aborting the stream. Optional.\n */\n override async cancel(reason?: unknown) {\n this._abortController.abort(reason);\n this._innerReader.releaseLock();\n }\n\n /**\n * The {@link AbortSignal} for the stream. Aborted when {@link cancel} is called.\n */\n get signal() {\n return this._abortController.signal;\n }\n}\n\nexport class IterableReadableWritableStream extends IterableReadableStream<StreamChunk> {\n modes: Set<StreamMode>;\n\n private controller: ReadableStreamDefaultController;\n\n private passthroughFn?: (chunk: StreamChunk) => void;\n\n private _closed: boolean = false;\n\n get closed() {\n return this._closed;\n }\n\n constructor(params: {\n passthroughFn?: (chunk: StreamChunk) => void;\n modes: Set<StreamMode>;\n }) {\n let streamControllerPromiseResolver: (\n controller: ReadableStreamDefaultController\n ) => void;\n const streamControllerPromise: Promise<ReadableStreamDefaultController> =\n new Promise<ReadableStreamDefaultController>((resolve) => {\n streamControllerPromiseResolver = resolve;\n });\n\n super({\n start: (controller) => {\n streamControllerPromiseResolver!(controller);\n },\n });\n\n // .start() will always be called before the stream can be interacted\n // with anyway\n void streamControllerPromise.then((controller) => {\n this.controller = controller;\n });\n\n this.passthroughFn = params.passthroughFn;\n this.modes = params.modes;\n }\n\n push(chunk: StreamChunk) {\n this.passthroughFn?.(chunk);\n this.controller.enqueue(chunk);\n }\n\n close() {\n try {\n this.controller.close();\n } catch (e) {\n // pass\n } finally {\n this._closed = true;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(e: any) {\n this.controller.error(e);\n }\n}\n\n/**\n * A callback handler that implements stream_mode=tools.\n * Emits on_tool_start, on_tool_event, on_tool_end, on_tool_error events.\n */\nexport class StreamToolsHandler extends BaseCallbackHandler {\n name = \"StreamToolsHandler\";\n\n streamFn: (streamChunk: StreamChunk) => void;\n\n runs: Record<string, ToolRunInfo | undefined> = {};\n\n constructor(streamFn: (streamChunk: StreamChunk) => void) {\n super();\n this.streamFn = streamFn;\n }\n\n handleToolStart(\n _tool: Serialized,\n input: string,\n runId: string,\n _parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string,\n toolCallId?: string\n ) {\n if (!metadata || (tags && tags.includes(TAG_HIDDEN))) return;\n\n const ns = (metadata.langgraph_checkpoint_ns as string)?.split(\"|\") ?? [];\n const info: ToolRunInfo = {\n ns,\n toolCallId,\n toolName: runName ?? \"unknown\",\n input,\n };\n this.runs[runId] = info;\n\n this.streamFn([\n ns,\n \"tools\",\n {\n event: \"on_tool_start\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n input,\n },\n ]);\n }\n\n handleToolEvent(chunk: unknown, runId: string) {\n const info = this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_event\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n data: chunk,\n },\n ]);\n }\n\n handleToolEnd(output: unknown, runId: string) {\n const info = this.runs[runId];\n delete this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_end\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n output,\n },\n ]);\n }\n\n handleToolError(err: unknown, runId: string) {\n const info = this.runs[runId];\n delete this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_error\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n error: err,\n },\n ]);\n }\n}\n\nfunction _stringifyAsDict(obj: unknown) {\n return JSON.stringify(obj, function (key: string | number, value: unknown) {\n const rawValue = this[key];\n if (\n rawValue != null &&\n typeof rawValue === \"object\" &&\n \"toDict\" in rawValue &&\n typeof rawValue.toDict === \"function\"\n ) {\n const { type, data } = rawValue.toDict();\n return { ...data, type };\n }\n\n return value;\n });\n}\n\nfunction _serializeError(error: unknown) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (error instanceof Error) {\n return { error: error.name, message: error.message };\n }\n return { error: \"Error\", message: JSON.stringify(error) };\n}\n\nfunction _isRunnableConfig(\n config: unknown\n): config is RunnableConfig & { configurable: Record<string, unknown> } {\n if (typeof config !== \"object\" || config == null) return false;\n return (\n \"configurable\" in config &&\n typeof config.configurable === \"object\" &&\n config.configurable != null\n );\n}\n\nfunction _extractCheckpointFromConfig(\n config: RunnableConfig | null | undefined\n) {\n if (!_isRunnableConfig(config) || !config.configurable.thread_id) {\n return null;\n }\n\n return {\n thread_id: config.configurable.thread_id,\n checkpoint_ns: config.configurable.checkpoint_ns || \"\",\n checkpoint_id: config.configurable.checkpoint_id || null,\n checkpoint_map: config.configurable.checkpoint_map || null,\n };\n}\n\nfunction _serializeConfig(config: unknown) {\n if (_isRunnableConfig(config)) {\n const configurable = Object.fromEntries(\n Object.entries(config.configurable).filter(\n ([key]) => !key.startsWith(\"__\")\n )\n );\n\n const newConfig = { ...config, configurable };\n delete newConfig.callbacks;\n return newConfig;\n }\n\n return config;\n}\n\nfunction _serializeCheckpoint(payload: StreamCheckpointsOutput<unknown>) {\n const result: Record<string, unknown> = {\n ...payload,\n checkpoint: _extractCheckpointFromConfig(payload.config),\n parent_checkpoint: _extractCheckpointFromConfig(payload.parentConfig),\n\n config: _serializeConfig(payload.config),\n parent_config: _serializeConfig(payload.parentConfig),\n\n tasks: payload.tasks.map((task) => {\n if (_isRunnableConfig(task.state)) {\n const checkpoint = _extractCheckpointFromConfig(task.state);\n if (checkpoint != null) {\n const cloneTask: Record<string, unknown> = { ...task, checkpoint };\n delete cloneTask.state;\n return cloneTask;\n }\n }\n\n return task;\n }),\n };\n\n delete result.parentConfig;\n return result;\n}\n\nexport function toEventStream(stream: AsyncGenerator) {\n const encoder = new TextEncoder();\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const enqueueChunk = (sse: {\n id?: string;\n event: string;\n data: unknown;\n }) => {\n controller.enqueue(\n encoder.encode(\n `event: ${sse.event}\\ndata: ${_stringifyAsDict(sse.data)}\\n\\n`\n )\n );\n };\n\n try {\n for await (const payload of stream) {\n const [ns, mode, chunk] = payload as AnyStreamOutput;\n\n let data: unknown = chunk;\n if (mode === \"debug\") {\n const debugChunk = chunk;\n\n if (debugChunk.type === \"checkpoint\") {\n data = {\n ...debugChunk,\n payload: _serializeCheckpoint(debugChunk.payload),\n };\n }\n }\n\n if (mode === \"checkpoints\") {\n data = _serializeCheckpoint(chunk);\n }\n\n const event = ns?.length ? `${mode}|${ns.join(\"|\")}` : mode;\n enqueueChunk({ event, data });\n }\n } catch (error) {\n enqueueChunk({ event: \"error\", data: _serializeError(error) });\n }\n\n controller.close();\n },\n });\n}\n"],"mappings":"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"}