@langchain/langgraph 1.3.6 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/channels/base.cjs +78 -2
- package/dist/channels/base.cjs.map +1 -1
- package/dist/channels/base.d.cts +35 -2
- package/dist/channels/base.d.cts.map +1 -1
- package/dist/channels/base.d.ts +35 -2
- package/dist/channels/base.d.ts.map +1 -1
- package/dist/channels/base.js +77 -4
- package/dist/channels/base.js.map +1 -1
- package/dist/channels/delta.cjs +136 -0
- package/dist/channels/delta.cjs.map +1 -0
- package/dist/channels/delta.d.cts +99 -0
- package/dist/channels/delta.d.cts.map +1 -0
- package/dist/channels/delta.d.ts +99 -0
- package/dist/channels/delta.d.ts.map +1 -0
- package/dist/channels/delta.js +136 -0
- package/dist/channels/delta.js.map +1 -0
- package/dist/channels/index.cjs +5 -0
- package/dist/channels/index.d.cts +3 -2
- package/dist/channels/index.d.ts +3 -2
- package/dist/channels/index.js +3 -2
- package/dist/constants.cjs +62 -4
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +33 -2
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.ts +33 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +59 -5
- package/dist/constants.js.map +1 -1
- package/dist/errors.cjs +128 -0
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.cts +86 -1
- package/dist/errors.d.cts.map +1 -1
- package/dist/errors.d.ts +86 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +123 -1
- package/dist/errors.js.map +1 -1
- package/dist/func/index.cjs +9 -2
- package/dist/func/index.cjs.map +1 -1
- package/dist/func/index.d.cts +14 -0
- package/dist/func/index.d.cts.map +1 -1
- package/dist/func/index.d.ts +14 -0
- package/dist/func/index.d.ts.map +1 -1
- package/dist/func/index.js +9 -2
- package/dist/func/index.js.map +1 -1
- package/dist/graph/graph.cjs +44 -7
- package/dist/graph/graph.cjs.map +1 -1
- package/dist/graph/graph.d.cts +24 -2
- package/dist/graph/graph.d.cts.map +1 -1
- package/dist/graph/graph.d.ts +24 -2
- package/dist/graph/graph.d.ts.map +1 -1
- package/dist/graph/graph.js +44 -7
- package/dist/graph/graph.js.map +1 -1
- package/dist/graph/index.d.ts +3 -3
- package/dist/graph/messages_reducer.cjs +55 -0
- package/dist/graph/messages_reducer.cjs.map +1 -1
- package/dist/graph/messages_reducer.d.cts +28 -1
- package/dist/graph/messages_reducer.d.cts.map +1 -1
- package/dist/graph/messages_reducer.d.ts +28 -1
- package/dist/graph/messages_reducer.d.ts.map +1 -1
- package/dist/graph/messages_reducer.js +56 -2
- package/dist/graph/messages_reducer.js.map +1 -1
- package/dist/graph/state.cjs +174 -7
- package/dist/graph/state.cjs.map +1 -1
- package/dist/graph/state.d.cts +193 -17
- package/dist/graph/state.d.cts.map +1 -1
- package/dist/graph/state.d.ts +193 -17
- package/dist/graph/state.d.ts.map +1 -1
- package/dist/graph/state.js +175 -8
- package/dist/graph/state.js.map +1 -1
- package/dist/graph/zod/schema.cjs +5 -0
- package/dist/graph/zod/schema.cjs.map +1 -1
- package/dist/graph/zod/schema.d.cts.map +1 -1
- package/dist/graph/zod/schema.d.ts.map +1 -1
- package/dist/graph/zod/schema.js +5 -0
- package/dist/graph/zod/schema.js.map +1 -1
- package/dist/index.cjs +11 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -8
- package/dist/index.d.ts +11 -8
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/prebuilt/react_agent_executor.d.cts +1 -1
- package/dist/pregel/algo.cjs +182 -21
- package/dist/pregel/algo.cjs.map +1 -1
- package/dist/pregel/algo.d.cts +1 -1
- package/dist/pregel/algo.d.cts.map +1 -1
- package/dist/pregel/algo.d.ts +1 -1
- package/dist/pregel/algo.d.ts.map +1 -1
- package/dist/pregel/algo.js +185 -25
- package/dist/pregel/algo.js.map +1 -1
- package/dist/pregel/call.cjs +2 -1
- package/dist/pregel/call.cjs.map +1 -1
- package/dist/pregel/call.js +2 -1
- package/dist/pregel/call.js.map +1 -1
- package/dist/pregel/index.cjs +15 -3
- 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 +17 -5
- package/dist/pregel/index.js.map +1 -1
- package/dist/pregel/loop.cjs +362 -41
- package/dist/pregel/loop.cjs.map +1 -1
- package/dist/pregel/loop.js +365 -44
- package/dist/pregel/loop.js.map +1 -1
- package/dist/pregel/messages-v2.cjs +1 -1
- package/dist/pregel/messages-v2.js +1 -1
- package/dist/pregel/messages.cjs +1 -1
- package/dist/pregel/messages.js +1 -1
- package/dist/pregel/read.cjs +15 -5
- package/dist/pregel/read.cjs.map +1 -1
- package/dist/pregel/read.d.cts +9 -0
- package/dist/pregel/read.d.cts.map +1 -1
- package/dist/pregel/read.d.ts +9 -0
- package/dist/pregel/read.d.ts.map +1 -1
- package/dist/pregel/read.js +15 -5
- package/dist/pregel/read.js.map +1 -1
- package/dist/pregel/remote-run-stream.cjs +107 -0
- package/dist/pregel/remote-run-stream.cjs.map +1 -0
- package/dist/pregel/remote-run-stream.d.cts +33 -0
- package/dist/pregel/remote-run-stream.d.cts.map +1 -0
- package/dist/pregel/remote-run-stream.d.ts +33 -0
- package/dist/pregel/remote-run-stream.d.ts.map +1 -0
- package/dist/pregel/remote-run-stream.js +107 -0
- package/dist/pregel/remote-run-stream.js.map +1 -0
- package/dist/pregel/remote.cjs +61 -1
- package/dist/pregel/remote.cjs.map +1 -1
- package/dist/pregel/remote.d.cts +17 -0
- package/dist/pregel/remote.d.cts.map +1 -1
- package/dist/pregel/remote.d.ts +17 -0
- package/dist/pregel/remote.d.ts.map +1 -1
- package/dist/pregel/remote.js +61 -1
- package/dist/pregel/remote.js.map +1 -1
- package/dist/pregel/replay.cjs +62 -0
- package/dist/pregel/replay.cjs.map +1 -0
- package/dist/pregel/replay.js +62 -0
- package/dist/pregel/replay.js.map +1 -0
- package/dist/pregel/retry.cjs +8 -6
- package/dist/pregel/retry.cjs.map +1 -1
- package/dist/pregel/retry.js +8 -6
- package/dist/pregel/retry.js.map +1 -1
- package/dist/pregel/runnable_types.d.cts +20 -0
- package/dist/pregel/runnable_types.d.cts.map +1 -1
- package/dist/pregel/runnable_types.d.ts +20 -0
- package/dist/pregel/runnable_types.d.ts.map +1 -1
- package/dist/pregel/runner.cjs +48 -7
- package/dist/pregel/runner.cjs.map +1 -1
- package/dist/pregel/runner.js +50 -9
- package/dist/pregel/runner.js.map +1 -1
- package/dist/pregel/runtime.cjs +64 -0
- package/dist/pregel/runtime.cjs.map +1 -0
- package/dist/pregel/runtime.d.cts +57 -0
- package/dist/pregel/runtime.d.cts.map +1 -0
- package/dist/pregel/runtime.d.ts +57 -0
- package/dist/pregel/runtime.d.ts.map +1 -0
- package/dist/pregel/runtime.js +64 -0
- package/dist/pregel/runtime.js.map +1 -0
- package/dist/pregel/stream.cjs +2 -0
- package/dist/pregel/stream.cjs.map +1 -1
- package/dist/pregel/stream.js +2 -0
- package/dist/pregel/stream.js.map +1 -1
- package/dist/pregel/timeout.cjs +216 -0
- package/dist/pregel/timeout.cjs.map +1 -0
- package/dist/pregel/timeout.js +216 -0
- package/dist/pregel/timeout.js.map +1 -0
- package/dist/pregel/types.cjs +3 -1
- package/dist/pregel/types.cjs.map +1 -1
- package/dist/pregel/types.d.cts +13 -0
- package/dist/pregel/types.d.cts.map +1 -1
- package/dist/pregel/types.d.ts +14 -1
- package/dist/pregel/types.d.ts.map +1 -1
- package/dist/pregel/types.js +3 -1
- package/dist/pregel/types.js.map +1 -1
- package/dist/pregel/utils/config.cjs +3 -1
- package/dist/pregel/utils/config.cjs.map +1 -1
- package/dist/pregel/utils/config.d.cts.map +1 -1
- package/dist/pregel/utils/config.d.ts.map +1 -1
- package/dist/pregel/utils/config.js +3 -1
- package/dist/pregel/utils/config.js.map +1 -1
- package/dist/pregel/utils/index.cjs +1 -0
- package/dist/pregel/utils/index.cjs.map +1 -1
- package/dist/pregel/utils/index.d.cts +6 -1
- package/dist/pregel/utils/index.d.cts.map +1 -1
- package/dist/pregel/utils/index.d.ts +6 -1
- package/dist/pregel/utils/index.d.ts.map +1 -1
- package/dist/pregel/utils/index.js +1 -0
- package/dist/pregel/utils/index.js.map +1 -1
- package/dist/pregel/utils/timeout.cjs +34 -0
- package/dist/pregel/utils/timeout.cjs.map +1 -0
- package/dist/pregel/utils/timeout.d.cts +45 -0
- package/dist/pregel/utils/timeout.d.cts.map +1 -0
- package/dist/pregel/utils/timeout.d.ts +45 -0
- package/dist/pregel/utils/timeout.d.ts.map +1 -0
- package/dist/pregel/utils/timeout.js +34 -0
- package/dist/pregel/utils/timeout.js.map +1 -0
- package/dist/stream/index.cjs +1 -0
- package/dist/stream/index.d.cts +2 -1
- package/dist/stream/index.d.ts +2 -1
- package/dist/stream/index.js +1 -0
- package/dist/stream/stream-channel.d.cts +9 -1
- package/dist/stream/stream-channel.d.cts.map +1 -1
- package/dist/stream/stream-channel.d.ts +9 -1
- package/dist/stream/stream-channel.d.ts.map +1 -1
- package/dist/stream/subscription.cjs +136 -0
- package/dist/stream/subscription.cjs.map +1 -0
- package/dist/stream/subscription.d.cts +94 -0
- package/dist/stream/subscription.d.cts.map +1 -0
- package/dist/stream/subscription.d.ts +94 -0
- package/dist/stream/subscription.d.ts.map +1 -0
- package/dist/stream/subscription.js +131 -0
- package/dist/stream/subscription.js.map +1 -0
- package/dist/stream/types.d.cts +1 -1
- package/dist/stream/types.d.ts +1 -1
- package/dist/stream.cjs +16 -0
- package/dist/stream.d.cts +5 -0
- package/dist/stream.d.ts +5 -0
- package/dist/stream.js +4 -0
- package/dist/web.cjs +11 -0
- package/dist/web.d.cts +11 -8
- package/dist/web.d.ts +11 -8
- package/dist/web.js +5 -3
- package/package.json +18 -6
|
@@ -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\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":"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"}
|
|
1
|
+
{"version":3,"file":"remote.cjs","names":["BaseMessage","Runnable","Client","propagateConfigurableToMetadata","isCommand","RemoteGraphRunStream","IterableReadableStreamWithAbortSignal","#prepareRunRequest","CONFIG_KEY_STREAM","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 { RemoteGraphRunStream } from \"./remote-run-stream.js\";\nimport { IterableReadableStreamWithAbortSignal } from \"./stream.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\";\nimport type { ProtocolEvent } from \"../stream/types.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\nfunction protocolEventsToEventStream(run: AsyncIterable<ProtocolEvent>) {\n const encoder = new TextEncoder();\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n for await (const event of run) {\n const namespace = event.params.namespace;\n const eventName = namespace.length\n ? `${event.method}|${namespace.join(\"|\")}`\n : event.method;\n controller.enqueue(\n encoder.encode(\n `event: ${eventName}\\ndata: ${JSON.stringify(event.params.data ?? {})}\\n\\n`\n )\n );\n }\n } catch (error) {\n controller.enqueue(\n encoder.encode(\n `event: error\\ndata: ${JSON.stringify({ message: String(error) })}\\n\\n`\n )\n );\n } finally {\n controller.close();\n }\n },\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: \"v3\";\n encoding: \"text/event-stream\";\n }\n ): Promise<IterableReadableStream<Uint8Array>>;\n\n override streamEvents(\n input: PregelInputType,\n options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n version: \"v3\";\n encoding?: undefined;\n }\n ): Promise<RemoteGraphRunStream<PregelOutputType>>;\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\" | \"v3\";\n encoding?: \"text/event-stream\";\n },\n _streamOptions?: StreamEventsOptions\n ):\n | IterableReadableStream<StreamEvent | Uint8Array>\n | Promise<RemoteGraphRunStream<PregelOutputType>>\n | Promise<IterableReadableStream<Uint8Array>>\n | Promise<\n | RemoteGraphRunStream<PregelOutputType>\n | IterableReadableStream<Uint8Array>\n > {\n if (options.version === \"v3\") {\n return this._streamEventsV3(\n input,\n options as Partial<PregelOptions<Nn, Cc, ContextType>> & {\n version: \"v3\";\n encoding?: \"text/event-stream\";\n }\n );\n }\n throw new Error(\"Not implemented.\");\n }\n\n protected _rejectV3Unsupported(\n options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n transformers?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n control?: any;\n }\n ) {\n if (options.transformers !== undefined) {\n throw new Error(\n 'RemoteGraph.streamEvents({ version: \"v3\" }) does not support `transformers`.'\n );\n }\n if (options.control !== undefined) {\n throw new Error(\n 'RemoteGraph.streamEvents({ version: \"v3\" }) does not support `control`.'\n );\n }\n if (\n options.interruptBefore !== undefined ||\n this.interruptBefore !== undefined\n ) {\n throw new Error(\n 'RemoteGraph.streamEvents({ version: \"v3\" }) does not support `interruptBefore`.'\n );\n }\n if (\n options.interruptAfter !== undefined ||\n this.interruptAfter !== undefined\n ) {\n throw new Error(\n 'RemoteGraph.streamEvents({ version: \"v3\" }) does not support `interruptAfter`.'\n );\n }\n }\n\n protected async _streamEventsV3(\n input: PregelInputType,\n options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n version: \"v3\";\n encoding?: \"text/event-stream\";\n }\n ): Promise<\n RemoteGraphRunStream<PregelOutputType> | IterableReadableStream<Uint8Array>\n > {\n this._rejectV3Unsupported(options);\n\n const abortController = new AbortController();\n const mergedConfig = mergeConfigs(this.config, options);\n const sanitizedConfig = this._sanitizeConfig(mergedConfig);\n const configurable = { ...sanitizedConfig.configurable };\n const threadId = configurable.thread_id;\n delete configurable.thread_id;\n\n const runConfig = {\n ...sanitizedConfig,\n configurable,\n };\n\n const thread =\n typeof threadId === \"string\"\n ? this.client.threads.stream(threadId, { assistantId: this.graphId })\n : this.client.threads.stream({ assistantId: this.graphId });\n\n let serializedInput;\n if (isCommand(input)) {\n serializedInput = input.toJSON() as Record<string, unknown>;\n } else {\n serializedInput = _serializeInputs(input);\n }\n\n const run = await thread.run.start({\n input: serializedInput,\n config: runConfig,\n });\n\n const graphRun = new RemoteGraphRunStream<PregelOutputType>({\n client: this.client,\n thread,\n runId: run.run_id,\n abortController,\n });\n\n if (mergedConfig.signal != null) {\n if (mergedConfig.signal.aborted) {\n graphRun.abort(mergedConfig.signal.reason);\n } else {\n mergedConfig.signal.addEventListener(\n \"abort\",\n () => graphRun.abort(mergedConfig.signal?.reason),\n { once: true }\n );\n }\n }\n\n if (options.encoding === \"text/event-stream\") {\n const encodingAbortController = new AbortController();\n encodingAbortController.signal.addEventListener(\n \"abort\",\n () => graphRun.abort(encodingAbortController.signal.reason),\n { once: true }\n );\n return new IterableReadableStreamWithAbortSignal(\n protocolEventsToEventStream(graphRun),\n encodingAbortController\n );\n }\n\n return graphRun;\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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"}
|
package/dist/pregel/remote.d.cts
CHANGED
|
@@ -3,6 +3,7 @@ import { LangGraphRunnableConfig } from "./runnable_types.cjs";
|
|
|
3
3
|
import { PregelNode } from "./read.cjs";
|
|
4
4
|
import { PregelInputType, PregelInterface, PregelOptions, PregelOutputType, PregelParams, StateSnapshot } from "./types.cjs";
|
|
5
5
|
import { StrRecord } from "./algo.cjs";
|
|
6
|
+
import { RemoteGraphRunStream } from "./remote-run-stream.cjs";
|
|
6
7
|
import { All, CheckpointListOptions } from "@langchain/langgraph-checkpoint";
|
|
7
8
|
import { Runnable, RunnableConfig } from "@langchain/core/runnables";
|
|
8
9
|
import { Graph, Node } from "@langchain/core/runnables/graph";
|
|
@@ -83,6 +84,14 @@ declare class RemoteGraph<Nn extends StrRecord<string, PregelNode> = StrRecord<s
|
|
|
83
84
|
protected _getCheckpoint(config?: RunnableConfig): Checkpoint$1 | undefined;
|
|
84
85
|
protected _createStateSnapshot(state: ThreadState, fallbackConfig?: RunnableConfig): StateSnapshot;
|
|
85
86
|
invoke(input: PregelInputType, options?: Partial<PregelOptions<Nn, Cc, ContextType>>): Promise<PregelOutputType>;
|
|
87
|
+
streamEvents(input: PregelInputType, options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
88
|
+
version: "v3";
|
|
89
|
+
encoding: "text/event-stream";
|
|
90
|
+
}): Promise<IterableReadableStream<Uint8Array>>;
|
|
91
|
+
streamEvents(input: PregelInputType, options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
92
|
+
version: "v3";
|
|
93
|
+
encoding?: undefined;
|
|
94
|
+
}): Promise<RemoteGraphRunStream<PregelOutputType>>;
|
|
86
95
|
streamEvents(input: PregelInputType, options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
87
96
|
version: "v1" | "v2";
|
|
88
97
|
}, streamOptions?: StreamEventsOptions): IterableReadableStream<StreamEvent>;
|
|
@@ -90,6 +99,14 @@ declare class RemoteGraph<Nn extends StrRecord<string, PregelNode> = StrRecord<s
|
|
|
90
99
|
version: "v1" | "v2";
|
|
91
100
|
encoding: "text/event-stream";
|
|
92
101
|
}, streamOptions?: StreamEventsOptions): IterableReadableStream<Uint8Array>;
|
|
102
|
+
protected _rejectV3Unsupported(options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
103
|
+
transformers?: any;
|
|
104
|
+
control?: any;
|
|
105
|
+
}): void;
|
|
106
|
+
protected _streamEventsV3(input: PregelInputType, options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
107
|
+
version: "v3";
|
|
108
|
+
encoding?: "text/event-stream";
|
|
109
|
+
}): Promise<RemoteGraphRunStream<PregelOutputType> | IterableReadableStream<Uint8Array>>;
|
|
93
110
|
_streamIterator(input: PregelInputType, options?: Partial<PregelOptions<Nn, Cc, ContextType>>): AsyncGenerator<PregelOutputType>;
|
|
94
111
|
updateState(inputConfig: LangGraphRunnableConfig, values: Record<string, unknown>, asNode?: string): Promise<RunnableConfig>;
|
|
95
112
|
getStateHistory(config: RunnableConfig, options?: CheckpointListOptions): AsyncIterableIterator<StateSnapshot>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.d.cts","names":[],"sources":["../../src/pregel/remote.ts"],"mappings":"
|
|
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
|
@@ -3,6 +3,7 @@ import { LangGraphRunnableConfig } from "./runnable_types.js";
|
|
|
3
3
|
import { PregelNode } from "./read.js";
|
|
4
4
|
import { PregelInputType, PregelInterface, PregelOptions, PregelOutputType, PregelParams, StateSnapshot } from "./types.js";
|
|
5
5
|
import { StrRecord } from "./algo.js";
|
|
6
|
+
import { RemoteGraphRunStream } from "./remote-run-stream.js";
|
|
6
7
|
import { All, CheckpointListOptions } from "@langchain/langgraph-checkpoint";
|
|
7
8
|
import { Runnable, RunnableConfig } from "@langchain/core/runnables";
|
|
8
9
|
import { Graph, Node } from "@langchain/core/runnables/graph";
|
|
@@ -83,6 +84,14 @@ declare class RemoteGraph<Nn extends StrRecord<string, PregelNode> = StrRecord<s
|
|
|
83
84
|
protected _getCheckpoint(config?: RunnableConfig): Checkpoint$1 | undefined;
|
|
84
85
|
protected _createStateSnapshot(state: ThreadState, fallbackConfig?: RunnableConfig): StateSnapshot;
|
|
85
86
|
invoke(input: PregelInputType, options?: Partial<PregelOptions<Nn, Cc, ContextType>>): Promise<PregelOutputType>;
|
|
87
|
+
streamEvents(input: PregelInputType, options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
88
|
+
version: "v3";
|
|
89
|
+
encoding: "text/event-stream";
|
|
90
|
+
}): Promise<IterableReadableStream<Uint8Array>>;
|
|
91
|
+
streamEvents(input: PregelInputType, options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
92
|
+
version: "v3";
|
|
93
|
+
encoding?: undefined;
|
|
94
|
+
}): Promise<RemoteGraphRunStream<PregelOutputType>>;
|
|
86
95
|
streamEvents(input: PregelInputType, options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
87
96
|
version: "v1" | "v2";
|
|
88
97
|
}, streamOptions?: StreamEventsOptions): IterableReadableStream<StreamEvent>;
|
|
@@ -90,6 +99,14 @@ declare class RemoteGraph<Nn extends StrRecord<string, PregelNode> = StrRecord<s
|
|
|
90
99
|
version: "v1" | "v2";
|
|
91
100
|
encoding: "text/event-stream";
|
|
92
101
|
}, streamOptions?: StreamEventsOptions): IterableReadableStream<Uint8Array>;
|
|
102
|
+
protected _rejectV3Unsupported(options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
103
|
+
transformers?: any;
|
|
104
|
+
control?: any;
|
|
105
|
+
}): void;
|
|
106
|
+
protected _streamEventsV3(input: PregelInputType, options: Partial<PregelOptions<Nn, Cc, ContextType>> & {
|
|
107
|
+
version: "v3";
|
|
108
|
+
encoding?: "text/event-stream";
|
|
109
|
+
}): Promise<RemoteGraphRunStream<PregelOutputType> | IterableReadableStream<Uint8Array>>;
|
|
93
110
|
_streamIterator(input: PregelInputType, options?: Partial<PregelOptions<Nn, Cc, ContextType>>): AsyncGenerator<PregelOutputType>;
|
|
94
111
|
updateState(inputConfig: LangGraphRunnableConfig, values: Record<string, unknown>, asNode?: string): Promise<RunnableConfig>;
|
|
95
112
|
getStateHistory(config: RunnableConfig, options?: CheckpointListOptions): AsyncIterableIterator<StateSnapshot>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.d.ts","names":[],"sources":["../../src/pregel/remote.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"remote.d.ts","names":[],"sources":["../../src/pregel/remote.ts"],"mappings":"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"}
|
package/dist/pregel/remote.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { CONFIG_KEY_STREAM, INTERRUPT, isCommand } from "../constants.js";
|
|
2
2
|
import { GraphInterrupt, RemoteException } from "../errors.js";
|
|
3
3
|
import { propagateConfigurableToMetadata } from "./utils/config.js";
|
|
4
|
+
import { IterableReadableStreamWithAbortSignal } from "./stream.js";
|
|
4
5
|
import "../web.js";
|
|
6
|
+
import { RemoteGraphRunStream } from "./remote-run-stream.js";
|
|
5
7
|
import { Runnable, mergeConfigs } from "@langchain/core/runnables";
|
|
6
8
|
import { Graph } from "@langchain/core/runnables/graph";
|
|
7
9
|
import { BaseMessage } from "@langchain/core/messages";
|
|
@@ -42,6 +44,22 @@ const getStreamModes = (streamMode, defaultStreamMode = "updates") => {
|
|
|
42
44
|
reqSingle
|
|
43
45
|
};
|
|
44
46
|
};
|
|
47
|
+
function protocolEventsToEventStream(run) {
|
|
48
|
+
const encoder = new TextEncoder();
|
|
49
|
+
return new ReadableStream({ async start(controller) {
|
|
50
|
+
try {
|
|
51
|
+
for await (const event of run) {
|
|
52
|
+
const namespace = event.params.namespace;
|
|
53
|
+
const eventName = namespace.length ? `${event.method}|${namespace.join("|")}` : event.method;
|
|
54
|
+
controller.enqueue(encoder.encode(`event: ${eventName}\ndata: ${JSON.stringify(event.params.data ?? {})}\n\n`));
|
|
55
|
+
}
|
|
56
|
+
} catch (error) {
|
|
57
|
+
controller.enqueue(encoder.encode(`event: error\ndata: ${JSON.stringify({ message: String(error) })}\n\n`));
|
|
58
|
+
} finally {
|
|
59
|
+
controller.close();
|
|
60
|
+
}
|
|
61
|
+
} });
|
|
62
|
+
}
|
|
45
63
|
/**
|
|
46
64
|
* The `RemoteGraph` class is a client implementation for calling remote
|
|
47
65
|
* APIs that implement the LangGraph Server API specification.
|
|
@@ -239,9 +257,51 @@ var RemoteGraph = class extends Runnable {
|
|
|
239
257
|
for await (const chunk of stream) lastValue = chunk;
|
|
240
258
|
return lastValue;
|
|
241
259
|
}
|
|
242
|
-
streamEvents(
|
|
260
|
+
streamEvents(input, options, _streamOptions) {
|
|
261
|
+
if (options.version === "v3") return this._streamEventsV3(input, options);
|
|
243
262
|
throw new Error("Not implemented.");
|
|
244
263
|
}
|
|
264
|
+
_rejectV3Unsupported(options) {
|
|
265
|
+
if (options.transformers !== void 0) throw new Error("RemoteGraph.streamEvents({ version: \"v3\" }) does not support `transformers`.");
|
|
266
|
+
if (options.control !== void 0) throw new Error("RemoteGraph.streamEvents({ version: \"v3\" }) does not support `control`.");
|
|
267
|
+
if (options.interruptBefore !== void 0 || this.interruptBefore !== void 0) throw new Error("RemoteGraph.streamEvents({ version: \"v3\" }) does not support `interruptBefore`.");
|
|
268
|
+
if (options.interruptAfter !== void 0 || this.interruptAfter !== void 0) throw new Error("RemoteGraph.streamEvents({ version: \"v3\" }) does not support `interruptAfter`.");
|
|
269
|
+
}
|
|
270
|
+
async _streamEventsV3(input, options) {
|
|
271
|
+
this._rejectV3Unsupported(options);
|
|
272
|
+
const abortController = new AbortController();
|
|
273
|
+
const mergedConfig = mergeConfigs(this.config, options);
|
|
274
|
+
const sanitizedConfig = this._sanitizeConfig(mergedConfig);
|
|
275
|
+
const configurable = { ...sanitizedConfig.configurable };
|
|
276
|
+
const threadId = configurable.thread_id;
|
|
277
|
+
delete configurable.thread_id;
|
|
278
|
+
const runConfig = {
|
|
279
|
+
...sanitizedConfig,
|
|
280
|
+
configurable
|
|
281
|
+
};
|
|
282
|
+
const thread = typeof threadId === "string" ? this.client.threads.stream(threadId, { assistantId: this.graphId }) : this.client.threads.stream({ assistantId: this.graphId });
|
|
283
|
+
let serializedInput;
|
|
284
|
+
if (isCommand(input)) serializedInput = input.toJSON();
|
|
285
|
+
else serializedInput = _serializeInputs(input);
|
|
286
|
+
const run = await thread.run.start({
|
|
287
|
+
input: serializedInput,
|
|
288
|
+
config: runConfig
|
|
289
|
+
});
|
|
290
|
+
const graphRun = new RemoteGraphRunStream({
|
|
291
|
+
client: this.client,
|
|
292
|
+
thread,
|
|
293
|
+
runId: run.run_id,
|
|
294
|
+
abortController
|
|
295
|
+
});
|
|
296
|
+
if (mergedConfig.signal != null) if (mergedConfig.signal.aborted) graphRun.abort(mergedConfig.signal.reason);
|
|
297
|
+
else mergedConfig.signal.addEventListener("abort", () => graphRun.abort(mergedConfig.signal?.reason), { once: true });
|
|
298
|
+
if (options.encoding === "text/event-stream") {
|
|
299
|
+
const encodingAbortController = new AbortController();
|
|
300
|
+
encodingAbortController.signal.addEventListener("abort", () => graphRun.abort(encodingAbortController.signal.reason), { once: true });
|
|
301
|
+
return new IterableReadableStreamWithAbortSignal(protocolEventsToEventStream(graphRun), encodingAbortController);
|
|
302
|
+
}
|
|
303
|
+
return graphRun;
|
|
304
|
+
}
|
|
245
305
|
async *_streamIterator(input, options) {
|
|
246
306
|
const mergedConfig = mergeConfigs(this.config, options);
|
|
247
307
|
const { threadId, context, config: sanitizedConfig } = this.#prepareRunRequest(mergedConfig);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.js","names":["#prepareRunRequest","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":"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"}
|
|
1
|
+
{"version":3,"file":"remote.js","names":["#prepareRunRequest","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 { RemoteGraphRunStream } from \"./remote-run-stream.js\";\nimport { IterableReadableStreamWithAbortSignal } from \"./stream.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\";\nimport type { ProtocolEvent } from \"../stream/types.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\nfunction protocolEventsToEventStream(run: AsyncIterable<ProtocolEvent>) {\n const encoder = new TextEncoder();\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n for await (const event of run) {\n const namespace = event.params.namespace;\n const eventName = namespace.length\n ? `${event.method}|${namespace.join(\"|\")}`\n : event.method;\n controller.enqueue(\n encoder.encode(\n `event: ${eventName}\\ndata: ${JSON.stringify(event.params.data ?? {})}\\n\\n`\n )\n );\n }\n } catch (error) {\n controller.enqueue(\n encoder.encode(\n `event: error\\ndata: ${JSON.stringify({ message: String(error) })}\\n\\n`\n )\n );\n } finally {\n controller.close();\n }\n },\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: \"v3\";\n encoding: \"text/event-stream\";\n }\n ): Promise<IterableReadableStream<Uint8Array>>;\n\n override streamEvents(\n input: PregelInputType,\n options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n version: \"v3\";\n encoding?: undefined;\n }\n ): Promise<RemoteGraphRunStream<PregelOutputType>>;\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\" | \"v3\";\n encoding?: \"text/event-stream\";\n },\n _streamOptions?: StreamEventsOptions\n ):\n | IterableReadableStream<StreamEvent | Uint8Array>\n | Promise<RemoteGraphRunStream<PregelOutputType>>\n | Promise<IterableReadableStream<Uint8Array>>\n | Promise<\n | RemoteGraphRunStream<PregelOutputType>\n | IterableReadableStream<Uint8Array>\n > {\n if (options.version === \"v3\") {\n return this._streamEventsV3(\n input,\n options as Partial<PregelOptions<Nn, Cc, ContextType>> & {\n version: \"v3\";\n encoding?: \"text/event-stream\";\n }\n );\n }\n throw new Error(\"Not implemented.\");\n }\n\n protected _rejectV3Unsupported(\n options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n transformers?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n control?: any;\n }\n ) {\n if (options.transformers !== undefined) {\n throw new Error(\n 'RemoteGraph.streamEvents({ version: \"v3\" }) does not support `transformers`.'\n );\n }\n if (options.control !== undefined) {\n throw new Error(\n 'RemoteGraph.streamEvents({ version: \"v3\" }) does not support `control`.'\n );\n }\n if (\n options.interruptBefore !== undefined ||\n this.interruptBefore !== undefined\n ) {\n throw new Error(\n 'RemoteGraph.streamEvents({ version: \"v3\" }) does not support `interruptBefore`.'\n );\n }\n if (\n options.interruptAfter !== undefined ||\n this.interruptAfter !== undefined\n ) {\n throw new Error(\n 'RemoteGraph.streamEvents({ version: \"v3\" }) does not support `interruptAfter`.'\n );\n }\n }\n\n protected async _streamEventsV3(\n input: PregelInputType,\n options: Partial<PregelOptions<Nn, Cc, ContextType>> & {\n version: \"v3\";\n encoding?: \"text/event-stream\";\n }\n ): Promise<\n RemoteGraphRunStream<PregelOutputType> | IterableReadableStream<Uint8Array>\n > {\n this._rejectV3Unsupported(options);\n\n const abortController = new AbortController();\n const mergedConfig = mergeConfigs(this.config, options);\n const sanitizedConfig = this._sanitizeConfig(mergedConfig);\n const configurable = { ...sanitizedConfig.configurable };\n const threadId = configurable.thread_id;\n delete configurable.thread_id;\n\n const runConfig = {\n ...sanitizedConfig,\n configurable,\n };\n\n const thread =\n typeof threadId === \"string\"\n ? this.client.threads.stream(threadId, { assistantId: this.graphId })\n : this.client.threads.stream({ assistantId: this.graphId });\n\n let serializedInput;\n if (isCommand(input)) {\n serializedInput = input.toJSON() as Record<string, unknown>;\n } else {\n serializedInput = _serializeInputs(input);\n }\n\n const run = await thread.run.start({\n input: serializedInput,\n config: runConfig,\n });\n\n const graphRun = new RemoteGraphRunStream<PregelOutputType>({\n client: this.client,\n thread,\n runId: run.run_id,\n abortController,\n });\n\n if (mergedConfig.signal != null) {\n if (mergedConfig.signal.aborted) {\n graphRun.abort(mergedConfig.signal.reason);\n } else {\n mergedConfig.signal.addEventListener(\n \"abort\",\n () => graphRun.abort(mergedConfig.signal?.reason),\n { once: true }\n );\n }\n }\n\n if (options.encoding === \"text/event-stream\") {\n const encodingAbortController = new AbortController();\n encodingAbortController.signal.addEventListener(\n \"abort\",\n () => graphRun.abort(encodingAbortController.signal.reason),\n { once: true }\n );\n return new IterableReadableStreamWithAbortSignal(\n protocolEventsToEventStream(graphRun),\n encodingAbortController\n );\n }\n\n return graphRun;\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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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require("../constants.cjs");
|
|
2
|
+
//#region src/pregel/replay.ts
|
|
3
|
+
/**
|
|
4
|
+
* Tracks subgraph checkpoint loading during parent-graph time travel.
|
|
5
|
+
*
|
|
6
|
+
* When a parent replays from a historical checkpoint, nested subgraphs must
|
|
7
|
+
* load the checkpoint that existed *before* the replay point on their first
|
|
8
|
+
* visit, then fall back to normal latest-checkpoint loading on later visits
|
|
9
|
+
* within the same run.
|
|
10
|
+
*/
|
|
11
|
+
var ReplayState = class {
|
|
12
|
+
/** Parent checkpoint ID used as the `before` cursor for subgraph lookups. */
|
|
13
|
+
checkpointId;
|
|
14
|
+
#visitedNs = /* @__PURE__ */ new Set();
|
|
15
|
+
/**
|
|
16
|
+
* @param checkpointId - Checkpoint ID from the parent graph at the replay point.
|
|
17
|
+
*/
|
|
18
|
+
constructor(checkpointId) {
|
|
19
|
+
this.checkpointId = checkpointId;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Whether this is the first visit to a logical subgraph namespace in the run.
|
|
23
|
+
*
|
|
24
|
+
* Task-id suffixes are stripped so the same subgraph invoked across loop
|
|
25
|
+
* iterations shares one visit record.
|
|
26
|
+
*
|
|
27
|
+
* @param checkpointNs - Subgraph checkpoint namespace.
|
|
28
|
+
*/
|
|
29
|
+
#isFirstVisit(checkpointNs) {
|
|
30
|
+
const stableNs = checkpointNs.includes(":") ? checkpointNs.slice(0, checkpointNs.lastIndexOf(":")) : checkpointNs;
|
|
31
|
+
if (this.#visitedNs.has(stableNs)) return false;
|
|
32
|
+
this.#visitedNs.add(stableNs);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Load the checkpoint tuple for a subgraph namespace during replay.
|
|
37
|
+
*
|
|
38
|
+
* On the first visit to `checkpointNs`, returns the latest checkpoint saved
|
|
39
|
+
* before {@link ReplayState.checkpointId}. On subsequent visits, delegates to
|
|
40
|
+
* `checkpointer.getTuple` for the current config.
|
|
41
|
+
*
|
|
42
|
+
* @param checkpointNs - Subgraph checkpoint namespace.
|
|
43
|
+
* @param checkpointer - Checkpointer shared with the parent graph.
|
|
44
|
+
* @param checkpointConfig - Runnable config for the subgraph lookup.
|
|
45
|
+
* @returns The resolved checkpoint tuple, if any.
|
|
46
|
+
*/
|
|
47
|
+
async getCheckpoint(checkpointNs, checkpointer, checkpointConfig) {
|
|
48
|
+
if (this.#isFirstVisit(checkpointNs)) {
|
|
49
|
+
const results = [];
|
|
50
|
+
for await (const saved of checkpointer.list(checkpointConfig, {
|
|
51
|
+
before: { configurable: { checkpoint_id: this.checkpointId } },
|
|
52
|
+
limit: 1
|
|
53
|
+
})) results.push(saved);
|
|
54
|
+
return results.length > 0 ? results[0] : void 0;
|
|
55
|
+
}
|
|
56
|
+
return await checkpointer.getTuple(checkpointConfig) ?? void 0;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
//#endregion
|
|
60
|
+
exports.ReplayState = ReplayState;
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=replay.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.cjs","names":["#visitedNs","#isFirstVisit"],"sources":["../../src/pregel/replay.ts"],"sourcesContent":["import type {\n BaseCheckpointSaver,\n CheckpointTuple,\n} from \"@langchain/langgraph-checkpoint\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { CHECKPOINT_NAMESPACE_END } from \"../constants.js\";\n\n/**\n * Tracks subgraph checkpoint loading during parent-graph time travel.\n *\n * When a parent replays from a historical checkpoint, nested subgraphs must\n * load the checkpoint that existed *before* the replay point on their first\n * visit, then fall back to normal latest-checkpoint loading on later visits\n * within the same run.\n */\nexport class ReplayState {\n /** Parent checkpoint ID used as the `before` cursor for subgraph lookups. */\n checkpointId: string;\n\n #visitedNs: Set<string> = new Set();\n\n /**\n * @param checkpointId - Checkpoint ID from the parent graph at the replay point.\n */\n constructor(checkpointId: string) {\n this.checkpointId = checkpointId;\n }\n\n /**\n * Whether this is the first visit to a logical subgraph namespace in the run.\n *\n * Task-id suffixes are stripped so the same subgraph invoked across loop\n * iterations shares one visit record.\n *\n * @param checkpointNs - Subgraph checkpoint namespace.\n */\n #isFirstVisit(checkpointNs: string): boolean {\n const stableNs = checkpointNs.includes(CHECKPOINT_NAMESPACE_END)\n ? checkpointNs.slice(\n 0,\n checkpointNs.lastIndexOf(CHECKPOINT_NAMESPACE_END)\n )\n : checkpointNs;\n if (this.#visitedNs.has(stableNs)) {\n return false;\n }\n this.#visitedNs.add(stableNs);\n return true;\n }\n\n /**\n * Load the checkpoint tuple for a subgraph namespace during replay.\n *\n * On the first visit to `checkpointNs`, returns the latest checkpoint saved\n * before {@link ReplayState.checkpointId}. On subsequent visits, delegates to\n * `checkpointer.getTuple` for the current config.\n *\n * @param checkpointNs - Subgraph checkpoint namespace.\n * @param checkpointer - Checkpointer shared with the parent graph.\n * @param checkpointConfig - Runnable config for the subgraph lookup.\n * @returns The resolved checkpoint tuple, if any.\n */\n async getCheckpoint(\n checkpointNs: string,\n checkpointer: BaseCheckpointSaver,\n checkpointConfig: RunnableConfig\n ): Promise<CheckpointTuple | undefined> {\n if (this.#isFirstVisit(checkpointNs)) {\n const results: CheckpointTuple[] = [];\n for await (const saved of checkpointer.list(checkpointConfig, {\n before: {\n configurable: { checkpoint_id: this.checkpointId },\n },\n limit: 1,\n })) {\n results.push(saved);\n }\n return results.length > 0 ? results[0] : undefined;\n }\n return (await checkpointer.getTuple(checkpointConfig)) ?? undefined;\n }\n}\n"],"mappings":";;;;;;;;;;AAeA,IAAa,cAAb,MAAyB;;CAEvB;CAEA,6BAA0B,IAAI,KAAK;;;;CAKnC,YAAY,cAAsB;AAChC,OAAK,eAAe;;;;;;;;;;CAWtB,cAAc,cAA+B;EAC3C,MAAM,WAAW,aAAa,SAAA,IAAkC,GAC5D,aAAa,MACX,GACA,aAAa,YAAA,IAAqC,CACnD,GACD;AACJ,MAAI,MAAA,UAAgB,IAAI,SAAS,CAC/B,QAAO;AAET,QAAA,UAAgB,IAAI,SAAS;AAC7B,SAAO;;;;;;;;;;;;;;CAeT,MAAM,cACJ,cACA,cACA,kBACsC;AACtC,MAAI,MAAA,aAAmB,aAAa,EAAE;GACpC,MAAM,UAA6B,EAAE;AACrC,cAAW,MAAM,SAAS,aAAa,KAAK,kBAAkB;IAC5D,QAAQ,EACN,cAAc,EAAE,eAAe,KAAK,cAAc,EACnD;IACD,OAAO;IACR,CAAC,CACA,SAAQ,KAAK,MAAM;AAErB,UAAO,QAAQ,SAAS,IAAI,QAAQ,KAAK,KAAA;;AAE3C,SAAQ,MAAM,aAAa,SAAS,iBAAiB,IAAK,KAAA"}
|