@langchain/langgraph 1.2.2 → 1.2.3
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/any_value.cjs +3 -4
- package/dist/channels/any_value.cjs.map +1 -1
- package/dist/channels/any_value.js +1 -2
- package/dist/channels/any_value.js.map +1 -1
- package/dist/channels/base.cjs +2 -3
- package/dist/channels/base.cjs.map +1 -1
- package/dist/channels/base.js +1 -2
- package/dist/channels/base.js.map +1 -1
- package/dist/channels/binop.cjs +4 -5
- package/dist/channels/binop.cjs.map +1 -1
- package/dist/channels/binop.js +1 -2
- package/dist/channels/binop.js.map +1 -1
- package/dist/channels/dynamic_barrier_value.cjs +4 -5
- package/dist/channels/dynamic_barrier_value.cjs.map +1 -1
- package/dist/channels/dynamic_barrier_value.js +1 -2
- package/dist/channels/dynamic_barrier_value.js.map +1 -1
- package/dist/channels/ephemeral_value.cjs +3 -4
- package/dist/channels/ephemeral_value.cjs.map +1 -1
- package/dist/channels/ephemeral_value.js +1 -2
- package/dist/channels/ephemeral_value.js.map +1 -1
- package/dist/channels/index.cjs +11 -12
- package/dist/channels/index.js +1 -2
- package/dist/channels/last_value.cjs +3 -4
- package/dist/channels/last_value.cjs.map +1 -1
- package/dist/channels/last_value.js +1 -2
- package/dist/channels/last_value.js.map +1 -1
- package/dist/channels/named_barrier_value.cjs +3 -4
- package/dist/channels/named_barrier_value.cjs.map +1 -1
- package/dist/channels/named_barrier_value.js +1 -2
- package/dist/channels/named_barrier_value.js.map +1 -1
- package/dist/channels/topic.cjs +3 -4
- package/dist/channels/topic.cjs.map +1 -1
- package/dist/channels/topic.js +1 -2
- package/dist/channels/topic.js.map +1 -1
- package/dist/channels/untracked_value.cjs +3 -4
- package/dist/channels/untracked_value.cjs.map +1 -1
- package/dist/channels/untracked_value.js +1 -2
- package/dist/channels/untracked_value.js.map +1 -1
- package/dist/constants.cjs +4 -9
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.js +5 -7
- package/dist/constants.js.map +1 -1
- package/dist/errors.cjs +1 -2
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/func/index.cjs +9 -10
- package/dist/func/index.cjs.map +1 -1
- package/dist/func/index.js +1 -2
- package/dist/func/index.js.map +1 -1
- package/dist/graph/annotation.cjs +3 -4
- package/dist/graph/annotation.cjs.map +1 -1
- package/dist/graph/annotation.js +1 -2
- package/dist/graph/annotation.js.map +1 -1
- package/dist/graph/graph.cjs +23 -24
- package/dist/graph/graph.cjs.map +1 -1
- package/dist/graph/graph.js +16 -17
- package/dist/graph/graph.js.map +1 -1
- package/dist/graph/index.cjs +6 -6
- package/dist/graph/index.js +7 -8
- package/dist/graph/message.cjs +4 -5
- package/dist/graph/message.cjs.map +1 -1
- package/dist/graph/message.js +1 -2
- package/dist/graph/message.js.map +1 -1
- package/dist/graph/messages_annotation.cjs +4 -5
- package/dist/graph/messages_annotation.cjs.map +1 -1
- package/dist/graph/messages_annotation.js +1 -2
- package/dist/graph/messages_annotation.js.map +1 -1
- package/dist/graph/messages_reducer.cjs +2 -3
- package/dist/graph/messages_reducer.cjs.map +1 -1
- package/dist/graph/messages_reducer.js +2 -3
- package/dist/graph/messages_reducer.js.map +1 -1
- package/dist/graph/state.cjs +24 -25
- package/dist/graph/state.cjs.map +1 -1
- package/dist/graph/state.js +10 -11
- package/dist/graph/state.js.map +1 -1
- package/dist/graph/types.cjs +4 -5
- package/dist/graph/types.cjs.map +1 -1
- package/dist/graph/types.js +2 -3
- package/dist/graph/types.js.map +1 -1
- package/dist/graph/zod/index.cjs +5 -6
- package/dist/graph/zod/index.js +1 -2
- package/dist/graph/zod/meta.cjs +4 -5
- package/dist/graph/zod/meta.cjs.map +1 -1
- package/dist/graph/zod/meta.js +2 -3
- package/dist/graph/zod/meta.js.map +1 -1
- package/dist/graph/zod/plugin.cjs +2 -3
- package/dist/graph/zod/plugin.cjs.map +1 -1
- package/dist/graph/zod/plugin.js +2 -3
- package/dist/graph/zod/plugin.js.map +1 -1
- package/dist/graph/zod/schema.cjs +5 -6
- package/dist/graph/zod/schema.cjs.map +1 -1
- package/dist/graph/zod/schema.js +4 -5
- package/dist/graph/zod/schema.js.map +1 -1
- package/dist/graph/zod/zod-registry.cjs +2 -3
- package/dist/graph/zod/zod-registry.cjs.map +1 -1
- package/dist/graph/zod/zod-registry.js +1 -2
- package/dist/graph/zod/zod-registry.js.map +1 -1
- package/dist/hash.cjs +1 -2
- package/dist/hash.cjs.map +1 -1
- package/dist/hash.js +1 -1
- package/dist/index.cjs +60 -61
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/interrupt.cjs +7 -8
- package/dist/interrupt.cjs.map +1 -1
- package/dist/interrupt.js +5 -6
- package/dist/interrupt.js.map +1 -1
- package/dist/prebuilt/agentName.cjs +1 -2
- package/dist/prebuilt/agentName.cjs.map +1 -1
- package/dist/prebuilt/agentName.js +1 -2
- package/dist/prebuilt/agentName.js.map +1 -1
- package/dist/prebuilt/agent_executor.cjs +4 -5
- package/dist/prebuilt/agent_executor.cjs.map +1 -1
- package/dist/prebuilt/agent_executor.js +1 -2
- package/dist/prebuilt/agent_executor.js.map +1 -1
- package/dist/prebuilt/chat_agent_executor.cjs +4 -5
- package/dist/prebuilt/chat_agent_executor.cjs.map +1 -1
- package/dist/prebuilt/chat_agent_executor.js +1 -2
- package/dist/prebuilt/chat_agent_executor.js.map +1 -1
- package/dist/prebuilt/index.cjs +8 -9
- package/dist/prebuilt/index.js +1 -2
- package/dist/prebuilt/react_agent_executor.cjs +8 -9
- package/dist/prebuilt/react_agent_executor.cjs.map +1 -1
- package/dist/prebuilt/react_agent_executor.js +1 -2
- package/dist/prebuilt/react_agent_executor.js.map +1 -1
- package/dist/prebuilt/tool_executor.cjs +1 -2
- package/dist/prebuilt/tool_executor.cjs.map +1 -1
- package/dist/prebuilt/tool_executor.js +1 -2
- package/dist/prebuilt/tool_executor.js.map +1 -1
- package/dist/prebuilt/tool_node.cjs +4 -5
- package/dist/prebuilt/tool_node.cjs.map +1 -1
- package/dist/prebuilt/tool_node.js +1 -2
- package/dist/prebuilt/tool_node.js.map +1 -1
- package/dist/pregel/algo.cjs +30 -31
- package/dist/pregel/algo.cjs.map +1 -1
- package/dist/pregel/algo.js +23 -24
- package/dist/pregel/algo.js.map +1 -1
- package/dist/pregel/call.cjs +5 -6
- package/dist/pregel/call.cjs.map +1 -1
- package/dist/pregel/call.js +2 -3
- package/dist/pregel/call.js.map +1 -1
- package/dist/pregel/debug.cjs +10 -11
- package/dist/pregel/debug.cjs.map +1 -1
- package/dist/pregel/debug.js +8 -9
- package/dist/pregel/debug.js.map +1 -1
- package/dist/pregel/index.cjs +47 -48
- package/dist/pregel/index.cjs.map +1 -1
- package/dist/pregel/index.js +28 -29
- package/dist/pregel/index.js.map +1 -1
- package/dist/pregel/io.cjs +7 -8
- package/dist/pregel/io.cjs.map +1 -1
- package/dist/pregel/io.js +5 -6
- package/dist/pregel/io.js.map +1 -1
- package/dist/pregel/loop.cjs +29 -30
- package/dist/pregel/loop.cjs.map +1 -1
- package/dist/pregel/loop.js +20 -21
- package/dist/pregel/loop.js.map +1 -1
- package/dist/pregel/messages.cjs +4 -5
- package/dist/pregel/messages.cjs.map +1 -1
- package/dist/pregel/messages.js +4 -5
- package/dist/pregel/messages.js.map +1 -1
- package/dist/pregel/read.cjs +4 -5
- package/dist/pregel/read.cjs.map +1 -1
- package/dist/pregel/read.js +1 -2
- package/dist/pregel/read.js.map +1 -1
- package/dist/pregel/remote.cjs +9 -10
- package/dist/pregel/remote.cjs.map +1 -1
- package/dist/pregel/remote.js +7 -8
- package/dist/pregel/remote.js.map +1 -1
- package/dist/pregel/retry.cjs +8 -14
- package/dist/pregel/retry.cjs.map +1 -1
- package/dist/pregel/retry.js +4 -10
- package/dist/pregel/retry.js.map +1 -1
- package/dist/pregel/runner.cjs +8 -9
- package/dist/pregel/runner.cjs.map +1 -1
- package/dist/pregel/runner.js +4 -5
- package/dist/pregel/runner.js.map +1 -1
- package/dist/pregel/stream.cjs +3 -4
- package/dist/pregel/stream.cjs.map +1 -1
- package/dist/pregel/stream.js +3 -4
- package/dist/pregel/stream.js.map +1 -1
- package/dist/pregel/types.cjs +1 -2
- package/dist/pregel/types.cjs.map +1 -1
- package/dist/pregel/types.js +1 -1
- package/dist/pregel/types.js.map +1 -1
- package/dist/pregel/utils/config.cjs +6 -7
- package/dist/pregel/utils/config.cjs.map +1 -1
- package/dist/pregel/utils/config.js +6 -7
- package/dist/pregel/utils/config.js.map +1 -1
- package/dist/pregel/utils/index.cjs +2 -3
- package/dist/pregel/utils/index.cjs.map +1 -1
- package/dist/pregel/utils/index.js +1 -2
- package/dist/pregel/utils/index.js.map +1 -1
- package/dist/pregel/utils/subgraph.cjs +1 -2
- package/dist/pregel/utils/subgraph.cjs.map +1 -1
- package/dist/pregel/utils/subgraph.js +1 -1
- package/dist/pregel/validate.cjs +4 -5
- package/dist/pregel/validate.cjs.map +1 -1
- package/dist/pregel/validate.js +2 -3
- package/dist/pregel/validate.js.map +1 -1
- package/dist/pregel/write.cjs +5 -8
- package/dist/pregel/write.cjs.map +1 -1
- package/dist/pregel/write.js +2 -5
- package/dist/pregel/write.js.map +1 -1
- package/dist/remote.cjs +3 -4
- package/dist/remote.js +1 -2
- package/dist/setup/async_local_storage.cjs +1 -2
- package/dist/setup/async_local_storage.cjs.map +1 -1
- package/dist/setup/async_local_storage.js +1 -2
- package/dist/setup/async_local_storage.js.map +1 -1
- package/dist/state/adapter.cjs +2 -3
- package/dist/state/adapter.cjs.map +1 -1
- package/dist/state/adapter.js +1 -2
- package/dist/state/adapter.js.map +1 -1
- package/dist/state/index.cjs +8 -8
- package/dist/state/index.js +7 -8
- package/dist/state/prebuilt/index.cjs +1 -1
- package/dist/state/prebuilt/index.js +2 -3
- package/dist/state/prebuilt/messages.cjs +3 -4
- package/dist/state/prebuilt/messages.cjs.map +1 -1
- package/dist/state/prebuilt/messages.js +3 -7
- package/dist/state/prebuilt/messages.js.map +1 -1
- package/dist/state/schema.cjs +16 -12
- package/dist/state/schema.cjs.map +1 -1
- package/dist/state/schema.d.cts.map +1 -1
- package/dist/state/schema.d.ts.map +1 -1
- package/dist/state/schema.js +8 -4
- package/dist/state/schema.js.map +1 -1
- package/dist/state/types.cjs +1 -2
- package/dist/state/types.cjs.map +1 -1
- package/dist/state/types.js +1 -1
- package/dist/state/values/index.cjs +2 -2
- package/dist/state/values/index.js +3 -4
- package/dist/state/values/reduced.cjs +1 -2
- package/dist/state/values/reduced.cjs.map +1 -1
- package/dist/state/values/reduced.js +1 -1
- package/dist/state/values/reduced.js.map +1 -1
- package/dist/state/values/untracked.cjs +1 -2
- package/dist/state/values/untracked.cjs.map +1 -1
- package/dist/state/values/untracked.js +1 -1
- package/dist/state/values/untracked.js.map +1 -1
- package/dist/utils.cjs +2 -3
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.js +1 -2
- package/dist/utils.js.map +1 -1
- package/dist/web.cjs +58 -59
- package/dist/web.js +1 -2
- package/dist/writer.cjs +1 -2
- package/dist/writer.cjs.map +1 -1
- package/dist/writer.js +1 -2
- package/dist/writer.js.map +1 -1
- package/package.json +3 -3
package/dist/pregel/retry.js
CHANGED
|
@@ -2,12 +2,6 @@ import { CONFIG_KEY_RESUMING, Command } from "../constants.js";
|
|
|
2
2
|
import { isGraphBubbleUp, isParentCommand } from "../errors.js";
|
|
3
3
|
import { getParentCheckpointNamespace } from "./utils/config.js";
|
|
4
4
|
import { patchConfigurable } from "./utils/index.js";
|
|
5
|
-
|
|
6
|
-
//#region src/pregel/retry.ts
|
|
7
|
-
const DEFAULT_INITIAL_INTERVAL = 500;
|
|
8
|
-
const DEFAULT_BACKOFF_FACTOR = 2;
|
|
9
|
-
const DEFAULT_MAX_INTERVAL = 128e3;
|
|
10
|
-
const DEFAULT_MAX_RETRIES = 3;
|
|
11
5
|
const DEFAULT_STATUS_NO_RETRY = [
|
|
12
6
|
400,
|
|
13
7
|
401,
|
|
@@ -30,7 +24,7 @@ const DEFAULT_RETRY_ON_HANDLER = (error) => {
|
|
|
30
24
|
};
|
|
31
25
|
async function _runWithRetry(pregelTask, retryPolicy, configurable, signal) {
|
|
32
26
|
const resolvedRetryPolicy = pregelTask.retry_policy ?? retryPolicy;
|
|
33
|
-
let interval = resolvedRetryPolicy !== void 0 ? resolvedRetryPolicy.initialInterval ??
|
|
27
|
+
let interval = resolvedRetryPolicy !== void 0 ? resolvedRetryPolicy.initialInterval ?? 500 : 0;
|
|
34
28
|
let attempts = 0;
|
|
35
29
|
let error;
|
|
36
30
|
let result;
|
|
@@ -68,9 +62,9 @@ async function _runWithRetry(pregelTask, retryPolicy, configurable, signal) {
|
|
|
68
62
|
if (isGraphBubbleUp(error)) break;
|
|
69
63
|
if (resolvedRetryPolicy === void 0) break;
|
|
70
64
|
attempts += 1;
|
|
71
|
-
if (attempts >= (resolvedRetryPolicy.maxAttempts ??
|
|
65
|
+
if (attempts >= (resolvedRetryPolicy.maxAttempts ?? 3)) break;
|
|
72
66
|
if (!(resolvedRetryPolicy.retryOn ?? DEFAULT_RETRY_ON_HANDLER)(error)) break;
|
|
73
|
-
interval = Math.min(resolvedRetryPolicy.maxInterval ??
|
|
67
|
+
interval = Math.min(resolvedRetryPolicy.maxInterval ?? 128e3, interval * (resolvedRetryPolicy.backoffFactor ?? 2));
|
|
74
68
|
const intervalWithJitter = resolvedRetryPolicy.jitter ? Math.floor(interval + Math.random() * 1e3) : interval;
|
|
75
69
|
await new Promise((resolve) => setTimeout(resolve, intervalWithJitter));
|
|
76
70
|
const errorName = error.name ?? error.constructor.unminifiable_name ?? error.constructor.name;
|
|
@@ -85,7 +79,7 @@ async function _runWithRetry(pregelTask, retryPolicy, configurable, signal) {
|
|
|
85
79
|
signalAborted: signal?.aborted
|
|
86
80
|
};
|
|
87
81
|
}
|
|
88
|
-
|
|
89
82
|
//#endregion
|
|
90
83
|
export { _runWithRetry };
|
|
84
|
+
|
|
91
85
|
//# sourceMappingURL=retry.js.map
|
package/dist/pregel/retry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","names":[],"sources":["../../src/pregel/retry.ts"],"sourcesContent":["import { Command, CONFIG_KEY_RESUMING } from \"../constants.js\";\nimport { isGraphBubbleUp, isParentCommand } from \"../errors.js\";\nimport { PregelExecutableTask } from \"./types.js\";\nimport { getParentCheckpointNamespace } from \"./utils/config.js\";\nimport { patchConfigurable, type RetryPolicy } from \"./utils/index.js\";\n\nexport const DEFAULT_INITIAL_INTERVAL = 500;\nexport const DEFAULT_BACKOFF_FACTOR = 2;\nexport const DEFAULT_MAX_INTERVAL = 128000;\nexport const DEFAULT_MAX_RETRIES = 3;\n\nconst DEFAULT_STATUS_NO_RETRY = [\n 400, // Bad Request\n 401, // Unauthorized\n 402, // Payment Required\n 403, // Forbidden\n 404, // Not Found\n 405, // Method Not Allowed\n 406, // Not Acceptable\n 407, // Proxy Authentication Required\n 409, // Conflict\n];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst DEFAULT_RETRY_ON_HANDLER = (error: any) => {\n if (\n error.message.startsWith(\"Cancel\") ||\n error.message.startsWith(\"AbortError\") ||\n error.name === \"AbortError\"\n ) {\n return false;\n }\n\n // Thrown when interrupt is called without a checkpointer\n if (error.name === \"GraphValueError\") {\n return false;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((error as any)?.code === \"ECONNABORTED\") {\n return false;\n }\n\n const status =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any)?.response?.status ?? (error as any)?.status;\n if (status && DEFAULT_STATUS_NO_RETRY.includes(+status)) {\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((error as any)?.error?.code === \"insufficient_quota\") {\n return false;\n }\n return true;\n};\n\nexport type SettledPregelTask = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n task: PregelExecutableTask<any, any>;\n error: Error;\n signalAborted?: boolean;\n};\n\nexport async function _runWithRetry<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pregelTask: PregelExecutableTask<N, C>,\n retryPolicy?: RetryPolicy,\n configurable?: Record<string, unknown>,\n signal?: AbortSignal\n): Promise<{\n task: PregelExecutableTask<N, C>;\n result: unknown;\n error: Error | undefined;\n signalAborted?: boolean;\n}> {\n const resolvedRetryPolicy = pregelTask.retry_policy ?? retryPolicy;\n let interval =\n resolvedRetryPolicy !== undefined\n ? resolvedRetryPolicy.initialInterval ?? DEFAULT_INITIAL_INTERVAL\n : 0;\n let attempts = 0;\n let error;\n let result;\n\n let { config } = pregelTask;\n if (configurable) config = patchConfigurable(config, configurable);\n config = { ...config, signal };\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (signal?.aborted) {\n // no need to throw here - we'll throw from the runner, instead.\n // there's just no point in retrying if the user has requested an abort.\n break;\n }\n // Clear any writes from previous attempts\n pregelTask.writes.splice(0, pregelTask.writes.length);\n error = undefined;\n try {\n result = await pregelTask.proc.invoke(pregelTask.input, config);\n break;\n } catch (e: unknown) {\n error = e;\n (error as { pregelTaskId: string }).pregelTaskId = pregelTask.id;\n if (isParentCommand(error)) {\n const ns: string = config?.configurable?.checkpoint_ns;\n const cmd = error.command;\n if (cmd.graph === ns) {\n // this command is for the current graph, handle it\n for (const writer of pregelTask.writers) {\n await writer.invoke(cmd, config);\n }\n error = undefined;\n break;\n } else if (cmd.graph === Command.PARENT) {\n // this command is for the parent graph, assign it to the parent\n const parentNs = getParentCheckpointNamespace(ns);\n error.command = new Command({\n ...error.command,\n graph: parentNs,\n });\n }\n }\n if (isGraphBubbleUp(error)) {\n break;\n }\n if (resolvedRetryPolicy === undefined) {\n break;\n }\n attempts += 1;\n // check if we should give up\n if (\n attempts >= (resolvedRetryPolicy.maxAttempts ?? DEFAULT_MAX_RETRIES)\n ) {\n break;\n }\n const retryOn = resolvedRetryPolicy.retryOn ?? DEFAULT_RETRY_ON_HANDLER;\n if (!retryOn(error)) {\n break;\n }\n interval = Math.min(\n resolvedRetryPolicy.maxInterval ?? DEFAULT_MAX_INTERVAL,\n interval * (resolvedRetryPolicy.backoffFactor ?? DEFAULT_BACKOFF_FACTOR)\n );\n const intervalWithJitter = resolvedRetryPolicy.jitter\n ? Math.floor(interval + Math.random() * 1000)\n : interval;\n // sleep before retrying\n // eslint-disable-next-line no-promise-executor-return\n await new Promise((resolve) => setTimeout(resolve, intervalWithJitter));\n // log the retry\n const errorName =\n (error as Error).name ??\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((error as Error).constructor as any).unminifiable_name ??\n (error as Error).constructor.name;\n if (resolvedRetryPolicy?.logWarning ?? true) {\n console.log(\n `Retrying task \"${String(pregelTask.name)}\" after ${interval.toFixed(\n 2\n )}ms (attempt ${attempts}) after ${errorName}: ${error}`\n );\n }\n\n // signal subgraphs to resume (if available)\n config = patchConfigurable(config, { [CONFIG_KEY_RESUMING]: true });\n }\n }\n return {\n task: pregelTask,\n result,\n error: error as Error | undefined,\n signalAborted: signal?.aborted,\n };\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"retry.js","names":[],"sources":["../../src/pregel/retry.ts"],"sourcesContent":["import { Command, CONFIG_KEY_RESUMING } from \"../constants.js\";\nimport { isGraphBubbleUp, isParentCommand } from \"../errors.js\";\nimport { PregelExecutableTask } from \"./types.js\";\nimport { getParentCheckpointNamespace } from \"./utils/config.js\";\nimport { patchConfigurable, type RetryPolicy } from \"./utils/index.js\";\n\nexport const DEFAULT_INITIAL_INTERVAL = 500;\nexport const DEFAULT_BACKOFF_FACTOR = 2;\nexport const DEFAULT_MAX_INTERVAL = 128000;\nexport const DEFAULT_MAX_RETRIES = 3;\n\nconst DEFAULT_STATUS_NO_RETRY = [\n 400, // Bad Request\n 401, // Unauthorized\n 402, // Payment Required\n 403, // Forbidden\n 404, // Not Found\n 405, // Method Not Allowed\n 406, // Not Acceptable\n 407, // Proxy Authentication Required\n 409, // Conflict\n];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst DEFAULT_RETRY_ON_HANDLER = (error: any) => {\n if (\n error.message.startsWith(\"Cancel\") ||\n error.message.startsWith(\"AbortError\") ||\n error.name === \"AbortError\"\n ) {\n return false;\n }\n\n // Thrown when interrupt is called without a checkpointer\n if (error.name === \"GraphValueError\") {\n return false;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((error as any)?.code === \"ECONNABORTED\") {\n return false;\n }\n\n const status =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any)?.response?.status ?? (error as any)?.status;\n if (status && DEFAULT_STATUS_NO_RETRY.includes(+status)) {\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((error as any)?.error?.code === \"insufficient_quota\") {\n return false;\n }\n return true;\n};\n\nexport type SettledPregelTask = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n task: PregelExecutableTask<any, any>;\n error: Error;\n signalAborted?: boolean;\n};\n\nexport async function _runWithRetry<\n N extends PropertyKey,\n C extends PropertyKey\n>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pregelTask: PregelExecutableTask<N, C>,\n retryPolicy?: RetryPolicy,\n configurable?: Record<string, unknown>,\n signal?: AbortSignal\n): Promise<{\n task: PregelExecutableTask<N, C>;\n result: unknown;\n error: Error | undefined;\n signalAborted?: boolean;\n}> {\n const resolvedRetryPolicy = pregelTask.retry_policy ?? retryPolicy;\n let interval =\n resolvedRetryPolicy !== undefined\n ? resolvedRetryPolicy.initialInterval ?? DEFAULT_INITIAL_INTERVAL\n : 0;\n let attempts = 0;\n let error;\n let result;\n\n let { config } = pregelTask;\n if (configurable) config = patchConfigurable(config, configurable);\n config = { ...config, signal };\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (signal?.aborted) {\n // no need to throw here - we'll throw from the runner, instead.\n // there's just no point in retrying if the user has requested an abort.\n break;\n }\n // Clear any writes from previous attempts\n pregelTask.writes.splice(0, pregelTask.writes.length);\n error = undefined;\n try {\n result = await pregelTask.proc.invoke(pregelTask.input, config);\n break;\n } catch (e: unknown) {\n error = e;\n (error as { pregelTaskId: string }).pregelTaskId = pregelTask.id;\n if (isParentCommand(error)) {\n const ns: string = config?.configurable?.checkpoint_ns;\n const cmd = error.command;\n if (cmd.graph === ns) {\n // this command is for the current graph, handle it\n for (const writer of pregelTask.writers) {\n await writer.invoke(cmd, config);\n }\n error = undefined;\n break;\n } else if (cmd.graph === Command.PARENT) {\n // this command is for the parent graph, assign it to the parent\n const parentNs = getParentCheckpointNamespace(ns);\n error.command = new Command({\n ...error.command,\n graph: parentNs,\n });\n }\n }\n if (isGraphBubbleUp(error)) {\n break;\n }\n if (resolvedRetryPolicy === undefined) {\n break;\n }\n attempts += 1;\n // check if we should give up\n if (\n attempts >= (resolvedRetryPolicy.maxAttempts ?? DEFAULT_MAX_RETRIES)\n ) {\n break;\n }\n const retryOn = resolvedRetryPolicy.retryOn ?? DEFAULT_RETRY_ON_HANDLER;\n if (!retryOn(error)) {\n break;\n }\n interval = Math.min(\n resolvedRetryPolicy.maxInterval ?? DEFAULT_MAX_INTERVAL,\n interval * (resolvedRetryPolicy.backoffFactor ?? DEFAULT_BACKOFF_FACTOR)\n );\n const intervalWithJitter = resolvedRetryPolicy.jitter\n ? Math.floor(interval + Math.random() * 1000)\n : interval;\n // sleep before retrying\n // eslint-disable-next-line no-promise-executor-return\n await new Promise((resolve) => setTimeout(resolve, intervalWithJitter));\n // log the retry\n const errorName =\n (error as Error).name ??\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((error as Error).constructor as any).unminifiable_name ??\n (error as Error).constructor.name;\n if (resolvedRetryPolicy?.logWarning ?? true) {\n console.log(\n `Retrying task \"${String(pregelTask.name)}\" after ${interval.toFixed(\n 2\n )}ms (attempt ${attempts}) after ${errorName}: ${error}`\n );\n }\n\n // signal subgraphs to resume (if available)\n config = patchConfigurable(config, { [CONFIG_KEY_RESUMING]: true });\n }\n }\n return {\n task: pregelTask,\n result,\n error: error as Error | undefined,\n signalAborted: signal?.aborted,\n };\n}\n"],"mappings":";;;;AAWA,MAAM,0BAA0B;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAGD,MAAM,4BAA4B,UAAe;AAC/C,KACE,MAAM,QAAQ,WAAW,SAAS,IAClC,MAAM,QAAQ,WAAW,aAAa,IACtC,MAAM,SAAS,aAEf,QAAO;AAIT,KAAI,MAAM,SAAS,kBACjB,QAAO;AAIT,KAAK,OAAe,SAAS,eAC3B,QAAO;CAGT,MAAM,SAEH,OAAe,UAAU,UAAW,OAAe;AACtD,KAAI,UAAU,wBAAwB,SAAS,CAAC,OAAO,CACrD,QAAO;AAGT,KAAK,OAAe,OAAO,SAAS,qBAClC,QAAO;AAET,QAAO;;AAUT,eAAsB,cAKpB,YACA,aACA,cACA,QAMC;CACD,MAAM,sBAAsB,WAAW,gBAAgB;CACvD,IAAI,WACF,wBAAwB,KAAA,IACpB,oBAAoB,mBAAA,MACpB;CACN,IAAI,WAAW;CACf,IAAI;CACJ,IAAI;CAEJ,IAAI,EAAE,WAAW;AACjB,KAAI,aAAc,UAAS,kBAAkB,QAAQ,aAAa;AAClE,UAAS;EAAE,GAAG;EAAQ;EAAQ;AAG9B,QAAO,MAAM;AACX,MAAI,QAAQ,QAGV;AAGF,aAAW,OAAO,OAAO,GAAG,WAAW,OAAO,OAAO;AACrD,UAAQ,KAAA;AACR,MAAI;AACF,YAAS,MAAM,WAAW,KAAK,OAAO,WAAW,OAAO,OAAO;AAC/D;WACO,GAAY;AACnB,WAAQ;AACP,SAAmC,eAAe,WAAW;AAC9D,OAAI,gBAAgB,MAAM,EAAE;IAC1B,MAAM,KAAa,QAAQ,cAAc;IACzC,MAAM,MAAM,MAAM;AAClB,QAAI,IAAI,UAAU,IAAI;AAEpB,UAAK,MAAM,UAAU,WAAW,QAC9B,OAAM,OAAO,OAAO,KAAK,OAAO;AAElC,aAAQ,KAAA;AACR;eACS,IAAI,UAAU,QAAQ,QAAQ;KAEvC,MAAM,WAAW,6BAA6B,GAAG;AACjD,WAAM,UAAU,IAAI,QAAQ;MAC1B,GAAG,MAAM;MACT,OAAO;MACR,CAAC;;;AAGN,OAAI,gBAAgB,MAAM,CACxB;AAEF,OAAI,wBAAwB,KAAA,EAC1B;AAEF,eAAY;AAEZ,OACE,aAAa,oBAAoB,eAAA,GAEjC;AAGF,OAAI,EADY,oBAAoB,WAAW,0BAClC,MAAM,CACjB;AAEF,cAAW,KAAK,IACd,oBAAoB,eAAA,OACpB,YAAY,oBAAoB,iBAAA,GACjC;GACD,MAAM,qBAAqB,oBAAoB,SAC3C,KAAK,MAAM,WAAW,KAAK,QAAQ,GAAG,IAAK,GAC3C;AAGJ,SAAM,IAAI,SAAS,YAAY,WAAW,SAAS,mBAAmB,CAAC;GAEvE,MAAM,YACH,MAAgB,QAEf,MAAgB,YAAoB,qBACrC,MAAgB,YAAY;AAC/B,OAAI,qBAAqB,cAAc,KACrC,SAAQ,IACN,kBAAkB,OAAO,WAAW,KAAK,CAAC,UAAU,SAAS,QAC3D,EACD,CAAC,cAAc,SAAS,UAAU,UAAU,IAAI,QAClD;AAIH,YAAS,kBAAkB,QAAQ,GAAG,sBAAsB,MAAM,CAAC;;;AAGvE,QAAO;EACL,MAAM;EACN;EACO;EACP,eAAe,QAAQ;EACxB"}
|
package/dist/pregel/runner.cjs
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
const require_constants = require(
|
|
2
|
-
const require_errors = require(
|
|
3
|
-
const require_types = require(
|
|
4
|
-
const require_index = require(
|
|
5
|
-
const require_retry = require(
|
|
6
|
-
|
|
1
|
+
const require_constants = require("../constants.cjs");
|
|
2
|
+
const require_errors = require("../errors.cjs");
|
|
3
|
+
const require_types = require("./types.cjs");
|
|
4
|
+
const require_index = require("./utils/index.cjs");
|
|
5
|
+
const require_retry = require("./retry.cjs");
|
|
7
6
|
//#region src/pregel/runner.ts
|
|
8
7
|
const PROMISE_ADDED_SYMBOL = Symbol.for("promiseAdded");
|
|
9
8
|
function createPromiseBarrier() {
|
|
@@ -88,7 +87,7 @@ var PregelRunner = class {
|
|
|
88
87
|
* @internal
|
|
89
88
|
*/
|
|
90
89
|
_initializeAbortSignals({ exceptionSignal, stepTimeoutSignal, signal }) {
|
|
91
|
-
const previousSignals = this.loop.config.configurable?.[
|
|
90
|
+
const previousSignals = this.loop.config.configurable?.["__pregel_abort_signals"] ?? {};
|
|
92
91
|
const externalAbortSignal = previousSignals.externalAbortSignal ?? signal;
|
|
93
92
|
const timeoutAbortSignal = stepTimeoutSignal ?? previousSignals.timeoutAbortSignal;
|
|
94
93
|
const { signal: composedAbortSignal, dispose: disposeCombinedSignal } = require_index.combineAbortSignals(externalAbortSignal, timeoutAbortSignal, exceptionSignal);
|
|
@@ -173,7 +172,7 @@ var PregelRunner = class {
|
|
|
173
172
|
name: error.name
|
|
174
173
|
}]]);
|
|
175
174
|
else {
|
|
176
|
-
if (this.nodeFinished && (task.config?.tags == null || !task.config.tags.includes(
|
|
175
|
+
if (this.nodeFinished && (task.config?.tags == null || !task.config.tags.includes("langsmith:hidden"))) this.nodeFinished(String(task.name));
|
|
177
176
|
if (task.writes.length === 0) task.writes.push([require_constants.NO_WRITES, null]);
|
|
178
177
|
this.loop.putWrites(task.id, task.writes);
|
|
179
178
|
}
|
|
@@ -222,7 +221,7 @@ async function call(runner, task, func, name, input, options = {}) {
|
|
|
222
221
|
});
|
|
223
222
|
}
|
|
224
223
|
}
|
|
225
|
-
|
|
226
224
|
//#endregion
|
|
227
225
|
exports.PregelRunner = PregelRunner;
|
|
226
|
+
|
|
228
227
|
//# sourceMappingURL=runner.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.cjs","names":["isGraphInterrupt","isGraphBubbleUp","CONFIG_KEY_ABORT_SIGNALS","combineAbortSignals","patchConfigurable","_runWithRetry","CONFIG_KEY_CALL","INTERRUPT","RESUME","ERROR","TAG_HIDDEN","NO_WRITES","CONFIG_KEY_SCRATCHPAD","Call","RETURN"],"sources":["../../src/pregel/runner.ts"],"sourcesContent":["import { PendingWrite } from \"@langchain/langgraph-checkpoint\";\nimport {\n Call,\n PregelAbortSignals,\n PregelExecutableTask,\n PregelScratchpad,\n} from \"./types.js\";\nimport {\n CachePolicy,\n combineAbortSignals,\n patchConfigurable,\n RetryPolicy,\n} from \"./utils/index.js\";\nimport {\n CONFIG_KEY_SCRATCHPAD,\n ERROR,\n INTERRUPT,\n RESUME,\n NO_WRITES,\n TAG_HIDDEN,\n RETURN,\n CONFIG_KEY_CALL,\n CONFIG_KEY_ABORT_SIGNALS,\n} from \"../constants.js\";\nimport { GraphBubbleUp, isGraphBubbleUp, isGraphInterrupt } from \"../errors.js\";\nimport { _runWithRetry, SettledPregelTask } from \"./retry.js\";\nimport { PregelLoop } from \"./loop.js\";\n\nconst PROMISE_ADDED_SYMBOL = Symbol.for(\"promiseAdded\");\n\nfunction createPromiseBarrier() {\n const barrier: {\n next: () => void;\n wait: Promise<unknown>;\n } = {\n next: () => void 0,\n wait: Promise.resolve(PROMISE_ADDED_SYMBOL),\n };\n\n function waitHandler(resolve: (value: typeof PROMISE_ADDED_SYMBOL) => void) {\n barrier.next = () => {\n barrier.wait = new Promise(waitHandler);\n resolve(PROMISE_ADDED_SYMBOL);\n };\n }\n barrier.wait = new Promise(waitHandler);\n return barrier;\n}\n\n/**\n * Options for the {@link PregelRunner#tick} method.\n */\nexport type TickOptions = {\n /**\n * The deadline before which all tasks must be completed.\n */\n timeout?: number;\n\n /**\n * An optional {@link AbortSignal} to cancel processing of tasks.\n */\n signal?: AbortSignal;\n\n /**\n * The {@link RetryPolicy} to use for the tick.\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * An optional callback to be called after all task writes are completed.\n */\n onStepWrite?: (step: number, writes: PendingWrite[]) => void;\n\n /**\n * The maximum number of tasks to execute concurrently.\n */\n maxConcurrency?: number;\n};\n\n/**\n * Responsible for handling task execution on each tick of the {@link PregelLoop}.\n */\nexport class PregelRunner {\n private nodeFinished?: (id: string) => void;\n\n private loop: PregelLoop;\n\n /**\n * Construct a new PregelRunner, which executes tasks from the provided PregelLoop.\n * @param loop - The PregelLoop that produces tasks for this runner to execute.\n */\n constructor({\n loop,\n nodeFinished,\n }: {\n loop: PregelLoop;\n nodeFinished?: (id: string) => void;\n }) {\n this.loop = loop;\n this.nodeFinished = nodeFinished;\n }\n\n /**\n * Execute tasks from the current step of the PregelLoop.\n *\n * Note: this method does NOT call {@link PregelLoop}#tick. That must be handled externally.\n * @param options - Options for the execution.\n */\n async tick(options: TickOptions = {}) {\n const { timeout, retryPolicy, onStepWrite, maxConcurrency } = options;\n\n const nodeErrors: Set<Error> = new Set();\n let graphBubbleUp: GraphBubbleUp | undefined;\n\n const exceptionSignalController = new AbortController();\n const exceptionSignal = exceptionSignalController.signal;\n const stepTimeoutSignal = timeout\n ? AbortSignal.timeout(timeout)\n : undefined;\n\n // Start task execution\n const pendingTasks = Object.values(this.loop.tasks).filter(\n (t) => t.writes.length === 0\n );\n\n const { signals, disposeCombinedSignal } = this._initializeAbortSignals({\n exceptionSignal,\n stepTimeoutSignal,\n signal: options.signal,\n });\n\n const taskStream = this._executeTasksWithRetry(pendingTasks, {\n signals,\n retryPolicy,\n maxConcurrency,\n });\n\n for await (const { task, error, signalAborted } of taskStream) {\n this._commit(task, error);\n if (isGraphInterrupt(error)) {\n graphBubbleUp = error;\n } else if (isGraphBubbleUp(error) && !isGraphInterrupt(graphBubbleUp)) {\n graphBubbleUp = error;\n } else if (error && (nodeErrors.size === 0 || !signalAborted)) {\n /*\n * The goal here is to capture the exception that causes the graph to terminate early. In\n * theory it's possible for multiple nodes to throw, so this also handles the edge case of\n * capturing concurrent exceptions thrown before the node saw an abort. This is checked via\n * the signalAborted flag, which records the state of the abort signal at the time the node\n * execution finished.\n *\n * There is a case however where one node throws some error causing us to trigger an abort,\n * which then causes other concurrently executing nodes to throw their own AbortErrors. In\n * this case we don't care about reporting the abort errors thrown by the other nodes,\n * because they don't tell the user anything about what caused the graph execution to\n * terminate early, so we ignore them (and any other errors that occur after the node sees\n * an abort signal).\n */\n exceptionSignalController.abort();\n nodeErrors.add(error);\n }\n }\n\n disposeCombinedSignal?.();\n\n onStepWrite?.(\n this.loop.step,\n Object.values(this.loop.tasks)\n .map((task) => task.writes)\n .flat()\n );\n\n if (nodeErrors.size === 1) {\n throw Array.from(nodeErrors)[0];\n } else if (nodeErrors.size > 1) {\n throw new AggregateError(\n Array.from(nodeErrors),\n `Multiple errors occurred during superstep ${this.loop.step}. See the \"errors\" field of this exception for more details.`\n );\n }\n\n if (isGraphInterrupt(graphBubbleUp)) {\n throw graphBubbleUp;\n }\n\n if (isGraphBubbleUp(graphBubbleUp) && this.loop.isNested) {\n throw graphBubbleUp;\n }\n }\n\n /**\n * Initializes the current AbortSignals for the PregelRunner, handling the various ways that\n * AbortSignals must be chained together so that the PregelLoop can be interrupted if necessary\n * while still allowing nodes to gracefully exit.\n *\n * This method must only be called once per PregelRunner#tick. It has the side effect of updating\n * the PregelLoop#config with the new AbortSignals so they may be propagated correctly to future\n * ticks and subgraph calls.\n *\n * @param options - Options for the initialization.\n * @returns The current abort signals.\n * @internal\n */\n private _initializeAbortSignals({\n exceptionSignal,\n stepTimeoutSignal,\n signal,\n }: {\n exceptionSignal: AbortSignal;\n stepTimeoutSignal?: AbortSignal;\n signal?: AbortSignal;\n }): { signals: PregelAbortSignals; disposeCombinedSignal?: () => void } {\n const previousSignals = (this.loop.config.configurable?.[\n CONFIG_KEY_ABORT_SIGNALS\n ] ?? {}) as PregelAbortSignals;\n\n // We always inherit the external abort signal from AsyncLocalStorage,\n // since that's the only way the signal is inherited by the subgraph calls.\n const externalAbortSignal = previousSignals.externalAbortSignal ?? signal;\n\n // inherit the step timeout signal from parent graph\n const timeoutAbortSignal =\n stepTimeoutSignal ?? previousSignals.timeoutAbortSignal;\n\n const { signal: composedAbortSignal, dispose: disposeCombinedSignal } =\n combineAbortSignals(\n externalAbortSignal,\n timeoutAbortSignal,\n exceptionSignal\n );\n\n const signals: PregelAbortSignals = {\n externalAbortSignal,\n timeoutAbortSignal,\n composedAbortSignal,\n };\n\n this.loop.config = patchConfigurable(this.loop.config, {\n [CONFIG_KEY_ABORT_SIGNALS]: signals,\n });\n\n return { signals, disposeCombinedSignal };\n }\n\n /**\n * Concurrently executes tasks with the requested retry policy, yielding a {@link SettledPregelTask} for each task as it completes.\n * @param tasks - The tasks to execute.\n * @param options - Options for the execution.\n */\n private async *_executeTasksWithRetry(\n tasks: PregelExecutableTask<string, string>[],\n options?: {\n signals?: PregelAbortSignals;\n retryPolicy?: RetryPolicy;\n maxConcurrency?: number;\n }\n ): AsyncGenerator<SettledPregelTask> {\n const { retryPolicy, maxConcurrency, signals } = options ?? {};\n\n const barrier = createPromiseBarrier();\n const executingTasksMap: Record<\n string,\n Promise<{\n task: PregelExecutableTask<string, string>;\n result?: unknown;\n error?: Error;\n }>\n > = {};\n\n const thisCall = {\n executingTasksMap,\n barrier,\n retryPolicy,\n scheduleTask: async (\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ) => this.loop.acceptPush(task, writeIdx, call),\n };\n\n if (signals?.composedAbortSignal?.aborted) {\n // note: don't use throwIfAborted here because it throws a DOMException,\n // which isn't consistent with how we throw on abort below.\n throw new Error(\"Abort\");\n }\n\n let startedTasksCount = 0;\n\n let listener: (() => void) | undefined;\n const timeoutOrCancelSignal = combineAbortSignals(\n signals?.externalAbortSignal,\n signals?.timeoutAbortSignal\n );\n\n const abortPromise = timeoutOrCancelSignal.signal\n ? new Promise<never>((_resolve, reject) => {\n listener = () => reject(new Error(\"Abort\"));\n timeoutOrCancelSignal.signal?.addEventListener(\"abort\", listener, {\n once: true,\n });\n })\n : undefined;\n\n while (\n (startedTasksCount === 0 || Object.keys(executingTasksMap).length > 0) &&\n tasks.length\n ) {\n for (\n ;\n Object.values(executingTasksMap).length <\n (maxConcurrency ?? tasks.length) && startedTasksCount < tasks.length;\n startedTasksCount += 1\n ) {\n const task = tasks[startedTasksCount];\n\n executingTasksMap[task.id] = _runWithRetry(\n task,\n retryPolicy,\n { [CONFIG_KEY_CALL]: call?.bind(thisCall, this, task) },\n signals?.composedAbortSignal\n ).catch((error) => {\n return {\n task,\n error,\n signalAborted: signals?.composedAbortSignal?.aborted,\n };\n });\n }\n\n const settledTask = await Promise.race([\n ...Object.values(executingTasksMap),\n ...(abortPromise ? [abortPromise] : []),\n barrier.wait,\n ]);\n\n if (settledTask === PROMISE_ADDED_SYMBOL) {\n continue;\n }\n\n yield settledTask as SettledPregelTask;\n\n if (listener != null) {\n timeoutOrCancelSignal.signal?.removeEventListener(\"abort\", listener);\n timeoutOrCancelSignal.dispose?.();\n }\n\n delete executingTasksMap[(settledTask as SettledPregelTask).task.id];\n }\n }\n\n /**\n * Determines what writes to apply based on whether the task completed successfully, and what type of error occurred.\n *\n * Throws an error if the error is a {@link GraphBubbleUp} error and {@link PregelLoop}#isNested is true.\n *\n * @param task - The task to commit.\n * @param error - The error that occurred, if any.\n */\n private _commit(task: PregelExecutableTask<string, string>, error?: Error) {\n if (error !== undefined) {\n if (isGraphInterrupt(error)) {\n if (error.interrupts.length) {\n const interrupts: PendingWrite<string>[] = error.interrupts.map(\n (interrupt) => [INTERRUPT, interrupt]\n );\n const resumes = task.writes.filter((w) => w[0] === RESUME);\n if (resumes.length) {\n interrupts.push(...resumes);\n }\n this.loop.putWrites(task.id, interrupts);\n }\n } else if (isGraphBubbleUp(error) && task.writes.length) {\n this.loop.putWrites(task.id, task.writes);\n } else {\n this.loop.putWrites(task.id, [\n [ERROR, { message: error.message, name: error.name }],\n ]);\n }\n } else {\n if (\n this.nodeFinished &&\n (task.config?.tags == null || !task.config.tags.includes(TAG_HIDDEN))\n ) {\n this.nodeFinished(String(task.name));\n }\n\n if (task.writes.length === 0) {\n // Add no writes marker\n task.writes.push([NO_WRITES, null]);\n }\n\n // Save task writes to checkpointer\n this.loop.putWrites(task.id, task.writes);\n }\n }\n}\n\nasync function call(\n this: {\n executingTasksMap: Record<\n string,\n Promise<{\n task: PregelExecutableTask<string, string>;\n result?: unknown;\n error?: Error;\n }>\n >;\n\n barrier: {\n next: () => void;\n wait: Promise<unknown>;\n };\n\n retryPolicy?: RetryPolicy;\n\n scheduleTask: (\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ) => Promise<PregelExecutableTask<string, string> | void>;\n },\n runner: PregelRunner,\n task: PregelExecutableTask<string, string>,\n func: (...args: unknown[]) => unknown | Promise<unknown>,\n name: string,\n input: unknown,\n options: {\n retry?: RetryPolicy;\n cache?: CachePolicy;\n callbacks?: unknown;\n } = {}\n): Promise<unknown> {\n // Schedule PUSH tasks, collect promises\n const scratchpad = task.config?.configurable?.[CONFIG_KEY_SCRATCHPAD] as\n | PregelScratchpad<unknown>\n | undefined;\n\n if (!scratchpad) {\n throw new Error(\n `BUG: No scratchpad found on task ${task.name}__${task.id}`\n );\n }\n\n const cnt = scratchpad.callCounter;\n scratchpad.callCounter += 1;\n\n // schedule the next task, if the callback returns one\n const wcall = new Call({\n func,\n name,\n input,\n cache: options.cache,\n retry: options.retry,\n callbacks: options.callbacks,\n });\n const nextTask = await this.scheduleTask(task, cnt, wcall);\n if (!nextTask) return undefined;\n\n // Check if this task is already running\n const existingPromise = this.executingTasksMap[nextTask.id];\n\n if (existingPromise !== undefined) {\n // If the parent task was retried, the next task might already be running\n return existingPromise;\n }\n\n if (nextTask.writes.length > 0) {\n // If it already ran, return the result\n const returns = nextTask.writes.filter(([c]) => c === RETURN);\n const errors = nextTask.writes.filter(([c]) => c === ERROR);\n\n if (returns.length > 0) {\n // Task completed successfully\n if (returns.length === 1) return Promise.resolve(returns[0][1]);\n\n // should be unreachable\n throw new Error(\n `BUG: multiple returns found for task ${nextTask.name}__${nextTask.id}`\n );\n }\n\n if (errors.length > 0) {\n // Task failed\n if (errors.length === 1) {\n const errorValue = errors[0][1];\n const error =\n // eslint-disable-next-line no-instanceof/no-instanceof\n errorValue instanceof Error\n ? errorValue\n : new Error(String(errorValue));\n\n return Promise.reject(error);\n }\n\n // the only way this should happen is if the task executes multiple times and writes aren't cleared\n throw new Error(\n `BUG: multiple errors found for task ${nextTask.name}__${nextTask.id}`\n );\n }\n\n return undefined;\n } else {\n // Schedule the next task with retry\n const prom = _runWithRetry<string, string>(nextTask, options.retry, {\n [CONFIG_KEY_CALL]: call.bind(this, runner, nextTask),\n });\n\n this.executingTasksMap[nextTask.id] = prom;\n this.barrier.next();\n\n return prom.then(({ result, error }) => {\n if (error) return Promise.reject(error);\n return result;\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runner.cjs","names":["isGraphInterrupt","isGraphBubbleUp","combineAbortSignals","patchConfigurable","CONFIG_KEY_ABORT_SIGNALS","_runWithRetry","CONFIG_KEY_CALL","INTERRUPT","RESUME","ERROR","NO_WRITES","CONFIG_KEY_SCRATCHPAD","Call","RETURN"],"sources":["../../src/pregel/runner.ts"],"sourcesContent":["import { PendingWrite } from \"@langchain/langgraph-checkpoint\";\nimport {\n Call,\n PregelAbortSignals,\n PregelExecutableTask,\n PregelScratchpad,\n} from \"./types.js\";\nimport {\n CachePolicy,\n combineAbortSignals,\n patchConfigurable,\n RetryPolicy,\n} from \"./utils/index.js\";\nimport {\n CONFIG_KEY_SCRATCHPAD,\n ERROR,\n INTERRUPT,\n RESUME,\n NO_WRITES,\n TAG_HIDDEN,\n RETURN,\n CONFIG_KEY_CALL,\n CONFIG_KEY_ABORT_SIGNALS,\n} from \"../constants.js\";\nimport { GraphBubbleUp, isGraphBubbleUp, isGraphInterrupt } from \"../errors.js\";\nimport { _runWithRetry, SettledPregelTask } from \"./retry.js\";\nimport { PregelLoop } from \"./loop.js\";\n\nconst PROMISE_ADDED_SYMBOL = Symbol.for(\"promiseAdded\");\n\nfunction createPromiseBarrier() {\n const barrier: {\n next: () => void;\n wait: Promise<unknown>;\n } = {\n next: () => void 0,\n wait: Promise.resolve(PROMISE_ADDED_SYMBOL),\n };\n\n function waitHandler(resolve: (value: typeof PROMISE_ADDED_SYMBOL) => void) {\n barrier.next = () => {\n barrier.wait = new Promise(waitHandler);\n resolve(PROMISE_ADDED_SYMBOL);\n };\n }\n barrier.wait = new Promise(waitHandler);\n return barrier;\n}\n\n/**\n * Options for the {@link PregelRunner#tick} method.\n */\nexport type TickOptions = {\n /**\n * The deadline before which all tasks must be completed.\n */\n timeout?: number;\n\n /**\n * An optional {@link AbortSignal} to cancel processing of tasks.\n */\n signal?: AbortSignal;\n\n /**\n * The {@link RetryPolicy} to use for the tick.\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * An optional callback to be called after all task writes are completed.\n */\n onStepWrite?: (step: number, writes: PendingWrite[]) => void;\n\n /**\n * The maximum number of tasks to execute concurrently.\n */\n maxConcurrency?: number;\n};\n\n/**\n * Responsible for handling task execution on each tick of the {@link PregelLoop}.\n */\nexport class PregelRunner {\n private nodeFinished?: (id: string) => void;\n\n private loop: PregelLoop;\n\n /**\n * Construct a new PregelRunner, which executes tasks from the provided PregelLoop.\n * @param loop - The PregelLoop that produces tasks for this runner to execute.\n */\n constructor({\n loop,\n nodeFinished,\n }: {\n loop: PregelLoop;\n nodeFinished?: (id: string) => void;\n }) {\n this.loop = loop;\n this.nodeFinished = nodeFinished;\n }\n\n /**\n * Execute tasks from the current step of the PregelLoop.\n *\n * Note: this method does NOT call {@link PregelLoop}#tick. That must be handled externally.\n * @param options - Options for the execution.\n */\n async tick(options: TickOptions = {}) {\n const { timeout, retryPolicy, onStepWrite, maxConcurrency } = options;\n\n const nodeErrors: Set<Error> = new Set();\n let graphBubbleUp: GraphBubbleUp | undefined;\n\n const exceptionSignalController = new AbortController();\n const exceptionSignal = exceptionSignalController.signal;\n const stepTimeoutSignal = timeout\n ? AbortSignal.timeout(timeout)\n : undefined;\n\n // Start task execution\n const pendingTasks = Object.values(this.loop.tasks).filter(\n (t) => t.writes.length === 0\n );\n\n const { signals, disposeCombinedSignal } = this._initializeAbortSignals({\n exceptionSignal,\n stepTimeoutSignal,\n signal: options.signal,\n });\n\n const taskStream = this._executeTasksWithRetry(pendingTasks, {\n signals,\n retryPolicy,\n maxConcurrency,\n });\n\n for await (const { task, error, signalAborted } of taskStream) {\n this._commit(task, error);\n if (isGraphInterrupt(error)) {\n graphBubbleUp = error;\n } else if (isGraphBubbleUp(error) && !isGraphInterrupt(graphBubbleUp)) {\n graphBubbleUp = error;\n } else if (error && (nodeErrors.size === 0 || !signalAborted)) {\n /*\n * The goal here is to capture the exception that causes the graph to terminate early. In\n * theory it's possible for multiple nodes to throw, so this also handles the edge case of\n * capturing concurrent exceptions thrown before the node saw an abort. This is checked via\n * the signalAborted flag, which records the state of the abort signal at the time the node\n * execution finished.\n *\n * There is a case however where one node throws some error causing us to trigger an abort,\n * which then causes other concurrently executing nodes to throw their own AbortErrors. In\n * this case we don't care about reporting the abort errors thrown by the other nodes,\n * because they don't tell the user anything about what caused the graph execution to\n * terminate early, so we ignore them (and any other errors that occur after the node sees\n * an abort signal).\n */\n exceptionSignalController.abort();\n nodeErrors.add(error);\n }\n }\n\n disposeCombinedSignal?.();\n\n onStepWrite?.(\n this.loop.step,\n Object.values(this.loop.tasks)\n .map((task) => task.writes)\n .flat()\n );\n\n if (nodeErrors.size === 1) {\n throw Array.from(nodeErrors)[0];\n } else if (nodeErrors.size > 1) {\n throw new AggregateError(\n Array.from(nodeErrors),\n `Multiple errors occurred during superstep ${this.loop.step}. See the \"errors\" field of this exception for more details.`\n );\n }\n\n if (isGraphInterrupt(graphBubbleUp)) {\n throw graphBubbleUp;\n }\n\n if (isGraphBubbleUp(graphBubbleUp) && this.loop.isNested) {\n throw graphBubbleUp;\n }\n }\n\n /**\n * Initializes the current AbortSignals for the PregelRunner, handling the various ways that\n * AbortSignals must be chained together so that the PregelLoop can be interrupted if necessary\n * while still allowing nodes to gracefully exit.\n *\n * This method must only be called once per PregelRunner#tick. It has the side effect of updating\n * the PregelLoop#config with the new AbortSignals so they may be propagated correctly to future\n * ticks and subgraph calls.\n *\n * @param options - Options for the initialization.\n * @returns The current abort signals.\n * @internal\n */\n private _initializeAbortSignals({\n exceptionSignal,\n stepTimeoutSignal,\n signal,\n }: {\n exceptionSignal: AbortSignal;\n stepTimeoutSignal?: AbortSignal;\n signal?: AbortSignal;\n }): { signals: PregelAbortSignals; disposeCombinedSignal?: () => void } {\n const previousSignals = (this.loop.config.configurable?.[\n CONFIG_KEY_ABORT_SIGNALS\n ] ?? {}) as PregelAbortSignals;\n\n // We always inherit the external abort signal from AsyncLocalStorage,\n // since that's the only way the signal is inherited by the subgraph calls.\n const externalAbortSignal = previousSignals.externalAbortSignal ?? signal;\n\n // inherit the step timeout signal from parent graph\n const timeoutAbortSignal =\n stepTimeoutSignal ?? previousSignals.timeoutAbortSignal;\n\n const { signal: composedAbortSignal, dispose: disposeCombinedSignal } =\n combineAbortSignals(\n externalAbortSignal,\n timeoutAbortSignal,\n exceptionSignal\n );\n\n const signals: PregelAbortSignals = {\n externalAbortSignal,\n timeoutAbortSignal,\n composedAbortSignal,\n };\n\n this.loop.config = patchConfigurable(this.loop.config, {\n [CONFIG_KEY_ABORT_SIGNALS]: signals,\n });\n\n return { signals, disposeCombinedSignal };\n }\n\n /**\n * Concurrently executes tasks with the requested retry policy, yielding a {@link SettledPregelTask} for each task as it completes.\n * @param tasks - The tasks to execute.\n * @param options - Options for the execution.\n */\n private async *_executeTasksWithRetry(\n tasks: PregelExecutableTask<string, string>[],\n options?: {\n signals?: PregelAbortSignals;\n retryPolicy?: RetryPolicy;\n maxConcurrency?: number;\n }\n ): AsyncGenerator<SettledPregelTask> {\n const { retryPolicy, maxConcurrency, signals } = options ?? {};\n\n const barrier = createPromiseBarrier();\n const executingTasksMap: Record<\n string,\n Promise<{\n task: PregelExecutableTask<string, string>;\n result?: unknown;\n error?: Error;\n }>\n > = {};\n\n const thisCall = {\n executingTasksMap,\n barrier,\n retryPolicy,\n scheduleTask: async (\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ) => this.loop.acceptPush(task, writeIdx, call),\n };\n\n if (signals?.composedAbortSignal?.aborted) {\n // note: don't use throwIfAborted here because it throws a DOMException,\n // which isn't consistent with how we throw on abort below.\n throw new Error(\"Abort\");\n }\n\n let startedTasksCount = 0;\n\n let listener: (() => void) | undefined;\n const timeoutOrCancelSignal = combineAbortSignals(\n signals?.externalAbortSignal,\n signals?.timeoutAbortSignal\n );\n\n const abortPromise = timeoutOrCancelSignal.signal\n ? new Promise<never>((_resolve, reject) => {\n listener = () => reject(new Error(\"Abort\"));\n timeoutOrCancelSignal.signal?.addEventListener(\"abort\", listener, {\n once: true,\n });\n })\n : undefined;\n\n while (\n (startedTasksCount === 0 || Object.keys(executingTasksMap).length > 0) &&\n tasks.length\n ) {\n for (\n ;\n Object.values(executingTasksMap).length <\n (maxConcurrency ?? tasks.length) && startedTasksCount < tasks.length;\n startedTasksCount += 1\n ) {\n const task = tasks[startedTasksCount];\n\n executingTasksMap[task.id] = _runWithRetry(\n task,\n retryPolicy,\n { [CONFIG_KEY_CALL]: call?.bind(thisCall, this, task) },\n signals?.composedAbortSignal\n ).catch((error) => {\n return {\n task,\n error,\n signalAborted: signals?.composedAbortSignal?.aborted,\n };\n });\n }\n\n const settledTask = await Promise.race([\n ...Object.values(executingTasksMap),\n ...(abortPromise ? [abortPromise] : []),\n barrier.wait,\n ]);\n\n if (settledTask === PROMISE_ADDED_SYMBOL) {\n continue;\n }\n\n yield settledTask as SettledPregelTask;\n\n if (listener != null) {\n timeoutOrCancelSignal.signal?.removeEventListener(\"abort\", listener);\n timeoutOrCancelSignal.dispose?.();\n }\n\n delete executingTasksMap[(settledTask as SettledPregelTask).task.id];\n }\n }\n\n /**\n * Determines what writes to apply based on whether the task completed successfully, and what type of error occurred.\n *\n * Throws an error if the error is a {@link GraphBubbleUp} error and {@link PregelLoop}#isNested is true.\n *\n * @param task - The task to commit.\n * @param error - The error that occurred, if any.\n */\n private _commit(task: PregelExecutableTask<string, string>, error?: Error) {\n if (error !== undefined) {\n if (isGraphInterrupt(error)) {\n if (error.interrupts.length) {\n const interrupts: PendingWrite<string>[] = error.interrupts.map(\n (interrupt) => [INTERRUPT, interrupt]\n );\n const resumes = task.writes.filter((w) => w[0] === RESUME);\n if (resumes.length) {\n interrupts.push(...resumes);\n }\n this.loop.putWrites(task.id, interrupts);\n }\n } else if (isGraphBubbleUp(error) && task.writes.length) {\n this.loop.putWrites(task.id, task.writes);\n } else {\n this.loop.putWrites(task.id, [\n [ERROR, { message: error.message, name: error.name }],\n ]);\n }\n } else {\n if (\n this.nodeFinished &&\n (task.config?.tags == null || !task.config.tags.includes(TAG_HIDDEN))\n ) {\n this.nodeFinished(String(task.name));\n }\n\n if (task.writes.length === 0) {\n // Add no writes marker\n task.writes.push([NO_WRITES, null]);\n }\n\n // Save task writes to checkpointer\n this.loop.putWrites(task.id, task.writes);\n }\n }\n}\n\nasync function call(\n this: {\n executingTasksMap: Record<\n string,\n Promise<{\n task: PregelExecutableTask<string, string>;\n result?: unknown;\n error?: Error;\n }>\n >;\n\n barrier: {\n next: () => void;\n wait: Promise<unknown>;\n };\n\n retryPolicy?: RetryPolicy;\n\n scheduleTask: (\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ) => Promise<PregelExecutableTask<string, string> | void>;\n },\n runner: PregelRunner,\n task: PregelExecutableTask<string, string>,\n func: (...args: unknown[]) => unknown | Promise<unknown>,\n name: string,\n input: unknown,\n options: {\n retry?: RetryPolicy;\n cache?: CachePolicy;\n callbacks?: unknown;\n } = {}\n): Promise<unknown> {\n // Schedule PUSH tasks, collect promises\n const scratchpad = task.config?.configurable?.[CONFIG_KEY_SCRATCHPAD] as\n | PregelScratchpad<unknown>\n | undefined;\n\n if (!scratchpad) {\n throw new Error(\n `BUG: No scratchpad found on task ${task.name}__${task.id}`\n );\n }\n\n const cnt = scratchpad.callCounter;\n scratchpad.callCounter += 1;\n\n // schedule the next task, if the callback returns one\n const wcall = new Call({\n func,\n name,\n input,\n cache: options.cache,\n retry: options.retry,\n callbacks: options.callbacks,\n });\n const nextTask = await this.scheduleTask(task, cnt, wcall);\n if (!nextTask) return undefined;\n\n // Check if this task is already running\n const existingPromise = this.executingTasksMap[nextTask.id];\n\n if (existingPromise !== undefined) {\n // If the parent task was retried, the next task might already be running\n return existingPromise;\n }\n\n if (nextTask.writes.length > 0) {\n // If it already ran, return the result\n const returns = nextTask.writes.filter(([c]) => c === RETURN);\n const errors = nextTask.writes.filter(([c]) => c === ERROR);\n\n if (returns.length > 0) {\n // Task completed successfully\n if (returns.length === 1) return Promise.resolve(returns[0][1]);\n\n // should be unreachable\n throw new Error(\n `BUG: multiple returns found for task ${nextTask.name}__${nextTask.id}`\n );\n }\n\n if (errors.length > 0) {\n // Task failed\n if (errors.length === 1) {\n const errorValue = errors[0][1];\n const error =\n // eslint-disable-next-line no-instanceof/no-instanceof\n errorValue instanceof Error\n ? errorValue\n : new Error(String(errorValue));\n\n return Promise.reject(error);\n }\n\n // the only way this should happen is if the task executes multiple times and writes aren't cleared\n throw new Error(\n `BUG: multiple errors found for task ${nextTask.name}__${nextTask.id}`\n );\n }\n\n return undefined;\n } else {\n // Schedule the next task with retry\n const prom = _runWithRetry<string, string>(nextTask, options.retry, {\n [CONFIG_KEY_CALL]: call.bind(this, runner, nextTask),\n });\n\n this.executingTasksMap[nextTask.id] = prom;\n this.barrier.next();\n\n return prom.then(({ result, error }) => {\n if (error) return Promise.reject(error);\n return result;\n });\n }\n}\n"],"mappings":"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"}
|
package/dist/pregel/runner.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { CONFIG_KEY_ABORT_SIGNALS, CONFIG_KEY_CALL, CONFIG_KEY_SCRATCHPAD, ERROR, INTERRUPT, NO_WRITES, RESUME, RETURN
|
|
1
|
+
import { CONFIG_KEY_ABORT_SIGNALS, CONFIG_KEY_CALL, CONFIG_KEY_SCRATCHPAD, ERROR, INTERRUPT, NO_WRITES, RESUME, RETURN } from "../constants.js";
|
|
2
2
|
import { isGraphBubbleUp, isGraphInterrupt } from "../errors.js";
|
|
3
3
|
import { Call } from "./types.js";
|
|
4
4
|
import { combineAbortSignals, patchConfigurable } from "./utils/index.js";
|
|
5
5
|
import { _runWithRetry } from "./retry.js";
|
|
6
|
-
|
|
7
6
|
//#region src/pregel/runner.ts
|
|
8
7
|
const PROMISE_ADDED_SYMBOL = Symbol.for("promiseAdded");
|
|
9
8
|
function createPromiseBarrier() {
|
|
@@ -88,7 +87,7 @@ var PregelRunner = class {
|
|
|
88
87
|
* @internal
|
|
89
88
|
*/
|
|
90
89
|
_initializeAbortSignals({ exceptionSignal, stepTimeoutSignal, signal }) {
|
|
91
|
-
const previousSignals = this.loop.config.configurable?.[
|
|
90
|
+
const previousSignals = this.loop.config.configurable?.["__pregel_abort_signals"] ?? {};
|
|
92
91
|
const externalAbortSignal = previousSignals.externalAbortSignal ?? signal;
|
|
93
92
|
const timeoutAbortSignal = stepTimeoutSignal ?? previousSignals.timeoutAbortSignal;
|
|
94
93
|
const { signal: composedAbortSignal, dispose: disposeCombinedSignal } = combineAbortSignals(externalAbortSignal, timeoutAbortSignal, exceptionSignal);
|
|
@@ -173,7 +172,7 @@ var PregelRunner = class {
|
|
|
173
172
|
name: error.name
|
|
174
173
|
}]]);
|
|
175
174
|
else {
|
|
176
|
-
if (this.nodeFinished && (task.config?.tags == null || !task.config.tags.includes(
|
|
175
|
+
if (this.nodeFinished && (task.config?.tags == null || !task.config.tags.includes("langsmith:hidden"))) this.nodeFinished(String(task.name));
|
|
177
176
|
if (task.writes.length === 0) task.writes.push([NO_WRITES, null]);
|
|
178
177
|
this.loop.putWrites(task.id, task.writes);
|
|
179
178
|
}
|
|
@@ -222,7 +221,7 @@ async function call(runner, task, func, name, input, options = {}) {
|
|
|
222
221
|
});
|
|
223
222
|
}
|
|
224
223
|
}
|
|
225
|
-
|
|
226
224
|
//#endregion
|
|
227
225
|
export { PregelRunner };
|
|
226
|
+
|
|
228
227
|
//# sourceMappingURL=runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","names":[],"sources":["../../src/pregel/runner.ts"],"sourcesContent":["import { PendingWrite } from \"@langchain/langgraph-checkpoint\";\nimport {\n Call,\n PregelAbortSignals,\n PregelExecutableTask,\n PregelScratchpad,\n} from \"./types.js\";\nimport {\n CachePolicy,\n combineAbortSignals,\n patchConfigurable,\n RetryPolicy,\n} from \"./utils/index.js\";\nimport {\n CONFIG_KEY_SCRATCHPAD,\n ERROR,\n INTERRUPT,\n RESUME,\n NO_WRITES,\n TAG_HIDDEN,\n RETURN,\n CONFIG_KEY_CALL,\n CONFIG_KEY_ABORT_SIGNALS,\n} from \"../constants.js\";\nimport { GraphBubbleUp, isGraphBubbleUp, isGraphInterrupt } from \"../errors.js\";\nimport { _runWithRetry, SettledPregelTask } from \"./retry.js\";\nimport { PregelLoop } from \"./loop.js\";\n\nconst PROMISE_ADDED_SYMBOL = Symbol.for(\"promiseAdded\");\n\nfunction createPromiseBarrier() {\n const barrier: {\n next: () => void;\n wait: Promise<unknown>;\n } = {\n next: () => void 0,\n wait: Promise.resolve(PROMISE_ADDED_SYMBOL),\n };\n\n function waitHandler(resolve: (value: typeof PROMISE_ADDED_SYMBOL) => void) {\n barrier.next = () => {\n barrier.wait = new Promise(waitHandler);\n resolve(PROMISE_ADDED_SYMBOL);\n };\n }\n barrier.wait = new Promise(waitHandler);\n return barrier;\n}\n\n/**\n * Options for the {@link PregelRunner#tick} method.\n */\nexport type TickOptions = {\n /**\n * The deadline before which all tasks must be completed.\n */\n timeout?: number;\n\n /**\n * An optional {@link AbortSignal} to cancel processing of tasks.\n */\n signal?: AbortSignal;\n\n /**\n * The {@link RetryPolicy} to use for the tick.\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * An optional callback to be called after all task writes are completed.\n */\n onStepWrite?: (step: number, writes: PendingWrite[]) => void;\n\n /**\n * The maximum number of tasks to execute concurrently.\n */\n maxConcurrency?: number;\n};\n\n/**\n * Responsible for handling task execution on each tick of the {@link PregelLoop}.\n */\nexport class PregelRunner {\n private nodeFinished?: (id: string) => void;\n\n private loop: PregelLoop;\n\n /**\n * Construct a new PregelRunner, which executes tasks from the provided PregelLoop.\n * @param loop - The PregelLoop that produces tasks for this runner to execute.\n */\n constructor({\n loop,\n nodeFinished,\n }: {\n loop: PregelLoop;\n nodeFinished?: (id: string) => void;\n }) {\n this.loop = loop;\n this.nodeFinished = nodeFinished;\n }\n\n /**\n * Execute tasks from the current step of the PregelLoop.\n *\n * Note: this method does NOT call {@link PregelLoop}#tick. That must be handled externally.\n * @param options - Options for the execution.\n */\n async tick(options: TickOptions = {}) {\n const { timeout, retryPolicy, onStepWrite, maxConcurrency } = options;\n\n const nodeErrors: Set<Error> = new Set();\n let graphBubbleUp: GraphBubbleUp | undefined;\n\n const exceptionSignalController = new AbortController();\n const exceptionSignal = exceptionSignalController.signal;\n const stepTimeoutSignal = timeout\n ? AbortSignal.timeout(timeout)\n : undefined;\n\n // Start task execution\n const pendingTasks = Object.values(this.loop.tasks).filter(\n (t) => t.writes.length === 0\n );\n\n const { signals, disposeCombinedSignal } = this._initializeAbortSignals({\n exceptionSignal,\n stepTimeoutSignal,\n signal: options.signal,\n });\n\n const taskStream = this._executeTasksWithRetry(pendingTasks, {\n signals,\n retryPolicy,\n maxConcurrency,\n });\n\n for await (const { task, error, signalAborted } of taskStream) {\n this._commit(task, error);\n if (isGraphInterrupt(error)) {\n graphBubbleUp = error;\n } else if (isGraphBubbleUp(error) && !isGraphInterrupt(graphBubbleUp)) {\n graphBubbleUp = error;\n } else if (error && (nodeErrors.size === 0 || !signalAborted)) {\n /*\n * The goal here is to capture the exception that causes the graph to terminate early. In\n * theory it's possible for multiple nodes to throw, so this also handles the edge case of\n * capturing concurrent exceptions thrown before the node saw an abort. This is checked via\n * the signalAborted flag, which records the state of the abort signal at the time the node\n * execution finished.\n *\n * There is a case however where one node throws some error causing us to trigger an abort,\n * which then causes other concurrently executing nodes to throw their own AbortErrors. In\n * this case we don't care about reporting the abort errors thrown by the other nodes,\n * because they don't tell the user anything about what caused the graph execution to\n * terminate early, so we ignore them (and any other errors that occur after the node sees\n * an abort signal).\n */\n exceptionSignalController.abort();\n nodeErrors.add(error);\n }\n }\n\n disposeCombinedSignal?.();\n\n onStepWrite?.(\n this.loop.step,\n Object.values(this.loop.tasks)\n .map((task) => task.writes)\n .flat()\n );\n\n if (nodeErrors.size === 1) {\n throw Array.from(nodeErrors)[0];\n } else if (nodeErrors.size > 1) {\n throw new AggregateError(\n Array.from(nodeErrors),\n `Multiple errors occurred during superstep ${this.loop.step}. See the \"errors\" field of this exception for more details.`\n );\n }\n\n if (isGraphInterrupt(graphBubbleUp)) {\n throw graphBubbleUp;\n }\n\n if (isGraphBubbleUp(graphBubbleUp) && this.loop.isNested) {\n throw graphBubbleUp;\n }\n }\n\n /**\n * Initializes the current AbortSignals for the PregelRunner, handling the various ways that\n * AbortSignals must be chained together so that the PregelLoop can be interrupted if necessary\n * while still allowing nodes to gracefully exit.\n *\n * This method must only be called once per PregelRunner#tick. It has the side effect of updating\n * the PregelLoop#config with the new AbortSignals so they may be propagated correctly to future\n * ticks and subgraph calls.\n *\n * @param options - Options for the initialization.\n * @returns The current abort signals.\n * @internal\n */\n private _initializeAbortSignals({\n exceptionSignal,\n stepTimeoutSignal,\n signal,\n }: {\n exceptionSignal: AbortSignal;\n stepTimeoutSignal?: AbortSignal;\n signal?: AbortSignal;\n }): { signals: PregelAbortSignals; disposeCombinedSignal?: () => void } {\n const previousSignals = (this.loop.config.configurable?.[\n CONFIG_KEY_ABORT_SIGNALS\n ] ?? {}) as PregelAbortSignals;\n\n // We always inherit the external abort signal from AsyncLocalStorage,\n // since that's the only way the signal is inherited by the subgraph calls.\n const externalAbortSignal = previousSignals.externalAbortSignal ?? signal;\n\n // inherit the step timeout signal from parent graph\n const timeoutAbortSignal =\n stepTimeoutSignal ?? previousSignals.timeoutAbortSignal;\n\n const { signal: composedAbortSignal, dispose: disposeCombinedSignal } =\n combineAbortSignals(\n externalAbortSignal,\n timeoutAbortSignal,\n exceptionSignal\n );\n\n const signals: PregelAbortSignals = {\n externalAbortSignal,\n timeoutAbortSignal,\n composedAbortSignal,\n };\n\n this.loop.config = patchConfigurable(this.loop.config, {\n [CONFIG_KEY_ABORT_SIGNALS]: signals,\n });\n\n return { signals, disposeCombinedSignal };\n }\n\n /**\n * Concurrently executes tasks with the requested retry policy, yielding a {@link SettledPregelTask} for each task as it completes.\n * @param tasks - The tasks to execute.\n * @param options - Options for the execution.\n */\n private async *_executeTasksWithRetry(\n tasks: PregelExecutableTask<string, string>[],\n options?: {\n signals?: PregelAbortSignals;\n retryPolicy?: RetryPolicy;\n maxConcurrency?: number;\n }\n ): AsyncGenerator<SettledPregelTask> {\n const { retryPolicy, maxConcurrency, signals } = options ?? {};\n\n const barrier = createPromiseBarrier();\n const executingTasksMap: Record<\n string,\n Promise<{\n task: PregelExecutableTask<string, string>;\n result?: unknown;\n error?: Error;\n }>\n > = {};\n\n const thisCall = {\n executingTasksMap,\n barrier,\n retryPolicy,\n scheduleTask: async (\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ) => this.loop.acceptPush(task, writeIdx, call),\n };\n\n if (signals?.composedAbortSignal?.aborted) {\n // note: don't use throwIfAborted here because it throws a DOMException,\n // which isn't consistent with how we throw on abort below.\n throw new Error(\"Abort\");\n }\n\n let startedTasksCount = 0;\n\n let listener: (() => void) | undefined;\n const timeoutOrCancelSignal = combineAbortSignals(\n signals?.externalAbortSignal,\n signals?.timeoutAbortSignal\n );\n\n const abortPromise = timeoutOrCancelSignal.signal\n ? new Promise<never>((_resolve, reject) => {\n listener = () => reject(new Error(\"Abort\"));\n timeoutOrCancelSignal.signal?.addEventListener(\"abort\", listener, {\n once: true,\n });\n })\n : undefined;\n\n while (\n (startedTasksCount === 0 || Object.keys(executingTasksMap).length > 0) &&\n tasks.length\n ) {\n for (\n ;\n Object.values(executingTasksMap).length <\n (maxConcurrency ?? tasks.length) && startedTasksCount < tasks.length;\n startedTasksCount += 1\n ) {\n const task = tasks[startedTasksCount];\n\n executingTasksMap[task.id] = _runWithRetry(\n task,\n retryPolicy,\n { [CONFIG_KEY_CALL]: call?.bind(thisCall, this, task) },\n signals?.composedAbortSignal\n ).catch((error) => {\n return {\n task,\n error,\n signalAborted: signals?.composedAbortSignal?.aborted,\n };\n });\n }\n\n const settledTask = await Promise.race([\n ...Object.values(executingTasksMap),\n ...(abortPromise ? [abortPromise] : []),\n barrier.wait,\n ]);\n\n if (settledTask === PROMISE_ADDED_SYMBOL) {\n continue;\n }\n\n yield settledTask as SettledPregelTask;\n\n if (listener != null) {\n timeoutOrCancelSignal.signal?.removeEventListener(\"abort\", listener);\n timeoutOrCancelSignal.dispose?.();\n }\n\n delete executingTasksMap[(settledTask as SettledPregelTask).task.id];\n }\n }\n\n /**\n * Determines what writes to apply based on whether the task completed successfully, and what type of error occurred.\n *\n * Throws an error if the error is a {@link GraphBubbleUp} error and {@link PregelLoop}#isNested is true.\n *\n * @param task - The task to commit.\n * @param error - The error that occurred, if any.\n */\n private _commit(task: PregelExecutableTask<string, string>, error?: Error) {\n if (error !== undefined) {\n if (isGraphInterrupt(error)) {\n if (error.interrupts.length) {\n const interrupts: PendingWrite<string>[] = error.interrupts.map(\n (interrupt) => [INTERRUPT, interrupt]\n );\n const resumes = task.writes.filter((w) => w[0] === RESUME);\n if (resumes.length) {\n interrupts.push(...resumes);\n }\n this.loop.putWrites(task.id, interrupts);\n }\n } else if (isGraphBubbleUp(error) && task.writes.length) {\n this.loop.putWrites(task.id, task.writes);\n } else {\n this.loop.putWrites(task.id, [\n [ERROR, { message: error.message, name: error.name }],\n ]);\n }\n } else {\n if (\n this.nodeFinished &&\n (task.config?.tags == null || !task.config.tags.includes(TAG_HIDDEN))\n ) {\n this.nodeFinished(String(task.name));\n }\n\n if (task.writes.length === 0) {\n // Add no writes marker\n task.writes.push([NO_WRITES, null]);\n }\n\n // Save task writes to checkpointer\n this.loop.putWrites(task.id, task.writes);\n }\n }\n}\n\nasync function call(\n this: {\n executingTasksMap: Record<\n string,\n Promise<{\n task: PregelExecutableTask<string, string>;\n result?: unknown;\n error?: Error;\n }>\n >;\n\n barrier: {\n next: () => void;\n wait: Promise<unknown>;\n };\n\n retryPolicy?: RetryPolicy;\n\n scheduleTask: (\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ) => Promise<PregelExecutableTask<string, string> | void>;\n },\n runner: PregelRunner,\n task: PregelExecutableTask<string, string>,\n func: (...args: unknown[]) => unknown | Promise<unknown>,\n name: string,\n input: unknown,\n options: {\n retry?: RetryPolicy;\n cache?: CachePolicy;\n callbacks?: unknown;\n } = {}\n): Promise<unknown> {\n // Schedule PUSH tasks, collect promises\n const scratchpad = task.config?.configurable?.[CONFIG_KEY_SCRATCHPAD] as\n | PregelScratchpad<unknown>\n | undefined;\n\n if (!scratchpad) {\n throw new Error(\n `BUG: No scratchpad found on task ${task.name}__${task.id}`\n );\n }\n\n const cnt = scratchpad.callCounter;\n scratchpad.callCounter += 1;\n\n // schedule the next task, if the callback returns one\n const wcall = new Call({\n func,\n name,\n input,\n cache: options.cache,\n retry: options.retry,\n callbacks: options.callbacks,\n });\n const nextTask = await this.scheduleTask(task, cnt, wcall);\n if (!nextTask) return undefined;\n\n // Check if this task is already running\n const existingPromise = this.executingTasksMap[nextTask.id];\n\n if (existingPromise !== undefined) {\n // If the parent task was retried, the next task might already be running\n return existingPromise;\n }\n\n if (nextTask.writes.length > 0) {\n // If it already ran, return the result\n const returns = nextTask.writes.filter(([c]) => c === RETURN);\n const errors = nextTask.writes.filter(([c]) => c === ERROR);\n\n if (returns.length > 0) {\n // Task completed successfully\n if (returns.length === 1) return Promise.resolve(returns[0][1]);\n\n // should be unreachable\n throw new Error(\n `BUG: multiple returns found for task ${nextTask.name}__${nextTask.id}`\n );\n }\n\n if (errors.length > 0) {\n // Task failed\n if (errors.length === 1) {\n const errorValue = errors[0][1];\n const error =\n // eslint-disable-next-line no-instanceof/no-instanceof\n errorValue instanceof Error\n ? errorValue\n : new Error(String(errorValue));\n\n return Promise.reject(error);\n }\n\n // the only way this should happen is if the task executes multiple times and writes aren't cleared\n throw new Error(\n `BUG: multiple errors found for task ${nextTask.name}__${nextTask.id}`\n );\n }\n\n return undefined;\n } else {\n // Schedule the next task with retry\n const prom = _runWithRetry<string, string>(nextTask, options.retry, {\n [CONFIG_KEY_CALL]: call.bind(this, runner, nextTask),\n });\n\n this.executingTasksMap[nextTask.id] = prom;\n this.barrier.next();\n\n return prom.then(({ result, error }) => {\n if (error) return Promise.reject(error);\n return result;\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runner.js","names":[],"sources":["../../src/pregel/runner.ts"],"sourcesContent":["import { PendingWrite } from \"@langchain/langgraph-checkpoint\";\nimport {\n Call,\n PregelAbortSignals,\n PregelExecutableTask,\n PregelScratchpad,\n} from \"./types.js\";\nimport {\n CachePolicy,\n combineAbortSignals,\n patchConfigurable,\n RetryPolicy,\n} from \"./utils/index.js\";\nimport {\n CONFIG_KEY_SCRATCHPAD,\n ERROR,\n INTERRUPT,\n RESUME,\n NO_WRITES,\n TAG_HIDDEN,\n RETURN,\n CONFIG_KEY_CALL,\n CONFIG_KEY_ABORT_SIGNALS,\n} from \"../constants.js\";\nimport { GraphBubbleUp, isGraphBubbleUp, isGraphInterrupt } from \"../errors.js\";\nimport { _runWithRetry, SettledPregelTask } from \"./retry.js\";\nimport { PregelLoop } from \"./loop.js\";\n\nconst PROMISE_ADDED_SYMBOL = Symbol.for(\"promiseAdded\");\n\nfunction createPromiseBarrier() {\n const barrier: {\n next: () => void;\n wait: Promise<unknown>;\n } = {\n next: () => void 0,\n wait: Promise.resolve(PROMISE_ADDED_SYMBOL),\n };\n\n function waitHandler(resolve: (value: typeof PROMISE_ADDED_SYMBOL) => void) {\n barrier.next = () => {\n barrier.wait = new Promise(waitHandler);\n resolve(PROMISE_ADDED_SYMBOL);\n };\n }\n barrier.wait = new Promise(waitHandler);\n return barrier;\n}\n\n/**\n * Options for the {@link PregelRunner#tick} method.\n */\nexport type TickOptions = {\n /**\n * The deadline before which all tasks must be completed.\n */\n timeout?: number;\n\n /**\n * An optional {@link AbortSignal} to cancel processing of tasks.\n */\n signal?: AbortSignal;\n\n /**\n * The {@link RetryPolicy} to use for the tick.\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * An optional callback to be called after all task writes are completed.\n */\n onStepWrite?: (step: number, writes: PendingWrite[]) => void;\n\n /**\n * The maximum number of tasks to execute concurrently.\n */\n maxConcurrency?: number;\n};\n\n/**\n * Responsible for handling task execution on each tick of the {@link PregelLoop}.\n */\nexport class PregelRunner {\n private nodeFinished?: (id: string) => void;\n\n private loop: PregelLoop;\n\n /**\n * Construct a new PregelRunner, which executes tasks from the provided PregelLoop.\n * @param loop - The PregelLoop that produces tasks for this runner to execute.\n */\n constructor({\n loop,\n nodeFinished,\n }: {\n loop: PregelLoop;\n nodeFinished?: (id: string) => void;\n }) {\n this.loop = loop;\n this.nodeFinished = nodeFinished;\n }\n\n /**\n * Execute tasks from the current step of the PregelLoop.\n *\n * Note: this method does NOT call {@link PregelLoop}#tick. That must be handled externally.\n * @param options - Options for the execution.\n */\n async tick(options: TickOptions = {}) {\n const { timeout, retryPolicy, onStepWrite, maxConcurrency } = options;\n\n const nodeErrors: Set<Error> = new Set();\n let graphBubbleUp: GraphBubbleUp | undefined;\n\n const exceptionSignalController = new AbortController();\n const exceptionSignal = exceptionSignalController.signal;\n const stepTimeoutSignal = timeout\n ? AbortSignal.timeout(timeout)\n : undefined;\n\n // Start task execution\n const pendingTasks = Object.values(this.loop.tasks).filter(\n (t) => t.writes.length === 0\n );\n\n const { signals, disposeCombinedSignal } = this._initializeAbortSignals({\n exceptionSignal,\n stepTimeoutSignal,\n signal: options.signal,\n });\n\n const taskStream = this._executeTasksWithRetry(pendingTasks, {\n signals,\n retryPolicy,\n maxConcurrency,\n });\n\n for await (const { task, error, signalAborted } of taskStream) {\n this._commit(task, error);\n if (isGraphInterrupt(error)) {\n graphBubbleUp = error;\n } else if (isGraphBubbleUp(error) && !isGraphInterrupt(graphBubbleUp)) {\n graphBubbleUp = error;\n } else if (error && (nodeErrors.size === 0 || !signalAborted)) {\n /*\n * The goal here is to capture the exception that causes the graph to terminate early. In\n * theory it's possible for multiple nodes to throw, so this also handles the edge case of\n * capturing concurrent exceptions thrown before the node saw an abort. This is checked via\n * the signalAborted flag, which records the state of the abort signal at the time the node\n * execution finished.\n *\n * There is a case however where one node throws some error causing us to trigger an abort,\n * which then causes other concurrently executing nodes to throw their own AbortErrors. In\n * this case we don't care about reporting the abort errors thrown by the other nodes,\n * because they don't tell the user anything about what caused the graph execution to\n * terminate early, so we ignore them (and any other errors that occur after the node sees\n * an abort signal).\n */\n exceptionSignalController.abort();\n nodeErrors.add(error);\n }\n }\n\n disposeCombinedSignal?.();\n\n onStepWrite?.(\n this.loop.step,\n Object.values(this.loop.tasks)\n .map((task) => task.writes)\n .flat()\n );\n\n if (nodeErrors.size === 1) {\n throw Array.from(nodeErrors)[0];\n } else if (nodeErrors.size > 1) {\n throw new AggregateError(\n Array.from(nodeErrors),\n `Multiple errors occurred during superstep ${this.loop.step}. See the \"errors\" field of this exception for more details.`\n );\n }\n\n if (isGraphInterrupt(graphBubbleUp)) {\n throw graphBubbleUp;\n }\n\n if (isGraphBubbleUp(graphBubbleUp) && this.loop.isNested) {\n throw graphBubbleUp;\n }\n }\n\n /**\n * Initializes the current AbortSignals for the PregelRunner, handling the various ways that\n * AbortSignals must be chained together so that the PregelLoop can be interrupted if necessary\n * while still allowing nodes to gracefully exit.\n *\n * This method must only be called once per PregelRunner#tick. It has the side effect of updating\n * the PregelLoop#config with the new AbortSignals so they may be propagated correctly to future\n * ticks and subgraph calls.\n *\n * @param options - Options for the initialization.\n * @returns The current abort signals.\n * @internal\n */\n private _initializeAbortSignals({\n exceptionSignal,\n stepTimeoutSignal,\n signal,\n }: {\n exceptionSignal: AbortSignal;\n stepTimeoutSignal?: AbortSignal;\n signal?: AbortSignal;\n }): { signals: PregelAbortSignals; disposeCombinedSignal?: () => void } {\n const previousSignals = (this.loop.config.configurable?.[\n CONFIG_KEY_ABORT_SIGNALS\n ] ?? {}) as PregelAbortSignals;\n\n // We always inherit the external abort signal from AsyncLocalStorage,\n // since that's the only way the signal is inherited by the subgraph calls.\n const externalAbortSignal = previousSignals.externalAbortSignal ?? signal;\n\n // inherit the step timeout signal from parent graph\n const timeoutAbortSignal =\n stepTimeoutSignal ?? previousSignals.timeoutAbortSignal;\n\n const { signal: composedAbortSignal, dispose: disposeCombinedSignal } =\n combineAbortSignals(\n externalAbortSignal,\n timeoutAbortSignal,\n exceptionSignal\n );\n\n const signals: PregelAbortSignals = {\n externalAbortSignal,\n timeoutAbortSignal,\n composedAbortSignal,\n };\n\n this.loop.config = patchConfigurable(this.loop.config, {\n [CONFIG_KEY_ABORT_SIGNALS]: signals,\n });\n\n return { signals, disposeCombinedSignal };\n }\n\n /**\n * Concurrently executes tasks with the requested retry policy, yielding a {@link SettledPregelTask} for each task as it completes.\n * @param tasks - The tasks to execute.\n * @param options - Options for the execution.\n */\n private async *_executeTasksWithRetry(\n tasks: PregelExecutableTask<string, string>[],\n options?: {\n signals?: PregelAbortSignals;\n retryPolicy?: RetryPolicy;\n maxConcurrency?: number;\n }\n ): AsyncGenerator<SettledPregelTask> {\n const { retryPolicy, maxConcurrency, signals } = options ?? {};\n\n const barrier = createPromiseBarrier();\n const executingTasksMap: Record<\n string,\n Promise<{\n task: PregelExecutableTask<string, string>;\n result?: unknown;\n error?: Error;\n }>\n > = {};\n\n const thisCall = {\n executingTasksMap,\n barrier,\n retryPolicy,\n scheduleTask: async (\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ) => this.loop.acceptPush(task, writeIdx, call),\n };\n\n if (signals?.composedAbortSignal?.aborted) {\n // note: don't use throwIfAborted here because it throws a DOMException,\n // which isn't consistent with how we throw on abort below.\n throw new Error(\"Abort\");\n }\n\n let startedTasksCount = 0;\n\n let listener: (() => void) | undefined;\n const timeoutOrCancelSignal = combineAbortSignals(\n signals?.externalAbortSignal,\n signals?.timeoutAbortSignal\n );\n\n const abortPromise = timeoutOrCancelSignal.signal\n ? new Promise<never>((_resolve, reject) => {\n listener = () => reject(new Error(\"Abort\"));\n timeoutOrCancelSignal.signal?.addEventListener(\"abort\", listener, {\n once: true,\n });\n })\n : undefined;\n\n while (\n (startedTasksCount === 0 || Object.keys(executingTasksMap).length > 0) &&\n tasks.length\n ) {\n for (\n ;\n Object.values(executingTasksMap).length <\n (maxConcurrency ?? tasks.length) && startedTasksCount < tasks.length;\n startedTasksCount += 1\n ) {\n const task = tasks[startedTasksCount];\n\n executingTasksMap[task.id] = _runWithRetry(\n task,\n retryPolicy,\n { [CONFIG_KEY_CALL]: call?.bind(thisCall, this, task) },\n signals?.composedAbortSignal\n ).catch((error) => {\n return {\n task,\n error,\n signalAborted: signals?.composedAbortSignal?.aborted,\n };\n });\n }\n\n const settledTask = await Promise.race([\n ...Object.values(executingTasksMap),\n ...(abortPromise ? [abortPromise] : []),\n barrier.wait,\n ]);\n\n if (settledTask === PROMISE_ADDED_SYMBOL) {\n continue;\n }\n\n yield settledTask as SettledPregelTask;\n\n if (listener != null) {\n timeoutOrCancelSignal.signal?.removeEventListener(\"abort\", listener);\n timeoutOrCancelSignal.dispose?.();\n }\n\n delete executingTasksMap[(settledTask as SettledPregelTask).task.id];\n }\n }\n\n /**\n * Determines what writes to apply based on whether the task completed successfully, and what type of error occurred.\n *\n * Throws an error if the error is a {@link GraphBubbleUp} error and {@link PregelLoop}#isNested is true.\n *\n * @param task - The task to commit.\n * @param error - The error that occurred, if any.\n */\n private _commit(task: PregelExecutableTask<string, string>, error?: Error) {\n if (error !== undefined) {\n if (isGraphInterrupt(error)) {\n if (error.interrupts.length) {\n const interrupts: PendingWrite<string>[] = error.interrupts.map(\n (interrupt) => [INTERRUPT, interrupt]\n );\n const resumes = task.writes.filter((w) => w[0] === RESUME);\n if (resumes.length) {\n interrupts.push(...resumes);\n }\n this.loop.putWrites(task.id, interrupts);\n }\n } else if (isGraphBubbleUp(error) && task.writes.length) {\n this.loop.putWrites(task.id, task.writes);\n } else {\n this.loop.putWrites(task.id, [\n [ERROR, { message: error.message, name: error.name }],\n ]);\n }\n } else {\n if (\n this.nodeFinished &&\n (task.config?.tags == null || !task.config.tags.includes(TAG_HIDDEN))\n ) {\n this.nodeFinished(String(task.name));\n }\n\n if (task.writes.length === 0) {\n // Add no writes marker\n task.writes.push([NO_WRITES, null]);\n }\n\n // Save task writes to checkpointer\n this.loop.putWrites(task.id, task.writes);\n }\n }\n}\n\nasync function call(\n this: {\n executingTasksMap: Record<\n string,\n Promise<{\n task: PregelExecutableTask<string, string>;\n result?: unknown;\n error?: Error;\n }>\n >;\n\n barrier: {\n next: () => void;\n wait: Promise<unknown>;\n };\n\n retryPolicy?: RetryPolicy;\n\n scheduleTask: (\n task: PregelExecutableTask<string, string>,\n writeIdx: number,\n call?: Call\n ) => Promise<PregelExecutableTask<string, string> | void>;\n },\n runner: PregelRunner,\n task: PregelExecutableTask<string, string>,\n func: (...args: unknown[]) => unknown | Promise<unknown>,\n name: string,\n input: unknown,\n options: {\n retry?: RetryPolicy;\n cache?: CachePolicy;\n callbacks?: unknown;\n } = {}\n): Promise<unknown> {\n // Schedule PUSH tasks, collect promises\n const scratchpad = task.config?.configurable?.[CONFIG_KEY_SCRATCHPAD] as\n | PregelScratchpad<unknown>\n | undefined;\n\n if (!scratchpad) {\n throw new Error(\n `BUG: No scratchpad found on task ${task.name}__${task.id}`\n );\n }\n\n const cnt = scratchpad.callCounter;\n scratchpad.callCounter += 1;\n\n // schedule the next task, if the callback returns one\n const wcall = new Call({\n func,\n name,\n input,\n cache: options.cache,\n retry: options.retry,\n callbacks: options.callbacks,\n });\n const nextTask = await this.scheduleTask(task, cnt, wcall);\n if (!nextTask) return undefined;\n\n // Check if this task is already running\n const existingPromise = this.executingTasksMap[nextTask.id];\n\n if (existingPromise !== undefined) {\n // If the parent task was retried, the next task might already be running\n return existingPromise;\n }\n\n if (nextTask.writes.length > 0) {\n // If it already ran, return the result\n const returns = nextTask.writes.filter(([c]) => c === RETURN);\n const errors = nextTask.writes.filter(([c]) => c === ERROR);\n\n if (returns.length > 0) {\n // Task completed successfully\n if (returns.length === 1) return Promise.resolve(returns[0][1]);\n\n // should be unreachable\n throw new Error(\n `BUG: multiple returns found for task ${nextTask.name}__${nextTask.id}`\n );\n }\n\n if (errors.length > 0) {\n // Task failed\n if (errors.length === 1) {\n const errorValue = errors[0][1];\n const error =\n // eslint-disable-next-line no-instanceof/no-instanceof\n errorValue instanceof Error\n ? errorValue\n : new Error(String(errorValue));\n\n return Promise.reject(error);\n }\n\n // the only way this should happen is if the task executes multiple times and writes aren't cleared\n throw new Error(\n `BUG: multiple errors found for task ${nextTask.name}__${nextTask.id}`\n );\n }\n\n return undefined;\n } else {\n // Schedule the next task with retry\n const prom = _runWithRetry<string, string>(nextTask, options.retry, {\n [CONFIG_KEY_CALL]: call.bind(this, runner, nextTask),\n });\n\n this.executingTasksMap[nextTask.id] = prom;\n this.barrier.next();\n\n return prom.then(({ result, error }) => {\n if (error) return Promise.reject(error);\n return result;\n });\n }\n}\n"],"mappings":"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"}
|
package/dist/pregel/stream.cjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
require("../constants.cjs");
|
|
2
2
|
let _langchain_core_utils_stream = require("@langchain/core/utils/stream");
|
|
3
3
|
let _langchain_core_callbacks_base = require("@langchain/core/callbacks/base");
|
|
4
|
-
|
|
5
4
|
//#region src/pregel/stream.ts
|
|
6
5
|
/**
|
|
7
6
|
* A wrapper around an IterableReadableStream that allows for aborting the stream when
|
|
@@ -99,7 +98,7 @@ var StreamToolsHandler = class extends _langchain_core_callbacks_base.BaseCallba
|
|
|
99
98
|
this.streamFn = streamFn;
|
|
100
99
|
}
|
|
101
100
|
handleToolStart(_tool, input, runId, _parentRunId, tags, metadata, runName, toolCallId) {
|
|
102
|
-
if (!metadata || tags && tags.includes(
|
|
101
|
+
if (!metadata || tags && tags.includes("langsmith:hidden")) return;
|
|
103
102
|
const ns = metadata.langgraph_checkpoint_ns?.split("|") ?? [];
|
|
104
103
|
const info = {
|
|
105
104
|
ns,
|
|
@@ -269,10 +268,10 @@ function toEventStream(stream) {
|
|
|
269
268
|
controller.close();
|
|
270
269
|
} });
|
|
271
270
|
}
|
|
272
|
-
|
|
273
271
|
//#endregion
|
|
274
272
|
exports.IterableReadableStreamWithAbortSignal = IterableReadableStreamWithAbortSignal;
|
|
275
273
|
exports.IterableReadableWritableStream = IterableReadableWritableStream;
|
|
276
274
|
exports.StreamToolsHandler = StreamToolsHandler;
|
|
277
275
|
exports.toEventStream = toEventStream;
|
|
276
|
+
|
|
278
277
|
//# sourceMappingURL=stream.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.cjs","names":["IterableReadableStream","BaseCallbackHandler","TAG_HIDDEN"],"sources":["../../src/pregel/stream.ts"],"sourcesContent":["import { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\nimport type { StreamMode, StreamOutputMap } from \"./types.js\";\nimport { TAG_HIDDEN } from \"../constants.js\";\n\n// [namespace, streamMode, payload]\nexport type StreamChunk = [string[], StreamMode, unknown];\n\ntype StreamCheckpointsOutput<StreamValues> = StreamOutputMap<\n \"checkpoints\",\n false,\n StreamValues,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype AnyStreamOutput = StreamOutputMap<\n StreamMode[],\n true,\n unknown,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype ToolRunInfo = {\n ns: string[];\n toolCallId?: string;\n toolName: string;\n input: unknown;\n};\n\n/**\n * A wrapper around an IterableReadableStream that allows for aborting the stream when\n * {@link cancel} is called.\n */\nexport class IterableReadableStreamWithAbortSignal<\n T\n> extends IterableReadableStream<T> {\n protected _abortController: AbortController;\n\n protected _innerReader: ReadableStreamDefaultReader<T>;\n\n /**\n * @param readableStream - The stream to wrap.\n * @param abortController - The abort controller to use. Optional. One will be created if not provided.\n */\n constructor(\n readableStream: ReadableStream<T>,\n abortController?: AbortController\n ) {\n const reader = readableStream.getReader();\n const ac = abortController ?? new AbortController();\n super({\n start(controller: ReadableStreamDefaultController<T>) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n });\n this._abortController = ac;\n this._innerReader = reader;\n }\n\n /**\n * Aborts the stream, abandoning any pending operations in progress. Calling this triggers an\n * {@link AbortSignal} that is propagated to the tasks that are producing the data for this stream.\n * @param reason - The reason for aborting the stream. Optional.\n */\n override async cancel(reason?: unknown) {\n this._abortController.abort(reason);\n this._innerReader.releaseLock();\n }\n\n /**\n * The {@link AbortSignal} for the stream. Aborted when {@link cancel} is called.\n */\n get signal() {\n return this._abortController.signal;\n }\n}\n\nexport class IterableReadableWritableStream extends IterableReadableStream<StreamChunk> {\n modes: Set<StreamMode>;\n\n private controller: ReadableStreamDefaultController;\n\n private passthroughFn?: (chunk: StreamChunk) => void;\n\n private _closed: boolean = false;\n\n get closed() {\n return this._closed;\n }\n\n constructor(params: {\n passthroughFn?: (chunk: StreamChunk) => void;\n modes: Set<StreamMode>;\n }) {\n let streamControllerPromiseResolver: (\n controller: ReadableStreamDefaultController\n ) => void;\n const streamControllerPromise: Promise<ReadableStreamDefaultController> =\n new Promise<ReadableStreamDefaultController>((resolve) => {\n streamControllerPromiseResolver = resolve;\n });\n\n super({\n start: (controller) => {\n streamControllerPromiseResolver!(controller);\n },\n });\n\n // .start() will always be called before the stream can be interacted\n // with anyway\n void streamControllerPromise.then((controller) => {\n this.controller = controller;\n });\n\n this.passthroughFn = params.passthroughFn;\n this.modes = params.modes;\n }\n\n push(chunk: StreamChunk) {\n this.passthroughFn?.(chunk);\n this.controller.enqueue(chunk);\n }\n\n close() {\n try {\n this.controller.close();\n } catch (e) {\n // pass\n } finally {\n this._closed = true;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(e: any) {\n this.controller.error(e);\n }\n}\n\n/**\n * A callback handler that implements stream_mode=tools.\n * Emits on_tool_start, on_tool_event, on_tool_end, on_tool_error events.\n */\nexport class StreamToolsHandler extends BaseCallbackHandler {\n name = \"StreamToolsHandler\";\n\n streamFn: (streamChunk: StreamChunk) => void;\n\n runs: Record<string, ToolRunInfo | undefined> = {};\n\n constructor(streamFn: (streamChunk: StreamChunk) => void) {\n super();\n this.streamFn = streamFn;\n }\n\n handleToolStart(\n _tool: Serialized,\n input: string,\n runId: string,\n _parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string,\n toolCallId?: string\n ) {\n if (!metadata || (tags && tags.includes(TAG_HIDDEN))) return;\n\n const ns = (metadata.langgraph_checkpoint_ns as string)?.split(\"|\") ?? [];\n const info: ToolRunInfo = {\n ns,\n toolCallId,\n toolName: runName ?? \"unknown\",\n input,\n };\n this.runs[runId] = info;\n\n this.streamFn([\n ns,\n \"tools\",\n {\n event: \"on_tool_start\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n input,\n },\n ]);\n }\n\n handleToolEvent(chunk: unknown, runId: string) {\n const info = this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_event\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n data: chunk,\n },\n ]);\n }\n\n handleToolEnd(output: unknown, runId: string) {\n const info = this.runs[runId];\n delete this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_end\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n output,\n },\n ]);\n }\n\n handleToolError(err: unknown, runId: string) {\n const info = this.runs[runId];\n delete this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_error\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n error: err,\n },\n ]);\n }\n}\n\nfunction _stringifyAsDict(obj: unknown) {\n return JSON.stringify(obj, function (key: string | number, value: unknown) {\n const rawValue = this[key];\n if (\n rawValue != null &&\n typeof rawValue === \"object\" &&\n \"toDict\" in rawValue &&\n typeof rawValue.toDict === \"function\"\n ) {\n const { type, data } = rawValue.toDict();\n return { ...data, type };\n }\n\n return value;\n });\n}\n\nfunction _serializeError(error: unknown) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (error instanceof Error) {\n return { error: error.name, message: error.message };\n }\n return { error: \"Error\", message: JSON.stringify(error) };\n}\n\nfunction _isRunnableConfig(\n config: unknown\n): config is RunnableConfig & { configurable: Record<string, unknown> } {\n if (typeof config !== \"object\" || config == null) return false;\n return (\n \"configurable\" in config &&\n typeof config.configurable === \"object\" &&\n config.configurable != null\n );\n}\n\nfunction _extractCheckpointFromConfig(\n config: RunnableConfig | null | undefined\n) {\n if (!_isRunnableConfig(config) || !config.configurable.thread_id) {\n return null;\n }\n\n return {\n thread_id: config.configurable.thread_id,\n checkpoint_ns: config.configurable.checkpoint_ns || \"\",\n checkpoint_id: config.configurable.checkpoint_id || null,\n checkpoint_map: config.configurable.checkpoint_map || null,\n };\n}\n\nfunction _serializeConfig(config: unknown) {\n if (_isRunnableConfig(config)) {\n const configurable = Object.fromEntries(\n Object.entries(config.configurable).filter(\n ([key]) => !key.startsWith(\"__\")\n )\n );\n\n const newConfig = { ...config, configurable };\n delete newConfig.callbacks;\n return newConfig;\n }\n\n return config;\n}\n\nfunction _serializeCheckpoint(payload: StreamCheckpointsOutput<unknown>) {\n const result: Record<string, unknown> = {\n ...payload,\n checkpoint: _extractCheckpointFromConfig(payload.config),\n parent_checkpoint: _extractCheckpointFromConfig(payload.parentConfig),\n\n config: _serializeConfig(payload.config),\n parent_config: _serializeConfig(payload.parentConfig),\n\n tasks: payload.tasks.map((task) => {\n if (_isRunnableConfig(task.state)) {\n const checkpoint = _extractCheckpointFromConfig(task.state);\n if (checkpoint != null) {\n const cloneTask: Record<string, unknown> = { ...task, checkpoint };\n delete cloneTask.state;\n return cloneTask;\n }\n }\n\n return task;\n }),\n };\n\n delete result.parentConfig;\n return result;\n}\n\nexport function toEventStream(stream: AsyncGenerator) {\n const encoder = new TextEncoder();\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const enqueueChunk = (sse: {\n id?: string;\n event: string;\n data: unknown;\n }) => {\n controller.enqueue(\n encoder.encode(\n `event: ${sse.event}\\ndata: ${_stringifyAsDict(sse.data)}\\n\\n`\n )\n );\n };\n\n try {\n for await (const payload of stream) {\n const [ns, mode, chunk] = payload as AnyStreamOutput;\n\n let data: unknown = chunk;\n if (mode === \"debug\") {\n const debugChunk = chunk;\n\n if (debugChunk.type === \"checkpoint\") {\n data = {\n ...debugChunk,\n payload: _serializeCheckpoint(debugChunk.payload),\n };\n }\n }\n\n if (mode === \"checkpoints\") {\n data = _serializeCheckpoint(chunk);\n }\n\n const event = ns?.length ? `${mode}|${ns.join(\"|\")}` : mode;\n enqueueChunk({ event, data });\n }\n } catch (error) {\n enqueueChunk({ event: \"error\", data: _serializeError(error) });\n }\n\n controller.close();\n },\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream.cjs","names":["IterableReadableStream","BaseCallbackHandler"],"sources":["../../src/pregel/stream.ts"],"sourcesContent":["import { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\nimport type { StreamMode, StreamOutputMap } from \"./types.js\";\nimport { TAG_HIDDEN } from \"../constants.js\";\n\n// [namespace, streamMode, payload]\nexport type StreamChunk = [string[], StreamMode, unknown];\n\ntype StreamCheckpointsOutput<StreamValues> = StreamOutputMap<\n \"checkpoints\",\n false,\n StreamValues,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype AnyStreamOutput = StreamOutputMap<\n StreamMode[],\n true,\n unknown,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype ToolRunInfo = {\n ns: string[];\n toolCallId?: string;\n toolName: string;\n input: unknown;\n};\n\n/**\n * A wrapper around an IterableReadableStream that allows for aborting the stream when\n * {@link cancel} is called.\n */\nexport class IterableReadableStreamWithAbortSignal<\n T\n> extends IterableReadableStream<T> {\n protected _abortController: AbortController;\n\n protected _innerReader: ReadableStreamDefaultReader<T>;\n\n /**\n * @param readableStream - The stream to wrap.\n * @param abortController - The abort controller to use. Optional. One will be created if not provided.\n */\n constructor(\n readableStream: ReadableStream<T>,\n abortController?: AbortController\n ) {\n const reader = readableStream.getReader();\n const ac = abortController ?? new AbortController();\n super({\n start(controller: ReadableStreamDefaultController<T>) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n });\n this._abortController = ac;\n this._innerReader = reader;\n }\n\n /**\n * Aborts the stream, abandoning any pending operations in progress. Calling this triggers an\n * {@link AbortSignal} that is propagated to the tasks that are producing the data for this stream.\n * @param reason - The reason for aborting the stream. Optional.\n */\n override async cancel(reason?: unknown) {\n this._abortController.abort(reason);\n this._innerReader.releaseLock();\n }\n\n /**\n * The {@link AbortSignal} for the stream. Aborted when {@link cancel} is called.\n */\n get signal() {\n return this._abortController.signal;\n }\n}\n\nexport class IterableReadableWritableStream extends IterableReadableStream<StreamChunk> {\n modes: Set<StreamMode>;\n\n private controller: ReadableStreamDefaultController;\n\n private passthroughFn?: (chunk: StreamChunk) => void;\n\n private _closed: boolean = false;\n\n get closed() {\n return this._closed;\n }\n\n constructor(params: {\n passthroughFn?: (chunk: StreamChunk) => void;\n modes: Set<StreamMode>;\n }) {\n let streamControllerPromiseResolver: (\n controller: ReadableStreamDefaultController\n ) => void;\n const streamControllerPromise: Promise<ReadableStreamDefaultController> =\n new Promise<ReadableStreamDefaultController>((resolve) => {\n streamControllerPromiseResolver = resolve;\n });\n\n super({\n start: (controller) => {\n streamControllerPromiseResolver!(controller);\n },\n });\n\n // .start() will always be called before the stream can be interacted\n // with anyway\n void streamControllerPromise.then((controller) => {\n this.controller = controller;\n });\n\n this.passthroughFn = params.passthroughFn;\n this.modes = params.modes;\n }\n\n push(chunk: StreamChunk) {\n this.passthroughFn?.(chunk);\n this.controller.enqueue(chunk);\n }\n\n close() {\n try {\n this.controller.close();\n } catch (e) {\n // pass\n } finally {\n this._closed = true;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(e: any) {\n this.controller.error(e);\n }\n}\n\n/**\n * A callback handler that implements stream_mode=tools.\n * Emits on_tool_start, on_tool_event, on_tool_end, on_tool_error events.\n */\nexport class StreamToolsHandler extends BaseCallbackHandler {\n name = \"StreamToolsHandler\";\n\n streamFn: (streamChunk: StreamChunk) => void;\n\n runs: Record<string, ToolRunInfo | undefined> = {};\n\n constructor(streamFn: (streamChunk: StreamChunk) => void) {\n super();\n this.streamFn = streamFn;\n }\n\n handleToolStart(\n _tool: Serialized,\n input: string,\n runId: string,\n _parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string,\n toolCallId?: string\n ) {\n if (!metadata || (tags && tags.includes(TAG_HIDDEN))) return;\n\n const ns = (metadata.langgraph_checkpoint_ns as string)?.split(\"|\") ?? [];\n const info: ToolRunInfo = {\n ns,\n toolCallId,\n toolName: runName ?? \"unknown\",\n input,\n };\n this.runs[runId] = info;\n\n this.streamFn([\n ns,\n \"tools\",\n {\n event: \"on_tool_start\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n input,\n },\n ]);\n }\n\n handleToolEvent(chunk: unknown, runId: string) {\n const info = this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_event\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n data: chunk,\n },\n ]);\n }\n\n handleToolEnd(output: unknown, runId: string) {\n const info = this.runs[runId];\n delete this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_end\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n output,\n },\n ]);\n }\n\n handleToolError(err: unknown, runId: string) {\n const info = this.runs[runId];\n delete this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_error\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n error: err,\n },\n ]);\n }\n}\n\nfunction _stringifyAsDict(obj: unknown) {\n return JSON.stringify(obj, function (key: string | number, value: unknown) {\n const rawValue = this[key];\n if (\n rawValue != null &&\n typeof rawValue === \"object\" &&\n \"toDict\" in rawValue &&\n typeof rawValue.toDict === \"function\"\n ) {\n const { type, data } = rawValue.toDict();\n return { ...data, type };\n }\n\n return value;\n });\n}\n\nfunction _serializeError(error: unknown) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (error instanceof Error) {\n return { error: error.name, message: error.message };\n }\n return { error: \"Error\", message: JSON.stringify(error) };\n}\n\nfunction _isRunnableConfig(\n config: unknown\n): config is RunnableConfig & { configurable: Record<string, unknown> } {\n if (typeof config !== \"object\" || config == null) return false;\n return (\n \"configurable\" in config &&\n typeof config.configurable === \"object\" &&\n config.configurable != null\n );\n}\n\nfunction _extractCheckpointFromConfig(\n config: RunnableConfig | null | undefined\n) {\n if (!_isRunnableConfig(config) || !config.configurable.thread_id) {\n return null;\n }\n\n return {\n thread_id: config.configurable.thread_id,\n checkpoint_ns: config.configurable.checkpoint_ns || \"\",\n checkpoint_id: config.configurable.checkpoint_id || null,\n checkpoint_map: config.configurable.checkpoint_map || null,\n };\n}\n\nfunction _serializeConfig(config: unknown) {\n if (_isRunnableConfig(config)) {\n const configurable = Object.fromEntries(\n Object.entries(config.configurable).filter(\n ([key]) => !key.startsWith(\"__\")\n )\n );\n\n const newConfig = { ...config, configurable };\n delete newConfig.callbacks;\n return newConfig;\n }\n\n return config;\n}\n\nfunction _serializeCheckpoint(payload: StreamCheckpointsOutput<unknown>) {\n const result: Record<string, unknown> = {\n ...payload,\n checkpoint: _extractCheckpointFromConfig(payload.config),\n parent_checkpoint: _extractCheckpointFromConfig(payload.parentConfig),\n\n config: _serializeConfig(payload.config),\n parent_config: _serializeConfig(payload.parentConfig),\n\n tasks: payload.tasks.map((task) => {\n if (_isRunnableConfig(task.state)) {\n const checkpoint = _extractCheckpointFromConfig(task.state);\n if (checkpoint != null) {\n const cloneTask: Record<string, unknown> = { ...task, checkpoint };\n delete cloneTask.state;\n return cloneTask;\n }\n }\n\n return task;\n }),\n };\n\n delete result.parentConfig;\n return result;\n}\n\nexport function toEventStream(stream: AsyncGenerator) {\n const encoder = new TextEncoder();\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const enqueueChunk = (sse: {\n id?: string;\n event: string;\n data: unknown;\n }) => {\n controller.enqueue(\n encoder.encode(\n `event: ${sse.event}\\ndata: ${_stringifyAsDict(sse.data)}\\n\\n`\n )\n );\n };\n\n try {\n for await (const payload of stream) {\n const [ns, mode, chunk] = payload as AnyStreamOutput;\n\n let data: unknown = chunk;\n if (mode === \"debug\") {\n const debugChunk = chunk;\n\n if (debugChunk.type === \"checkpoint\") {\n data = {\n ...debugChunk,\n payload: _serializeCheckpoint(debugChunk.payload),\n };\n }\n }\n\n if (mode === \"checkpoints\") {\n data = _serializeCheckpoint(chunk);\n }\n\n const event = ns?.length ? `${mode}|${ns.join(\"|\")}` : mode;\n enqueueChunk({ event, data });\n }\n } catch (error) {\n enqueueChunk({ event: \"error\", data: _serializeError(error) });\n }\n\n controller.close();\n },\n });\n}\n"],"mappings":"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"}
|
package/dist/pregel/stream.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "../constants.js";
|
|
2
2
|
import { IterableReadableStream } from "@langchain/core/utils/stream";
|
|
3
3
|
import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
|
|
4
|
-
|
|
5
4
|
//#region src/pregel/stream.ts
|
|
6
5
|
/**
|
|
7
6
|
* A wrapper around an IterableReadableStream that allows for aborting the stream when
|
|
@@ -99,7 +98,7 @@ var StreamToolsHandler = class extends BaseCallbackHandler {
|
|
|
99
98
|
this.streamFn = streamFn;
|
|
100
99
|
}
|
|
101
100
|
handleToolStart(_tool, input, runId, _parentRunId, tags, metadata, runName, toolCallId) {
|
|
102
|
-
if (!metadata || tags && tags.includes(
|
|
101
|
+
if (!metadata || tags && tags.includes("langsmith:hidden")) return;
|
|
103
102
|
const ns = metadata.langgraph_checkpoint_ns?.split("|") ?? [];
|
|
104
103
|
const info = {
|
|
105
104
|
ns,
|
|
@@ -269,7 +268,7 @@ function toEventStream(stream) {
|
|
|
269
268
|
controller.close();
|
|
270
269
|
} });
|
|
271
270
|
}
|
|
272
|
-
|
|
273
271
|
//#endregion
|
|
274
272
|
export { IterableReadableStreamWithAbortSignal, IterableReadableWritableStream, StreamToolsHandler, toEventStream };
|
|
273
|
+
|
|
275
274
|
//# sourceMappingURL=stream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","names":[],"sources":["../../src/pregel/stream.ts"],"sourcesContent":["import { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\nimport type { StreamMode, StreamOutputMap } from \"./types.js\";\nimport { TAG_HIDDEN } from \"../constants.js\";\n\n// [namespace, streamMode, payload]\nexport type StreamChunk = [string[], StreamMode, unknown];\n\ntype StreamCheckpointsOutput<StreamValues> = StreamOutputMap<\n \"checkpoints\",\n false,\n StreamValues,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype AnyStreamOutput = StreamOutputMap<\n StreamMode[],\n true,\n unknown,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype ToolRunInfo = {\n ns: string[];\n toolCallId?: string;\n toolName: string;\n input: unknown;\n};\n\n/**\n * A wrapper around an IterableReadableStream that allows for aborting the stream when\n * {@link cancel} is called.\n */\nexport class IterableReadableStreamWithAbortSignal<\n T\n> extends IterableReadableStream<T> {\n protected _abortController: AbortController;\n\n protected _innerReader: ReadableStreamDefaultReader<T>;\n\n /**\n * @param readableStream - The stream to wrap.\n * @param abortController - The abort controller to use. Optional. One will be created if not provided.\n */\n constructor(\n readableStream: ReadableStream<T>,\n abortController?: AbortController\n ) {\n const reader = readableStream.getReader();\n const ac = abortController ?? new AbortController();\n super({\n start(controller: ReadableStreamDefaultController<T>) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n });\n this._abortController = ac;\n this._innerReader = reader;\n }\n\n /**\n * Aborts the stream, abandoning any pending operations in progress. Calling this triggers an\n * {@link AbortSignal} that is propagated to the tasks that are producing the data for this stream.\n * @param reason - The reason for aborting the stream. Optional.\n */\n override async cancel(reason?: unknown) {\n this._abortController.abort(reason);\n this._innerReader.releaseLock();\n }\n\n /**\n * The {@link AbortSignal} for the stream. Aborted when {@link cancel} is called.\n */\n get signal() {\n return this._abortController.signal;\n }\n}\n\nexport class IterableReadableWritableStream extends IterableReadableStream<StreamChunk> {\n modes: Set<StreamMode>;\n\n private controller: ReadableStreamDefaultController;\n\n private passthroughFn?: (chunk: StreamChunk) => void;\n\n private _closed: boolean = false;\n\n get closed() {\n return this._closed;\n }\n\n constructor(params: {\n passthroughFn?: (chunk: StreamChunk) => void;\n modes: Set<StreamMode>;\n }) {\n let streamControllerPromiseResolver: (\n controller: ReadableStreamDefaultController\n ) => void;\n const streamControllerPromise: Promise<ReadableStreamDefaultController> =\n new Promise<ReadableStreamDefaultController>((resolve) => {\n streamControllerPromiseResolver = resolve;\n });\n\n super({\n start: (controller) => {\n streamControllerPromiseResolver!(controller);\n },\n });\n\n // .start() will always be called before the stream can be interacted\n // with anyway\n void streamControllerPromise.then((controller) => {\n this.controller = controller;\n });\n\n this.passthroughFn = params.passthroughFn;\n this.modes = params.modes;\n }\n\n push(chunk: StreamChunk) {\n this.passthroughFn?.(chunk);\n this.controller.enqueue(chunk);\n }\n\n close() {\n try {\n this.controller.close();\n } catch (e) {\n // pass\n } finally {\n this._closed = true;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(e: any) {\n this.controller.error(e);\n }\n}\n\n/**\n * A callback handler that implements stream_mode=tools.\n * Emits on_tool_start, on_tool_event, on_tool_end, on_tool_error events.\n */\nexport class StreamToolsHandler extends BaseCallbackHandler {\n name = \"StreamToolsHandler\";\n\n streamFn: (streamChunk: StreamChunk) => void;\n\n runs: Record<string, ToolRunInfo | undefined> = {};\n\n constructor(streamFn: (streamChunk: StreamChunk) => void) {\n super();\n this.streamFn = streamFn;\n }\n\n handleToolStart(\n _tool: Serialized,\n input: string,\n runId: string,\n _parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string,\n toolCallId?: string\n ) {\n if (!metadata || (tags && tags.includes(TAG_HIDDEN))) return;\n\n const ns = (metadata.langgraph_checkpoint_ns as string)?.split(\"|\") ?? [];\n const info: ToolRunInfo = {\n ns,\n toolCallId,\n toolName: runName ?? \"unknown\",\n input,\n };\n this.runs[runId] = info;\n\n this.streamFn([\n ns,\n \"tools\",\n {\n event: \"on_tool_start\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n input,\n },\n ]);\n }\n\n handleToolEvent(chunk: unknown, runId: string) {\n const info = this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_event\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n data: chunk,\n },\n ]);\n }\n\n handleToolEnd(output: unknown, runId: string) {\n const info = this.runs[runId];\n delete this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_end\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n output,\n },\n ]);\n }\n\n handleToolError(err: unknown, runId: string) {\n const info = this.runs[runId];\n delete this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_error\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n error: err,\n },\n ]);\n }\n}\n\nfunction _stringifyAsDict(obj: unknown) {\n return JSON.stringify(obj, function (key: string | number, value: unknown) {\n const rawValue = this[key];\n if (\n rawValue != null &&\n typeof rawValue === \"object\" &&\n \"toDict\" in rawValue &&\n typeof rawValue.toDict === \"function\"\n ) {\n const { type, data } = rawValue.toDict();\n return { ...data, type };\n }\n\n return value;\n });\n}\n\nfunction _serializeError(error: unknown) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (error instanceof Error) {\n return { error: error.name, message: error.message };\n }\n return { error: \"Error\", message: JSON.stringify(error) };\n}\n\nfunction _isRunnableConfig(\n config: unknown\n): config is RunnableConfig & { configurable: Record<string, unknown> } {\n if (typeof config !== \"object\" || config == null) return false;\n return (\n \"configurable\" in config &&\n typeof config.configurable === \"object\" &&\n config.configurable != null\n );\n}\n\nfunction _extractCheckpointFromConfig(\n config: RunnableConfig | null | undefined\n) {\n if (!_isRunnableConfig(config) || !config.configurable.thread_id) {\n return null;\n }\n\n return {\n thread_id: config.configurable.thread_id,\n checkpoint_ns: config.configurable.checkpoint_ns || \"\",\n checkpoint_id: config.configurable.checkpoint_id || null,\n checkpoint_map: config.configurable.checkpoint_map || null,\n };\n}\n\nfunction _serializeConfig(config: unknown) {\n if (_isRunnableConfig(config)) {\n const configurable = Object.fromEntries(\n Object.entries(config.configurable).filter(\n ([key]) => !key.startsWith(\"__\")\n )\n );\n\n const newConfig = { ...config, configurable };\n delete newConfig.callbacks;\n return newConfig;\n }\n\n return config;\n}\n\nfunction _serializeCheckpoint(payload: StreamCheckpointsOutput<unknown>) {\n const result: Record<string, unknown> = {\n ...payload,\n checkpoint: _extractCheckpointFromConfig(payload.config),\n parent_checkpoint: _extractCheckpointFromConfig(payload.parentConfig),\n\n config: _serializeConfig(payload.config),\n parent_config: _serializeConfig(payload.parentConfig),\n\n tasks: payload.tasks.map((task) => {\n if (_isRunnableConfig(task.state)) {\n const checkpoint = _extractCheckpointFromConfig(task.state);\n if (checkpoint != null) {\n const cloneTask: Record<string, unknown> = { ...task, checkpoint };\n delete cloneTask.state;\n return cloneTask;\n }\n }\n\n return task;\n }),\n };\n\n delete result.parentConfig;\n return result;\n}\n\nexport function toEventStream(stream: AsyncGenerator) {\n const encoder = new TextEncoder();\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const enqueueChunk = (sse: {\n id?: string;\n event: string;\n data: unknown;\n }) => {\n controller.enqueue(\n encoder.encode(\n `event: ${sse.event}\\ndata: ${_stringifyAsDict(sse.data)}\\n\\n`\n )\n );\n };\n\n try {\n for await (const payload of stream) {\n const [ns, mode, chunk] = payload as AnyStreamOutput;\n\n let data: unknown = chunk;\n if (mode === \"debug\") {\n const debugChunk = chunk;\n\n if (debugChunk.type === \"checkpoint\") {\n data = {\n ...debugChunk,\n payload: _serializeCheckpoint(debugChunk.payload),\n };\n }\n }\n\n if (mode === \"checkpoints\") {\n data = _serializeCheckpoint(chunk);\n }\n\n const event = ns?.length ? `${mode}|${ns.join(\"|\")}` : mode;\n enqueueChunk({ event, data });\n }\n } catch (error) {\n enqueueChunk({ event: \"error\", data: _serializeError(error) });\n }\n\n controller.close();\n },\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream.js","names":[],"sources":["../../src/pregel/stream.ts"],"sourcesContent":["import { IterableReadableStream } from \"@langchain/core/utils/stream\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport { Serialized } from \"@langchain/core/load/serializable\";\nimport type { StreamMode, StreamOutputMap } from \"./types.js\";\nimport { TAG_HIDDEN } from \"../constants.js\";\n\n// [namespace, streamMode, payload]\nexport type StreamChunk = [string[], StreamMode, unknown];\n\ntype StreamCheckpointsOutput<StreamValues> = StreamOutputMap<\n \"checkpoints\",\n false,\n StreamValues,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype AnyStreamOutput = StreamOutputMap<\n StreamMode[],\n true,\n unknown,\n unknown,\n string,\n unknown,\n unknown,\n undefined\n>;\n\ntype ToolRunInfo = {\n ns: string[];\n toolCallId?: string;\n toolName: string;\n input: unknown;\n};\n\n/**\n * A wrapper around an IterableReadableStream that allows for aborting the stream when\n * {@link cancel} is called.\n */\nexport class IterableReadableStreamWithAbortSignal<\n T\n> extends IterableReadableStream<T> {\n protected _abortController: AbortController;\n\n protected _innerReader: ReadableStreamDefaultReader<T>;\n\n /**\n * @param readableStream - The stream to wrap.\n * @param abortController - The abort controller to use. Optional. One will be created if not provided.\n */\n constructor(\n readableStream: ReadableStream<T>,\n abortController?: AbortController\n ) {\n const reader = readableStream.getReader();\n const ac = abortController ?? new AbortController();\n super({\n start(controller: ReadableStreamDefaultController<T>) {\n return pump();\n function pump(): Promise<T | undefined> {\n return reader.read().then(({ done, value }) => {\n // When no more data needs to be consumed, close the stream\n if (done) {\n controller.close();\n return;\n }\n // Enqueue the next data chunk into our target stream\n controller.enqueue(value);\n return pump();\n });\n }\n },\n });\n this._abortController = ac;\n this._innerReader = reader;\n }\n\n /**\n * Aborts the stream, abandoning any pending operations in progress. Calling this triggers an\n * {@link AbortSignal} that is propagated to the tasks that are producing the data for this stream.\n * @param reason - The reason for aborting the stream. Optional.\n */\n override async cancel(reason?: unknown) {\n this._abortController.abort(reason);\n this._innerReader.releaseLock();\n }\n\n /**\n * The {@link AbortSignal} for the stream. Aborted when {@link cancel} is called.\n */\n get signal() {\n return this._abortController.signal;\n }\n}\n\nexport class IterableReadableWritableStream extends IterableReadableStream<StreamChunk> {\n modes: Set<StreamMode>;\n\n private controller: ReadableStreamDefaultController;\n\n private passthroughFn?: (chunk: StreamChunk) => void;\n\n private _closed: boolean = false;\n\n get closed() {\n return this._closed;\n }\n\n constructor(params: {\n passthroughFn?: (chunk: StreamChunk) => void;\n modes: Set<StreamMode>;\n }) {\n let streamControllerPromiseResolver: (\n controller: ReadableStreamDefaultController\n ) => void;\n const streamControllerPromise: Promise<ReadableStreamDefaultController> =\n new Promise<ReadableStreamDefaultController>((resolve) => {\n streamControllerPromiseResolver = resolve;\n });\n\n super({\n start: (controller) => {\n streamControllerPromiseResolver!(controller);\n },\n });\n\n // .start() will always be called before the stream can be interacted\n // with anyway\n void streamControllerPromise.then((controller) => {\n this.controller = controller;\n });\n\n this.passthroughFn = params.passthroughFn;\n this.modes = params.modes;\n }\n\n push(chunk: StreamChunk) {\n this.passthroughFn?.(chunk);\n this.controller.enqueue(chunk);\n }\n\n close() {\n try {\n this.controller.close();\n } catch (e) {\n // pass\n } finally {\n this._closed = true;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(e: any) {\n this.controller.error(e);\n }\n}\n\n/**\n * A callback handler that implements stream_mode=tools.\n * Emits on_tool_start, on_tool_event, on_tool_end, on_tool_error events.\n */\nexport class StreamToolsHandler extends BaseCallbackHandler {\n name = \"StreamToolsHandler\";\n\n streamFn: (streamChunk: StreamChunk) => void;\n\n runs: Record<string, ToolRunInfo | undefined> = {};\n\n constructor(streamFn: (streamChunk: StreamChunk) => void) {\n super();\n this.streamFn = streamFn;\n }\n\n handleToolStart(\n _tool: Serialized,\n input: string,\n runId: string,\n _parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string,\n toolCallId?: string\n ) {\n if (!metadata || (tags && tags.includes(TAG_HIDDEN))) return;\n\n const ns = (metadata.langgraph_checkpoint_ns as string)?.split(\"|\") ?? [];\n const info: ToolRunInfo = {\n ns,\n toolCallId,\n toolName: runName ?? \"unknown\",\n input,\n };\n this.runs[runId] = info;\n\n this.streamFn([\n ns,\n \"tools\",\n {\n event: \"on_tool_start\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n input,\n },\n ]);\n }\n\n handleToolEvent(chunk: unknown, runId: string) {\n const info = this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_event\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n data: chunk,\n },\n ]);\n }\n\n handleToolEnd(output: unknown, runId: string) {\n const info = this.runs[runId];\n delete this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_end\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n output,\n },\n ]);\n }\n\n handleToolError(err: unknown, runId: string) {\n const info = this.runs[runId];\n delete this.runs[runId];\n if (!info) return;\n\n this.streamFn([\n info.ns,\n \"tools\",\n {\n event: \"on_tool_error\",\n toolCallId: info.toolCallId,\n name: info.toolName,\n error: err,\n },\n ]);\n }\n}\n\nfunction _stringifyAsDict(obj: unknown) {\n return JSON.stringify(obj, function (key: string | number, value: unknown) {\n const rawValue = this[key];\n if (\n rawValue != null &&\n typeof rawValue === \"object\" &&\n \"toDict\" in rawValue &&\n typeof rawValue.toDict === \"function\"\n ) {\n const { type, data } = rawValue.toDict();\n return { ...data, type };\n }\n\n return value;\n });\n}\n\nfunction _serializeError(error: unknown) {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (error instanceof Error) {\n return { error: error.name, message: error.message };\n }\n return { error: \"Error\", message: JSON.stringify(error) };\n}\n\nfunction _isRunnableConfig(\n config: unknown\n): config is RunnableConfig & { configurable: Record<string, unknown> } {\n if (typeof config !== \"object\" || config == null) return false;\n return (\n \"configurable\" in config &&\n typeof config.configurable === \"object\" &&\n config.configurable != null\n );\n}\n\nfunction _extractCheckpointFromConfig(\n config: RunnableConfig | null | undefined\n) {\n if (!_isRunnableConfig(config) || !config.configurable.thread_id) {\n return null;\n }\n\n return {\n thread_id: config.configurable.thread_id,\n checkpoint_ns: config.configurable.checkpoint_ns || \"\",\n checkpoint_id: config.configurable.checkpoint_id || null,\n checkpoint_map: config.configurable.checkpoint_map || null,\n };\n}\n\nfunction _serializeConfig(config: unknown) {\n if (_isRunnableConfig(config)) {\n const configurable = Object.fromEntries(\n Object.entries(config.configurable).filter(\n ([key]) => !key.startsWith(\"__\")\n )\n );\n\n const newConfig = { ...config, configurable };\n delete newConfig.callbacks;\n return newConfig;\n }\n\n return config;\n}\n\nfunction _serializeCheckpoint(payload: StreamCheckpointsOutput<unknown>) {\n const result: Record<string, unknown> = {\n ...payload,\n checkpoint: _extractCheckpointFromConfig(payload.config),\n parent_checkpoint: _extractCheckpointFromConfig(payload.parentConfig),\n\n config: _serializeConfig(payload.config),\n parent_config: _serializeConfig(payload.parentConfig),\n\n tasks: payload.tasks.map((task) => {\n if (_isRunnableConfig(task.state)) {\n const checkpoint = _extractCheckpointFromConfig(task.state);\n if (checkpoint != null) {\n const cloneTask: Record<string, unknown> = { ...task, checkpoint };\n delete cloneTask.state;\n return cloneTask;\n }\n }\n\n return task;\n }),\n };\n\n delete result.parentConfig;\n return result;\n}\n\nexport function toEventStream(stream: AsyncGenerator) {\n const encoder = new TextEncoder();\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const enqueueChunk = (sse: {\n id?: string;\n event: string;\n data: unknown;\n }) => {\n controller.enqueue(\n encoder.encode(\n `event: ${sse.event}\\ndata: ${_stringifyAsDict(sse.data)}\\n\\n`\n )\n );\n };\n\n try {\n for await (const payload of stream) {\n const [ns, mode, chunk] = payload as AnyStreamOutput;\n\n let data: unknown = chunk;\n if (mode === \"debug\") {\n const debugChunk = chunk;\n\n if (debugChunk.type === \"checkpoint\") {\n data = {\n ...debugChunk,\n payload: _serializeCheckpoint(debugChunk.payload),\n };\n }\n }\n\n if (mode === \"checkpoints\") {\n data = _serializeCheckpoint(chunk);\n }\n\n const event = ns?.length ? `${mode}|${ns.join(\"|\")}` : mode;\n enqueueChunk({ event, data });\n }\n } catch (error) {\n enqueueChunk({ event: \"error\", data: _serializeError(error) });\n }\n\n controller.close();\n },\n });\n}\n"],"mappings":"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"}
|
package/dist/pregel/types.cjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
//#region src/pregel/types.ts
|
|
3
2
|
var Call = class {
|
|
4
3
|
func;
|
|
@@ -20,8 +19,8 @@ var Call = class {
|
|
|
20
19
|
function isCall(value) {
|
|
21
20
|
return typeof value === "object" && value !== null && "__lg_type" in value && value.__lg_type === "call";
|
|
22
21
|
}
|
|
23
|
-
|
|
24
22
|
//#endregion
|
|
25
23
|
exports.Call = Call;
|
|
26
24
|
exports.isCall = isCall;
|
|
25
|
+
|
|
27
26
|
//# sourceMappingURL=types.cjs.map
|