@langchain/langgraph 1.3.3 → 1.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/graph/state.cjs +5 -1
- package/dist/graph/state.cjs.map +1 -1
- package/dist/graph/state.d.cts.map +1 -1
- package/dist/graph/state.d.ts.map +1 -1
- package/dist/graph/state.js +5 -1
- package/dist/graph/state.js.map +1 -1
- package/dist/index.cjs +4 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/{setup/async_local_storage.cjs → node.cjs} +2 -2
- package/dist/node.cjs.map +1 -0
- package/dist/{setup/async_local_storage.js → node.js} +2 -2
- package/dist/node.js.map +1 -0
- package/dist/pregel/index.cjs +13 -12
- package/dist/pregel/index.cjs.map +1 -1
- package/dist/pregel/index.d.cts.map +1 -1
- package/dist/pregel/index.d.ts.map +1 -1
- package/dist/pregel/index.js +13 -12
- package/dist/pregel/index.js.map +1 -1
- package/dist/pregel/loop.cjs +19 -33
- package/dist/pregel/loop.cjs.map +1 -1
- package/dist/pregel/loop.js +19 -33
- package/dist/pregel/loop.js.map +1 -1
- package/dist/pregel/remote.cjs +1 -1
- package/dist/pregel/remote.cjs.map +1 -1
- package/dist/pregel/remote.d.cts +4 -3
- package/dist/pregel/remote.d.cts.map +1 -1
- package/dist/pregel/remote.d.ts +4 -3
- package/dist/pregel/remote.d.ts.map +1 -1
- package/dist/pregel/remote.js +1 -1
- package/dist/pregel/remote.js.map +1 -1
- package/dist/pregel/stream.cjs +12 -0
- package/dist/pregel/stream.cjs.map +1 -1
- package/dist/pregel/stream.d.cts +2 -24
- package/dist/pregel/stream.d.cts.map +1 -1
- package/dist/pregel/stream.d.ts +2 -24
- package/dist/pregel/stream.d.ts.map +1 -1
- package/dist/pregel/stream.js +12 -1
- package/dist/pregel/stream.js.map +1 -1
- package/dist/stream/convert.cjs +29 -23
- package/dist/stream/convert.cjs.map +1 -1
- package/dist/stream/convert.d.cts +9 -38
- package/dist/stream/convert.d.cts.map +1 -1
- package/dist/stream/convert.d.ts +9 -38
- package/dist/stream/convert.d.ts.map +1 -1
- package/dist/stream/convert.js +29 -24
- package/dist/stream/convert.js.map +1 -1
- package/dist/stream/index.cjs +1 -1
- package/dist/stream/index.d.cts +1 -1
- package/dist/stream/index.d.ts +1 -1
- package/dist/stream/index.js +1 -1
- package/dist/stream/mux.cjs +3 -4
- package/dist/stream/mux.cjs.map +1 -1
- package/dist/stream/mux.js +3 -4
- package/dist/stream/mux.js.map +1 -1
- package/dist/stream/types.d.cts +2 -2
- package/dist/stream/types.d.ts +2 -2
- package/dist/web.cjs +2 -1
- package/dist/web.d.cts +2 -2
- package/dist/web.d.ts +2 -2
- package/dist/web.js +2 -2
- package/package.json +11 -10
- package/dist/setup/async_local_storage.cjs.map +0 -1
- package/dist/setup/async_local_storage.js.map +0 -1
package/dist/pregel/loop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop.js","names":[],"sources":["../../src/pregel/loop.ts"],"sourcesContent":["import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport type { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n BaseCheckpointSaver,\n Checkpoint,\n CheckpointTuple,\n copyCheckpoint,\n emptyCheckpoint,\n PendingWrite,\n CheckpointPendingWrite,\n CheckpointMetadata,\n All,\n BaseStore,\n AsyncBatchedStore,\n WRITES_IDX_MAP,\n BaseCache,\n CacheFullKey,\n CacheNamespace,\n} from \"@langchain/langgraph-checkpoint\";\n\nimport {\n BaseChannel,\n createCheckpoint,\n emptyChannels,\n} from \"../channels/base.js\";\nimport type {\n Call,\n CallTaskPath,\n Durability,\n PregelExecutableTask,\n PregelScratchpad,\n StreamMode,\n} from \"./types.js\";\nimport {\n isCommand,\n _isSend,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n Command,\n CONFIG_KEY_CHECKPOINT_MAP,\n CONFIG_KEY_READ,\n CONFIG_KEY_RESUMING,\n CONFIG_KEY_STREAM,\n ERROR,\n INPUT,\n INTERRUPT,\n NULL_TASK_ID,\n RESUME,\n TAG_HIDDEN,\n TASKS,\n PUSH,\n CONFIG_KEY_SCRATCHPAD,\n CONFIG_KEY_CHECKPOINT_NS,\n CHECKPOINT_NAMESPACE_END,\n CONFIG_KEY_CHECKPOINT_ID,\n CONFIG_KEY_RESUME_MAP,\n START,\n} from \"../constants.js\";\nimport {\n _applyWrites,\n _prepareNextTasks,\n _prepareSingleTask,\n increment,\n shouldInterrupt,\n sanitizeUntrackedValuesInSend,\n WritesProtocol,\n} from \"./algo.js\";\nimport {\n gatherIterator,\n gatherIteratorSync,\n prefixGenerator,\n} from \"../utils.js\";\nimport {\n mapCommand,\n mapInput,\n mapOutputUpdates,\n mapOutputValues,\n readChannels,\n} from \"./io.js\";\nimport {\n EmptyInputError,\n GraphInterrupt,\n isGraphInterrupt,\n} from \"../errors.js\";\nimport { getNewChannelVersions, patchConfigurable } from \"./utils/index.js\";\nimport {\n mapDebugTasks,\n mapDebugCheckpoint,\n mapDebugTaskResults,\n printStepTasks,\n} from \"./debug.js\";\nimport { PregelNode } from \"./read.js\";\nimport { LangGraphRunnableConfig } from \"./runnable_types.js\";\nimport {\n IterableReadableWritableStream,\n StreamChunk,\n StreamChunkMeta,\n} from \"./stream.js\";\nimport { isXXH3 } from \"../hash.js\";\n\nconst INPUT_DONE = Symbol.for(\"INPUT_DONE\");\nconst INPUT_RESUMING = Symbol.for(\"INPUT_RESUMING\");\nconst DEFAULT_LOOP_LIMIT = 25;\n\nexport type PregelLoopInitializeParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any | Command;\n config: RunnableConfig;\n checkpointer?: BaseCheckpointSaver;\n outputKeys: string | string[];\n streamKeys: string | string[];\n nodes: Record<string, PregelNode>;\n channelSpecs: Record<string, BaseChannel>;\n stream: IterableReadableWritableStream;\n store?: BaseStore;\n cache?: BaseCache<PendingWrite<string>[]>;\n interruptAfter: string[] | All;\n interruptBefore: string[] | All;\n durability: Durability;\n manager?: CallbackManagerForChainRun;\n debug: boolean;\n triggerToNodes: Record<string, string[]>;\n};\n\ntype PregelLoopParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any | Command;\n config: RunnableConfig;\n checkpointer?: BaseCheckpointSaver;\n checkpoint: Checkpoint;\n checkpointMetadata: CheckpointMetadata;\n checkpointPreviousVersions: Record<string, string | number>;\n checkpointPendingWrites: CheckpointPendingWrite[];\n checkpointConfig: RunnableConfig;\n channels: Record<string, BaseChannel>;\n step: number;\n stop: number;\n outputKeys: string | string[];\n streamKeys: string | string[];\n nodes: Record<string, PregelNode>;\n checkpointNamespace: string[];\n skipDoneTasks: boolean;\n isNested: boolean;\n manager?: CallbackManagerForChainRun;\n stream: IterableReadableWritableStream;\n store?: AsyncBatchedStore;\n cache?: BaseCache<PendingWrite<string>[]>;\n prevCheckpointConfig: RunnableConfig | undefined;\n interruptAfter: string[] | All;\n interruptBefore: string[] | All;\n durability: Durability;\n debug: boolean;\n triggerToNodes: Record<string, string[]>;\n};\n\nfunction createDuplexStream(...streams: IterableReadableWritableStream[]) {\n return new IterableReadableWritableStream({\n passthroughFn: (value: StreamChunk) => {\n for (const stream of streams) {\n if (stream.modes.has(value[1])) {\n stream.push(value);\n }\n }\n },\n modes: new Set(streams.flatMap((s) => Array.from(s.modes))),\n });\n}\n\nclass AsyncBatchedCache extends BaseCache<PendingWrite<string>[]> {\n protected cache: BaseCache<PendingWrite<string>[]>;\n\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(cache: BaseCache<unknown>) {\n super();\n this.cache = cache as BaseCache<PendingWrite<string>[]>;\n }\n\n async get(keys: CacheFullKey[]) {\n return this.enqueueOperation(\"get\", keys);\n }\n\n async set(\n pairs: {\n key: CacheFullKey;\n value: PendingWrite<string>[];\n ttl?: number;\n }[]\n ) {\n return this.enqueueOperation(\"set\", pairs);\n }\n\n async clear(namespaces: CacheNamespace[]) {\n return this.enqueueOperation(\"clear\", namespaces);\n }\n\n async stop() {\n await this.queue;\n }\n\n private enqueueOperation<Type extends \"get\" | \"set\" | \"clear\">(\n type: Type,\n ...args: Parameters<(typeof this.cache)[Type]>\n ) {\n const newPromise = this.queue.then(() => {\n // @ts-expect-error Tuple type warning\n return this.cache[type](...args) as Promise<\n ReturnType<(typeof this.cache)[Type]>\n >;\n });\n\n this.queue = newPromise.then(\n () => void 0,\n () => void 0\n );\n\n return newPromise;\n }\n}\n\nexport class PregelLoop {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected input?: any | Command;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n output: any;\n\n config: LangGraphRunnableConfig;\n\n protected checkpointer?: BaseCheckpointSaver;\n\n protected checkpointerGetNextVersion: (current: number | undefined) => number;\n\n channels: Record<string, BaseChannel>;\n\n protected checkpoint: Checkpoint;\n\n protected checkpointIdSaved: string | undefined;\n\n protected checkpointConfig: RunnableConfig;\n\n checkpointMetadata: CheckpointMetadata;\n\n protected checkpointNamespace: string[];\n\n protected checkpointPendingWrites: CheckpointPendingWrite[] = [];\n\n protected checkpointPreviousVersions: Record<string, string | number>;\n\n step: number;\n\n protected stop: number;\n\n protected durability: Durability;\n\n protected outputKeys: string | string[];\n\n protected streamKeys: string | string[];\n\n protected nodes: Record<string, PregelNode>;\n\n protected skipDoneTasks: boolean;\n\n protected prevCheckpointConfig: RunnableConfig | undefined;\n\n protected updatedChannels: Set<string> | undefined;\n\n status:\n | \"pending\"\n | \"done\"\n | \"interrupt_before\"\n | \"interrupt_after\"\n | \"out_of_steps\" = \"pending\";\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tasks: Record<string, PregelExecutableTask<any, any>> = {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n stream: IterableReadableWritableStream;\n\n checkpointerPromises: Set<Promise<unknown>> = new Set();\n\n isNested: boolean;\n\n protected _checkpointerChainedPromise: Promise<unknown> = Promise.resolve();\n\n /**\n * Track a checkpointer promise, removing it from the set on success.\n * Failed promises are kept so that Promise.all() in the finally block\n * of _streamIterator can surface the error.\n *\n * @internal\n */\n protected _trackCheckpointerPromise(promise: Promise<unknown>) {\n const tracked = promise.then(\n (value) => {\n this.checkpointerPromises.delete(tracked);\n return value;\n },\n (error) => {\n // Keep failed promises in the set so errors surface via Promise.all()\n throw error;\n }\n );\n this.checkpointerPromises.add(tracked);\n }\n\n store?: AsyncBatchedStore;\n\n cache?: AsyncBatchedCache;\n\n manager?: CallbackManagerForChainRun;\n\n interruptAfter: string[] | All;\n\n interruptBefore: string[] | All;\n\n toInterrupt: PregelExecutableTask<string, string>[] = [];\n\n debug: boolean = false;\n\n triggerToNodes: Record<string, string[]>;\n\n get isResuming() {\n let hasChannelVersions = false;\n if (START in this.checkpoint.channel_versions) {\n // For common channels, we can short-circuit the check\n hasChannelVersions = true;\n } else {\n for (const chan in this.checkpoint.channel_versions) {\n if (\n Object.prototype.hasOwnProperty.call(\n this.checkpoint.channel_versions,\n chan\n )\n ) {\n hasChannelVersions = true;\n break;\n }\n }\n }\n\n const configHasResumingFlag =\n this.config.configurable?.[CONFIG_KEY_RESUMING] !== undefined;\n const configIsResuming =\n configHasResumingFlag && this.config.configurable?.[CONFIG_KEY_RESUMING];\n\n const inputIsNullOrUndefined =\n this.input === null || this.input === undefined;\n const inputIsCommandResuming =\n isCommand(this.input) && this.input.resume != null;\n const inputIsResuming = this.input === INPUT_RESUMING;\n\n const runIdMatchesPrevious =\n !this.isNested &&\n this.config.metadata?.run_id !== undefined &&\n (this.checkpointMetadata as { run_id?: unknown })?.run_id !== undefined &&\n this.config.metadata.run_id ===\n (this.checkpointMetadata as { run_id?: unknown })?.run_id;\n\n return (\n hasChannelVersions &&\n (configIsResuming ||\n inputIsNullOrUndefined ||\n inputIsCommandResuming ||\n inputIsResuming ||\n runIdMatchesPrevious)\n );\n }\n\n constructor(params: PregelLoopParams) {\n this.input = params.input;\n this.checkpointer = params.checkpointer;\n // TODO: if managed values no longer needs graph we can replace with\n // managed_specs, channel_specs\n if (this.checkpointer !== undefined) {\n this.checkpointerGetNextVersion = this.checkpointer.getNextVersion.bind(\n this.checkpointer\n );\n } else {\n this.checkpointerGetNextVersion = increment;\n }\n this.checkpoint = params.checkpoint;\n this.checkpointMetadata = params.checkpointMetadata;\n this.checkpointPreviousVersions = params.checkpointPreviousVersions;\n this.channels = params.channels;\n this.checkpointPendingWrites = params.checkpointPendingWrites;\n this.step = params.step;\n this.stop = params.stop;\n this.config = params.config;\n this.checkpointConfig = params.checkpointConfig;\n this.isNested = params.isNested;\n this.manager = params.manager;\n this.outputKeys = params.outputKeys;\n this.streamKeys = params.streamKeys;\n this.nodes = params.nodes;\n this.skipDoneTasks = params.skipDoneTasks;\n this.store = params.store;\n this.cache = params.cache ? new AsyncBatchedCache(params.cache) : undefined;\n this.stream = params.stream;\n this.checkpointNamespace = params.checkpointNamespace;\n this.prevCheckpointConfig = params.prevCheckpointConfig;\n this.interruptAfter = params.interruptAfter;\n this.interruptBefore = params.interruptBefore;\n this.durability = params.durability;\n this.debug = params.debug;\n this.triggerToNodes = params.triggerToNodes;\n }\n\n static async initialize(params: PregelLoopInitializeParams) {\n let { config, stream } = params;\n if (\n stream !== undefined &&\n config.configurable?.[CONFIG_KEY_STREAM] !== undefined\n ) {\n stream = createDuplexStream(\n stream,\n config.configurable[CONFIG_KEY_STREAM]\n );\n }\n const skipDoneTasks = config.configurable\n ? !(\"checkpoint_id\" in config.configurable)\n : true;\n\n const scratchpad = config.configurable?.[CONFIG_KEY_SCRATCHPAD] as\n | PregelScratchpad\n | undefined;\n\n if (config.configurable && scratchpad) {\n if (scratchpad.subgraphCounter > 0) {\n config = patchConfigurable(config, {\n [CONFIG_KEY_CHECKPOINT_NS]: [\n config.configurable[CONFIG_KEY_CHECKPOINT_NS],\n scratchpad.subgraphCounter.toString(),\n ].join(CHECKPOINT_NAMESPACE_SEPARATOR),\n });\n }\n\n scratchpad.subgraphCounter += 1;\n }\n\n const isNested = CONFIG_KEY_READ in (config.configurable ?? {});\n if (\n !isNested &&\n config.configurable?.checkpoint_ns !== undefined &&\n config.configurable?.checkpoint_ns !== \"\"\n ) {\n config = patchConfigurable(config, {\n checkpoint_ns: \"\",\n checkpoint_id: undefined,\n });\n }\n let checkpointConfig = config;\n if (\n config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] !== undefined &&\n config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP]?.[\n config.configurable?.checkpoint_ns\n ]\n ) {\n checkpointConfig = patchConfigurable(config, {\n checkpoint_id:\n config.configurable[CONFIG_KEY_CHECKPOINT_MAP][\n config.configurable?.checkpoint_ns\n ],\n });\n }\n const checkpointNamespace =\n config.configurable?.checkpoint_ns?.split(\n CHECKPOINT_NAMESPACE_SEPARATOR\n ) ?? [];\n\n const saved: CheckpointTuple = (await params.checkpointer?.getTuple(\n checkpointConfig\n )) ?? {\n config,\n checkpoint: emptyCheckpoint(),\n metadata: { source: \"input\", step: -2, parents: {} },\n pendingWrites: [],\n };\n checkpointConfig = {\n ...config,\n ...saved.config,\n configurable: {\n checkpoint_ns: \"\",\n ...config.configurable,\n ...saved.config.configurable,\n },\n };\n const prevCheckpointConfig = saved.parentConfig;\n const checkpoint = copyCheckpoint(saved.checkpoint);\n const checkpointMetadata = { ...saved.metadata } as CheckpointMetadata;\n const checkpointPendingWrites = saved.pendingWrites ?? [];\n\n const channels = emptyChannels(params.channelSpecs, checkpoint);\n\n const step = (checkpointMetadata.step ?? 0) + 1;\n const stop = step + (config.recursionLimit ?? DEFAULT_LOOP_LIMIT) + 1;\n const checkpointPreviousVersions = { ...checkpoint.channel_versions };\n\n const store = params.store\n ? new AsyncBatchedStore(params.store)\n : undefined;\n\n if (store) {\n // Start the store. This is a batch store, so it will run continuously\n await store.start();\n }\n return new PregelLoop({\n input: params.input,\n config,\n checkpointer: params.checkpointer,\n checkpoint,\n checkpointMetadata,\n checkpointConfig,\n prevCheckpointConfig,\n checkpointNamespace,\n channels,\n isNested,\n manager: params.manager,\n skipDoneTasks,\n step,\n stop,\n checkpointPreviousVersions,\n checkpointPendingWrites,\n outputKeys: params.outputKeys ?? [],\n streamKeys: params.streamKeys ?? [],\n nodes: params.nodes,\n stream,\n store,\n cache: params.cache,\n interruptAfter: params.interruptAfter,\n interruptBefore: params.interruptBefore,\n durability: params.durability,\n debug: params.debug,\n triggerToNodes: params.triggerToNodes,\n });\n }\n\n protected _checkpointerPutAfterPrevious(input: {\n config: RunnableConfig;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n newVersions: Record<string, string | number>;\n }) {\n this._checkpointerChainedPromise = this._checkpointerChainedPromise.then(\n () => {\n return this.checkpointer?.put(\n input.config,\n input.checkpoint,\n input.metadata,\n input.newVersions\n );\n }\n );\n this._trackCheckpointerPromise(this._checkpointerChainedPromise);\n }\n\n /**\n * Put writes for a task, to be read by the next tick.\n * @param taskId\n * @param writes\n */\n putWrites(taskId: string, writes: PendingWrite<string>[]) {\n let writesCopy = writes;\n if (writesCopy.length === 0) return;\n\n // deduplicate writes to special channels, last write wins\n if (writesCopy.every(([key]) => key in WRITES_IDX_MAP)) {\n writesCopy = Array.from(\n new Map(writesCopy.map((w) => [w[0], w])).values()\n );\n }\n\n // Check if any channels are UntrackedValue (manual loop for perf)\n let hasUntrackedChannels = false;\n for (const key in this.channels) {\n if (Object.prototype.hasOwnProperty.call(this.channels, key)) {\n const channel = this.channels[key];\n if (channel.lc_graph_name === \"UntrackedValue\") {\n hasUntrackedChannels = true;\n break;\n }\n }\n }\n\n // Sanitize writes for checkpointing: remove UntrackedValue writes and sanitize Send packets\n let writesToSave = writesCopy;\n if (hasUntrackedChannels) {\n writesToSave = writesCopy\n .filter(([c]) => {\n // Don't persist UntrackedValue channel writes\n const channel = this.channels[c];\n return !channel || channel.lc_graph_name !== \"UntrackedValue\";\n })\n .map(([c, v]) => {\n // Sanitize UntrackedValues nested within Send packets\n if (c === TASKS && _isSend(v)) {\n return [c, sanitizeUntrackedValuesInSend(v, this.channels)] as [\n string,\n unknown,\n ];\n }\n return [c, v] as [string, unknown];\n });\n }\n\n // remove existing writes for this task\n this.checkpointPendingWrites = this.checkpointPendingWrites.filter(\n (w) => w[0] !== taskId\n );\n\n // save writes\n for (const [c, v] of writesToSave) {\n this.checkpointPendingWrites.push([taskId, c, v]);\n }\n\n const config = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id,\n });\n\n if (this.durability !== \"exit\" && this.checkpointer != null) {\n this._trackCheckpointerPromise(\n // Use sanitized writes for checkpointer\n this.checkpointer.putWrites(config, writesToSave, taskId)\n );\n }\n\n if (this.tasks) {\n this._outputWrites(taskId, writesCopy);\n }\n\n if (!writes.length || !this.cache || !this.tasks) {\n return;\n }\n\n // only cache tasks with a cache key\n const task = this.tasks[taskId];\n if (task == null || task.cache_key == null) {\n return;\n }\n\n // only cache successful tasks\n if (writes[0][0] === ERROR || writes[0][0] === INTERRUPT) {\n return;\n }\n\n void this.cache.set([\n {\n key: [task.cache_key.ns, task.cache_key.key],\n value: task.writes,\n ttl: task.cache_key.ttl,\n },\n ]);\n }\n\n _outputWrites(taskId: string, writes: [string, unknown][], cached = false) {\n const task = this.tasks[taskId];\n if (task !== undefined) {\n if (\n task.config !== undefined &&\n (task.config.tags ?? []).includes(TAG_HIDDEN)\n ) {\n return;\n }\n\n if (writes.length > 0) {\n if (writes[0][0] === INTERRUPT) {\n // in `algo.ts` we append a bool to the task path to indicate\n // whether or not a call was present. If so, we don't emit the\n // the interrupt as it'll be emitted by the parent.\n if (\n task.path?.[0] === PUSH &&\n task.path?.[task.path.length - 1] === true\n )\n return;\n\n const interruptWrites = writes\n .filter((w) => w[0] === INTERRUPT)\n .flatMap((w) => w[1] as string[]);\n\n this._emit([\n [\"updates\", { [INTERRUPT]: interruptWrites }],\n [\"values\", { [INTERRUPT]: interruptWrites }],\n ]);\n } else if (writes[0][0] !== ERROR) {\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapOutputUpdates(this.outputKeys, [[task, writes]], cached),\n \"updates\"\n )\n )\n );\n }\n }\n if (!cached) {\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapDebugTaskResults([[task, writes]], this.streamKeys),\n \"tasks\"\n )\n )\n );\n }\n }\n }\n\n async _matchCachedWrites() {\n if (!this.cache) return [];\n\n const matched: {\n task: PregelExecutableTask<string, string>;\n result: unknown;\n }[] = [];\n\n const serializeKey = ([ns, key]: CacheFullKey) => {\n return `ns:${ns.join(\",\")}|key:${key}`;\n };\n\n const keys: CacheFullKey[] = [];\n const keyMap: Record<string, PregelExecutableTask<string, string>> = {};\n\n for (const task of Object.values(this.tasks)) {\n if (task.cache_key != null && !task.writes.length) {\n keys.push([task.cache_key.ns, task.cache_key.key]);\n keyMap[serializeKey([task.cache_key.ns, task.cache_key.key])] = task;\n }\n }\n\n if (keys.length === 0) return [];\n const cache = await this.cache.get(keys);\n\n for (const { key, value } of cache) {\n const task = keyMap[serializeKey(key)];\n if (task != null) {\n // update the task with the cached writes\n task.writes.push(...value);\n matched.push({ task, result: value });\n }\n }\n\n return matched;\n }\n\n /**\n * Execute a single iteration of the Pregel loop.\n * Returns true if more iterations are needed.\n * @param params\n */\n async tick(params: { inputKeys?: string | string[] }): Promise<boolean> {\n if (this.store && !this.store.isRunning) {\n await this.store?.start();\n }\n const { inputKeys = [] } = params;\n if (this.status !== \"pending\") {\n throw new Error(\n `Cannot tick when status is no longer \"pending\". Current status: \"${this.status}\"`\n );\n }\n if (![INPUT_DONE, INPUT_RESUMING].includes(this.input)) {\n await this._first(inputKeys);\n } else if (this.toInterrupt.length > 0) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n } else if (\n Object.values(this.tasks).every((task) => task.writes.length > 0)\n ) {\n // finish superstep\n const writes = Object.values(this.tasks).flatMap((t) => t.writes);\n // All tasks have finished\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n Object.values(this.tasks),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, writes, this.channels),\n \"values\"\n )\n );\n // clear pending writes\n this.checkpointPendingWrites = [];\n // persist the new checkpoint BEFORE emitting values, so the\n // attached `checkpoint` envelope on the values event points at\n // the fork target that captures this superstep's final state.\n await this._putCheckpoint({ source: \"loop\" });\n this._emitValuesWithCheckpointMeta(valuesOutput);\n // after execution, check if we should interrupt\n if (\n shouldInterrupt(\n this.checkpoint,\n this.interruptAfter,\n Object.values(this.tasks)\n )\n ) {\n this.status = \"interrupt_after\";\n throw new GraphInterrupt();\n }\n\n // unset resuming flag\n if (this.config.configurable?.[CONFIG_KEY_RESUMING] !== undefined) {\n delete this.config.configurable?.[CONFIG_KEY_RESUMING];\n }\n } else {\n return false;\n }\n if (this.step > this.stop) {\n this.status = \"out_of_steps\";\n return false;\n }\n\n const nextTasks = _prepareNextTasks(\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n this.config,\n true,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n isResuming: this.isResuming,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n triggerToNodes: this.triggerToNodes,\n updatedChannels: this.updatedChannels,\n }\n );\n this.tasks = nextTasks;\n\n // Produce debug output\n if (this.checkpointer) {\n this._emit(\n await gatherIterator(\n prefixGenerator(\n mapDebugCheckpoint(\n this.checkpointConfig,\n this.channels,\n this.streamKeys,\n this.checkpointMetadata,\n Object.values(this.tasks),\n this.checkpointPendingWrites,\n this.prevCheckpointConfig,\n this.outputKeys\n ),\n \"checkpoints\"\n )\n )\n );\n }\n\n if (Object.values(this.tasks).length === 0) {\n this.status = \"done\";\n return false;\n }\n // if there are pending writes from a previous loop, apply them\n if (this.skipDoneTasks && this.checkpointPendingWrites.length > 0) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (k === ERROR || k === INTERRUPT || k === RESUME) {\n continue;\n }\n const task = Object.values(this.tasks).find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n for (const task of Object.values(this.tasks)) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\n }\n }\n }\n // if all tasks have finished, re-tick\n if (Object.values(this.tasks).every((task) => task.writes.length > 0)) {\n return this.tick({ inputKeys });\n }\n\n // Before execution, check if we should interrupt\n if (\n shouldInterrupt(\n this.checkpoint,\n this.interruptBefore,\n Object.values(this.tasks)\n )\n ) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n }\n\n // Produce debug output\n const debugOutput = await gatherIterator(\n prefixGenerator(mapDebugTasks(Object.values(this.tasks)), \"tasks\")\n );\n this._emit(debugOutput);\n\n return true;\n }\n\n async finishAndHandleError(error?: Error) {\n // persist current checkpoint and writes\n if (\n this.durability === \"exit\" &&\n // if it's a top graph\n (!this.isNested ||\n // or a nested graph with error or interrupt\n typeof error !== \"undefined\" ||\n // or a nested graph with checkpointer: true\n this.checkpointNamespace.every(\n (part) => !part.includes(CHECKPOINT_NAMESPACE_END)\n ))\n ) {\n this._putCheckpoint(this.checkpointMetadata);\n this._flushPendingWrites();\n }\n\n const suppress = this._suppressInterrupt(error);\n if (suppress || error === undefined) {\n this.output = readChannels(this.channels, this.outputKeys);\n }\n if (suppress) {\n // emit one last \"values\" event, with pending writes applied\n if (\n this.tasks !== undefined &&\n this.checkpointPendingWrites.length > 0 &&\n Object.values(this.tasks).some((task) => task.writes.length > 0)\n ) {\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n Object.values(this.tasks),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n\n this._emitValuesWithCheckpointMeta(\n gatherIteratorSync(\n prefixGenerator(\n mapOutputValues(\n this.outputKeys,\n Object.values(this.tasks).flatMap((t) => t.writes),\n this.channels\n ),\n \"values\"\n )\n )\n );\n }\n\n // Emit INTERRUPT event (not a state snapshot — no checkpoint envelope)\n if (isGraphInterrupt(error) && !error.interrupts.length) {\n this._emit([\n [\"updates\", { [INTERRUPT]: [] }],\n [\"values\", { [INTERRUPT]: [] }],\n ]);\n }\n }\n return suppress;\n }\n\n async acceptPush(\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ): Promise<PregelExecutableTask<string, string> | void> {\n if (\n this.interruptAfter?.length > 0 &&\n shouldInterrupt(this.checkpoint, this.interruptAfter, [task])\n ) {\n this.toInterrupt.push(task);\n return;\n }\n\n const pushed = _prepareSingleTask(\n [PUSH, task.path ?? [], writeIdx, task.id, call] as CallTaskPath,\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n task.config ?? {},\n true,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n }\n );\n\n if (!pushed) return;\n if (\n this.interruptBefore?.length > 0 &&\n shouldInterrupt(this.checkpoint, this.interruptBefore, [pushed])\n ) {\n this.toInterrupt.push(pushed);\n return;\n }\n\n this._emit(\n gatherIteratorSync(prefixGenerator(mapDebugTasks([pushed]), \"tasks\"))\n );\n\n if (this.debug) printStepTasks(this.step, [pushed]);\n this.tasks[pushed.id] = pushed;\n if (this.skipDoneTasks) this._matchWrites({ [pushed.id]: pushed });\n\n const tasks = await this._matchCachedWrites();\n for (const { task } of tasks) {\n this._outputWrites(task.id, task.writes, true);\n }\n\n return pushed;\n }\n\n protected _suppressInterrupt(e?: Error): boolean {\n return isGraphInterrupt(e) && !this.isNested;\n }\n\n protected async _first(inputKeys: string | string[]) {\n /*\n * Resuming from previous checkpoint requires\n * - finding a previous checkpoint\n * - receiving null input (outer graph) or RESUMING flag (subgraph)\n */\n\n const { configurable } = this.config;\n\n // take resume value from parent\n const scratchpad = configurable?.[\n CONFIG_KEY_SCRATCHPAD\n ] as PregelScratchpad;\n\n if (scratchpad && scratchpad.nullResume !== undefined) {\n this.putWrites(NULL_TASK_ID, [[RESUME, scratchpad.nullResume]]);\n }\n\n // map command to writes\n if (isCommand(this.input)) {\n const hasResume = this.input.resume != null;\n\n if (\n this.input.resume != null &&\n typeof this.input.resume === \"object\" &&\n Object.keys(this.input.resume).every(isXXH3)\n ) {\n this.config.configurable ??= {};\n this.config.configurable[CONFIG_KEY_RESUME_MAP] = this.input.resume;\n }\n\n if (hasResume && this.checkpointer == null) {\n throw new Error(\"Cannot use Command(resume=...) without checkpointer\");\n }\n\n const writes: { [key: string]: PendingWrite[] } = {};\n\n // group writes by task id\n for (const [tid, key, value] of mapCommand(\n this.input,\n this.checkpointPendingWrites\n )) {\n writes[tid] ??= [];\n writes[tid].push([key, value]);\n }\n if (Object.keys(writes).length === 0) {\n throw new EmptyInputError(\"Received empty Command input\");\n }\n\n // save writes\n for (const [tid, ws] of Object.entries(writes)) {\n this.putWrites(tid, ws);\n }\n }\n\n // apply null writes\n const nullWrites = (this.checkpointPendingWrites ?? [])\n .filter((w) => w[0] === NULL_TASK_ID)\n .map((w) => w.slice(1)) as PendingWrite<string>[];\n if (nullWrites.length > 0) {\n _applyWrites(\n this.checkpoint,\n this.channels,\n [\n {\n name: INPUT,\n writes: nullWrites,\n triggers: [],\n },\n ],\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n }\n const isCommandUpdateOrGoto =\n isCommand(this.input) && nullWrites.length > 0;\n if (this.isResuming || isCommandUpdateOrGoto) {\n for (const channelName in this.channels) {\n if (!Object.prototype.hasOwnProperty.call(this.channels, channelName))\n continue;\n if (this.checkpoint.channel_versions[channelName] !== undefined) {\n const version = this.checkpoint.channel_versions[channelName];\n this.checkpoint.versions_seen[INTERRUPT] = {\n ...this.checkpoint.versions_seen[INTERRUPT],\n [channelName]: version,\n };\n }\n }\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, true, this.channels),\n \"values\"\n )\n );\n // Preserve the original `isResuming`-first priority: when both\n // `isResuming` and `isCommandUpdateOrGoto` are true (resuming from\n // an interrupt with a Command update/goto), the resume path wins\n // and no new input checkpoint is created here.\n if (this.isResuming) {\n this.input = INPUT_RESUMING;\n } else if (isCommandUpdateOrGoto) {\n // Persist the input checkpoint BEFORE emitting values so the\n // attached `checkpoint` envelope points at the just-created\n // fork target. We need a new checkpoint for Command(update=...)\n // or Command(goto=...) in case the result of Command(goto=...)\n // is an interrupt. If not done, the checkpoint containing the\n // interrupt will be lost.\n await this._putCheckpoint({ source: \"input\" });\n this.input = INPUT_DONE;\n }\n // Emit after any checkpoint persistence so the `checkpoint` envelope\n // on the values event points at the fork target for the emitted state.\n this._emitValuesWithCheckpointMeta(valuesOutput);\n } else {\n // map inputs to channel updates\n const inputWrites = await gatherIterator(mapInput(inputKeys, this.input));\n if (inputWrites.length > 0) {\n const discardTasks = _prepareNextTasks(\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n this.config,\n true,\n { step: this.step }\n );\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n (Object.values(discardTasks) as WritesProtocol[]).concat([\n {\n name: INPUT,\n writes: inputWrites as PendingWrite[],\n triggers: [],\n },\n ]),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // save input checkpoint\n await this._putCheckpoint({ source: \"input\" });\n\n this.input = INPUT_DONE;\n } else if (!(CONFIG_KEY_RESUMING in (this.config.configurable ?? {}))) {\n throw new EmptyInputError(\n `Received no input writes for ${JSON.stringify(inputKeys, null, 2)}`\n );\n } else {\n // done with input\n this.input = INPUT_DONE;\n }\n }\n if (!this.isNested) {\n this.config = patchConfigurable(this.config, {\n [CONFIG_KEY_RESUMING]: this.isResuming,\n });\n }\n }\n\n protected _emit(\n values: Array<\n [StreamMode, unknown] | [StreamMode, unknown, StreamChunkMeta | undefined]\n >\n ) {\n for (const entry of values) {\n const [mode, payload, meta] = entry as [\n StreamMode,\n unknown,\n StreamChunkMeta | undefined,\n ];\n if (this.stream.modes.has(mode)) {\n this.stream.push([this.checkpointNamespace, mode, payload, meta]);\n }\n\n // debug mode is a \"checkpoints\" or \"tasks\" wrapped in an object\n // TODO: consider deprecating this in 1.x\n if (\n (mode === \"checkpoints\" || mode === \"tasks\") &&\n this.stream.modes.has(\"debug\")\n ) {\n const step = mode === \"checkpoints\" ? this.step - 1 : this.step;\n const timestamp = new Date().toISOString();\n const type = (() => {\n if (mode === \"checkpoints\") {\n return \"checkpoint\";\n } else if (\n typeof payload === \"object\" &&\n payload != null &&\n \"result\" in payload\n ) {\n return \"task_result\";\n } else {\n return \"task\";\n }\n })();\n\n this.stream.push([\n this.checkpointNamespace,\n \"debug\",\n { step, type, timestamp, payload },\n ]);\n }\n }\n }\n\n /**\n * Build a {@link StreamChunkMeta} describing the currently active checkpoint.\n * Used to enrich `values` tuples with a lightweight fork pointer that\n * `streamEvents(..., { version: \"v3\" })` promotes to a companion\n * `checkpoints` event (emitted immediately before its paired `values`).\n * This envelope backs branching / time-travel UIs\n * (`useMessageMetadata(msg.id).parentCheckpointId`). Returns `undefined`\n * if no checkpoint metadata is available yet (no checkpointer\n * configured, or first superstep before the input checkpoint lands).\n */\n protected _currentCheckpointMeta(): StreamChunkMeta | undefined {\n if (!this.checkpointMetadata || !this.checkpoint?.id) return undefined;\n const parent_id = this.prevCheckpointConfig?.configurable?.checkpoint_id as\n | string\n | undefined;\n return {\n checkpoint: {\n id: this.checkpoint.id,\n ...(parent_id ? { parent_id } : {}),\n step: this.checkpointMetadata.step,\n source: this.checkpointMetadata.source,\n },\n };\n }\n\n /**\n * Emit the given stream entries, attaching the current checkpoint meta to\n * every `\"values\"` entry. Callers MUST invoke this after the checkpoint\n * corresponding to the emitted state has been created (typically via\n * `_putCheckpoint`), so the attached `id` points at the fork target that\n * captures the emitted state.\n */\n protected _emitValuesWithCheckpointMeta(\n entries: [StreamMode, unknown][]\n ): void {\n const meta = this._currentCheckpointMeta();\n if (!meta) {\n this._emit(entries);\n return;\n }\n this._emit(\n entries.map(([mode, payload]) =>\n mode === \"values\" ? [mode, payload, meta] : [mode, payload]\n )\n );\n }\n\n protected _putCheckpoint(\n inputMetadata: Omit<CheckpointMetadata, \"step\" | \"parents\">\n ) {\n const exiting = this.checkpointMetadata === inputMetadata;\n\n const doCheckpoint =\n this.checkpointer != null && (this.durability !== \"exit\" || exiting);\n\n const storeCheckpoint = (checkpoint: Checkpoint) => {\n // store the previous checkpoint config for debug events\n this.prevCheckpointConfig = this.checkpointConfig?.configurable\n ?.checkpoint_id\n ? this.checkpointConfig\n : undefined;\n\n // child graphs keep at most one checkpoint per parent checkpoint\n // this is achieved by writing child checkpoints as progress is made\n // (so that error recovery / resuming from interrupt don't lose work)\n // but doing so always with an id equal to that of the parent checkpoint\n this.checkpointConfig = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]:\n this.config.configurable?.checkpoint_ns ?? \"\",\n });\n\n const channelVersions = { ...this.checkpoint.channel_versions };\n const newVersions = getNewChannelVersions(\n this.checkpointPreviousVersions,\n channelVersions\n );\n this.checkpointPreviousVersions = channelVersions;\n // save it, without blocking\n // if there's a previous checkpoint save in progress, wait for it\n // ensuring checkpointers receive checkpoints in order\n void this._checkpointerPutAfterPrevious({\n config: { ...this.checkpointConfig },\n checkpoint: copyCheckpoint(checkpoint),\n metadata: { ...this.checkpointMetadata },\n newVersions,\n });\n this.checkpointConfig = {\n ...this.checkpointConfig,\n configurable: {\n ...this.checkpointConfig.configurable,\n checkpoint_id: this.checkpoint.id,\n },\n };\n };\n\n if (!exiting) {\n this.checkpointMetadata = {\n ...inputMetadata,\n step: this.step,\n parents: this.config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] ?? {},\n };\n }\n\n // create new checkpoint\n this.checkpoint = createCheckpoint(\n this.checkpoint,\n doCheckpoint ? this.channels : undefined,\n this.step,\n exiting ? { id: this.checkpoint.id } : undefined\n );\n\n // Bail if no checkpointer\n if (doCheckpoint) storeCheckpoint(this.checkpoint);\n\n if (!exiting) {\n // increment step\n this.step += 1;\n }\n }\n\n protected _flushPendingWrites() {\n if (this.checkpointer == null) return;\n if (this.checkpointPendingWrites.length === 0) return;\n\n // patch config\n const config = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id,\n });\n\n // group writes by task id\n const byTask: Record<string, PendingWrite<string>[]> = {};\n for (const [tid, key, value] of this.checkpointPendingWrites) {\n byTask[tid] ??= [];\n byTask[tid].push([key, value]);\n }\n\n // submit writes to checkpointer\n for (const [tid, ws] of Object.entries(byTask)) {\n this._trackCheckpointerPromise(\n this.checkpointer.putWrites(config, ws, tid)\n );\n }\n }\n\n protected _matchWrites(\n tasks: Record<string, PregelExecutableTask<string, string>>\n ) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (k === ERROR || k === INTERRUPT || k === RESUME) {\n continue;\n }\n const task = Object.values(tasks).find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n for (const task of Object.values(tasks)) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"loop.js","names":[],"sources":["../../src/pregel/loop.ts"],"sourcesContent":["import type { RunnableConfig } from \"@langchain/core/runnables\";\nimport type { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport {\n BaseCheckpointSaver,\n Checkpoint,\n CheckpointTuple,\n copyCheckpoint,\n emptyCheckpoint,\n PendingWrite,\n CheckpointPendingWrite,\n CheckpointMetadata,\n All,\n BaseStore,\n AsyncBatchedStore,\n WRITES_IDX_MAP,\n BaseCache,\n CacheFullKey,\n CacheNamespace,\n} from \"@langchain/langgraph-checkpoint\";\n\nimport {\n BaseChannel,\n createCheckpoint,\n emptyChannels,\n} from \"../channels/base.js\";\nimport type {\n Call,\n CallTaskPath,\n Durability,\n PregelExecutableTask,\n PregelScratchpad,\n StreamMode,\n} from \"./types.js\";\nimport {\n isCommand,\n _isSend,\n CHECKPOINT_NAMESPACE_SEPARATOR,\n Command,\n CONFIG_KEY_CHECKPOINT_MAP,\n CONFIG_KEY_READ,\n CONFIG_KEY_RESUMING,\n CONFIG_KEY_STREAM,\n ERROR,\n INPUT,\n INTERRUPT,\n NULL_TASK_ID,\n RESUME,\n TAG_HIDDEN,\n TASKS,\n PUSH,\n CONFIG_KEY_SCRATCHPAD,\n CONFIG_KEY_CHECKPOINT_NS,\n CHECKPOINT_NAMESPACE_END,\n CONFIG_KEY_CHECKPOINT_ID,\n CONFIG_KEY_RESUME_MAP,\n START,\n} from \"../constants.js\";\nimport {\n _applyWrites,\n _prepareNextTasks,\n _prepareSingleTask,\n increment,\n shouldInterrupt,\n sanitizeUntrackedValuesInSend,\n WritesProtocol,\n} from \"./algo.js\";\nimport {\n gatherIterator,\n gatherIteratorSync,\n prefixGenerator,\n} from \"../utils.js\";\nimport {\n mapCommand,\n mapInput,\n mapOutputUpdates,\n mapOutputValues,\n readChannels,\n} from \"./io.js\";\nimport {\n EmptyInputError,\n GraphInterrupt,\n isGraphInterrupt,\n} from \"../errors.js\";\nimport { getNewChannelVersions, patchConfigurable } from \"./utils/index.js\";\nimport {\n mapDebugTasks,\n mapDebugCheckpoint,\n mapDebugTaskResults,\n printStepTasks,\n} from \"./debug.js\";\nimport { PregelNode } from \"./read.js\";\nimport { LangGraphRunnableConfig } from \"./runnable_types.js\";\nimport {\n createDuplexStream,\n IterableReadableWritableStream,\n StreamChunkMeta,\n} from \"./stream.js\";\nimport { isXXH3 } from \"../hash.js\";\n\nconst INPUT_DONE = Symbol.for(\"INPUT_DONE\");\nconst INPUT_RESUMING = Symbol.for(\"INPUT_RESUMING\");\nconst DEFAULT_LOOP_LIMIT = 25;\n\nexport type PregelLoopInitializeParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any | Command;\n config: RunnableConfig;\n checkpointer?: BaseCheckpointSaver;\n outputKeys: string | string[];\n streamKeys: string | string[];\n nodes: Record<string, PregelNode>;\n channelSpecs: Record<string, BaseChannel>;\n stream: IterableReadableWritableStream;\n store?: BaseStore;\n cache?: BaseCache<PendingWrite<string>[]>;\n interruptAfter: string[] | All;\n interruptBefore: string[] | All;\n durability: Durability;\n manager?: CallbackManagerForChainRun;\n debug: boolean;\n triggerToNodes: Record<string, string[]>;\n};\n\ntype PregelLoopParams = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n input?: any | Command;\n config: RunnableConfig;\n checkpointer?: BaseCheckpointSaver;\n checkpoint: Checkpoint;\n checkpointMetadata: CheckpointMetadata;\n checkpointPreviousVersions: Record<string, string | number>;\n checkpointPendingWrites: CheckpointPendingWrite[];\n checkpointConfig: RunnableConfig;\n channels: Record<string, BaseChannel>;\n step: number;\n stop: number;\n outputKeys: string | string[];\n streamKeys: string | string[];\n nodes: Record<string, PregelNode>;\n checkpointNamespace: string[];\n skipDoneTasks: boolean;\n isNested: boolean;\n manager?: CallbackManagerForChainRun;\n stream: IterableReadableWritableStream;\n store?: AsyncBatchedStore;\n cache?: BaseCache<PendingWrite<string>[]>;\n prevCheckpointConfig: RunnableConfig | undefined;\n interruptAfter: string[] | All;\n interruptBefore: string[] | All;\n durability: Durability;\n debug: boolean;\n triggerToNodes: Record<string, string[]>;\n};\n\nclass AsyncBatchedCache extends BaseCache<PendingWrite<string>[]> {\n protected cache: BaseCache<PendingWrite<string>[]>;\n\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(cache: BaseCache<unknown>) {\n super();\n this.cache = cache as BaseCache<PendingWrite<string>[]>;\n }\n\n async get(keys: CacheFullKey[]) {\n return this.enqueueOperation(\"get\", keys);\n }\n\n async set(\n pairs: {\n key: CacheFullKey;\n value: PendingWrite<string>[];\n ttl?: number;\n }[]\n ) {\n return this.enqueueOperation(\"set\", pairs);\n }\n\n async clear(namespaces: CacheNamespace[]) {\n return this.enqueueOperation(\"clear\", namespaces);\n }\n\n async stop() {\n await this.queue;\n }\n\n private enqueueOperation<Type extends \"get\" | \"set\" | \"clear\">(\n type: Type,\n ...args: Parameters<(typeof this.cache)[Type]>\n ) {\n const newPromise = this.queue.then(() => {\n // @ts-expect-error Tuple type warning\n return this.cache[type](...args) as Promise<\n ReturnType<(typeof this.cache)[Type]>\n >;\n });\n\n this.queue = newPromise.then(\n () => void 0,\n () => void 0\n );\n\n return newPromise;\n }\n}\n\nexport class PregelLoop {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected input?: any | Command;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n output: any;\n\n config: LangGraphRunnableConfig;\n\n protected checkpointer?: BaseCheckpointSaver;\n\n protected checkpointerGetNextVersion: (current: number | undefined) => number;\n\n channels: Record<string, BaseChannel>;\n\n protected checkpoint: Checkpoint;\n\n protected checkpointIdSaved: string | undefined;\n\n protected checkpointConfig: RunnableConfig;\n\n checkpointMetadata: CheckpointMetadata;\n\n protected checkpointNamespace: string[];\n\n protected checkpointPendingWrites: CheckpointPendingWrite[] = [];\n\n protected checkpointPreviousVersions: Record<string, string | number>;\n\n step: number;\n\n protected stop: number;\n\n protected durability: Durability;\n\n protected outputKeys: string | string[];\n\n protected streamKeys: string | string[];\n\n protected nodes: Record<string, PregelNode>;\n\n protected skipDoneTasks: boolean;\n\n protected prevCheckpointConfig: RunnableConfig | undefined;\n\n protected updatedChannels: Set<string> | undefined;\n\n status:\n | \"pending\"\n | \"done\"\n | \"interrupt_before\"\n | \"interrupt_after\"\n | \"out_of_steps\" = \"pending\";\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tasks: Record<string, PregelExecutableTask<any, any>> = {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n stream: IterableReadableWritableStream;\n\n checkpointerPromises: Set<Promise<unknown>> = new Set();\n\n isNested: boolean;\n\n protected _checkpointerChainedPromise: Promise<unknown> = Promise.resolve();\n\n /**\n * Track a checkpointer promise, removing it from the set on success.\n * Failed promises are kept so that Promise.all() in the finally block\n * of _streamIterator can surface the error.\n *\n * @internal\n */\n protected _trackCheckpointerPromise(promise: Promise<unknown>) {\n const tracked = promise.then(\n (value) => {\n this.checkpointerPromises.delete(tracked);\n return value;\n },\n (error) => {\n // Keep failed promises in the set so errors surface via Promise.all()\n throw error;\n }\n );\n this.checkpointerPromises.add(tracked);\n }\n\n store?: AsyncBatchedStore;\n\n cache?: AsyncBatchedCache;\n\n manager?: CallbackManagerForChainRun;\n\n interruptAfter: string[] | All;\n\n interruptBefore: string[] | All;\n\n toInterrupt: PregelExecutableTask<string, string>[] = [];\n\n debug: boolean = false;\n\n triggerToNodes: Record<string, string[]>;\n\n get isResuming() {\n let hasChannelVersions = false;\n if (START in this.checkpoint.channel_versions) {\n // For common channels, we can short-circuit the check\n hasChannelVersions = true;\n } else {\n for (const chan in this.checkpoint.channel_versions) {\n if (\n Object.prototype.hasOwnProperty.call(\n this.checkpoint.channel_versions,\n chan\n )\n ) {\n hasChannelVersions = true;\n break;\n }\n }\n }\n\n const configHasResumingFlag =\n this.config.configurable?.[CONFIG_KEY_RESUMING] !== undefined;\n const configIsResuming =\n configHasResumingFlag && this.config.configurable?.[CONFIG_KEY_RESUMING];\n\n const inputIsNullOrUndefined =\n this.input === null || this.input === undefined;\n const inputIsCommandResuming =\n isCommand(this.input) && this.input.resume != null;\n const inputIsResuming = this.input === INPUT_RESUMING;\n\n const runIdMatchesPrevious =\n !this.isNested &&\n this.config.metadata?.run_id !== undefined &&\n (this.checkpointMetadata as { run_id?: unknown })?.run_id !== undefined &&\n this.config.metadata.run_id ===\n (this.checkpointMetadata as { run_id?: unknown })?.run_id;\n\n return (\n hasChannelVersions &&\n (configIsResuming ||\n inputIsNullOrUndefined ||\n inputIsCommandResuming ||\n inputIsResuming ||\n runIdMatchesPrevious)\n );\n }\n\n constructor(params: PregelLoopParams) {\n this.input = params.input;\n this.checkpointer = params.checkpointer;\n // TODO: if managed values no longer needs graph we can replace with\n // managed_specs, channel_specs\n if (this.checkpointer !== undefined) {\n this.checkpointerGetNextVersion = this.checkpointer.getNextVersion.bind(\n this.checkpointer\n );\n } else {\n this.checkpointerGetNextVersion = increment;\n }\n this.checkpoint = params.checkpoint;\n this.checkpointMetadata = params.checkpointMetadata;\n this.checkpointPreviousVersions = params.checkpointPreviousVersions;\n this.channels = params.channels;\n this.checkpointPendingWrites = params.checkpointPendingWrites;\n this.step = params.step;\n this.stop = params.stop;\n this.config = params.config;\n this.checkpointConfig = params.checkpointConfig;\n this.isNested = params.isNested;\n this.manager = params.manager;\n this.outputKeys = params.outputKeys;\n this.streamKeys = params.streamKeys;\n this.nodes = params.nodes;\n this.skipDoneTasks = params.skipDoneTasks;\n this.store = params.store;\n this.cache = params.cache ? new AsyncBatchedCache(params.cache) : undefined;\n this.stream = params.stream;\n this.checkpointNamespace = params.checkpointNamespace;\n this.prevCheckpointConfig = params.prevCheckpointConfig;\n this.interruptAfter = params.interruptAfter;\n this.interruptBefore = params.interruptBefore;\n this.durability = params.durability;\n this.debug = params.debug;\n this.triggerToNodes = params.triggerToNodes;\n }\n\n static async initialize(params: PregelLoopInitializeParams) {\n let { config, stream } = params;\n if (\n stream !== undefined &&\n config.configurable?.[CONFIG_KEY_STREAM] !== undefined\n ) {\n stream = createDuplexStream(\n stream,\n config.configurable[CONFIG_KEY_STREAM]\n );\n }\n const skipDoneTasks = config.configurable\n ? !(\"checkpoint_id\" in config.configurable)\n : true;\n\n const scratchpad = config.configurable?.[CONFIG_KEY_SCRATCHPAD] as\n | PregelScratchpad\n | undefined;\n\n if (config.configurable && scratchpad) {\n if (scratchpad.subgraphCounter > 0) {\n config = patchConfigurable(config, {\n [CONFIG_KEY_CHECKPOINT_NS]: [\n config.configurable[CONFIG_KEY_CHECKPOINT_NS],\n scratchpad.subgraphCounter.toString(),\n ].join(CHECKPOINT_NAMESPACE_SEPARATOR),\n });\n }\n\n scratchpad.subgraphCounter += 1;\n }\n\n const isNested = CONFIG_KEY_READ in (config.configurable ?? {});\n if (\n !isNested &&\n config.configurable?.checkpoint_ns !== undefined &&\n config.configurable?.checkpoint_ns !== \"\"\n ) {\n config = patchConfigurable(config, {\n checkpoint_ns: \"\",\n checkpoint_id: undefined,\n });\n }\n let checkpointConfig = config;\n if (\n config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] !== undefined &&\n config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP]?.[\n config.configurable?.checkpoint_ns\n ]\n ) {\n checkpointConfig = patchConfigurable(config, {\n checkpoint_id:\n config.configurable[CONFIG_KEY_CHECKPOINT_MAP][\n config.configurable?.checkpoint_ns\n ],\n });\n }\n const checkpointNamespace =\n config.configurable?.checkpoint_ns?.split(\n CHECKPOINT_NAMESPACE_SEPARATOR\n ) ?? [];\n\n const saved: CheckpointTuple = (await params.checkpointer?.getTuple(\n checkpointConfig\n )) ?? {\n config,\n checkpoint: emptyCheckpoint(),\n metadata: { source: \"input\", step: -2, parents: {} },\n pendingWrites: [],\n };\n checkpointConfig = {\n ...config,\n ...saved.config,\n configurable: {\n checkpoint_ns: \"\",\n ...config.configurable,\n ...saved.config.configurable,\n },\n };\n const prevCheckpointConfig = saved.parentConfig;\n const checkpoint = copyCheckpoint(saved.checkpoint);\n const checkpointMetadata = { ...saved.metadata } as CheckpointMetadata;\n const checkpointPendingWrites = saved.pendingWrites ?? [];\n\n const channels = emptyChannels(params.channelSpecs, checkpoint);\n\n const step = (checkpointMetadata.step ?? 0) + 1;\n const stop = step + (config.recursionLimit ?? DEFAULT_LOOP_LIMIT) + 1;\n const checkpointPreviousVersions = { ...checkpoint.channel_versions };\n\n const store = params.store\n ? new AsyncBatchedStore(params.store)\n : undefined;\n\n if (store) {\n // Start the store. This is a batch store, so it will run continuously\n await store.start();\n }\n return new PregelLoop({\n input: params.input,\n config,\n checkpointer: params.checkpointer,\n checkpoint,\n checkpointMetadata,\n checkpointConfig,\n prevCheckpointConfig,\n checkpointNamespace,\n channels,\n isNested,\n manager: params.manager,\n skipDoneTasks,\n step,\n stop,\n checkpointPreviousVersions,\n checkpointPendingWrites,\n outputKeys: params.outputKeys ?? [],\n streamKeys: params.streamKeys ?? [],\n nodes: params.nodes,\n stream,\n store,\n cache: params.cache,\n interruptAfter: params.interruptAfter,\n interruptBefore: params.interruptBefore,\n durability: params.durability,\n debug: params.debug,\n triggerToNodes: params.triggerToNodes,\n });\n }\n\n protected _checkpointerPutAfterPrevious(input: {\n config: RunnableConfig;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n newVersions: Record<string, string | number>;\n }) {\n this._checkpointerChainedPromise = this._checkpointerChainedPromise.then(\n () => {\n return this.checkpointer?.put(\n input.config,\n input.checkpoint,\n input.metadata,\n input.newVersions\n );\n }\n );\n this._trackCheckpointerPromise(this._checkpointerChainedPromise);\n }\n\n /**\n * Put writes for a task, to be read by the next tick.\n * @param taskId\n * @param writes\n */\n putWrites(taskId: string, writes: PendingWrite<string>[]) {\n let writesCopy = writes;\n if (writesCopy.length === 0) return;\n\n // deduplicate writes to special channels, last write wins\n if (writesCopy.every(([key]) => key in WRITES_IDX_MAP)) {\n writesCopy = Array.from(\n new Map(writesCopy.map((w) => [w[0], w])).values()\n );\n }\n\n // Check if any channels are UntrackedValue (manual loop for perf)\n let hasUntrackedChannels = false;\n for (const key in this.channels) {\n if (Object.prototype.hasOwnProperty.call(this.channels, key)) {\n const channel = this.channels[key];\n if (channel.lc_graph_name === \"UntrackedValue\") {\n hasUntrackedChannels = true;\n break;\n }\n }\n }\n\n // Sanitize writes for checkpointing: remove UntrackedValue writes and sanitize Send packets\n let writesToSave = writesCopy;\n if (hasUntrackedChannels) {\n writesToSave = writesCopy\n .filter(([c]) => {\n // Don't persist UntrackedValue channel writes\n const channel = this.channels[c];\n return !channel || channel.lc_graph_name !== \"UntrackedValue\";\n })\n .map(([c, v]) => {\n // Sanitize UntrackedValues nested within Send packets\n if (c === TASKS && _isSend(v)) {\n return [c, sanitizeUntrackedValuesInSend(v, this.channels)] as [\n string,\n unknown,\n ];\n }\n return [c, v] as [string, unknown];\n });\n }\n\n // remove existing writes for this task\n this.checkpointPendingWrites = this.checkpointPendingWrites.filter(\n (w) => w[0] !== taskId\n );\n\n // save writes\n for (const [c, v] of writesToSave) {\n this.checkpointPendingWrites.push([taskId, c, v]);\n }\n\n const config = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id,\n });\n\n if (this.durability !== \"exit\" && this.checkpointer != null) {\n this._trackCheckpointerPromise(\n // Use sanitized writes for checkpointer\n this.checkpointer.putWrites(config, writesToSave, taskId)\n );\n }\n\n if (this.tasks) {\n this._outputWrites(taskId, writesCopy);\n }\n\n if (!writes.length || !this.cache || !this.tasks) {\n return;\n }\n\n // only cache tasks with a cache key\n const task = this.tasks[taskId];\n if (task == null || task.cache_key == null) {\n return;\n }\n\n // only cache successful tasks\n if (writes[0][0] === ERROR || writes[0][0] === INTERRUPT) {\n return;\n }\n\n void this.cache.set([\n {\n key: [task.cache_key.ns, task.cache_key.key],\n value: task.writes,\n ttl: task.cache_key.ttl,\n },\n ]);\n }\n\n _outputWrites(taskId: string, writes: [string, unknown][], cached = false) {\n const task = this.tasks[taskId];\n if (task !== undefined) {\n if (\n task.config !== undefined &&\n (task.config.tags ?? []).includes(TAG_HIDDEN)\n ) {\n return;\n }\n\n if (writes.length > 0) {\n if (writes[0][0] === INTERRUPT) {\n // in `algo.ts` we append a bool to the task path to indicate\n // whether or not a call was present. If so, we don't emit the\n // the interrupt as it'll be emitted by the parent.\n if (\n task.path?.[0] === PUSH &&\n task.path?.[task.path.length - 1] === true\n )\n return;\n\n const interruptWrites = writes\n .filter((w) => w[0] === INTERRUPT)\n .flatMap((w) => w[1] as string[]);\n\n this._emit([\n [\"updates\", { [INTERRUPT]: interruptWrites }],\n [\"values\", { [INTERRUPT]: interruptWrites }],\n ]);\n } else if (writes[0][0] !== ERROR) {\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapOutputUpdates(this.outputKeys, [[task, writes]], cached),\n \"updates\"\n )\n )\n );\n }\n }\n if (!cached) {\n this._emit(\n gatherIteratorSync(\n prefixGenerator(\n mapDebugTaskResults([[task, writes]], this.streamKeys),\n \"tasks\"\n )\n )\n );\n }\n }\n }\n\n async _matchCachedWrites() {\n if (!this.cache) return [];\n\n const matched: {\n task: PregelExecutableTask<string, string>;\n result: unknown;\n }[] = [];\n\n const serializeKey = ([ns, key]: CacheFullKey) => {\n return `ns:${ns.join(\",\")}|key:${key}`;\n };\n\n const keys: CacheFullKey[] = [];\n const keyMap: Record<string, PregelExecutableTask<string, string>> = {};\n\n for (const task of Object.values(this.tasks)) {\n if (task.cache_key != null && !task.writes.length) {\n keys.push([task.cache_key.ns, task.cache_key.key]);\n keyMap[serializeKey([task.cache_key.ns, task.cache_key.key])] = task;\n }\n }\n\n if (keys.length === 0) return [];\n const cache = await this.cache.get(keys);\n\n for (const { key, value } of cache) {\n const task = keyMap[serializeKey(key)];\n if (task != null) {\n // update the task with the cached writes\n task.writes.push(...value);\n matched.push({ task, result: value });\n }\n }\n\n return matched;\n }\n\n /**\n * Execute a single iteration of the Pregel loop.\n * Returns true if more iterations are needed.\n * @param params\n */\n async tick(params: { inputKeys?: string | string[] }): Promise<boolean> {\n if (this.store && !this.store.isRunning) {\n await this.store?.start();\n }\n const { inputKeys = [] } = params;\n if (this.status !== \"pending\") {\n throw new Error(\n `Cannot tick when status is no longer \"pending\". Current status: \"${this.status}\"`\n );\n }\n if (![INPUT_DONE, INPUT_RESUMING].includes(this.input)) {\n await this._first(inputKeys);\n } else if (this.toInterrupt.length > 0) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n } else if (\n Object.values(this.tasks).every((task) => task.writes.length > 0)\n ) {\n // finish superstep\n const writes = Object.values(this.tasks).flatMap((t) => t.writes);\n // All tasks have finished\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n Object.values(this.tasks),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, writes, this.channels),\n \"values\"\n )\n );\n // clear pending writes\n this.checkpointPendingWrites = [];\n // persist the new checkpoint BEFORE emitting values, so the\n // attached `checkpoint` envelope on the values event points at\n // the fork target that captures this superstep's final state.\n await this._putCheckpoint({ source: \"loop\" });\n this._emitValuesWithCheckpointMeta(valuesOutput);\n // after execution, check if we should interrupt\n if (\n shouldInterrupt(\n this.checkpoint,\n this.interruptAfter,\n Object.values(this.tasks)\n )\n ) {\n this.status = \"interrupt_after\";\n throw new GraphInterrupt();\n }\n\n // unset resuming flag\n if (this.config.configurable?.[CONFIG_KEY_RESUMING] !== undefined) {\n delete this.config.configurable?.[CONFIG_KEY_RESUMING];\n }\n } else {\n return false;\n }\n if (this.step > this.stop) {\n this.status = \"out_of_steps\";\n return false;\n }\n\n const nextTasks = _prepareNextTasks(\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n this.config,\n true,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n isResuming: this.isResuming,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n triggerToNodes: this.triggerToNodes,\n updatedChannels: this.updatedChannels,\n }\n );\n this.tasks = nextTasks;\n\n // Produce debug output\n if (this.checkpointer) {\n this._emit(\n await gatherIterator(\n prefixGenerator(\n mapDebugCheckpoint(\n this.checkpointConfig,\n this.channels,\n this.streamKeys,\n this.checkpointMetadata,\n Object.values(this.tasks),\n this.checkpointPendingWrites,\n this.prevCheckpointConfig,\n this.outputKeys\n ),\n \"checkpoints\"\n )\n )\n );\n }\n\n if (Object.values(this.tasks).length === 0) {\n this.status = \"done\";\n return false;\n }\n // if there are pending writes from a previous loop, apply them\n if (this.skipDoneTasks && this.checkpointPendingWrites.length > 0) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (k === ERROR || k === INTERRUPT || k === RESUME) {\n continue;\n }\n const task = Object.values(this.tasks).find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n for (const task of Object.values(this.tasks)) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\n }\n }\n }\n // if all tasks have finished, re-tick\n if (Object.values(this.tasks).every((task) => task.writes.length > 0)) {\n return this.tick({ inputKeys });\n }\n\n // Before execution, check if we should interrupt\n if (\n shouldInterrupt(\n this.checkpoint,\n this.interruptBefore,\n Object.values(this.tasks)\n )\n ) {\n this.status = \"interrupt_before\";\n throw new GraphInterrupt();\n }\n\n // Produce debug output\n const debugOutput = await gatherIterator(\n prefixGenerator(mapDebugTasks(Object.values(this.tasks)), \"tasks\")\n );\n this._emit(debugOutput);\n\n return true;\n }\n\n async finishAndHandleError(error?: Error) {\n // persist current checkpoint and writes\n if (\n this.durability === \"exit\" &&\n // if it's a top graph\n (!this.isNested ||\n // or a nested graph with error or interrupt\n typeof error !== \"undefined\" ||\n // or a nested graph with checkpointer: true\n this.checkpointNamespace.every(\n (part) => !part.includes(CHECKPOINT_NAMESPACE_END)\n ))\n ) {\n this._putCheckpoint(this.checkpointMetadata);\n this._flushPendingWrites();\n }\n\n const suppress = this._suppressInterrupt(error);\n if (suppress || error === undefined) {\n this.output = readChannels(this.channels, this.outputKeys);\n }\n if (suppress) {\n // emit one last \"values\" event, with pending writes applied\n if (\n this.tasks !== undefined &&\n this.checkpointPendingWrites.length > 0 &&\n Object.values(this.tasks).some((task) => task.writes.length > 0)\n ) {\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n Object.values(this.tasks),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n\n this._emitValuesWithCheckpointMeta(\n gatherIteratorSync(\n prefixGenerator(\n mapOutputValues(\n this.outputKeys,\n Object.values(this.tasks).flatMap((t) => t.writes),\n this.channels\n ),\n \"values\"\n )\n )\n );\n }\n\n // Emit INTERRUPT event (not a state snapshot — no checkpoint envelope)\n if (isGraphInterrupt(error) && !error.interrupts.length) {\n this._emit([\n [\"updates\", { [INTERRUPT]: [] }],\n [\"values\", { [INTERRUPT]: [] }],\n ]);\n }\n }\n return suppress;\n }\n\n async acceptPush(\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ): Promise<PregelExecutableTask<string, string> | void> {\n if (\n this.interruptAfter?.length > 0 &&\n shouldInterrupt(this.checkpoint, this.interruptAfter, [task])\n ) {\n this.toInterrupt.push(task);\n return;\n }\n\n const pushed = _prepareSingleTask(\n [PUSH, task.path ?? [], writeIdx, task.id, call] as CallTaskPath,\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n task.config ?? {},\n true,\n {\n step: this.step,\n checkpointer: this.checkpointer,\n manager: this.manager,\n store: this.store,\n stream: this.stream,\n }\n );\n\n if (!pushed) return;\n if (\n this.interruptBefore?.length > 0 &&\n shouldInterrupt(this.checkpoint, this.interruptBefore, [pushed])\n ) {\n this.toInterrupt.push(pushed);\n return;\n }\n\n this._emit(\n gatherIteratorSync(prefixGenerator(mapDebugTasks([pushed]), \"tasks\"))\n );\n\n if (this.debug) printStepTasks(this.step, [pushed]);\n this.tasks[pushed.id] = pushed;\n if (this.skipDoneTasks) this._matchWrites({ [pushed.id]: pushed });\n\n const tasks = await this._matchCachedWrites();\n for (const { task } of tasks) {\n this._outputWrites(task.id, task.writes, true);\n }\n\n return pushed;\n }\n\n protected _suppressInterrupt(e?: Error): boolean {\n return isGraphInterrupt(e) && !this.isNested;\n }\n\n protected async _first(inputKeys: string | string[]) {\n /*\n * Resuming from previous checkpoint requires\n * - finding a previous checkpoint\n * - receiving null input (outer graph) or RESUMING flag (subgraph)\n */\n\n const { configurable } = this.config;\n\n // take resume value from parent\n const scratchpad = configurable?.[\n CONFIG_KEY_SCRATCHPAD\n ] as PregelScratchpad;\n\n if (scratchpad && scratchpad.nullResume !== undefined) {\n this.putWrites(NULL_TASK_ID, [[RESUME, scratchpad.nullResume]]);\n }\n\n // map command to writes\n if (isCommand(this.input)) {\n const hasResume = this.input.resume != null;\n\n if (\n this.input.resume != null &&\n typeof this.input.resume === \"object\" &&\n Object.keys(this.input.resume).every(isXXH3)\n ) {\n this.config.configurable ??= {};\n this.config.configurable[CONFIG_KEY_RESUME_MAP] = this.input.resume;\n }\n\n if (hasResume && this.checkpointer == null) {\n throw new Error(\"Cannot use Command(resume=...) without checkpointer\");\n }\n\n const writes: { [key: string]: PendingWrite[] } = {};\n\n // group writes by task id\n for (const [tid, key, value] of mapCommand(\n this.input,\n this.checkpointPendingWrites\n )) {\n writes[tid] ??= [];\n writes[tid].push([key, value]);\n }\n if (Object.keys(writes).length === 0) {\n throw new EmptyInputError(\"Received empty Command input\");\n }\n\n // save writes\n for (const [tid, ws] of Object.entries(writes)) {\n this.putWrites(tid, ws);\n }\n }\n\n // apply null writes\n const nullWrites = (this.checkpointPendingWrites ?? [])\n .filter((w) => w[0] === NULL_TASK_ID)\n .map((w) => w.slice(1)) as PendingWrite<string>[];\n if (nullWrites.length > 0) {\n _applyWrites(\n this.checkpoint,\n this.channels,\n [\n {\n name: INPUT,\n writes: nullWrites,\n triggers: [],\n },\n ],\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n }\n const isCommandUpdateOrGoto =\n isCommand(this.input) && nullWrites.length > 0;\n if (this.isResuming || isCommandUpdateOrGoto) {\n for (const channelName in this.channels) {\n if (!Object.prototype.hasOwnProperty.call(this.channels, channelName))\n continue;\n if (this.checkpoint.channel_versions[channelName] !== undefined) {\n const version = this.checkpoint.channel_versions[channelName];\n this.checkpoint.versions_seen[INTERRUPT] = {\n ...this.checkpoint.versions_seen[INTERRUPT],\n [channelName]: version,\n };\n }\n }\n // produce values output\n const valuesOutput = await gatherIterator(\n prefixGenerator(\n mapOutputValues(this.outputKeys, true, this.channels),\n \"values\"\n )\n );\n // Preserve the original `isResuming`-first priority: when both\n // `isResuming` and `isCommandUpdateOrGoto` are true (resuming from\n // an interrupt with a Command update/goto), the resume path wins\n // and no new input checkpoint is created here.\n if (this.isResuming) {\n this.input = INPUT_RESUMING;\n } else if (isCommandUpdateOrGoto) {\n // Persist the input checkpoint BEFORE emitting values so the\n // attached `checkpoint` envelope points at the just-created\n // fork target. We need a new checkpoint for Command(update=...)\n // or Command(goto=...) in case the result of Command(goto=...)\n // is an interrupt. If not done, the checkpoint containing the\n // interrupt will be lost.\n await this._putCheckpoint({ source: \"input\" });\n this.input = INPUT_DONE;\n }\n // Emit after any checkpoint persistence so the `checkpoint` envelope\n // on the values event points at the fork target for the emitted state.\n this._emitValuesWithCheckpointMeta(valuesOutput);\n } else {\n // map inputs to channel updates\n const inputWrites = await gatherIterator(mapInput(inputKeys, this.input));\n if (inputWrites.length > 0) {\n const discardTasks = _prepareNextTasks(\n this.checkpoint,\n this.checkpointPendingWrites,\n this.nodes,\n this.channels,\n this.config,\n true,\n { step: this.step }\n );\n this.updatedChannels = _applyWrites(\n this.checkpoint,\n this.channels,\n (Object.values(discardTasks) as WritesProtocol[]).concat([\n {\n name: INPUT,\n writes: inputWrites as PendingWrite[],\n triggers: [],\n },\n ]),\n this.checkpointerGetNextVersion,\n this.triggerToNodes\n );\n // save input checkpoint\n await this._putCheckpoint({ source: \"input\" });\n\n this.input = INPUT_DONE;\n } else if (!(CONFIG_KEY_RESUMING in (this.config.configurable ?? {}))) {\n throw new EmptyInputError(\n `Received no input writes for ${JSON.stringify(inputKeys, null, 2)}`\n );\n } else {\n // done with input\n this.input = INPUT_DONE;\n }\n }\n if (!this.isNested) {\n this.config = patchConfigurable(this.config, {\n [CONFIG_KEY_RESUMING]: this.isResuming,\n });\n }\n }\n\n protected _emit(values: Array<[StreamMode, unknown]>) {\n for (const [mode, payload] of values) {\n if (this.stream.modes.has(mode)) {\n this.stream.push([this.checkpointNamespace, mode, payload]);\n }\n\n // debug mode is a \"checkpoints\" or \"tasks\" wrapped in an object\n // TODO: consider deprecating this in 1.x\n if (\n (mode === \"checkpoints\" || mode === \"tasks\") &&\n this.stream.modes.has(\"debug\")\n ) {\n const step = mode === \"checkpoints\" ? this.step - 1 : this.step;\n const timestamp = new Date().toISOString();\n const type = (() => {\n if (mode === \"checkpoints\") {\n return \"checkpoint\";\n } else if (\n typeof payload === \"object\" &&\n payload != null &&\n \"result\" in payload\n ) {\n return \"task_result\";\n } else {\n return \"task\";\n }\n })();\n\n this.stream.push([\n this.checkpointNamespace,\n \"debug\",\n { step, type, timestamp, payload },\n ]);\n }\n }\n }\n\n /**\n * Build a {@link StreamChunkMeta} describing the currently active checkpoint.\n * Emitted as a separate ``[namespace, \"checkpoints\", envelope]`` chunk before\n * the paired ``values`` chunk. Returns `undefined` if no checkpoint metadata\n * is available yet.\n */\n protected _currentCheckpointMeta(): StreamChunkMeta | undefined {\n if (!this.checkpointMetadata || !this.checkpoint?.id) return undefined;\n const parent_id = this.prevCheckpointConfig?.configurable?.checkpoint_id as\n | string\n | undefined;\n return {\n checkpoint: {\n id: this.checkpoint.id,\n ...(parent_id ? { parent_id } : {}),\n step: this.checkpointMetadata.step,\n source: this.checkpointMetadata.source,\n },\n };\n }\n\n /**\n * Emit stream entries. When checkpoint meta is available, push a lightweight\n * ``[namespace, \"checkpoints\", envelope]`` chunk before each ``values`` chunk.\n */\n protected _emitValuesWithCheckpointMeta(\n entries: [StreamMode, unknown][]\n ): void {\n const meta = this._currentCheckpointMeta();\n for (const [mode, payload] of entries) {\n if (\n mode === \"values\" &&\n meta?.checkpoint != null &&\n !this.stream.modes.has(\"checkpoints\")\n ) {\n this.stream.push([\n this.checkpointNamespace,\n \"checkpoints\",\n meta.checkpoint,\n ]);\n }\n if (this.stream.modes.has(mode)) {\n this.stream.push([this.checkpointNamespace, mode, payload]);\n }\n }\n }\n\n protected _putCheckpoint(\n inputMetadata: Omit<CheckpointMetadata, \"step\" | \"parents\">\n ) {\n const exiting = this.checkpointMetadata === inputMetadata;\n\n const doCheckpoint =\n this.checkpointer != null && (this.durability !== \"exit\" || exiting);\n\n const storeCheckpoint = (checkpoint: Checkpoint) => {\n // store the previous checkpoint config for debug events\n this.prevCheckpointConfig = this.checkpointConfig?.configurable\n ?.checkpoint_id\n ? this.checkpointConfig\n : undefined;\n\n // child graphs keep at most one checkpoint per parent checkpoint\n // this is achieved by writing child checkpoints as progress is made\n // (so that error recovery / resuming from interrupt don't lose work)\n // but doing so always with an id equal to that of the parent checkpoint\n this.checkpointConfig = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]:\n this.config.configurable?.checkpoint_ns ?? \"\",\n });\n\n const channelVersions = { ...this.checkpoint.channel_versions };\n const newVersions = getNewChannelVersions(\n this.checkpointPreviousVersions,\n channelVersions\n );\n this.checkpointPreviousVersions = channelVersions;\n // save it, without blocking\n // if there's a previous checkpoint save in progress, wait for it\n // ensuring checkpointers receive checkpoints in order\n void this._checkpointerPutAfterPrevious({\n config: { ...this.checkpointConfig },\n checkpoint: copyCheckpoint(checkpoint),\n metadata: { ...this.checkpointMetadata },\n newVersions,\n });\n this.checkpointConfig = {\n ...this.checkpointConfig,\n configurable: {\n ...this.checkpointConfig.configurable,\n checkpoint_id: this.checkpoint.id,\n },\n };\n };\n\n if (!exiting) {\n this.checkpointMetadata = {\n ...inputMetadata,\n step: this.step,\n parents: this.config.configurable?.[CONFIG_KEY_CHECKPOINT_MAP] ?? {},\n };\n }\n\n // create new checkpoint\n this.checkpoint = createCheckpoint(\n this.checkpoint,\n doCheckpoint ? this.channels : undefined,\n this.step,\n exiting ? { id: this.checkpoint.id } : undefined\n );\n\n // Bail if no checkpointer\n if (doCheckpoint) storeCheckpoint(this.checkpoint);\n\n if (!exiting) {\n // increment step\n this.step += 1;\n }\n }\n\n protected _flushPendingWrites() {\n if (this.checkpointer == null) return;\n if (this.checkpointPendingWrites.length === 0) return;\n\n // patch config\n const config = patchConfigurable(this.checkpointConfig, {\n [CONFIG_KEY_CHECKPOINT_NS]: this.config.configurable?.checkpoint_ns ?? \"\",\n [CONFIG_KEY_CHECKPOINT_ID]: this.checkpoint.id,\n });\n\n // group writes by task id\n const byTask: Record<string, PendingWrite<string>[]> = {};\n for (const [tid, key, value] of this.checkpointPendingWrites) {\n byTask[tid] ??= [];\n byTask[tid].push([key, value]);\n }\n\n // submit writes to checkpointer\n for (const [tid, ws] of Object.entries(byTask)) {\n this._trackCheckpointerPromise(\n this.checkpointer.putWrites(config, ws, tid)\n );\n }\n }\n\n protected _matchWrites(\n tasks: Record<string, PregelExecutableTask<string, string>>\n ) {\n for (const [tid, k, v] of this.checkpointPendingWrites) {\n if (k === ERROR || k === INTERRUPT || k === RESUME) {\n continue;\n }\n const task = Object.values(tasks).find((t) => t.id === tid);\n if (task) {\n task.writes.push([k, v]);\n }\n }\n for (const task of Object.values(tasks)) {\n if (task.writes.length > 0) {\n this._outputWrites(task.id, task.writes, true);\n }\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/pregel/remote.cjs
CHANGED
|
@@ -239,7 +239,7 @@ var RemoteGraph = class extends _langchain_core_runnables.Runnable {
|
|
|
239
239
|
for await (const chunk of stream) lastValue = chunk;
|
|
240
240
|
return lastValue;
|
|
241
241
|
}
|
|
242
|
-
streamEvents(_input, _options) {
|
|
242
|
+
streamEvents(_input, _options, _streamOptions) {
|
|
243
243
|
throw new Error("Not implemented.");
|
|
244
244
|
}
|
|
245
245
|
async *_streamIterator(input, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.cjs","names":["BaseMessage","Runnable","Client","propagateConfigurableToMetadata","#prepareRunRequest","CONFIG_KEY_STREAM","isCommand","GraphInterrupt","INTERRUPT","RemoteException","DrawableGraph"],"sources":["../../src/pregel/remote.ts"],"sourcesContent":["import {\n Client,\n type Checkpoint,\n type ThreadState,\n} from \"@langchain/langgraph-sdk\";\nimport {\n Graph as DrawableGraph,\n Node as DrawableNode,\n} from \"@langchain/core/runnables/graph\";\nimport {\n mergeConfigs,\n Runnable,\n RunnableConfig,\n} from \"@langchain/core/runnables\";\nimport {\n All,\n CheckpointListOptions,\n CheckpointMetadata,\n} from \"@langchain/langgraph-checkpoint\";\nimport { StreamEvent } from \"@langchain/core/tracers/log_stream\";\nimport { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport { BaseMessage } from \"@langchain/core/messages\";\n\nimport {\n BaseChannel,\n GraphInterrupt,\n LangGraphRunnableConfig,\n RemoteException,\n} from \"../web.js\";\nimport { StrRecord } from \"./algo.js\";\nimport { PregelInputType, PregelOptions, PregelOutputType } from \"./index.js\";\nimport { PregelNode } from \"./read.js\";\nimport {\n PregelParams,\n PregelInterface,\n PregelTaskDescription,\n StateSnapshot,\n StreamMode,\n} from \"./types.js\";\nimport {\n CHECKPOINT_NAMESPACE_SEPARATOR,\n CONFIG_KEY_STREAM,\n INTERRUPT,\n isCommand,\n} from \"../constants.js\";\nimport { propagateConfigurableToMetadata } from \"./utils/config.js\";\n\nexport type RemoteGraphParams = Omit<\n PregelParams<StrRecord<string, PregelNode>, StrRecord<string, BaseChannel>>,\n \"channels\" | \"nodes\" | \"inputChannels\" | \"outputChannels\"\n> & {\n graphId: string;\n client?: Client;\n url?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n streamResumable?: boolean;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _serializeInputs = (obj: any): any => {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(_serializeInputs);\n }\n\n // Handle BaseMessage instances by converting them to a serializable format\n if (BaseMessage.isInstance(obj)) {\n const dict = obj.toDict();\n return {\n ...dict.data,\n role: obj.getType(),\n };\n }\n\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [key, _serializeInputs(value)])\n );\n};\n\n/**\n * Return a tuple of the final list of stream modes sent to the\n * remote graph and a boolean flag indicating if only one stream mode was\n * originally requested and whether stream mode 'updates'\n * was present in the original list of stream modes.\n *\n * 'updates' mode is always added to the list of stream modes so that interrupts\n * can be detected in the remote graph.\n */\nconst getStreamModes = (\n streamMode?: StreamMode | StreamMode[],\n defaultStreamMode: StreamMode = \"updates\"\n) => {\n const updatedStreamModes: StreamMode[] = [];\n let reqUpdates = false;\n let reqSingle = true;\n\n if (\n streamMode !== undefined &&\n (typeof streamMode === \"string\" ||\n (Array.isArray(streamMode) && streamMode.length > 0))\n ) {\n reqSingle = typeof streamMode === \"string\";\n const mapped = Array.isArray(streamMode) ? streamMode : [streamMode];\n updatedStreamModes.push(...mapped);\n } else {\n updatedStreamModes.push(defaultStreamMode);\n }\n if (updatedStreamModes.includes(\"updates\")) {\n reqUpdates = true;\n } else {\n updatedStreamModes.push(\"updates\");\n }\n return {\n updatedStreamModes,\n reqUpdates,\n reqSingle,\n };\n};\n\n/**\n * The `RemoteGraph` class is a client implementation for calling remote\n * APIs that implement the LangGraph Server API specification.\n *\n * For example, the `RemoteGraph` class can be used to call APIs from deployments\n * on LangSmith Deployment.\n *\n * `RemoteGraph` behaves the same way as a `StateGraph` and can be used directly as\n * a node in another `StateGraph`.\n *\n * @example\n * ```ts\n * import { RemoteGraph } from \"@langchain/langgraph/remote\";\n *\n * // Can also pass a LangGraph SDK client instance directly\n * const remoteGraph = new RemoteGraph({\n * graphId: process.env.LANGGRAPH_REMOTE_GRAPH_ID!,\n * apiKey: process.env.LANGGRAPH_REMOTE_GRAPH_API_KEY,\n * url: process.env.LANGGRAPH_REMOTE_GRAPH_API_URL,\n * });\n *\n * const input = {\n * messages: [\n * {\n * role: \"human\",\n * content: \"Hello world!\",\n * },\n * ],\n * };\n *\n * const config = {\n * configurable: { thread_id: \"threadId1\" },\n * };\n *\n * await remoteGraph.invoke(input, config);\n * ```\n */\nexport class RemoteGraph<\n Nn extends StrRecord<string, PregelNode> = StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel> = StrRecord<string, BaseChannel>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ContextType extends Record<string, any> = StrRecord<string, any>,\n>\n extends Runnable<\n PregelInputType,\n PregelOutputType,\n PregelOptions<Nn, Cc, ContextType>\n >\n implements PregelInterface<Nn, Cc, ContextType>\n{\n static lc_name() {\n return \"RemoteGraph\";\n }\n\n lc_namespace = [\"langgraph\", \"pregel\"];\n\n lg_is_pregel = true;\n\n config?: RunnableConfig;\n\n graphId: string;\n\n protected client: Client;\n\n protected interruptBefore?: Array<keyof Nn> | All;\n\n protected interruptAfter?: Array<keyof Nn> | All;\n\n protected streamResumable?: boolean;\n\n constructor(params: RemoteGraphParams) {\n super(params);\n\n this.graphId = params.graphId;\n this.client =\n params.client ??\n new Client({\n apiUrl: params.url,\n apiKey: params.apiKey,\n defaultHeaders: params.headers,\n });\n this.config = params.config;\n this.interruptBefore = params.interruptBefore;\n this.interruptAfter = params.interruptAfter;\n this.streamResumable = params.streamResumable;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Remove ignore when we remove support for 0.2 versions of core\n override withConfig(config: RunnableConfig): typeof this {\n const mergedConfig = mergeConfigs(this.config, config);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new (this.constructor as any)({ ...this, config: mergedConfig });\n }\n\n protected _sanitizeConfig(config: RunnableConfig) {\n const reservedConfigurableKeys = new Set([\n \"callbacks\",\n \"checkpoint_map\",\n \"checkpoint_id\",\n \"checkpoint_ns\",\n ]);\n\n const sanitizeObj = <T>(obj: T): T => {\n try {\n // This will only throw if we're trying to serialize a circular reference\n // or trying to serialize a BigInt...\n JSON.stringify(obj);\n return obj;\n } catch {\n const seen = new WeakSet();\n return JSON.parse(\n JSON.stringify(obj, (_, value) => {\n if (typeof value === \"object\" && value != null) {\n if (seen.has(value)) return \"[Circular]\";\n seen.add(value);\n }\n\n if (typeof value === \"bigint\") return value.toString();\n return value;\n })\n );\n }\n };\n\n const propagateMetadataDefaults = (obj: unknown) => {\n const seen = new WeakSet<object>();\n const visit = (value: unknown) => {\n if (typeof value !== \"object\" || value == null) {\n return;\n }\n if (seen.has(value)) {\n return;\n }\n seen.add(value);\n const record = value as Record<string, unknown>;\n const configurable = record.configurable;\n if (\n typeof configurable === \"object\" &&\n configurable != null &&\n !Array.isArray(configurable)\n ) {\n const metadata =\n typeof record.metadata === \"object\" &&\n record.metadata != null &&\n !Array.isArray(record.metadata)\n ? (record.metadata as Record<string, unknown>)\n : undefined;\n record.metadata =\n propagateConfigurableToMetadata(\n configurable as Record<string, unknown>,\n metadata\n ) ?? record.metadata;\n }\n for (const nestedValue of Object.values(record)) {\n visit(nestedValue);\n }\n };\n visit(obj);\n };\n\n propagateMetadataDefaults(config);\n\n // Remove non-JSON serializable fields from the config\n const sanitizedConfig = sanitizeObj(config);\n\n // Only include configurable keys that are not reserved and\n // not starting with \"__pregel_\" prefix\n const newConfigurable = Object.fromEntries(\n Object.entries(sanitizedConfig.configurable ?? {}).filter(\n ([k]) => !reservedConfigurableKeys.has(k) && !k.startsWith(\"__pregel_\")\n )\n );\n\n return {\n tags: sanitizedConfig.tags ?? [],\n metadata: sanitizedConfig.metadata ?? {},\n configurable: newConfigurable,\n recursion_limit: sanitizedConfig.recursionLimit,\n };\n }\n\n /**\n * Prepare config and thread ID for remote run API calls.\n *\n * `thread_id` is passed via the URL path, not in `config.configurable`, so the\n * server can accept a separate `context` payload for stateful runs.\n */\n #prepareRunRequest(mergedConfig: LangGraphRunnableConfig): {\n threadId: string | undefined;\n context: unknown;\n config: ReturnType<RemoteGraph[\"_sanitizeConfig\"]>;\n } {\n const context = mergedConfig.context;\n const sanitizedConfig = this._sanitizeConfig(mergedConfig);\n const configurable = { ...sanitizedConfig.configurable };\n const threadId = configurable.thread_id as string | undefined;\n delete configurable.thread_id;\n\n return {\n threadId,\n context,\n config: {\n ...sanitizedConfig,\n configurable,\n },\n };\n }\n\n protected _getConfig(checkpoint: Record<string, unknown>): RunnableConfig {\n return {\n configurable: {\n thread_id: checkpoint.thread_id,\n checkpoint_ns: checkpoint.checkpoint_ns,\n checkpoint_id: checkpoint.checkpoint_id,\n checkpoint_map: checkpoint.checkpoint_map ?? {},\n },\n };\n }\n\n protected _checkpointToConfig(\n checkpoint?: Partial<Checkpoint> | null,\n fallbackConfig?: RunnableConfig\n ): RunnableConfig {\n const resolvedCheckpoint =\n checkpoint ?? this._getCheckpoint(fallbackConfig);\n if (resolvedCheckpoint == null) {\n return { configurable: {} };\n }\n\n const configurable: Record<string, unknown> = {};\n if (resolvedCheckpoint.thread_id !== undefined) {\n configurable.thread_id = resolvedCheckpoint.thread_id;\n }\n if (resolvedCheckpoint.checkpoint_ns !== undefined) {\n configurable.checkpoint_ns = resolvedCheckpoint.checkpoint_ns;\n }\n if (resolvedCheckpoint.checkpoint_id !== undefined) {\n configurable.checkpoint_id = resolvedCheckpoint.checkpoint_id;\n }\n\n const hasCheckpointFields =\n resolvedCheckpoint.checkpoint_ns !== undefined ||\n resolvedCheckpoint.checkpoint_id !== undefined ||\n resolvedCheckpoint.checkpoint_map !== undefined;\n if (hasCheckpointFields) {\n configurable.checkpoint_map = resolvedCheckpoint.checkpoint_map ?? {};\n }\n\n return { configurable };\n }\n\n protected _getCheckpoint(config?: RunnableConfig): Checkpoint | undefined {\n if (config?.configurable === undefined) {\n return undefined;\n }\n\n const checkpointKeys = [\n \"thread_id\",\n \"checkpoint_ns\",\n \"checkpoint_id\",\n \"checkpoint_map\",\n ] as const;\n\n const checkpoint = Object.fromEntries(\n checkpointKeys\n .map((key) => [key, config.configurable![key]])\n .filter(([_, value]) => value !== undefined)\n );\n\n return Object.keys(checkpoint).length > 0 ? checkpoint : undefined;\n }\n\n protected _createStateSnapshot(\n state: ThreadState,\n fallbackConfig?: RunnableConfig\n ): StateSnapshot {\n const tasks: PregelTaskDescription[] = state.tasks.map((task) => {\n return {\n id: task.id,\n name: task.name,\n error: task.error ? { message: task.error } : undefined,\n // TODO: remove in LangGraph.js 0.4\n interrupts: task.interrupts.map(({ id, ...rest }) => ({\n interrupt_id: id,\n ...rest,\n })),\n // eslint-disable-next-line no-nested-ternary\n state: task.state\n ? this._createStateSnapshot(\n task.state,\n task.checkpoint\n ? this._checkpointToConfig(task.checkpoint)\n : fallbackConfig\n )\n : task.checkpoint\n ? { configurable: task.checkpoint }\n : undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n result: (task as any).result,\n };\n });\n\n return {\n values: state.values,\n next: state.next ? [...state.next] : [],\n // TODO: Fix SDK typing. `ThreadState.checkpoint` is typed as non-null,\n // but deployments can return `null` (e.g. a thread that exists but has\n // not produced a checkpoint yet). See #2328.\n config: this._checkpointToConfig(\n state.checkpoint as Checkpoint | null,\n fallbackConfig\n ),\n metadata: state.metadata\n ? (state.metadata as CheckpointMetadata)\n : undefined,\n createdAt: state.created_at ?? undefined,\n parentConfig: state.parent_checkpoint\n ? this._checkpointToConfig(state.parent_checkpoint)\n : undefined,\n tasks,\n };\n }\n\n override async invoke(\n input: PregelInputType,\n options?: Partial<PregelOptions<Nn, Cc, ContextType>>\n ): Promise<PregelOutputType> {\n let lastValue;\n const stream = await this.stream(input, {\n ...options,\n streamMode: \"values\",\n });\n for await (const chunk of stream) {\n lastValue = chunk;\n }\n return lastValue;\n }\n\n override streamEvents(\n input: PregelInputType,\n options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n version: \"v1\" | \"v2\";\n }\n ): IterableReadableStream<StreamEvent>;\n\n override streamEvents(\n input: PregelInputType,\n options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n version: \"v1\" | \"v2\";\n encoding: never;\n }\n ): IterableReadableStream<never>;\n\n override streamEvents(\n _input: PregelInputType,\n _options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n version: \"v1\" | \"v2\";\n encoding?: never;\n }\n ): IterableReadableStream<StreamEvent> {\n throw new Error(\"Not implemented.\");\n }\n\n override async *_streamIterator(\n input: PregelInputType,\n options?: Partial<PregelOptions<Nn, Cc, ContextType>>\n ): AsyncGenerator<PregelOutputType> {\n const mergedConfig = mergeConfigs(\n this.config,\n options\n ) as LangGraphRunnableConfig;\n const {\n threadId,\n context,\n config: sanitizedConfig,\n } = this.#prepareRunRequest(mergedConfig);\n\n const streamProtocolInstance = options?.configurable?.[CONFIG_KEY_STREAM];\n\n const streamSubgraphs =\n options?.subgraphs ?? streamProtocolInstance !== undefined;\n\n const interruptBefore = options?.interruptBefore ?? this.interruptBefore;\n const interruptAfter = options?.interruptAfter ?? this.interruptAfter;\n\n const { updatedStreamModes, reqSingle, reqUpdates } = getStreamModes(\n options?.streamMode\n );\n\n const extendedStreamModes = [\n ...new Set([\n ...updatedStreamModes,\n ...(streamProtocolInstance?.modes ?? new Set()),\n ]),\n ].map((mode) => {\n if (mode === \"messages\") return \"messages-tuple\";\n return mode;\n });\n\n let command;\n let serializedInput;\n if (isCommand(input)) {\n // TODO: Remove cast when SDK type fix gets merged\n command = input.toJSON() as Record<string, unknown>;\n serializedInput = undefined;\n } else {\n serializedInput = _serializeInputs(input);\n }\n\n const streamPayload = {\n command,\n input: serializedInput,\n config: sanitizedConfig,\n context,\n streamMode: extendedStreamModes,\n interruptBefore: interruptBefore as string[],\n interruptAfter: interruptAfter as string[],\n streamSubgraphs,\n ifNotExists: \"create\" as const,\n signal: mergedConfig.signal,\n streamResumable: this.streamResumable,\n };\n\n const runStream =\n threadId != null\n ? this.client.runs.stream(threadId, this.graphId, streamPayload)\n : this.client.runs.stream(null, this.graphId, streamPayload);\n\n for await (const chunk of runStream) {\n let mode;\n let namespace: string[];\n if (chunk.event.includes(CHECKPOINT_NAMESPACE_SEPARATOR)) {\n const eventComponents = chunk.event.split(\n CHECKPOINT_NAMESPACE_SEPARATOR\n );\n // eslint-disable-next-line prefer-destructuring\n mode = eventComponents[0];\n namespace = eventComponents.slice(1);\n } else {\n mode = chunk.event;\n namespace = [];\n }\n const callerNamespace = options?.configurable?.checkpoint_ns;\n if (typeof callerNamespace === \"string\") {\n namespace = callerNamespace\n .split(CHECKPOINT_NAMESPACE_SEPARATOR)\n .concat(namespace);\n }\n if (\n streamProtocolInstance !== undefined &&\n streamProtocolInstance.modes?.has(chunk.event)\n ) {\n streamProtocolInstance.push([namespace, mode, chunk.data]);\n }\n if (chunk.event.startsWith(\"updates\")) {\n if (\n typeof chunk.data === \"object\" &&\n chunk.data?.[INTERRUPT] !== undefined\n ) {\n throw new GraphInterrupt(chunk.data[INTERRUPT]);\n }\n if (!reqUpdates) {\n continue;\n }\n } else if (chunk.event?.startsWith(\"error\")) {\n throw new RemoteException(\n typeof chunk.data === \"string\"\n ? chunk.data\n : JSON.stringify(chunk.data)\n );\n }\n if (\n !updatedStreamModes.includes(\n chunk.event.split(CHECKPOINT_NAMESPACE_SEPARATOR)[0] as StreamMode\n )\n ) {\n continue;\n }\n if (options?.subgraphs) {\n if (reqSingle) {\n yield [namespace, chunk.data];\n } else {\n yield [namespace, mode, chunk.data];\n }\n } else if (reqSingle) {\n yield chunk.data;\n } else {\n yield [mode, chunk.data];\n }\n }\n }\n\n async updateState(\n inputConfig: LangGraphRunnableConfig,\n values: Record<string, unknown>,\n asNode?: string\n ): Promise<RunnableConfig> {\n const mergedConfig = mergeConfigs(this.config, inputConfig);\n const response = await this.client.threads.updateState(\n mergedConfig.configurable?.thread_id,\n { values, asNode, checkpoint: this._getCheckpoint(mergedConfig) }\n );\n // TODO: Fix SDK typing\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this._getConfig((response as any).checkpoint);\n }\n\n async *getStateHistory(\n config: RunnableConfig,\n options?: CheckpointListOptions\n ): AsyncIterableIterator<StateSnapshot> {\n const mergedConfig = mergeConfigs(this.config, config);\n const states = await this.client.threads.getHistory(\n mergedConfig.configurable?.thread_id,\n {\n limit: options?.limit ?? 10,\n // TODO: Fix type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n before: this._getCheckpoint(options?.before) as any,\n metadata: options?.filter,\n checkpoint: this._getCheckpoint(mergedConfig),\n }\n );\n for (const state of states) {\n yield this._createStateSnapshot(state, mergedConfig);\n }\n }\n\n protected _getDrawableNodes(\n nodes: Array<{\n id: string | number;\n name?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data?: Record<string, any> | string;\n metadata?: unknown;\n }>\n ): Record<string, DrawableNode> {\n const nodesMap: Record<string, DrawableNode> = {};\n for (const node of nodes) {\n const nodeId = node.id;\n nodesMap[nodeId] = {\n id: nodeId.toString(),\n name:\n typeof node.data === \"string\" ? node.data : (node.data?.name ?? \"\"),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: (node.data as any) ?? {},\n metadata:\n typeof node.data !== \"string\" ? (node.data?.metadata ?? {}) : {},\n };\n }\n return nodesMap;\n }\n\n async getState(\n config: RunnableConfig,\n options?: { subgraphs?: boolean }\n ): Promise<StateSnapshot> {\n const mergedConfig = mergeConfigs(this.config, config);\n\n const state = await this.client.threads.getState(\n mergedConfig.configurable?.thread_id,\n this._getCheckpoint(mergedConfig),\n options\n );\n return this._createStateSnapshot(state, mergedConfig);\n }\n\n /** @deprecated Use getGraphAsync instead. The async method will become the default in the next minor release. */\n override getGraph(\n _?: RunnableConfig & { xray?: boolean | number }\n ): DrawableGraph {\n throw new Error(\n `The synchronous \"getGraph\" is not supported for this graph. Call \"getGraphAsync\" instead.`\n );\n }\n\n /**\n * Returns a drawable representation of the computation graph.\n */\n async getGraphAsync(config?: RunnableConfig & { xray?: boolean | number }) {\n const graph = await this.client.assistants.getGraph(this.graphId, {\n xray: config?.xray,\n });\n return new DrawableGraph({\n nodes: this._getDrawableNodes(graph.nodes),\n edges: graph.edges,\n });\n }\n\n /** @deprecated Use getSubgraphsAsync instead. The async method will become the default in the next minor release. */\n getSubgraphs(): Generator<[string, PregelInterface<Nn, Cc, ContextType>]> {\n throw new Error(\n `The synchronous \"getSubgraphs\" method is not supported for this graph. Call \"getSubgraphsAsync\" instead.`\n );\n }\n\n async *getSubgraphsAsync(\n namespace?: string,\n recurse = false\n ): AsyncGenerator<[string, PregelInterface<Nn, Cc, ContextType>]> {\n const subgraphs = await this.client.assistants.getSubgraphs(this.graphId, {\n namespace,\n recurse,\n });\n\n for (const [ns, graphSchema] of Object.entries(subgraphs)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const remoteSubgraph = new (this.constructor as any)({\n ...this,\n graphId: graphSchema.graph_id,\n });\n yield [ns, remoteSubgraph];\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"remote.cjs","names":["BaseMessage","Runnable","Client","propagateConfigurableToMetadata","#prepareRunRequest","CONFIG_KEY_STREAM","isCommand","GraphInterrupt","INTERRUPT","RemoteException","DrawableGraph"],"sources":["../../src/pregel/remote.ts"],"sourcesContent":["import {\n Client,\n type Checkpoint,\n type ThreadState,\n} from \"@langchain/langgraph-sdk\";\nimport {\n Graph as DrawableGraph,\n Node as DrawableNode,\n} from \"@langchain/core/runnables/graph\";\nimport {\n mergeConfigs,\n Runnable,\n RunnableConfig,\n} from \"@langchain/core/runnables\";\nimport {\n All,\n CheckpointListOptions,\n CheckpointMetadata,\n} from \"@langchain/langgraph-checkpoint\";\nimport { StreamEvent } from \"@langchain/core/tracers/log_stream\";\nimport { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport { BaseMessage } from \"@langchain/core/messages\";\n\nimport {\n BaseChannel,\n GraphInterrupt,\n LangGraphRunnableConfig,\n RemoteException,\n} from \"../web.js\";\nimport { StrRecord } from \"./algo.js\";\nimport { PregelInputType, PregelOptions, PregelOutputType } from \"./index.js\";\nimport { PregelNode } from \"./read.js\";\nimport {\n PregelParams,\n PregelInterface,\n PregelTaskDescription,\n StateSnapshot,\n StreamMode,\n} from \"./types.js\";\nimport {\n CHECKPOINT_NAMESPACE_SEPARATOR,\n CONFIG_KEY_STREAM,\n INTERRUPT,\n isCommand,\n} from \"../constants.js\";\nimport { propagateConfigurableToMetadata } from \"./utils/config.js\";\n\nexport type RemoteGraphParams = Omit<\n PregelParams<StrRecord<string, PregelNode>, StrRecord<string, BaseChannel>>,\n \"channels\" | \"nodes\" | \"inputChannels\" | \"outputChannels\"\n> & {\n graphId: string;\n client?: Client;\n url?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n streamResumable?: boolean;\n};\n\ntype StreamEventsOptions = Parameters<Runnable[\"streamEvents\"]>[2];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _serializeInputs = (obj: any): any => {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(_serializeInputs);\n }\n\n // Handle BaseMessage instances by converting them to a serializable format\n if (BaseMessage.isInstance(obj)) {\n const dict = obj.toDict();\n return {\n ...dict.data,\n role: obj.getType(),\n };\n }\n\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [key, _serializeInputs(value)])\n );\n};\n\n/**\n * Return a tuple of the final list of stream modes sent to the\n * remote graph and a boolean flag indicating if only one stream mode was\n * originally requested and whether stream mode 'updates'\n * was present in the original list of stream modes.\n *\n * 'updates' mode is always added to the list of stream modes so that interrupts\n * can be detected in the remote graph.\n */\nconst getStreamModes = (\n streamMode?: StreamMode | StreamMode[],\n defaultStreamMode: StreamMode = \"updates\"\n) => {\n const updatedStreamModes: StreamMode[] = [];\n let reqUpdates = false;\n let reqSingle = true;\n\n if (\n streamMode !== undefined &&\n (typeof streamMode === \"string\" ||\n (Array.isArray(streamMode) && streamMode.length > 0))\n ) {\n reqSingle = typeof streamMode === \"string\";\n const mapped = Array.isArray(streamMode) ? streamMode : [streamMode];\n updatedStreamModes.push(...mapped);\n } else {\n updatedStreamModes.push(defaultStreamMode);\n }\n if (updatedStreamModes.includes(\"updates\")) {\n reqUpdates = true;\n } else {\n updatedStreamModes.push(\"updates\");\n }\n return {\n updatedStreamModes,\n reqUpdates,\n reqSingle,\n };\n};\n\n/**\n * The `RemoteGraph` class is a client implementation for calling remote\n * APIs that implement the LangGraph Server API specification.\n *\n * For example, the `RemoteGraph` class can be used to call APIs from deployments\n * on LangSmith Deployment.\n *\n * `RemoteGraph` behaves the same way as a `StateGraph` and can be used directly as\n * a node in another `StateGraph`.\n *\n * @example\n * ```ts\n * import { RemoteGraph } from \"@langchain/langgraph/remote\";\n *\n * // Can also pass a LangGraph SDK client instance directly\n * const remoteGraph = new RemoteGraph({\n * graphId: process.env.LANGGRAPH_REMOTE_GRAPH_ID!,\n * apiKey: process.env.LANGGRAPH_REMOTE_GRAPH_API_KEY,\n * url: process.env.LANGGRAPH_REMOTE_GRAPH_API_URL,\n * });\n *\n * const input = {\n * messages: [\n * {\n * role: \"human\",\n * content: \"Hello world!\",\n * },\n * ],\n * };\n *\n * const config = {\n * configurable: { thread_id: \"threadId1\" },\n * };\n *\n * await remoteGraph.invoke(input, config);\n * ```\n */\nexport class RemoteGraph<\n Nn extends StrRecord<string, PregelNode> = StrRecord<string, PregelNode>,\n Cc extends StrRecord<string, BaseChannel> = StrRecord<string, BaseChannel>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ContextType extends Record<string, any> = StrRecord<string, any>,\n>\n extends Runnable<\n PregelInputType,\n PregelOutputType,\n PregelOptions<Nn, Cc, ContextType>\n >\n implements PregelInterface<Nn, Cc, ContextType>\n{\n static lc_name() {\n return \"RemoteGraph\";\n }\n\n lc_namespace = [\"langgraph\", \"pregel\"];\n\n lg_is_pregel = true;\n\n config?: RunnableConfig;\n\n graphId: string;\n\n protected client: Client;\n\n protected interruptBefore?: Array<keyof Nn> | All;\n\n protected interruptAfter?: Array<keyof Nn> | All;\n\n protected streamResumable?: boolean;\n\n constructor(params: RemoteGraphParams) {\n super(params);\n\n this.graphId = params.graphId;\n this.client =\n params.client ??\n new Client({\n apiUrl: params.url,\n apiKey: params.apiKey,\n defaultHeaders: params.headers,\n });\n this.config = params.config;\n this.interruptBefore = params.interruptBefore;\n this.interruptAfter = params.interruptAfter;\n this.streamResumable = params.streamResumable;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Remove ignore when we remove support for 0.2 versions of core\n override withConfig(config: RunnableConfig): typeof this {\n const mergedConfig = mergeConfigs(this.config, config);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new (this.constructor as any)({ ...this, config: mergedConfig });\n }\n\n protected _sanitizeConfig(config: RunnableConfig) {\n const reservedConfigurableKeys = new Set([\n \"callbacks\",\n \"checkpoint_map\",\n \"checkpoint_id\",\n \"checkpoint_ns\",\n ]);\n\n const sanitizeObj = <T>(obj: T): T => {\n try {\n // This will only throw if we're trying to serialize a circular reference\n // or trying to serialize a BigInt...\n JSON.stringify(obj);\n return obj;\n } catch {\n const seen = new WeakSet();\n return JSON.parse(\n JSON.stringify(obj, (_, value) => {\n if (typeof value === \"object\" && value != null) {\n if (seen.has(value)) return \"[Circular]\";\n seen.add(value);\n }\n\n if (typeof value === \"bigint\") return value.toString();\n return value;\n })\n );\n }\n };\n\n const propagateMetadataDefaults = (obj: unknown) => {\n const seen = new WeakSet<object>();\n const visit = (value: unknown) => {\n if (typeof value !== \"object\" || value == null) {\n return;\n }\n if (seen.has(value)) {\n return;\n }\n seen.add(value);\n const record = value as Record<string, unknown>;\n const configurable = record.configurable;\n if (\n typeof configurable === \"object\" &&\n configurable != null &&\n !Array.isArray(configurable)\n ) {\n const metadata =\n typeof record.metadata === \"object\" &&\n record.metadata != null &&\n !Array.isArray(record.metadata)\n ? (record.metadata as Record<string, unknown>)\n : undefined;\n record.metadata =\n propagateConfigurableToMetadata(\n configurable as Record<string, unknown>,\n metadata\n ) ?? record.metadata;\n }\n for (const nestedValue of Object.values(record)) {\n visit(nestedValue);\n }\n };\n visit(obj);\n };\n\n propagateMetadataDefaults(config);\n\n // Remove non-JSON serializable fields from the config\n const sanitizedConfig = sanitizeObj(config);\n\n // Only include configurable keys that are not reserved and\n // not starting with \"__pregel_\" prefix\n const newConfigurable = Object.fromEntries(\n Object.entries(sanitizedConfig.configurable ?? {}).filter(\n ([k]) => !reservedConfigurableKeys.has(k) && !k.startsWith(\"__pregel_\")\n )\n );\n\n return {\n tags: sanitizedConfig.tags ?? [],\n metadata: sanitizedConfig.metadata ?? {},\n configurable: newConfigurable,\n recursion_limit: sanitizedConfig.recursionLimit,\n };\n }\n\n /**\n * Prepare config and thread ID for remote run API calls.\n *\n * `thread_id` is passed via the URL path, not in `config.configurable`, so the\n * server can accept a separate `context` payload for stateful runs.\n */\n #prepareRunRequest(mergedConfig: LangGraphRunnableConfig): {\n threadId: string | undefined;\n context: unknown;\n config: ReturnType<RemoteGraph[\"_sanitizeConfig\"]>;\n } {\n const context = mergedConfig.context;\n const sanitizedConfig = this._sanitizeConfig(mergedConfig);\n const configurable = { ...sanitizedConfig.configurable };\n const threadId = configurable.thread_id as string | undefined;\n delete configurable.thread_id;\n\n return {\n threadId,\n context,\n config: {\n ...sanitizedConfig,\n configurable,\n },\n };\n }\n\n protected _getConfig(checkpoint: Record<string, unknown>): RunnableConfig {\n return {\n configurable: {\n thread_id: checkpoint.thread_id,\n checkpoint_ns: checkpoint.checkpoint_ns,\n checkpoint_id: checkpoint.checkpoint_id,\n checkpoint_map: checkpoint.checkpoint_map ?? {},\n },\n };\n }\n\n protected _checkpointToConfig(\n checkpoint?: Partial<Checkpoint> | null,\n fallbackConfig?: RunnableConfig\n ): RunnableConfig {\n const resolvedCheckpoint =\n checkpoint ?? this._getCheckpoint(fallbackConfig);\n if (resolvedCheckpoint == null) {\n return { configurable: {} };\n }\n\n const configurable: Record<string, unknown> = {};\n if (resolvedCheckpoint.thread_id !== undefined) {\n configurable.thread_id = resolvedCheckpoint.thread_id;\n }\n if (resolvedCheckpoint.checkpoint_ns !== undefined) {\n configurable.checkpoint_ns = resolvedCheckpoint.checkpoint_ns;\n }\n if (resolvedCheckpoint.checkpoint_id !== undefined) {\n configurable.checkpoint_id = resolvedCheckpoint.checkpoint_id;\n }\n\n const hasCheckpointFields =\n resolvedCheckpoint.checkpoint_ns !== undefined ||\n resolvedCheckpoint.checkpoint_id !== undefined ||\n resolvedCheckpoint.checkpoint_map !== undefined;\n if (hasCheckpointFields) {\n configurable.checkpoint_map = resolvedCheckpoint.checkpoint_map ?? {};\n }\n\n return { configurable };\n }\n\n protected _getCheckpoint(config?: RunnableConfig): Checkpoint | undefined {\n if (config?.configurable === undefined) {\n return undefined;\n }\n\n const checkpointKeys = [\n \"thread_id\",\n \"checkpoint_ns\",\n \"checkpoint_id\",\n \"checkpoint_map\",\n ] as const;\n\n const checkpoint = Object.fromEntries(\n checkpointKeys\n .map((key) => [key, config.configurable![key]])\n .filter(([_, value]) => value !== undefined)\n );\n\n return Object.keys(checkpoint).length > 0 ? checkpoint : undefined;\n }\n\n protected _createStateSnapshot(\n state: ThreadState,\n fallbackConfig?: RunnableConfig\n ): StateSnapshot {\n const tasks: PregelTaskDescription[] = state.tasks.map((task) => {\n return {\n id: task.id,\n name: task.name,\n error: task.error ? { message: task.error } : undefined,\n // TODO: remove in LangGraph.js 0.4\n interrupts: task.interrupts.map(({ id, ...rest }) => ({\n interrupt_id: id,\n ...rest,\n })),\n // eslint-disable-next-line no-nested-ternary\n state: task.state\n ? this._createStateSnapshot(\n task.state,\n task.checkpoint\n ? this._checkpointToConfig(task.checkpoint)\n : fallbackConfig\n )\n : task.checkpoint\n ? { configurable: task.checkpoint }\n : undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n result: (task as any).result,\n };\n });\n\n return {\n values: state.values,\n next: state.next ? [...state.next] : [],\n // TODO: Fix SDK typing. `ThreadState.checkpoint` is typed as non-null,\n // but deployments can return `null` (e.g. a thread that exists but has\n // not produced a checkpoint yet). See #2328.\n config: this._checkpointToConfig(\n state.checkpoint as Checkpoint | null,\n fallbackConfig\n ),\n metadata: state.metadata\n ? (state.metadata as CheckpointMetadata)\n : undefined,\n createdAt: state.created_at ?? undefined,\n parentConfig: state.parent_checkpoint\n ? this._checkpointToConfig(state.parent_checkpoint)\n : undefined,\n tasks,\n };\n }\n\n override async invoke(\n input: PregelInputType,\n options?: Partial<PregelOptions<Nn, Cc, ContextType>>\n ): Promise<PregelOutputType> {\n let lastValue;\n const stream = await this.stream(input, {\n ...options,\n streamMode: \"values\",\n });\n for await (const chunk of stream) {\n lastValue = chunk;\n }\n return lastValue;\n }\n\n override streamEvents(\n input: PregelInputType,\n options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n version: \"v1\" | \"v2\";\n },\n streamOptions?: StreamEventsOptions\n ): IterableReadableStream<StreamEvent>;\n\n override streamEvents(\n input: PregelInputType,\n options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n version: \"v1\" | \"v2\";\n encoding: \"text/event-stream\";\n },\n streamOptions?: StreamEventsOptions\n ): IterableReadableStream<Uint8Array>;\n\n override streamEvents(\n _input: PregelInputType,\n _options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n version: \"v1\" | \"v2\";\n encoding?: \"text/event-stream\";\n },\n _streamOptions?: StreamEventsOptions\n ): IterableReadableStream<StreamEvent | Uint8Array> {\n throw new Error(\"Not implemented.\");\n }\n\n override async *_streamIterator(\n input: PregelInputType,\n options?: Partial<PregelOptions<Nn, Cc, ContextType>>\n ): AsyncGenerator<PregelOutputType> {\n const mergedConfig = mergeConfigs(\n this.config,\n options\n ) as LangGraphRunnableConfig;\n const {\n threadId,\n context,\n config: sanitizedConfig,\n } = this.#prepareRunRequest(mergedConfig);\n\n const streamProtocolInstance = options?.configurable?.[CONFIG_KEY_STREAM];\n\n const streamSubgraphs =\n options?.subgraphs ?? streamProtocolInstance !== undefined;\n\n const interruptBefore = options?.interruptBefore ?? this.interruptBefore;\n const interruptAfter = options?.interruptAfter ?? this.interruptAfter;\n\n const { updatedStreamModes, reqSingle, reqUpdates } = getStreamModes(\n options?.streamMode\n );\n\n const extendedStreamModes = [\n ...new Set([\n ...updatedStreamModes,\n ...(streamProtocolInstance?.modes ?? new Set()),\n ]),\n ].map((mode) => {\n if (mode === \"messages\") return \"messages-tuple\";\n return mode;\n });\n\n let command;\n let serializedInput;\n if (isCommand(input)) {\n // TODO: Remove cast when SDK type fix gets merged\n command = input.toJSON() as Record<string, unknown>;\n serializedInput = undefined;\n } else {\n serializedInput = _serializeInputs(input);\n }\n\n const streamPayload = {\n command,\n input: serializedInput,\n config: sanitizedConfig,\n context,\n streamMode: extendedStreamModes,\n interruptBefore: interruptBefore as string[],\n interruptAfter: interruptAfter as string[],\n streamSubgraphs,\n ifNotExists: \"create\" as const,\n signal: mergedConfig.signal,\n streamResumable: this.streamResumable,\n };\n\n const runStream =\n threadId != null\n ? this.client.runs.stream(threadId, this.graphId, streamPayload)\n : this.client.runs.stream(null, this.graphId, streamPayload);\n\n for await (const chunk of runStream) {\n let mode;\n let namespace: string[];\n if (chunk.event.includes(CHECKPOINT_NAMESPACE_SEPARATOR)) {\n const eventComponents = chunk.event.split(\n CHECKPOINT_NAMESPACE_SEPARATOR\n );\n // eslint-disable-next-line prefer-destructuring\n mode = eventComponents[0];\n namespace = eventComponents.slice(1);\n } else {\n mode = chunk.event;\n namespace = [];\n }\n const callerNamespace = options?.configurable?.checkpoint_ns;\n if (typeof callerNamespace === \"string\") {\n namespace = callerNamespace\n .split(CHECKPOINT_NAMESPACE_SEPARATOR)\n .concat(namespace);\n }\n if (\n streamProtocolInstance !== undefined &&\n streamProtocolInstance.modes?.has(chunk.event)\n ) {\n streamProtocolInstance.push([namespace, mode, chunk.data]);\n }\n if (chunk.event.startsWith(\"updates\")) {\n if (\n typeof chunk.data === \"object\" &&\n chunk.data?.[INTERRUPT] !== undefined\n ) {\n throw new GraphInterrupt(chunk.data[INTERRUPT]);\n }\n if (!reqUpdates) {\n continue;\n }\n } else if (chunk.event?.startsWith(\"error\")) {\n throw new RemoteException(\n typeof chunk.data === \"string\"\n ? chunk.data\n : JSON.stringify(chunk.data)\n );\n }\n if (\n !updatedStreamModes.includes(\n chunk.event.split(CHECKPOINT_NAMESPACE_SEPARATOR)[0] as StreamMode\n )\n ) {\n continue;\n }\n if (options?.subgraphs) {\n if (reqSingle) {\n yield [namespace, chunk.data];\n } else {\n yield [namespace, mode, chunk.data];\n }\n } else if (reqSingle) {\n yield chunk.data;\n } else {\n yield [mode, chunk.data];\n }\n }\n }\n\n async updateState(\n inputConfig: LangGraphRunnableConfig,\n values: Record<string, unknown>,\n asNode?: string\n ): Promise<RunnableConfig> {\n const mergedConfig = mergeConfigs(this.config, inputConfig);\n const response = await this.client.threads.updateState(\n mergedConfig.configurable?.thread_id,\n { values, asNode, checkpoint: this._getCheckpoint(mergedConfig) }\n );\n // TODO: Fix SDK typing\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this._getConfig((response as any).checkpoint);\n }\n\n async *getStateHistory(\n config: RunnableConfig,\n options?: CheckpointListOptions\n ): AsyncIterableIterator<StateSnapshot> {\n const mergedConfig = mergeConfigs(this.config, config);\n const states = await this.client.threads.getHistory(\n mergedConfig.configurable?.thread_id,\n {\n limit: options?.limit ?? 10,\n // TODO: Fix type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n before: this._getCheckpoint(options?.before) as any,\n metadata: options?.filter,\n checkpoint: this._getCheckpoint(mergedConfig),\n }\n );\n for (const state of states) {\n yield this._createStateSnapshot(state, mergedConfig);\n }\n }\n\n protected _getDrawableNodes(\n nodes: Array<{\n id: string | number;\n name?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data?: Record<string, any> | string;\n metadata?: unknown;\n }>\n ): Record<string, DrawableNode> {\n const nodesMap: Record<string, DrawableNode> = {};\n for (const node of nodes) {\n const nodeId = node.id;\n nodesMap[nodeId] = {\n id: nodeId.toString(),\n name:\n typeof node.data === \"string\" ? node.data : (node.data?.name ?? \"\"),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: (node.data as any) ?? {},\n metadata:\n typeof node.data !== \"string\" ? (node.data?.metadata ?? {}) : {},\n };\n }\n return nodesMap;\n }\n\n async getState(\n config: RunnableConfig,\n options?: { subgraphs?: boolean }\n ): Promise<StateSnapshot> {\n const mergedConfig = mergeConfigs(this.config, config);\n\n const state = await this.client.threads.getState(\n mergedConfig.configurable?.thread_id,\n this._getCheckpoint(mergedConfig),\n options\n );\n return this._createStateSnapshot(state, mergedConfig);\n }\n\n /** @deprecated Use getGraphAsync instead. The async method will become the default in the next minor release. */\n override getGraph(\n _?: RunnableConfig & { xray?: boolean | number }\n ): DrawableGraph {\n throw new Error(\n `The synchronous \"getGraph\" is not supported for this graph. Call \"getGraphAsync\" instead.`\n );\n }\n\n /**\n * Returns a drawable representation of the computation graph.\n */\n async getGraphAsync(config?: RunnableConfig & { xray?: boolean | number }) {\n const graph = await this.client.assistants.getGraph(this.graphId, {\n xray: config?.xray,\n });\n return new DrawableGraph({\n nodes: this._getDrawableNodes(graph.nodes),\n edges: graph.edges,\n });\n }\n\n /** @deprecated Use getSubgraphsAsync instead. The async method will become the default in the next minor release. */\n getSubgraphs(): Generator<[string, PregelInterface<Nn, Cc, ContextType>]> {\n throw new Error(\n `The synchronous \"getSubgraphs\" method is not supported for this graph. Call \"getSubgraphsAsync\" instead.`\n );\n }\n\n async *getSubgraphsAsync(\n namespace?: string,\n recurse = false\n ): AsyncGenerator<[string, PregelInterface<Nn, Cc, ContextType>]> {\n const subgraphs = await this.client.assistants.getSubgraphs(this.graphId, {\n namespace,\n recurse,\n });\n\n for (const [ns, graphSchema] of Object.entries(subgraphs)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const remoteSubgraph = new (this.constructor as any)({\n ...this,\n graphId: graphSchema.graph_id,\n });\n yield [ns, remoteSubgraph];\n }\n }\n}\n"],"mappings":";;;;;;;;;AA8DA,MAAM,oBAAoB,QAAkB;AAC1C,KAAI,QAAQ,QAAQ,OAAO,QAAQ,SACjC,QAAO;AAGT,KAAI,MAAM,QAAQ,IAAI,CACpB,QAAO,IAAI,IAAI,iBAAiB;AAIlC,KAAIA,yBAAAA,YAAY,WAAW,IAAI,CAE7B,QAAO;EACL,GAFW,IAAI,QAAQ,CAEf;EACR,MAAM,IAAI,SAAS;EACpB;AAGH,QAAO,OAAO,YACZ,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,iBAAiB,MAAM,CAAC,CAAC,CAC1E;;;;;;;;;;;AAYH,MAAM,kBACJ,YACA,oBAAgC,cAC7B;CACH,MAAM,qBAAmC,EAAE;CAC3C,IAAI,aAAa;CACjB,IAAI,YAAY;AAEhB,KACE,eAAe,KAAA,MACd,OAAO,eAAe,YACpB,MAAM,QAAQ,WAAW,IAAI,WAAW,SAAS,IACpD;AACA,cAAY,OAAO,eAAe;EAClC,MAAM,SAAS,MAAM,QAAQ,WAAW,GAAG,aAAa,CAAC,WAAW;AACpE,qBAAmB,KAAK,GAAG,OAAO;OAElC,oBAAmB,KAAK,kBAAkB;AAE5C,KAAI,mBAAmB,SAAS,UAAU,CACxC,cAAa;KAEb,oBAAmB,KAAK,UAAU;AAEpC,QAAO;EACL;EACA;EACA;EACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCH,IAAa,cAAb,cAMUC,0BAAAA,SAMV;CACE,OAAO,UAAU;AACf,SAAO;;CAGT,eAAe,CAAC,aAAa,SAAS;CAEtC,eAAe;CAEf;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,YAAY,QAA2B;AACrC,QAAM,OAAO;AAEb,OAAK,UAAU,OAAO;AACtB,OAAK,SACH,OAAO,UACP,IAAIC,yBAAAA,OAAO;GACT,QAAQ,OAAO;GACf,QAAQ,OAAO;GACf,gBAAgB,OAAO;GACxB,CAAC;AACJ,OAAK,SAAS,OAAO;AACrB,OAAK,kBAAkB,OAAO;AAC9B,OAAK,iBAAiB,OAAO;AAC7B,OAAK,kBAAkB,OAAO;;CAKhC,WAAoB,QAAqC;EACvD,MAAM,gBAAA,GAAA,0BAAA,cAA4B,KAAK,QAAQ,OAAO;AAEtD,SAAO,IAAK,KAAK,YAAoB;GAAE,GAAG;GAAM,QAAQ;GAAc,CAAC;;CAGzE,gBAA0B,QAAwB;EAChD,MAAM,2BAA2B,IAAI,IAAI;GACvC;GACA;GACA;GACA;GACD,CAAC;EAEF,MAAM,eAAkB,QAAc;AACpC,OAAI;AAGF,SAAK,UAAU,IAAI;AACnB,WAAO;WACD;IACN,MAAM,uBAAO,IAAI,SAAS;AAC1B,WAAO,KAAK,MACV,KAAK,UAAU,MAAM,GAAG,UAAU;AAChC,SAAI,OAAO,UAAU,YAAY,SAAS,MAAM;AAC9C,UAAI,KAAK,IAAI,MAAM,CAAE,QAAO;AAC5B,WAAK,IAAI,MAAM;;AAGjB,SAAI,OAAO,UAAU,SAAU,QAAO,MAAM,UAAU;AACtD,YAAO;MACP,CACH;;;EAIL,MAAM,6BAA6B,QAAiB;GAClD,MAAM,uBAAO,IAAI,SAAiB;GAClC,MAAM,SAAS,UAAmB;AAChC,QAAI,OAAO,UAAU,YAAY,SAAS,KACxC;AAEF,QAAI,KAAK,IAAI,MAAM,CACjB;AAEF,SAAK,IAAI,MAAM;IACf,MAAM,SAAS;IACf,MAAM,eAAe,OAAO;AAC5B,QACE,OAAO,iBAAiB,YACxB,gBAAgB,QAChB,CAAC,MAAM,QAAQ,aAAa,CAQ5B,QAAO,WACLC,eAAAA,gCACE,cAPF,OAAO,OAAO,aAAa,YAC3B,OAAO,YAAY,QACnB,CAAC,MAAM,QAAQ,OAAO,SAAS,GAC1B,OAAO,WACR,KAAA,EAKH,IAAI,OAAO;AAEhB,SAAK,MAAM,eAAe,OAAO,OAAO,OAAO,CAC7C,OAAM,YAAY;;AAGtB,SAAM,IAAI;;AAGZ,4BAA0B,OAAO;EAGjC,MAAM,kBAAkB,YAAY,OAAO;EAI3C,MAAM,kBAAkB,OAAO,YAC7B,OAAO,QAAQ,gBAAgB,gBAAgB,EAAE,CAAC,CAAC,QAChD,CAAC,OAAO,CAAC,yBAAyB,IAAI,EAAE,IAAI,CAAC,EAAE,WAAW,YAAY,CACxE,CACF;AAED,SAAO;GACL,MAAM,gBAAgB,QAAQ,EAAE;GAChC,UAAU,gBAAgB,YAAY,EAAE;GACxC,cAAc;GACd,iBAAiB,gBAAgB;GAClC;;;;;;;;CASH,mBAAmB,cAIjB;EACA,MAAM,UAAU,aAAa;EAC7B,MAAM,kBAAkB,KAAK,gBAAgB,aAAa;EAC1D,MAAM,eAAe,EAAE,GAAG,gBAAgB,cAAc;EACxD,MAAM,WAAW,aAAa;AAC9B,SAAO,aAAa;AAEpB,SAAO;GACL;GACA;GACA,QAAQ;IACN,GAAG;IACH;IACD;GACF;;CAGH,WAAqB,YAAqD;AACxE,SAAO,EACL,cAAc;GACZ,WAAW,WAAW;GACtB,eAAe,WAAW;GAC1B,eAAe,WAAW;GAC1B,gBAAgB,WAAW,kBAAkB,EAAE;GAChD,EACF;;CAGH,oBACE,YACA,gBACgB;EAChB,MAAM,qBACJ,cAAc,KAAK,eAAe,eAAe;AACnD,MAAI,sBAAsB,KACxB,QAAO,EAAE,cAAc,EAAE,EAAE;EAG7B,MAAM,eAAwC,EAAE;AAChD,MAAI,mBAAmB,cAAc,KAAA,EACnC,cAAa,YAAY,mBAAmB;AAE9C,MAAI,mBAAmB,kBAAkB,KAAA,EACvC,cAAa,gBAAgB,mBAAmB;AAElD,MAAI,mBAAmB,kBAAkB,KAAA,EACvC,cAAa,gBAAgB,mBAAmB;AAOlD,MAHE,mBAAmB,kBAAkB,KAAA,KACrC,mBAAmB,kBAAkB,KAAA,KACrC,mBAAmB,mBAAmB,KAAA,EAEtC,cAAa,iBAAiB,mBAAmB,kBAAkB,EAAE;AAGvE,SAAO,EAAE,cAAc;;CAGzB,eAAyB,QAAiD;AACxE,MAAI,QAAQ,iBAAiB,KAAA,EAC3B;EAUF,MAAM,aAAa,OAAO,YAPH;GACrB;GACA;GACA;GACA;GACD,CAII,KAAK,QAAQ,CAAC,KAAK,OAAO,aAAc,KAAK,CAAC,CAC9C,QAAQ,CAAC,GAAG,WAAW,UAAU,KAAA,EAAU,CAC/C;AAED,SAAO,OAAO,KAAK,WAAW,CAAC,SAAS,IAAI,aAAa,KAAA;;CAG3D,qBACE,OACA,gBACe;EACf,MAAM,QAAiC,MAAM,MAAM,KAAK,SAAS;AAC/D,UAAO;IACL,IAAI,KAAK;IACT,MAAM,KAAK;IACX,OAAO,KAAK,QAAQ,EAAE,SAAS,KAAK,OAAO,GAAG,KAAA;IAE9C,YAAY,KAAK,WAAW,KAAK,EAAE,IAAI,GAAG,YAAY;KACpD,cAAc;KACd,GAAG;KACJ,EAAE;IAEH,OAAO,KAAK,QACR,KAAK,qBACH,KAAK,OACL,KAAK,aACD,KAAK,oBAAoB,KAAK,WAAW,GACzC,eACL,GACD,KAAK,aACH,EAAE,cAAc,KAAK,YAAY,GACjC,KAAA;IAEN,QAAS,KAAa;IACvB;IACD;AAEF,SAAO;GACL,QAAQ,MAAM;GACd,MAAM,MAAM,OAAO,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE;GAIvC,QAAQ,KAAK,oBACX,MAAM,YACN,eACD;GACD,UAAU,MAAM,WACX,MAAM,WACP,KAAA;GACJ,WAAW,MAAM,cAAc,KAAA;GAC/B,cAAc,MAAM,oBAChB,KAAK,oBAAoB,MAAM,kBAAkB,GACjD,KAAA;GACJ;GACD;;CAGH,MAAe,OACb,OACA,SAC2B;EAC3B,IAAI;EACJ,MAAM,SAAS,MAAM,KAAK,OAAO,OAAO;GACtC,GAAG;GACH,YAAY;GACb,CAAC;AACF,aAAW,MAAM,SAAS,OACxB,aAAY;AAEd,SAAO;;CAoBT,aACE,QACA,UAIA,gBACkD;AAClD,QAAM,IAAI,MAAM,mBAAmB;;CAGrC,OAAgB,gBACd,OACA,SACkC;EAClC,MAAM,gBAAA,GAAA,0BAAA,cACJ,KAAK,QACL,QACD;EACD,MAAM,EACJ,UACA,SACA,QAAQ,oBACN,MAAA,kBAAwB,aAAa;EAEzC,MAAM,yBAAyB,SAAS,eAAeE,kBAAAA;EAEvD,MAAM,kBACJ,SAAS,aAAa,2BAA2B,KAAA;EAEnD,MAAM,kBAAkB,SAAS,mBAAmB,KAAK;EACzD,MAAM,iBAAiB,SAAS,kBAAkB,KAAK;EAEvD,MAAM,EAAE,oBAAoB,WAAW,eAAe,eACpD,SAAS,WACV;EAED,MAAM,sBAAsB,CAC1B,GAAG,IAAI,IAAI,CACT,GAAG,oBACH,GAAI,wBAAwB,yBAAS,IAAI,KAAK,CAC/C,CAAC,CACH,CAAC,KAAK,SAAS;AACd,OAAI,SAAS,WAAY,QAAO;AAChC,UAAO;IACP;EAEF,IAAI;EACJ,IAAI;AACJ,MAAIC,kBAAAA,UAAU,MAAM,EAAE;AAEpB,aAAU,MAAM,QAAQ;AACxB,qBAAkB,KAAA;QAElB,mBAAkB,iBAAiB,MAAM;EAG3C,MAAM,gBAAgB;GACpB;GACA,OAAO;GACP,QAAQ;GACR;GACA,YAAY;GACK;GACD;GAChB;GACA,aAAa;GACb,QAAQ,aAAa;GACrB,iBAAiB,KAAK;GACvB;EAED,MAAM,YACJ,YAAY,OACR,KAAK,OAAO,KAAK,OAAO,UAAU,KAAK,SAAS,cAAc,GAC9D,KAAK,OAAO,KAAK,OAAO,MAAM,KAAK,SAAS,cAAc;AAEhE,aAAW,MAAM,SAAS,WAAW;GACnC,IAAI;GACJ,IAAI;AACJ,OAAI,MAAM,MAAM,SAAA,IAAwC,EAAE;IACxD,MAAM,kBAAkB,MAAM,MAAM,MAAA,IAEnC;AAED,WAAO,gBAAgB;AACvB,gBAAY,gBAAgB,MAAM,EAAE;UAC/B;AACL,WAAO,MAAM;AACb,gBAAY,EAAE;;GAEhB,MAAM,kBAAkB,SAAS,cAAc;AAC/C,OAAI,OAAO,oBAAoB,SAC7B,aAAY,gBACT,MAAA,IAAqC,CACrC,OAAO,UAAU;AAEtB,OACE,2BAA2B,KAAA,KAC3B,uBAAuB,OAAO,IAAI,MAAM,MAAM,CAE9C,wBAAuB,KAAK;IAAC;IAAW;IAAM,MAAM;IAAK,CAAC;AAE5D,OAAI,MAAM,MAAM,WAAW,UAAU,EAAE;AACrC,QACE,OAAO,MAAM,SAAS,YACtB,MAAM,OAAA,qBAAsB,KAAA,EAE5B,OAAM,IAAIC,eAAAA,eAAe,MAAM,KAAKC,kBAAAA,WAAW;AAEjD,QAAI,CAAC,WACH;cAEO,MAAM,OAAO,WAAW,QAAQ,CACzC,OAAM,IAAIC,eAAAA,gBACR,OAAO,MAAM,SAAS,WAClB,MAAM,OACN,KAAK,UAAU,MAAM,KAAK,CAC/B;AAEH,OACE,CAAC,mBAAmB,SAClB,MAAM,MAAM,MAAA,IAAqC,CAAC,GACnD,CAED;AAEF,OAAI,SAAS,UACX,KAAI,UACF,OAAM,CAAC,WAAW,MAAM,KAAK;OAE7B,OAAM;IAAC;IAAW;IAAM,MAAM;IAAK;YAE5B,UACT,OAAM,MAAM;OAEZ,OAAM,CAAC,MAAM,MAAM,KAAK;;;CAK9B,MAAM,YACJ,aACA,QACA,QACyB;EACzB,MAAM,gBAAA,GAAA,0BAAA,cAA4B,KAAK,QAAQ,YAAY;EAC3D,MAAM,WAAW,MAAM,KAAK,OAAO,QAAQ,YACzC,aAAa,cAAc,WAC3B;GAAE;GAAQ;GAAQ,YAAY,KAAK,eAAe,aAAa;GAAE,CAClE;AAGD,SAAO,KAAK,WAAY,SAAiB,WAAW;;CAGtD,OAAO,gBACL,QACA,SACsC;EACtC,MAAM,gBAAA,GAAA,0BAAA,cAA4B,KAAK,QAAQ,OAAO;EACtD,MAAM,SAAS,MAAM,KAAK,OAAO,QAAQ,WACvC,aAAa,cAAc,WAC3B;GACE,OAAO,SAAS,SAAS;GAGzB,QAAQ,KAAK,eAAe,SAAS,OAAO;GAC5C,UAAU,SAAS;GACnB,YAAY,KAAK,eAAe,aAAa;GAC9C,CACF;AACD,OAAK,MAAM,SAAS,OAClB,OAAM,KAAK,qBAAqB,OAAO,aAAa;;CAIxD,kBACE,OAO8B;EAC9B,MAAM,WAAyC,EAAE;AACjD,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,SAAS,KAAK;AACpB,YAAS,UAAU;IACjB,IAAI,OAAO,UAAU;IACrB,MACE,OAAO,KAAK,SAAS,WAAW,KAAK,OAAQ,KAAK,MAAM,QAAQ;IAElE,MAAO,KAAK,QAAgB,EAAE;IAC9B,UACE,OAAO,KAAK,SAAS,WAAY,KAAK,MAAM,YAAY,EAAE,GAAI,EAAE;IACnE;;AAEH,SAAO;;CAGT,MAAM,SACJ,QACA,SACwB;EACxB,MAAM,gBAAA,GAAA,0BAAA,cAA4B,KAAK,QAAQ,OAAO;EAEtD,MAAM,QAAQ,MAAM,KAAK,OAAO,QAAQ,SACtC,aAAa,cAAc,WAC3B,KAAK,eAAe,aAAa,EACjC,QACD;AACD,SAAO,KAAK,qBAAqB,OAAO,aAAa;;;CAIvD,SACE,GACe;AACf,QAAM,IAAI,MACR,4FACD;;;;;CAMH,MAAM,cAAc,QAAuD;EACzE,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,SAAS,KAAK,SAAS,EAChE,MAAM,QAAQ,MACf,CAAC;AACF,SAAO,IAAIC,gCAAAA,MAAc;GACvB,OAAO,KAAK,kBAAkB,MAAM,MAAM;GAC1C,OAAO,MAAM;GACd,CAAC;;;CAIJ,eAA0E;AACxE,QAAM,IAAI,MACR,2GACD;;CAGH,OAAO,kBACL,WACA,UAAU,OACsD;EAChE,MAAM,YAAY,MAAM,KAAK,OAAO,WAAW,aAAa,KAAK,SAAS;GACxE;GACA;GACD,CAAC;AAEF,OAAK,MAAM,CAAC,IAAI,gBAAgB,OAAO,QAAQ,UAAU,CAMvD,OAAM,CAAC,IAJgB,IAAK,KAAK,YAAoB;GACnD,GAAG;GACH,SAAS,YAAY;GACtB,CAAC,CACwB"}
|
package/dist/pregel/remote.d.cts
CHANGED
|
@@ -19,6 +19,7 @@ type RemoteGraphParams = Omit<PregelParams<StrRecord<string, PregelNode>, StrRec
|
|
|
19
19
|
headers?: Record<string, string>;
|
|
20
20
|
streamResumable?: boolean;
|
|
21
21
|
};
|
|
22
|
+
type StreamEventsOptions = Parameters<Runnable["streamEvents"]>[2];
|
|
22
23
|
/**
|
|
23
24
|
* The `RemoteGraph` class is a client implementation for calling remote
|
|
24
25
|
* APIs that implement the LangGraph Server API specification.
|
|
@@ -84,11 +85,11 @@ declare class RemoteGraph<Nn extends StrRecord<string, PregelNode> = StrRecord<s
|
|
|
84
85
|
invoke(input: PregelInputType, options?: Partial<PregelOptions<Nn, Cc, ContextType>>): Promise<PregelOutputType>;
|
|
85
86
|
streamEvents(input: PregelInputType, options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
86
87
|
version: "v1" | "v2";
|
|
87
|
-
}): IterableReadableStream<StreamEvent>;
|
|
88
|
+
}, streamOptions?: StreamEventsOptions): IterableReadableStream<StreamEvent>;
|
|
88
89
|
streamEvents(input: PregelInputType, options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
89
90
|
version: "v1" | "v2";
|
|
90
|
-
encoding:
|
|
91
|
-
}): IterableReadableStream<
|
|
91
|
+
encoding: "text/event-stream";
|
|
92
|
+
}, streamOptions?: StreamEventsOptions): IterableReadableStream<Uint8Array>;
|
|
92
93
|
_streamIterator(input: PregelInputType, options?: Partial<PregelOptions<Nn, Cc, ContextType>>): AsyncGenerator<PregelOutputType>;
|
|
93
94
|
updateState(inputConfig: LangGraphRunnableConfig, values: Record<string, unknown>, asNode?: string): Promise<RunnableConfig>;
|
|
94
95
|
getStateHistory(config: RunnableConfig, options?: CheckpointListOptions): AsyncIterableIterator<StateSnapshot>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.d.cts","names":[],"sources":["../../src/pregel/remote.ts"],"mappings":";;;;;;;;;;;;;KA+CY,iBAAA,GAAoB,IAAA,CAC9B,YAAA,CAAa,SAAA,SAAkB,UAAA,GAAa,SAAA,SAAkB,WAAA;EAG9D,OAAA;EACA,MAAA,GAAS,MAAA;EACT,GAAA;EACA,MAAA;EACA,OAAA,GAAU,MAAA;EACV,eAAA;AAAA
|
|
1
|
+
{"version":3,"file":"remote.d.cts","names":[],"sources":["../../src/pregel/remote.ts"],"mappings":"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"}
|
package/dist/pregel/remote.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ type RemoteGraphParams = Omit<PregelParams<StrRecord<string, PregelNode>, StrRec
|
|
|
19
19
|
headers?: Record<string, string>;
|
|
20
20
|
streamResumable?: boolean;
|
|
21
21
|
};
|
|
22
|
+
type StreamEventsOptions = Parameters<Runnable["streamEvents"]>[2];
|
|
22
23
|
/**
|
|
23
24
|
* The `RemoteGraph` class is a client implementation for calling remote
|
|
24
25
|
* APIs that implement the LangGraph Server API specification.
|
|
@@ -84,11 +85,11 @@ declare class RemoteGraph<Nn extends StrRecord<string, PregelNode> = StrRecord<s
|
|
|
84
85
|
invoke(input: PregelInputType, options?: Partial<PregelOptions<Nn, Cc, ContextType>>): Promise<PregelOutputType>;
|
|
85
86
|
streamEvents(input: PregelInputType, options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
86
87
|
version: "v1" | "v2";
|
|
87
|
-
}): IterableReadableStream<StreamEvent>;
|
|
88
|
+
}, streamOptions?: StreamEventsOptions): IterableReadableStream<StreamEvent>;
|
|
88
89
|
streamEvents(input: PregelInputType, options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
89
90
|
version: "v1" | "v2";
|
|
90
|
-
encoding:
|
|
91
|
-
}): IterableReadableStream<
|
|
91
|
+
encoding: "text/event-stream";
|
|
92
|
+
}, streamOptions?: StreamEventsOptions): IterableReadableStream<Uint8Array>;
|
|
92
93
|
_streamIterator(input: PregelInputType, options?: Partial<PregelOptions<Nn, Cc, ContextType>>): AsyncGenerator<PregelOutputType>;
|
|
93
94
|
updateState(inputConfig: LangGraphRunnableConfig, values: Record<string, unknown>, asNode?: string): Promise<RunnableConfig>;
|
|
94
95
|
getStateHistory(config: RunnableConfig, options?: CheckpointListOptions): AsyncIterableIterator<StateSnapshot>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.d.ts","names":[],"sources":["../../src/pregel/remote.ts"],"mappings":";;;;;;;;;;;;;KA+CY,iBAAA,GAAoB,IAAA,CAC9B,YAAA,CAAa,SAAA,SAAkB,UAAA,GAAa,SAAA,SAAkB,WAAA;EAG9D,OAAA;EACA,MAAA,GAAS,MAAA;EACT,GAAA;EACA,MAAA;EACA,OAAA,GAAU,MAAA;EACV,eAAA;AAAA
|
|
1
|
+
{"version":3,"file":"remote.d.ts","names":[],"sources":["../../src/pregel/remote.ts"],"mappings":"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"}
|
package/dist/pregel/remote.js
CHANGED
|
@@ -239,7 +239,7 @@ var RemoteGraph = class extends Runnable {
|
|
|
239
239
|
for await (const chunk of stream) lastValue = chunk;
|
|
240
240
|
return lastValue;
|
|
241
241
|
}
|
|
242
|
-
streamEvents(_input, _options) {
|
|
242
|
+
streamEvents(_input, _options, _streamOptions) {
|
|
243
243
|
throw new Error("Not implemented.");
|
|
244
244
|
}
|
|
245
245
|
async *_streamIterator(input, options) {
|