@langchain/langgraph 0.4.4 → 0.4.6
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/CHANGELOG.md +19 -0
- package/dist/channels/base.cjs +33 -7
- package/dist/channels/base.d.ts +1 -0
- package/dist/channels/base.js +33 -8
- package/dist/channels/base.js.map +1 -1
- package/dist/interrupt.cjs +2 -4
- package/dist/interrupt.js +2 -4
- package/dist/interrupt.js.map +1 -1
- package/dist/pregel/algo.cjs +59 -49
- package/dist/pregel/algo.js +60 -50
- package/dist/pregel/algo.js.map +1 -1
- package/dist/pregel/index.cjs +8 -7
- package/dist/pregel/index.d.ts +1 -1
- package/dist/pregel/index.js +10 -9
- package/dist/pregel/index.js.map +1 -1
- package/dist/pregel/io.cjs +2 -2
- package/dist/pregel/io.js +2 -2
- package/dist/pregel/io.js.map +1 -1
- package/dist/pregel/io.mapCommand.test.cjs +5 -6
- package/dist/pregel/io.mapCommand.test.js +5 -6
- package/dist/pregel/io.mapCommand.test.js.map +1 -1
- package/dist/pregel/loop.cjs +16 -2
- package/dist/pregel/loop.js +17 -3
- package/dist/pregel/loop.js.map +1 -1
- package/dist/pregel/utils/index.cjs +6 -4
- package/dist/pregel/utils/index.js +6 -4
- package/dist/pregel/utils/index.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @langchain/langgraph
|
|
2
2
|
|
|
3
|
+
## 0.4.6
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 5f1db81: fix(langgraph): `withConfig` should accept `context`
|
|
8
|
+
- c53ca47: Avoid iterating on channels if no managed values are present
|
|
9
|
+
- a3707fb: fix(langgraph): allow `updateState` after resuming from an interrupt
|
|
10
|
+
- Updated dependencies [e8b4540]
|
|
11
|
+
- Updated dependencies [9c57526]
|
|
12
|
+
- @langchain/langgraph-sdk@0.0.109
|
|
13
|
+
|
|
14
|
+
## 0.4.5
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- d22113a: fix(pregel/utils): propagate abort reason in combineAbortSignals
|
|
19
|
+
- 2284045: fix(langgraph): send checkpoint namespace when yielding custom events in subgraphs
|
|
20
|
+
- 4774013: fix(langgraph): persist resume map values
|
|
21
|
+
|
|
3
22
|
## 0.4.4
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/channels/base.cjs
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BaseChannel = void 0;
|
|
4
4
|
exports.isBaseChannel = isBaseChannel;
|
|
5
|
+
exports.getOnlyChannels = getOnlyChannels;
|
|
5
6
|
exports.emptyChannels = emptyChannels;
|
|
6
7
|
exports.createCheckpoint = createCheckpoint;
|
|
7
8
|
const langgraph_checkpoint_1 = require("@langchain/langgraph-checkpoint");
|
|
@@ -70,15 +71,32 @@ class BaseChannel {
|
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
73
|
exports.BaseChannel = BaseChannel;
|
|
74
|
+
const IS_ONLY_BASE_CHANNEL = Symbol.for("LG_IS_ONLY_BASE_CHANNEL");
|
|
75
|
+
function getOnlyChannels(channels) {
|
|
76
|
+
// @ts-expect-error - we know it's a record of base channels
|
|
77
|
+
if (channels[IS_ONLY_BASE_CHANNEL] === true)
|
|
78
|
+
return channels;
|
|
79
|
+
const newChannels = {};
|
|
80
|
+
for (const k in channels) {
|
|
81
|
+
if (!Object.prototype.hasOwnProperty.call(channels, k))
|
|
82
|
+
continue;
|
|
83
|
+
const value = channels[k];
|
|
84
|
+
if (isBaseChannel(value))
|
|
85
|
+
newChannels[k] = value;
|
|
86
|
+
}
|
|
87
|
+
Object.assign(newChannels, { [IS_ONLY_BASE_CHANNEL]: true });
|
|
88
|
+
return newChannels;
|
|
89
|
+
}
|
|
73
90
|
function emptyChannels(channels, checkpoint) {
|
|
74
|
-
const filteredChannels =
|
|
91
|
+
const filteredChannels = getOnlyChannels(channels);
|
|
75
92
|
const newChannels = {};
|
|
76
93
|
for (const k in filteredChannels) {
|
|
77
|
-
if (Object.prototype.hasOwnProperty.call(filteredChannels, k))
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
94
|
+
if (!Object.prototype.hasOwnProperty.call(filteredChannels, k))
|
|
95
|
+
continue;
|
|
96
|
+
const channelValue = checkpoint.channel_values[k];
|
|
97
|
+
newChannels[k] = filteredChannels[k].fromCheckpoint(channelValue);
|
|
81
98
|
}
|
|
99
|
+
Object.assign(newChannels, { [IS_ONLY_BASE_CHANNEL]: true });
|
|
82
100
|
return newChannels;
|
|
83
101
|
}
|
|
84
102
|
function createCheckpoint(checkpoint, channels, step, options) {
|
|
@@ -89,7 +107,9 @@ function createCheckpoint(checkpoint, channels, step, options) {
|
|
|
89
107
|
}
|
|
90
108
|
else {
|
|
91
109
|
values = {};
|
|
92
|
-
for (const k
|
|
110
|
+
for (const k in channels) {
|
|
111
|
+
if (!Object.prototype.hasOwnProperty.call(channels, k))
|
|
112
|
+
continue;
|
|
93
113
|
try {
|
|
94
114
|
values[k] = channels[k].checkpoint();
|
|
95
115
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -104,13 +124,19 @@ function createCheckpoint(checkpoint, channels, step, options) {
|
|
|
104
124
|
}
|
|
105
125
|
}
|
|
106
126
|
}
|
|
127
|
+
const newVersionsSeen = {};
|
|
128
|
+
for (const k in checkpoint.versions_seen) {
|
|
129
|
+
if (!Object.prototype.hasOwnProperty.call(checkpoint.versions_seen, k))
|
|
130
|
+
continue;
|
|
131
|
+
newVersionsSeen[k] = { ...checkpoint.versions_seen[k] };
|
|
132
|
+
}
|
|
107
133
|
return {
|
|
108
134
|
v: 4,
|
|
109
135
|
id: options?.id ?? (0, langgraph_checkpoint_1.uuid6)(step),
|
|
110
136
|
ts: new Date().toISOString(),
|
|
111
137
|
channel_values: values,
|
|
112
138
|
channel_versions: { ...checkpoint.channel_versions },
|
|
113
|
-
versions_seen:
|
|
139
|
+
versions_seen: newVersionsSeen,
|
|
114
140
|
};
|
|
115
141
|
}
|
|
116
142
|
//# sourceMappingURL=base.js.map
|
package/dist/channels/base.d.ts
CHANGED
|
@@ -68,6 +68,7 @@ export declare abstract class BaseChannel<ValueType = unknown, UpdateType = unkn
|
|
|
68
68
|
*/
|
|
69
69
|
isAvailable(): boolean;
|
|
70
70
|
}
|
|
71
|
+
export declare function getOnlyChannels(channels: Record<string, BaseChannel>): Record<string, BaseChannel>;
|
|
71
72
|
export declare function emptyChannels<Cc extends Record<string, BaseChannel>>(channels: Cc, checkpoint: ReadonlyCheckpoint): Cc;
|
|
72
73
|
export declare function createCheckpoint<ValueType>(checkpoint: ReadonlyCheckpoint, channels: Record<string, BaseChannel<ValueType>> | undefined, step: number, options?: {
|
|
73
74
|
id?: string;
|
package/dist/channels/base.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { uuid6, } from "@langchain/langgraph-checkpoint";
|
|
2
2
|
import { EmptyChannelError } from "../errors.js";
|
|
3
3
|
export function isBaseChannel(obj) {
|
|
4
4
|
return obj != null && obj.lg_is_channel === true;
|
|
@@ -63,15 +63,32 @@ export class BaseChannel {
|
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
+
const IS_ONLY_BASE_CHANNEL = Symbol.for("LG_IS_ONLY_BASE_CHANNEL");
|
|
67
|
+
export function getOnlyChannels(channels) {
|
|
68
|
+
// @ts-expect-error - we know it's a record of base channels
|
|
69
|
+
if (channels[IS_ONLY_BASE_CHANNEL] === true)
|
|
70
|
+
return channels;
|
|
71
|
+
const newChannels = {};
|
|
72
|
+
for (const k in channels) {
|
|
73
|
+
if (!Object.prototype.hasOwnProperty.call(channels, k))
|
|
74
|
+
continue;
|
|
75
|
+
const value = channels[k];
|
|
76
|
+
if (isBaseChannel(value))
|
|
77
|
+
newChannels[k] = value;
|
|
78
|
+
}
|
|
79
|
+
Object.assign(newChannels, { [IS_ONLY_BASE_CHANNEL]: true });
|
|
80
|
+
return newChannels;
|
|
81
|
+
}
|
|
66
82
|
export function emptyChannels(channels, checkpoint) {
|
|
67
|
-
const filteredChannels =
|
|
83
|
+
const filteredChannels = getOnlyChannels(channels);
|
|
68
84
|
const newChannels = {};
|
|
69
85
|
for (const k in filteredChannels) {
|
|
70
|
-
if (Object.prototype.hasOwnProperty.call(filteredChannels, k))
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
86
|
+
if (!Object.prototype.hasOwnProperty.call(filteredChannels, k))
|
|
87
|
+
continue;
|
|
88
|
+
const channelValue = checkpoint.channel_values[k];
|
|
89
|
+
newChannels[k] = filteredChannels[k].fromCheckpoint(channelValue);
|
|
74
90
|
}
|
|
91
|
+
Object.assign(newChannels, { [IS_ONLY_BASE_CHANNEL]: true });
|
|
75
92
|
return newChannels;
|
|
76
93
|
}
|
|
77
94
|
export function createCheckpoint(checkpoint, channels, step, options) {
|
|
@@ -82,7 +99,9 @@ export function createCheckpoint(checkpoint, channels, step, options) {
|
|
|
82
99
|
}
|
|
83
100
|
else {
|
|
84
101
|
values = {};
|
|
85
|
-
for (const k
|
|
102
|
+
for (const k in channels) {
|
|
103
|
+
if (!Object.prototype.hasOwnProperty.call(channels, k))
|
|
104
|
+
continue;
|
|
86
105
|
try {
|
|
87
106
|
values[k] = channels[k].checkpoint();
|
|
88
107
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -97,13 +116,19 @@ export function createCheckpoint(checkpoint, channels, step, options) {
|
|
|
97
116
|
}
|
|
98
117
|
}
|
|
99
118
|
}
|
|
119
|
+
const newVersionsSeen = {};
|
|
120
|
+
for (const k in checkpoint.versions_seen) {
|
|
121
|
+
if (!Object.prototype.hasOwnProperty.call(checkpoint.versions_seen, k))
|
|
122
|
+
continue;
|
|
123
|
+
newVersionsSeen[k] = { ...checkpoint.versions_seen[k] };
|
|
124
|
+
}
|
|
100
125
|
return {
|
|
101
126
|
v: 4,
|
|
102
127
|
id: options?.id ?? uuid6(step),
|
|
103
128
|
ts: new Date().toISOString(),
|
|
104
129
|
channel_values: values,
|
|
105
130
|
channel_versions: { ...checkpoint.channel_versions },
|
|
106
|
-
versions_seen:
|
|
131
|
+
versions_seen: newVersionsSeen,
|
|
107
132
|
};
|
|
108
133
|
}
|
|
109
134
|
//# sourceMappingURL=base.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/channels/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/channels/base.ts"],"names":[],"mappings":"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"}
|
package/dist/interrupt.cjs
CHANGED
|
@@ -67,6 +67,7 @@ function interrupt(value) {
|
|
|
67
67
|
const idx = scratchpad.interruptCounter;
|
|
68
68
|
// Find previous resume values
|
|
69
69
|
if (scratchpad.resume.length > 0 && idx < scratchpad.resume.length) {
|
|
70
|
+
conf[constants_js_1.CONFIG_KEY_SEND]?.([[constants_js_1.RESUME, scratchpad.resume]]);
|
|
70
71
|
return scratchpad.resume[idx];
|
|
71
72
|
}
|
|
72
73
|
// Find current resume value
|
|
@@ -76,10 +77,7 @@ function interrupt(value) {
|
|
|
76
77
|
}
|
|
77
78
|
const v = scratchpad.consumeNullResume();
|
|
78
79
|
scratchpad.resume.push(v);
|
|
79
|
-
|
|
80
|
-
if (send) {
|
|
81
|
-
send([[constants_js_1.RESUME, scratchpad.resume]]);
|
|
82
|
-
}
|
|
80
|
+
conf[constants_js_1.CONFIG_KEY_SEND]?.([[constants_js_1.RESUME, scratchpad.resume]]);
|
|
83
81
|
return v;
|
|
84
82
|
}
|
|
85
83
|
// No resume value found
|
package/dist/interrupt.js
CHANGED
|
@@ -64,6 +64,7 @@ export function interrupt(value) {
|
|
|
64
64
|
const idx = scratchpad.interruptCounter;
|
|
65
65
|
// Find previous resume values
|
|
66
66
|
if (scratchpad.resume.length > 0 && idx < scratchpad.resume.length) {
|
|
67
|
+
conf[CONFIG_KEY_SEND]?.([[RESUME, scratchpad.resume]]);
|
|
67
68
|
return scratchpad.resume[idx];
|
|
68
69
|
}
|
|
69
70
|
// Find current resume value
|
|
@@ -73,10 +74,7 @@ export function interrupt(value) {
|
|
|
73
74
|
}
|
|
74
75
|
const v = scratchpad.consumeNullResume();
|
|
75
76
|
scratchpad.resume.push(v);
|
|
76
|
-
|
|
77
|
-
if (send) {
|
|
78
|
-
send([[RESUME, scratchpad.resume]]);
|
|
79
|
-
}
|
|
77
|
+
conf[CONFIG_KEY_SEND]?.([[RESUME, scratchpad.resume]]);
|
|
80
78
|
return v;
|
|
81
79
|
}
|
|
82
80
|
// No resume value found
|
package/dist/interrupt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interrupt.js","sourceRoot":"","sources":["../src/interrupt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kCAAkC,EAAE,MAAM,4BAA4B,CAAC;AAMhF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,8BAA8B,EAC9B,MAAM,GACP,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAuB,KAAQ;IACtD,MAAM,MAAM,GACV,kCAAkC,CAAC,iBAAiB,EAAE,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC;IACjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,YAAY,GAAwB,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACxE,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;IAEpE,wBAAwB;IACxB,MAAM,UAAU,GAAqB,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACjE,UAAU,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,UAAU,CAAC,gBAAgB,CAAC;IAExC,8BAA8B;IAC9B,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnE,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,CAAM,CAAC;IACrC,CAAC;IAED,4BAA4B;IAC5B,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACxC,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,2BAA2B,UAAU,CAAC,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,CACjE,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,GAAG,UAAU,CAAC,iBAAiB,EAAE,CAAC;QACzC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,
|
|
1
|
+
{"version":3,"file":"interrupt.js","sourceRoot":"","sources":["../src/interrupt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kCAAkC,EAAE,MAAM,4BAA4B,CAAC;AAMhF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,8BAA8B,EAC9B,MAAM,GACP,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAuB,KAAQ;IACtD,MAAM,MAAM,GACV,kCAAkC,CAAC,iBAAiB,EAAE,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC;IACjC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,YAAY,GAAwB,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACxE,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;IAEpE,wBAAwB;IACxB,MAAM,UAAU,GAAqB,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACjE,UAAU,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,UAAU,CAAC,gBAAgB,CAAC;IAExC,8BAA8B;IAC9B,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnE,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAiB,CAAC,CAAC,CAAC;QACvE,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,CAAM,CAAC;IACrC,CAAC;IAED,4BAA4B;IAC5B,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACxC,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,2BAA2B,UAAU,CAAC,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,CACjE,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,GAAG,UAAU,CAAC,iBAAiB,EAAE,CAAC;QACzC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAiB,CAAC,CAAC,CAAC;QACvE,OAAO,CAAM,CAAC;IAChB,CAAC;IAED,wBAAwB;IACxB,MAAM,EAAE,GAAyB,IAAI,CAAC,wBAAwB,CAAC,EAAE,KAAK,CACpE,8BAA8B,CAC/B,CAAC;IAEF,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,MAAM,IAAI,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC"}
|
package/dist/pregel/algo.cjs
CHANGED
|
@@ -22,20 +22,33 @@ const increment = (current) => {
|
|
|
22
22
|
return current !== undefined ? current + 1 : 1;
|
|
23
23
|
};
|
|
24
24
|
exports.increment = increment;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
// Avoids unnecessary double iteration
|
|
26
|
+
function maxChannelMapVersion(channelVersions) {
|
|
27
|
+
let maxVersion;
|
|
28
|
+
for (const chan in channelVersions) {
|
|
29
|
+
if (!Object.prototype.hasOwnProperty.call(channelVersions, chan))
|
|
30
|
+
continue;
|
|
31
|
+
if (maxVersion == null) {
|
|
32
|
+
maxVersion = channelVersions[chan];
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
maxVersion = (0, langgraph_checkpoint_1.maxChannelVersion)(maxVersion, channelVersions[chan]);
|
|
36
|
+
}
|
|
34
37
|
}
|
|
38
|
+
return maxVersion;
|
|
39
|
+
}
|
|
40
|
+
function shouldInterrupt(checkpoint, interruptNodes, tasks) {
|
|
41
|
+
const nullVersion = (0, index_js_1.getNullChannelVersion)(checkpoint.channel_versions);
|
|
35
42
|
const seen = checkpoint.versions_seen[constants_js_1.INTERRUPT] ?? {};
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
43
|
+
let anyChannelUpdated = false;
|
|
44
|
+
for (const chan in checkpoint.channel_versions) {
|
|
45
|
+
if (!Object.prototype.hasOwnProperty.call(checkpoint.channel_versions, chan))
|
|
46
|
+
continue;
|
|
47
|
+
if (checkpoint.channel_versions[chan] > (seen[chan] ?? nullVersion)) {
|
|
48
|
+
anyChannelUpdated = true;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
39
52
|
const anyTriggeredNodeInInterruptNodes = tasks.some((task) => interruptNodes === "*"
|
|
40
53
|
? !task.config?.tags?.includes(constants_js_1.TAG_HIDDEN)
|
|
41
54
|
: interruptNodes.includes(task.name));
|
|
@@ -115,7 +128,7 @@ getNextVersion, triggerToNodes) {
|
|
|
115
128
|
// so we don't do anything other than update the channels written to
|
|
116
129
|
const bumpStep = tasks.some((task) => task.triggers.length > 0);
|
|
117
130
|
// Filter out non instances of BaseChannel
|
|
118
|
-
const onlyChannels =
|
|
131
|
+
const onlyChannels = (0, base_js_1.getOnlyChannels)(channels);
|
|
119
132
|
// Update seen versions
|
|
120
133
|
for (const task of tasks) {
|
|
121
134
|
checkpoint.versions_seen[task.name] ??= {};
|
|
@@ -127,10 +140,7 @@ getNextVersion, triggerToNodes) {
|
|
|
127
140
|
}
|
|
128
141
|
}
|
|
129
142
|
// Find the highest version of all channels
|
|
130
|
-
let maxVersion;
|
|
131
|
-
if (Object.keys(checkpoint.channel_versions).length > 0) {
|
|
132
|
-
maxVersion = (0, langgraph_checkpoint_1.maxChannelVersion)(...Object.values(checkpoint.channel_versions));
|
|
133
|
-
}
|
|
143
|
+
let maxVersion = maxChannelMapVersion(checkpoint.channel_versions);
|
|
134
144
|
// Consume all channels that were read
|
|
135
145
|
const channelsToConsume = new Set(tasks
|
|
136
146
|
.flatMap((task) => task.triggers)
|
|
@@ -156,18 +166,15 @@ getNextVersion, triggerToNodes) {
|
|
|
156
166
|
}
|
|
157
167
|
}
|
|
158
168
|
// Find the highest version of all channels
|
|
159
|
-
|
|
160
|
-
maxVersion = undefined;
|
|
161
|
-
if (Object.keys(checkpoint.channel_versions).length > 0) {
|
|
162
|
-
maxVersion = (0, langgraph_checkpoint_1.maxChannelVersion)(...Object.values(checkpoint.channel_versions));
|
|
163
|
-
}
|
|
169
|
+
maxVersion = maxChannelMapVersion(checkpoint.channel_versions);
|
|
164
170
|
const updatedChannels = new Set();
|
|
165
171
|
// Apply writes to channels
|
|
166
172
|
for (const [chan, vals] of Object.entries(pendingWritesByChannel)) {
|
|
167
173
|
if (chan in onlyChannels) {
|
|
174
|
+
const channel = onlyChannels[chan];
|
|
168
175
|
let updated;
|
|
169
176
|
try {
|
|
170
|
-
updated =
|
|
177
|
+
updated = channel.update(vals);
|
|
171
178
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
172
179
|
}
|
|
173
180
|
catch (e) {
|
|
@@ -183,23 +190,24 @@ getNextVersion, triggerToNodes) {
|
|
|
183
190
|
if (updated && getNextVersion !== undefined) {
|
|
184
191
|
checkpoint.channel_versions[chan] = getNextVersion(maxVersion);
|
|
185
192
|
// unavailable channels can't trigger tasks, so don't add them
|
|
186
|
-
if (
|
|
193
|
+
if (channel.isAvailable())
|
|
187
194
|
updatedChannels.add(chan);
|
|
188
|
-
}
|
|
189
195
|
}
|
|
190
196
|
}
|
|
191
197
|
}
|
|
192
198
|
// Channels that weren't updated in this step are notified of a new step
|
|
193
199
|
if (bumpStep) {
|
|
194
|
-
for (const chan
|
|
195
|
-
if (
|
|
196
|
-
|
|
200
|
+
for (const chan in onlyChannels) {
|
|
201
|
+
if (!Object.prototype.hasOwnProperty.call(onlyChannels, chan))
|
|
202
|
+
continue;
|
|
203
|
+
const channel = onlyChannels[chan];
|
|
204
|
+
if (channel.isAvailable() && !updatedChannels.has(chan)) {
|
|
205
|
+
const updated = channel.update([]);
|
|
197
206
|
if (updated && getNextVersion !== undefined) {
|
|
198
207
|
checkpoint.channel_versions[chan] = getNextVersion(maxVersion);
|
|
199
208
|
// unavailable channels can't trigger tasks, so don't add them
|
|
200
|
-
if (
|
|
209
|
+
if (channel.isAvailable())
|
|
201
210
|
updatedChannels.add(chan);
|
|
202
|
-
}
|
|
203
211
|
}
|
|
204
212
|
}
|
|
205
213
|
}
|
|
@@ -207,13 +215,15 @@ getNextVersion, triggerToNodes) {
|
|
|
207
215
|
// If this is (tentatively) the last superstep, notify all channels of finish
|
|
208
216
|
if (bumpStep &&
|
|
209
217
|
!Object.keys(triggerToNodes ?? {}).some((channel) => updatedChannels.has(channel))) {
|
|
210
|
-
for (const chan
|
|
211
|
-
if (
|
|
218
|
+
for (const chan in onlyChannels) {
|
|
219
|
+
if (!Object.prototype.hasOwnProperty.call(onlyChannels, chan))
|
|
220
|
+
continue;
|
|
221
|
+
const channel = onlyChannels[chan];
|
|
222
|
+
if (channel.finish() && getNextVersion !== undefined) {
|
|
212
223
|
checkpoint.channel_versions[chan] = getNextVersion(maxVersion);
|
|
213
224
|
// unavailable channels can't trigger tasks, so don't add them
|
|
214
|
-
if (
|
|
225
|
+
if (channel.isAvailable())
|
|
215
226
|
updatedChannels.add(chan);
|
|
216
|
-
}
|
|
217
227
|
}
|
|
218
228
|
}
|
|
219
229
|
}
|
|
@@ -238,7 +248,9 @@ function _prepareNextTasks(checkpoint, pendingWrites, processes, channels, confi
|
|
|
238
248
|
}
|
|
239
249
|
// Check if any processes should be run in next step
|
|
240
250
|
// If so, prepare the values to be passed to them
|
|
241
|
-
for (const name
|
|
251
|
+
for (const name in processes) {
|
|
252
|
+
if (!Object.prototype.hasOwnProperty.call(processes, name))
|
|
253
|
+
continue;
|
|
242
254
|
const task = _prepareSingleTask([constants_js_1.PULL, name], checkpoint, pendingWrites, processes, channels, config, forExecution, extra);
|
|
243
255
|
if (task !== undefined) {
|
|
244
256
|
tasks[task.id] = task;
|
|
@@ -488,17 +500,15 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
|
|
|
488
500
|
return undefined;
|
|
489
501
|
}
|
|
490
502
|
const seen = checkpoint.versions_seen[name] ?? {};
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
return (
|
|
496
|
-
(
|
|
497
|
-
|
|
498
|
-
})
|
|
499
|
-
.sort();
|
|
503
|
+
// Find the first trigger that is available and has a new version
|
|
504
|
+
const trigger = proc.triggers.find((chan) => {
|
|
505
|
+
if (!channels[chan].isAvailable())
|
|
506
|
+
return false;
|
|
507
|
+
return ((checkpoint.channel_versions[chan] ?? nullVersion) >
|
|
508
|
+
(seen[chan] ?? nullVersion));
|
|
509
|
+
});
|
|
500
510
|
// If any of the channels read by this process were updated
|
|
501
|
-
if (
|
|
511
|
+
if (trigger !== undefined) {
|
|
502
512
|
const val = _procInput(proc, channels, forExecution);
|
|
503
513
|
if (val === undefined) {
|
|
504
514
|
return undefined;
|
|
@@ -511,13 +521,13 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
|
|
|
511
521
|
step.toString(),
|
|
512
522
|
name,
|
|
513
523
|
constants_js_1.PULL,
|
|
514
|
-
|
|
524
|
+
[trigger],
|
|
515
525
|
]), checkpoint.id);
|
|
516
526
|
const taskCheckpointNamespace = `${checkpointNamespace}${constants_js_1.CHECKPOINT_NAMESPACE_END}${taskId}`;
|
|
517
527
|
let metadata = {
|
|
518
528
|
langgraph_step: step,
|
|
519
529
|
langgraph_node: name,
|
|
520
|
-
langgraph_triggers:
|
|
530
|
+
langgraph_triggers: [trigger],
|
|
521
531
|
langgraph_path: taskPath,
|
|
522
532
|
langgraph_checkpoint_ns: taskCheckpointNamespace,
|
|
523
533
|
};
|
|
@@ -550,7 +560,7 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
|
|
|
550
560
|
[constants_js_1.CONFIG_KEY_READ]: (select_, fresh_ = false) => _localRead(checkpoint, channels, {
|
|
551
561
|
name,
|
|
552
562
|
writes: writes,
|
|
553
|
-
triggers,
|
|
563
|
+
triggers: [trigger],
|
|
554
564
|
path: taskPath,
|
|
555
565
|
}, select_, fresh_),
|
|
556
566
|
[constants_js_1.CONFIG_KEY_CHECKPOINTER]: checkpointer ?? configurable[constants_js_1.CONFIG_KEY_CHECKPOINTER],
|
|
@@ -570,7 +580,7 @@ function _prepareSingleTask(taskPath, checkpoint, pendingWrites, processes, chan
|
|
|
570
580
|
checkpoint_ns: taskCheckpointNamespace,
|
|
571
581
|
},
|
|
572
582
|
}),
|
|
573
|
-
triggers,
|
|
583
|
+
triggers: [trigger],
|
|
574
584
|
retry_policy: proc.retryPolicy,
|
|
575
585
|
cache_key: proc.cachePolicy
|
|
576
586
|
? {
|