@langchain/langgraph 0.2.73 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/channels/any_value.cjs +3 -0
- package/dist/channels/any_value.d.ts +1 -0
- package/dist/channels/any_value.js +3 -0
- package/dist/channels/any_value.js.map +1 -1
- package/dist/channels/base.cjs +35 -6
- package/dist/channels/base.d.ts +17 -2
- package/dist/channels/base.js +31 -2
- package/dist/channels/base.js.map +1 -1
- package/dist/channels/binop.cjs +3 -0
- package/dist/channels/binop.d.ts +1 -0
- package/dist/channels/binop.js +3 -0
- package/dist/channels/binop.js.map +1 -1
- package/dist/channels/dynamic_barrier_value.cjs +119 -9
- package/dist/channels/dynamic_barrier_value.d.ts +29 -0
- package/dist/channels/dynamic_barrier_value.js +117 -8
- package/dist/channels/dynamic_barrier_value.js.map +1 -1
- package/dist/channels/ephemeral_value.cjs +3 -0
- package/dist/channels/ephemeral_value.d.ts +1 -0
- package/dist/channels/ephemeral_value.js +3 -0
- package/dist/channels/ephemeral_value.js.map +1 -1
- package/dist/channels/last_value.cjs +82 -4
- package/dist/channels/last_value.d.ts +21 -0
- package/dist/channels/last_value.js +80 -3
- package/dist/channels/last_value.js.map +1 -1
- package/dist/channels/named_barrier_value.cjs +94 -1
- package/dist/channels/named_barrier_value.d.ts +23 -0
- package/dist/channels/named_barrier_value.js +92 -0
- package/dist/channels/named_barrier_value.js.map +1 -1
- package/dist/channels/topic.cjs +3 -0
- package/dist/channels/topic.d.ts +1 -0
- package/dist/channels/topic.js +3 -0
- package/dist/channels/topic.js.map +1 -1
- package/dist/constants.cjs +33 -12
- package/dist/constants.d.ts +48 -27
- package/dist/constants.js +27 -7
- package/dist/constants.js.map +1 -1
- package/dist/errors.cjs +4 -4
- package/dist/errors.js.map +1 -1
- package/dist/func/index.cjs +15 -7
- package/dist/func/index.d.ts +12 -3
- package/dist/func/index.js +12 -4
- package/dist/func/index.js.map +1 -1
- package/dist/func/types.cjs +1 -2
- package/dist/func/types.d.ts +1 -1
- package/dist/graph/annotation.cjs +2 -2
- package/dist/graph/annotation.js.map +1 -1
- package/dist/graph/graph.cjs +46 -40
- package/dist/graph/graph.d.ts +14 -4
- package/dist/graph/graph.js +46 -40
- package/dist/graph/graph.js.map +1 -1
- package/dist/graph/index.cjs +3 -1
- package/dist/graph/index.d.ts +2 -2
- package/dist/graph/index.js +2 -2
- package/dist/graph/index.js.map +1 -1
- package/dist/graph/message.cjs +43 -5
- package/dist/graph/message.d.ts +5 -0
- package/dist/graph/message.js +40 -3
- package/dist/graph/message.js.map +1 -1
- package/dist/graph/message.test.cjs +196 -0
- package/dist/graph/message.test.d.ts +1 -0
- package/dist/graph/message.test.js +194 -0
- package/dist/graph/message.test.js.map +1 -0
- package/dist/graph/messages_annotation.cjs +54 -1
- package/dist/graph/messages_annotation.d.ts +47 -0
- package/dist/graph/messages_annotation.js +53 -0
- package/dist/graph/messages_annotation.js.map +1 -1
- package/dist/graph/state.cjs +162 -104
- package/dist/graph/state.d.ts +36 -11
- package/dist/graph/state.js +163 -106
- package/dist/graph/state.js.map +1 -1
- package/dist/graph/zod/plugin.js.map +1 -1
- package/dist/graph/zod/schema.cjs +17 -67
- package/dist/graph/zod/schema.js +12 -61
- package/dist/graph/zod/schema.js.map +1 -1
- package/dist/graph/zod/state.cjs +69 -7
- package/dist/graph/zod/state.d.ts +10 -1
- package/dist/graph/zod/state.js +61 -0
- package/dist/graph/zod/state.js.map +1 -1
- package/dist/interrupt.cjs +1 -2
- package/dist/interrupt.js.map +1 -1
- package/dist/managed/base.cjs +3 -3
- package/dist/managed/base.js.map +1 -1
- package/dist/managed/shared_value.js.map +1 -1
- package/dist/prebuilt/agentName.cjs +3 -4
- package/dist/prebuilt/agentName.js.map +1 -1
- package/dist/prebuilt/agent_executor.cjs +1 -2
- package/dist/prebuilt/agent_executor.d.ts +1 -1
- package/dist/prebuilt/agent_executor.js.map +1 -1
- package/dist/prebuilt/chat_agent_executor.cjs +1 -2
- package/dist/prebuilt/chat_agent_executor.js.map +1 -1
- package/dist/prebuilt/react_agent_executor.cjs +103 -49
- package/dist/prebuilt/react_agent_executor.d.ts +22 -6
- package/dist/prebuilt/react_agent_executor.js +99 -45
- package/dist/prebuilt/react_agent_executor.js.map +1 -1
- package/dist/prebuilt/tool_executor.js.map +1 -1
- package/dist/prebuilt/tool_node.cjs +2 -2
- package/dist/prebuilt/tool_node.js.map +1 -1
- package/dist/pregel/algo.cjs +68 -27
- package/dist/pregel/algo.d.ts +1 -1
- package/dist/pregel/algo.js +62 -21
- package/dist/pregel/algo.js.map +1 -1
- package/dist/pregel/call.cjs +5 -5
- package/dist/pregel/call.d.ts +3 -2
- package/dist/pregel/call.js +2 -1
- package/dist/pregel/call.js.map +1 -1
- package/dist/pregel/debug.cjs +10 -10
- package/dist/pregel/debug.d.ts +3 -3
- package/dist/pregel/debug.js.map +1 -1
- package/dist/pregel/debug.test.cjs +37 -31
- package/dist/pregel/debug.test.js +18 -12
- package/dist/pregel/debug.test.js.map +1 -1
- package/dist/pregel/index.cjs +99 -29
- package/dist/pregel/index.d.ts +19 -6
- package/dist/pregel/index.js +100 -30
- package/dist/pregel/index.js.map +1 -1
- package/dist/pregel/io.cjs +8 -9
- package/dist/pregel/io.js +2 -2
- package/dist/pregel/io.js.map +1 -1
- package/dist/pregel/io.mapCommand.test.cjs +29 -29
- package/dist/pregel/io.mapCommand.test.js +5 -5
- package/dist/pregel/io.mapCommand.test.js.map +1 -1
- package/dist/pregel/loop.cjs +126 -26
- package/dist/pregel/loop.d.ts +29 -2
- package/dist/pregel/loop.js +127 -27
- package/dist/pregel/loop.js.map +1 -1
- package/dist/pregel/messages.cjs +15 -13
- package/dist/pregel/messages.d.ts +1 -1
- package/dist/pregel/messages.js +15 -13
- package/dist/pregel/messages.js.map +1 -1
- package/dist/pregel/messages.test.cjs +105 -105
- package/dist/pregel/messages.test.js +31 -31
- package/dist/pregel/messages.test.js.map +1 -1
- package/dist/pregel/read.cjs +12 -1
- package/dist/pregel/read.d.ts +3 -1
- package/dist/pregel/read.js +12 -1
- package/dist/pregel/read.js.map +1 -1
- package/dist/pregel/read.test.cjs +35 -35
- package/dist/pregel/read.test.js +4 -4
- package/dist/pregel/read.test.js.map +1 -1
- package/dist/pregel/remote.js.map +1 -1
- package/dist/pregel/retry.cjs +12 -16
- package/dist/pregel/retry.js +10 -14
- package/dist/pregel/retry.js.map +1 -1
- package/dist/pregel/runner.cjs +92 -118
- package/dist/pregel/runner.js +93 -119
- package/dist/pregel/runner.js.map +1 -1
- package/dist/pregel/runner.test.cjs +14 -14
- package/dist/pregel/runner.test.js +4 -4
- package/dist/pregel/runner.test.js.map +1 -1
- package/dist/pregel/stream.js.map +1 -1
- package/dist/pregel/types.cjs +10 -3
- package/dist/pregel/types.d.ts +64 -8
- package/dist/pregel/types.js +8 -1
- package/dist/pregel/types.js.map +1 -1
- package/dist/pregel/utils/config.cjs +40 -22
- package/dist/pregel/utils/config.d.ts +8 -5
- package/dist/pregel/utils/config.js +33 -14
- package/dist/pregel/utils/config.js.map +1 -1
- package/dist/pregel/utils/config.test.cjs +58 -58
- package/dist/pregel/utils/config.test.js +12 -12
- package/dist/pregel/utils/config.test.js.map +1 -1
- package/dist/pregel/utils/index.cjs +12 -11
- package/dist/pregel/utils/index.d.ts +15 -0
- package/dist/pregel/utils/index.js +6 -4
- package/dist/pregel/utils/index.js.map +1 -1
- package/dist/pregel/utils/subgraph.cjs +2 -3
- package/dist/pregel/utils/subgraph.js.map +1 -1
- package/dist/pregel/utils/subgraph.test.cjs +18 -18
- package/dist/pregel/utils/subgraph.test.js +1 -1
- package/dist/pregel/utils/subgraph.test.js.map +1 -1
- package/dist/pregel/validate.cjs +3 -3
- package/dist/pregel/validate.js.map +1 -1
- package/dist/pregel/validate.test.cjs +43 -43
- package/dist/pregel/validate.test.js +3 -3
- package/dist/pregel/validate.test.js.map +1 -1
- package/dist/pregel/write.js.map +1 -1
- package/dist/pregel/write.test.cjs +30 -30
- package/dist/pregel/write.test.js +8 -8
- package/dist/pregel/write.test.js.map +1 -1
- package/dist/setup/async_local_storage.cjs +1 -2
- package/dist/utils.cjs +7 -7
- package/dist/utils.js.map +1 -1
- package/dist/web.cjs +6 -1
- package/dist/web.d.ts +3 -3
- package/dist/web.js +3 -3
- package/dist/web.js.map +1 -1
- package/package.json +15 -15
package/dist/graph/message.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { coerceMessageLikeToMessage, } from "@langchain/core/messages";
|
|
2
2
|
import { v4 } from "uuid";
|
|
3
3
|
import { StateGraph } from "./state.js";
|
|
4
|
+
export const REMOVE_ALL_MESSAGES = "__remove_all__";
|
|
4
5
|
/**
|
|
5
6
|
* Prebuilt reducer that combines returned messages.
|
|
6
7
|
* Can handle standard messages and special modifiers like {@link RemoveMessage}
|
|
@@ -19,12 +20,19 @@ export function messagesStateReducer(left, right) {
|
|
|
19
20
|
m.lc_kwargs.id = m.id;
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
|
-
|
|
23
|
+
let removeAllIdx;
|
|
24
|
+
for (let i = 0; i < rightMessages.length; i += 1) {
|
|
25
|
+
const m = rightMessages[i];
|
|
23
26
|
if (m.id === null || m.id === undefined) {
|
|
24
27
|
m.id = v4();
|
|
25
28
|
m.lc_kwargs.id = m.id;
|
|
26
29
|
}
|
|
30
|
+
if (m.getType() === "remove" && m.id === REMOVE_ALL_MESSAGES) {
|
|
31
|
+
removeAllIdx = i;
|
|
32
|
+
}
|
|
27
33
|
}
|
|
34
|
+
if (removeAllIdx != null)
|
|
35
|
+
return rightMessages.slice(removeAllIdx + 1);
|
|
28
36
|
// merge
|
|
29
37
|
const merged = [...leftMessages];
|
|
30
38
|
const mergedById = new Map(merged.map((m, i) => [m.id, i]));
|
|
@@ -32,7 +40,7 @@ export function messagesStateReducer(left, right) {
|
|
|
32
40
|
for (const m of rightMessages) {
|
|
33
41
|
const existingIdx = mergedById.get(m.id);
|
|
34
42
|
if (existingIdx !== undefined) {
|
|
35
|
-
if (m.
|
|
43
|
+
if (m.getType() === "remove") {
|
|
36
44
|
idsToRemove.add(m.id);
|
|
37
45
|
}
|
|
38
46
|
else {
|
|
@@ -41,7 +49,7 @@ export function messagesStateReducer(left, right) {
|
|
|
41
49
|
}
|
|
42
50
|
}
|
|
43
51
|
else {
|
|
44
|
-
if (m.
|
|
52
|
+
if (m.getType() === "remove") {
|
|
45
53
|
throw new Error(`Attempting to delete a message with an ID that doesn't exist ('${m.id}')`);
|
|
46
54
|
}
|
|
47
55
|
mergedById.set(m.id, merged.length);
|
|
@@ -63,4 +71,33 @@ export class MessageGraph extends StateGraph {
|
|
|
63
71
|
});
|
|
64
72
|
}
|
|
65
73
|
}
|
|
74
|
+
export function pushMessage(message, config, options) {
|
|
75
|
+
let stateKey = options?.stateKey ?? "messages";
|
|
76
|
+
if (options?.stateKey === null) {
|
|
77
|
+
stateKey = undefined;
|
|
78
|
+
}
|
|
79
|
+
// coerce to message
|
|
80
|
+
const validMessage = coerceMessageLikeToMessage(message);
|
|
81
|
+
if (!validMessage.id)
|
|
82
|
+
throw new Error("Message ID is required.");
|
|
83
|
+
const callbacks = (() => {
|
|
84
|
+
if (Array.isArray(config.callbacks)) {
|
|
85
|
+
return config.callbacks;
|
|
86
|
+
}
|
|
87
|
+
if (typeof config.callbacks !== "undefined") {
|
|
88
|
+
return config.callbacks.handlers;
|
|
89
|
+
}
|
|
90
|
+
return [];
|
|
91
|
+
})();
|
|
92
|
+
const messagesHandler = callbacks.find((cb) => "name" in cb && cb.name === "StreamMessagesHandler");
|
|
93
|
+
if (messagesHandler) {
|
|
94
|
+
const metadata = config.metadata ?? {};
|
|
95
|
+
const namespace = (metadata.langgraph_checkpoint_ns ?? "").split("|");
|
|
96
|
+
messagesHandler._emit([namespace, metadata], validMessage, undefined, false);
|
|
97
|
+
}
|
|
98
|
+
if (stateKey) {
|
|
99
|
+
config.configurable?.__pregel_send?.([[stateKey, validMessage]]);
|
|
100
|
+
}
|
|
101
|
+
return validMessage;
|
|
102
|
+
}
|
|
66
103
|
//# sourceMappingURL=message.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/graph/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/graph/message.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const messages_1 = require("@langchain/core/messages");
|
|
5
|
+
const message_js_1 = require("./message.cjs");
|
|
6
|
+
const constants_js_1 = require("../constants.cjs");
|
|
7
|
+
const state_js_1 = require("../graph/state.cjs");
|
|
8
|
+
const messages_annotation_js_1 = require("../graph/messages_annotation.cjs");
|
|
9
|
+
(0, vitest_1.describe)("messagesStateReducer", () => {
|
|
10
|
+
(0, vitest_1.it)("should add a single message", () => {
|
|
11
|
+
const left = [new messages_1.HumanMessage({ id: "1", content: "Hello" })];
|
|
12
|
+
const right = new messages_1.AIMessage({ id: "2", content: "Hi there!" });
|
|
13
|
+
const result = (0, message_js_1.messagesStateReducer)(left, right);
|
|
14
|
+
const expected = [
|
|
15
|
+
new messages_1.HumanMessage({ id: "1", content: "Hello" }),
|
|
16
|
+
new messages_1.AIMessage({ id: "2", content: "Hi there!" }),
|
|
17
|
+
];
|
|
18
|
+
(0, vitest_1.expect)(result).toEqual(expected);
|
|
19
|
+
});
|
|
20
|
+
(0, vitest_1.it)("should add multiple messages", () => {
|
|
21
|
+
const left = [new messages_1.HumanMessage({ id: "1", content: "Hello" })];
|
|
22
|
+
const right = [
|
|
23
|
+
new messages_1.AIMessage({ id: "2", content: "Hi there!" }),
|
|
24
|
+
new messages_1.SystemMessage({ id: "3", content: "System message" }),
|
|
25
|
+
];
|
|
26
|
+
const result = (0, message_js_1.messagesStateReducer)(left, right);
|
|
27
|
+
const expected = [
|
|
28
|
+
new messages_1.HumanMessage({ id: "1", content: "Hello" }),
|
|
29
|
+
new messages_1.AIMessage({ id: "2", content: "Hi there!" }),
|
|
30
|
+
new messages_1.SystemMessage({ id: "3", content: "System message" }),
|
|
31
|
+
];
|
|
32
|
+
(0, vitest_1.expect)(result).toEqual(expected);
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)("should update existing message", () => {
|
|
35
|
+
const left = [new messages_1.HumanMessage({ id: "1", content: "Hello" })];
|
|
36
|
+
const right = new messages_1.HumanMessage({ id: "1", content: "Hello again" });
|
|
37
|
+
const result = (0, message_js_1.messagesStateReducer)(left, right);
|
|
38
|
+
const expected = [new messages_1.HumanMessage({ id: "1", content: "Hello again" })];
|
|
39
|
+
(0, vitest_1.expect)(result).toEqual(expected);
|
|
40
|
+
});
|
|
41
|
+
(0, vitest_1.it)("should assign missing IDs", () => {
|
|
42
|
+
const left = [new messages_1.HumanMessage({ content: "Hello" })];
|
|
43
|
+
const right = [new messages_1.AIMessage({ content: "Hi there!" })];
|
|
44
|
+
const result = (0, message_js_1.messagesStateReducer)(left, right);
|
|
45
|
+
(0, vitest_1.expect)(result).toHaveLength(2);
|
|
46
|
+
(0, vitest_1.expect)(result.every((m) => typeof m.id === "string" && m.id.length > 0)).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)("should handle duplicates in input", () => {
|
|
49
|
+
const left = [];
|
|
50
|
+
const right = [
|
|
51
|
+
new messages_1.AIMessage({ id: "1", content: "Hi there!" }),
|
|
52
|
+
new messages_1.AIMessage({ id: "1", content: "Hi there again!" }),
|
|
53
|
+
];
|
|
54
|
+
const result = (0, message_js_1.messagesStateReducer)(left, right);
|
|
55
|
+
(0, vitest_1.expect)(result).toHaveLength(1);
|
|
56
|
+
(0, vitest_1.expect)(result[0].id).toBe("1");
|
|
57
|
+
(0, vitest_1.expect)(result[0].content).toBe("Hi there again!");
|
|
58
|
+
});
|
|
59
|
+
(0, vitest_1.it)("should handle duplicates with remove", () => {
|
|
60
|
+
const left = [new messages_1.AIMessage({ id: "1", content: "Hello!" })];
|
|
61
|
+
const right = [
|
|
62
|
+
new messages_1.RemoveMessage({ id: "1" }),
|
|
63
|
+
new messages_1.AIMessage({ id: "1", content: "Hi there!" }),
|
|
64
|
+
new messages_1.AIMessage({ id: "1", content: "Hi there again!" }),
|
|
65
|
+
];
|
|
66
|
+
const result = (0, message_js_1.messagesStateReducer)(left, right);
|
|
67
|
+
(0, vitest_1.expect)(result).toHaveLength(1);
|
|
68
|
+
(0, vitest_1.expect)(result[0].id).toBe("1");
|
|
69
|
+
(0, vitest_1.expect)(result[0].content).toBe("Hi there again!");
|
|
70
|
+
});
|
|
71
|
+
(0, vitest_1.it)("should remove message", () => {
|
|
72
|
+
const left = [
|
|
73
|
+
new messages_1.HumanMessage({ id: "1", content: "Hello" }),
|
|
74
|
+
new messages_1.AIMessage({ id: "2", content: "Hi there!" }),
|
|
75
|
+
];
|
|
76
|
+
const right = new messages_1.RemoveMessage({ id: "2" });
|
|
77
|
+
const result = (0, message_js_1.messagesStateReducer)(left, right);
|
|
78
|
+
const expected = [new messages_1.HumanMessage({ id: "1", content: "Hello" })];
|
|
79
|
+
(0, vitest_1.expect)(result).toEqual(expected);
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.it)("should handle duplicate remove messages", () => {
|
|
82
|
+
const left = [
|
|
83
|
+
new messages_1.HumanMessage({ id: "1", content: "Hello" }),
|
|
84
|
+
new messages_1.AIMessage({ id: "2", content: "Hi there!" }),
|
|
85
|
+
];
|
|
86
|
+
const right = [
|
|
87
|
+
new messages_1.RemoveMessage({ id: "2" }),
|
|
88
|
+
new messages_1.RemoveMessage({ id: "2" }),
|
|
89
|
+
];
|
|
90
|
+
const result = (0, message_js_1.messagesStateReducer)(left, right);
|
|
91
|
+
const expected = [new messages_1.HumanMessage({ id: "1", content: "Hello" })];
|
|
92
|
+
(0, vitest_1.expect)(result).toEqual(expected);
|
|
93
|
+
});
|
|
94
|
+
(0, vitest_1.it)("should throw on removing nonexistent message", () => {
|
|
95
|
+
const left = [new messages_1.HumanMessage({ id: "1", content: "Hello" })];
|
|
96
|
+
const right = new messages_1.RemoveMessage({ id: "2" });
|
|
97
|
+
(0, vitest_1.expect)(() => (0, message_js_1.messagesStateReducer)(left, right)).toThrow("Attempting to delete a message with an ID that doesn't exist");
|
|
98
|
+
});
|
|
99
|
+
(0, vitest_1.it)("should handle mixed operations", () => {
|
|
100
|
+
const left = [
|
|
101
|
+
new messages_1.HumanMessage({ id: "1", content: "Hello" }),
|
|
102
|
+
new messages_1.AIMessage({ id: "2", content: "Hi there!" }),
|
|
103
|
+
];
|
|
104
|
+
const right = [
|
|
105
|
+
new messages_1.HumanMessage({ id: "1", content: "Updated hello" }),
|
|
106
|
+
new messages_1.RemoveMessage({ id: "2" }),
|
|
107
|
+
new messages_1.SystemMessage({ id: "3", content: "New message" }),
|
|
108
|
+
];
|
|
109
|
+
const result = (0, message_js_1.messagesStateReducer)(left, right);
|
|
110
|
+
const expected = [
|
|
111
|
+
new messages_1.HumanMessage({ id: "1", content: "Updated hello" }),
|
|
112
|
+
new messages_1.SystemMessage({ id: "3", content: "New message" }),
|
|
113
|
+
];
|
|
114
|
+
(0, vitest_1.expect)(result).toEqual(expected);
|
|
115
|
+
});
|
|
116
|
+
(0, vitest_1.it)("should handle empty inputs", () => {
|
|
117
|
+
(0, vitest_1.expect)((0, message_js_1.messagesStateReducer)([], [])).toEqual([]);
|
|
118
|
+
(0, vitest_1.expect)((0, message_js_1.messagesStateReducer)([], [new messages_1.HumanMessage({ id: "1", content: "Hello" })])).toEqual([new messages_1.HumanMessage({ id: "1", content: "Hello" })]);
|
|
119
|
+
(0, vitest_1.expect)((0, message_js_1.messagesStateReducer)([new messages_1.HumanMessage({ id: "1", content: "Hello" })], [])).toEqual([new messages_1.HumanMessage({ id: "1", content: "Hello" })]);
|
|
120
|
+
});
|
|
121
|
+
(0, vitest_1.it)("should handle non-array inputs", () => {
|
|
122
|
+
const left = new messages_1.HumanMessage({ id: "1", content: "Hello" });
|
|
123
|
+
const right = new messages_1.AIMessage({ id: "2", content: "Hi there!" });
|
|
124
|
+
const result = (0, message_js_1.messagesStateReducer)(left, right);
|
|
125
|
+
const expected = [
|
|
126
|
+
new messages_1.HumanMessage({ id: "1", content: "Hello" }),
|
|
127
|
+
new messages_1.AIMessage({ id: "2", content: "Hi there!" }),
|
|
128
|
+
];
|
|
129
|
+
(0, vitest_1.expect)(result).toEqual(expected);
|
|
130
|
+
});
|
|
131
|
+
(0, vitest_1.it)("should remove all messages", () => {
|
|
132
|
+
// simple removal
|
|
133
|
+
(0, vitest_1.expect)((0, message_js_1.messagesStateReducer)([new messages_1.HumanMessage("Hello"), new messages_1.AIMessage("Hi there!")], [new messages_1.RemoveMessage({ id: message_js_1.REMOVE_ALL_MESSAGES })])).toEqual([]);
|
|
134
|
+
// removal and update (i.e. overwriting)
|
|
135
|
+
(0, vitest_1.expect)((0, message_js_1.messagesStateReducer)([new messages_1.HumanMessage("Hello"), new messages_1.AIMessage("Hi there!")], [
|
|
136
|
+
new messages_1.RemoveMessage({ id: message_js_1.REMOVE_ALL_MESSAGES }),
|
|
137
|
+
new messages_1.HumanMessage({ id: "1", content: "Updated hello" }),
|
|
138
|
+
])).toEqual([new messages_1.HumanMessage({ id: "1", content: "Updated hello" })]);
|
|
139
|
+
// test removing preceding messages in the right list
|
|
140
|
+
(0, vitest_1.expect)((0, message_js_1.messagesStateReducer)([new messages_1.HumanMessage("Hello"), new messages_1.AIMessage("Hi there!")], [
|
|
141
|
+
new messages_1.HumanMessage("Updated hello"),
|
|
142
|
+
new messages_1.RemoveMessage({ id: message_js_1.REMOVE_ALL_MESSAGES }),
|
|
143
|
+
new messages_1.HumanMessage({ id: "1", content: "Updated hi there" }),
|
|
144
|
+
])).toEqual([new messages_1.HumanMessage({ id: "1", content: "Updated hi there" })]);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
(0, vitest_1.describe)("pushMessage", () => {
|
|
148
|
+
(0, vitest_1.it)("should throw on message without ID", () => {
|
|
149
|
+
const message = new messages_1.AIMessage("No ID");
|
|
150
|
+
const config = { callbacks: [] };
|
|
151
|
+
(0, vitest_1.expect)(() => (0, message_js_1.pushMessage)(message, config)).toThrow("Message ID is required");
|
|
152
|
+
});
|
|
153
|
+
(0, vitest_1.it)("should handle message with ID", () => {
|
|
154
|
+
const message = new messages_1.AIMessage({ id: "1", content: "With ID" });
|
|
155
|
+
const config = { callbacks: [] };
|
|
156
|
+
const result = (0, message_js_1.pushMessage)(message, config);
|
|
157
|
+
(0, vitest_1.expect)(result).toEqual(message);
|
|
158
|
+
});
|
|
159
|
+
(0, vitest_1.it)("should handle message with custom state key", () => {
|
|
160
|
+
const message = new messages_1.AIMessage({ id: "1", content: "With ID" });
|
|
161
|
+
const config = {
|
|
162
|
+
callbacks: [],
|
|
163
|
+
configurable: {
|
|
164
|
+
__pregel_send: (messages) => {
|
|
165
|
+
(0, vitest_1.expect)(messages).toEqual([["custom", message]]);
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
(0, message_js_1.pushMessage)(message, config, { stateKey: "custom" });
|
|
170
|
+
});
|
|
171
|
+
(0, vitest_1.it)("should push messages in graph", async () => {
|
|
172
|
+
const graph = new state_js_1.StateGraph(messages_annotation_js_1.MessagesAnnotation)
|
|
173
|
+
.addNode("chat", (state, config) => {
|
|
174
|
+
(0, vitest_1.expect)(() => (0, message_js_1.pushMessage)(new messages_1.AIMessage("No ID"), config)).toThrow();
|
|
175
|
+
(0, message_js_1.pushMessage)(new messages_1.AIMessage({ id: "1", content: "First" }), config);
|
|
176
|
+
(0, message_js_1.pushMessage)(new messages_1.HumanMessage({ id: "2", content: "Second" }), config);
|
|
177
|
+
(0, message_js_1.pushMessage)(new messages_1.AIMessage({ id: "3", content: "Third" }), config);
|
|
178
|
+
return state;
|
|
179
|
+
})
|
|
180
|
+
.addEdge(constants_js_1.START, "chat")
|
|
181
|
+
.compile();
|
|
182
|
+
const messages = [];
|
|
183
|
+
let values;
|
|
184
|
+
for await (const [event, chunk] of await graph.stream({ messages: [] }, { streamMode: ["messages", "values"] })) {
|
|
185
|
+
if (event === "values") {
|
|
186
|
+
values = chunk.messages;
|
|
187
|
+
}
|
|
188
|
+
else if (event === "messages") {
|
|
189
|
+
const [message] = chunk;
|
|
190
|
+
messages.push(message);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
(0, vitest_1.expect)(values).toEqual(messages);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
//# sourceMappingURL=message.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { AIMessage, HumanMessage, SystemMessage, RemoveMessage, } from "@langchain/core/messages";
|
|
3
|
+
import { messagesStateReducer, pushMessage, REMOVE_ALL_MESSAGES, } from "./message.js";
|
|
4
|
+
import { START } from "../constants.js";
|
|
5
|
+
import { StateGraph } from "../graph/state.js";
|
|
6
|
+
import { MessagesAnnotation } from "../graph/messages_annotation.js";
|
|
7
|
+
describe("messagesStateReducer", () => {
|
|
8
|
+
it("should add a single message", () => {
|
|
9
|
+
const left = [new HumanMessage({ id: "1", content: "Hello" })];
|
|
10
|
+
const right = new AIMessage({ id: "2", content: "Hi there!" });
|
|
11
|
+
const result = messagesStateReducer(left, right);
|
|
12
|
+
const expected = [
|
|
13
|
+
new HumanMessage({ id: "1", content: "Hello" }),
|
|
14
|
+
new AIMessage({ id: "2", content: "Hi there!" }),
|
|
15
|
+
];
|
|
16
|
+
expect(result).toEqual(expected);
|
|
17
|
+
});
|
|
18
|
+
it("should add multiple messages", () => {
|
|
19
|
+
const left = [new HumanMessage({ id: "1", content: "Hello" })];
|
|
20
|
+
const right = [
|
|
21
|
+
new AIMessage({ id: "2", content: "Hi there!" }),
|
|
22
|
+
new SystemMessage({ id: "3", content: "System message" }),
|
|
23
|
+
];
|
|
24
|
+
const result = messagesStateReducer(left, right);
|
|
25
|
+
const expected = [
|
|
26
|
+
new HumanMessage({ id: "1", content: "Hello" }),
|
|
27
|
+
new AIMessage({ id: "2", content: "Hi there!" }),
|
|
28
|
+
new SystemMessage({ id: "3", content: "System message" }),
|
|
29
|
+
];
|
|
30
|
+
expect(result).toEqual(expected);
|
|
31
|
+
});
|
|
32
|
+
it("should update existing message", () => {
|
|
33
|
+
const left = [new HumanMessage({ id: "1", content: "Hello" })];
|
|
34
|
+
const right = new HumanMessage({ id: "1", content: "Hello again" });
|
|
35
|
+
const result = messagesStateReducer(left, right);
|
|
36
|
+
const expected = [new HumanMessage({ id: "1", content: "Hello again" })];
|
|
37
|
+
expect(result).toEqual(expected);
|
|
38
|
+
});
|
|
39
|
+
it("should assign missing IDs", () => {
|
|
40
|
+
const left = [new HumanMessage({ content: "Hello" })];
|
|
41
|
+
const right = [new AIMessage({ content: "Hi there!" })];
|
|
42
|
+
const result = messagesStateReducer(left, right);
|
|
43
|
+
expect(result).toHaveLength(2);
|
|
44
|
+
expect(result.every((m) => typeof m.id === "string" && m.id.length > 0)).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
it("should handle duplicates in input", () => {
|
|
47
|
+
const left = [];
|
|
48
|
+
const right = [
|
|
49
|
+
new AIMessage({ id: "1", content: "Hi there!" }),
|
|
50
|
+
new AIMessage({ id: "1", content: "Hi there again!" }),
|
|
51
|
+
];
|
|
52
|
+
const result = messagesStateReducer(left, right);
|
|
53
|
+
expect(result).toHaveLength(1);
|
|
54
|
+
expect(result[0].id).toBe("1");
|
|
55
|
+
expect(result[0].content).toBe("Hi there again!");
|
|
56
|
+
});
|
|
57
|
+
it("should handle duplicates with remove", () => {
|
|
58
|
+
const left = [new AIMessage({ id: "1", content: "Hello!" })];
|
|
59
|
+
const right = [
|
|
60
|
+
new RemoveMessage({ id: "1" }),
|
|
61
|
+
new AIMessage({ id: "1", content: "Hi there!" }),
|
|
62
|
+
new AIMessage({ id: "1", content: "Hi there again!" }),
|
|
63
|
+
];
|
|
64
|
+
const result = messagesStateReducer(left, right);
|
|
65
|
+
expect(result).toHaveLength(1);
|
|
66
|
+
expect(result[0].id).toBe("1");
|
|
67
|
+
expect(result[0].content).toBe("Hi there again!");
|
|
68
|
+
});
|
|
69
|
+
it("should remove message", () => {
|
|
70
|
+
const left = [
|
|
71
|
+
new HumanMessage({ id: "1", content: "Hello" }),
|
|
72
|
+
new AIMessage({ id: "2", content: "Hi there!" }),
|
|
73
|
+
];
|
|
74
|
+
const right = new RemoveMessage({ id: "2" });
|
|
75
|
+
const result = messagesStateReducer(left, right);
|
|
76
|
+
const expected = [new HumanMessage({ id: "1", content: "Hello" })];
|
|
77
|
+
expect(result).toEqual(expected);
|
|
78
|
+
});
|
|
79
|
+
it("should handle duplicate remove messages", () => {
|
|
80
|
+
const left = [
|
|
81
|
+
new HumanMessage({ id: "1", content: "Hello" }),
|
|
82
|
+
new AIMessage({ id: "2", content: "Hi there!" }),
|
|
83
|
+
];
|
|
84
|
+
const right = [
|
|
85
|
+
new RemoveMessage({ id: "2" }),
|
|
86
|
+
new RemoveMessage({ id: "2" }),
|
|
87
|
+
];
|
|
88
|
+
const result = messagesStateReducer(left, right);
|
|
89
|
+
const expected = [new HumanMessage({ id: "1", content: "Hello" })];
|
|
90
|
+
expect(result).toEqual(expected);
|
|
91
|
+
});
|
|
92
|
+
it("should throw on removing nonexistent message", () => {
|
|
93
|
+
const left = [new HumanMessage({ id: "1", content: "Hello" })];
|
|
94
|
+
const right = new RemoveMessage({ id: "2" });
|
|
95
|
+
expect(() => messagesStateReducer(left, right)).toThrow("Attempting to delete a message with an ID that doesn't exist");
|
|
96
|
+
});
|
|
97
|
+
it("should handle mixed operations", () => {
|
|
98
|
+
const left = [
|
|
99
|
+
new HumanMessage({ id: "1", content: "Hello" }),
|
|
100
|
+
new AIMessage({ id: "2", content: "Hi there!" }),
|
|
101
|
+
];
|
|
102
|
+
const right = [
|
|
103
|
+
new HumanMessage({ id: "1", content: "Updated hello" }),
|
|
104
|
+
new RemoveMessage({ id: "2" }),
|
|
105
|
+
new SystemMessage({ id: "3", content: "New message" }),
|
|
106
|
+
];
|
|
107
|
+
const result = messagesStateReducer(left, right);
|
|
108
|
+
const expected = [
|
|
109
|
+
new HumanMessage({ id: "1", content: "Updated hello" }),
|
|
110
|
+
new SystemMessage({ id: "3", content: "New message" }),
|
|
111
|
+
];
|
|
112
|
+
expect(result).toEqual(expected);
|
|
113
|
+
});
|
|
114
|
+
it("should handle empty inputs", () => {
|
|
115
|
+
expect(messagesStateReducer([], [])).toEqual([]);
|
|
116
|
+
expect(messagesStateReducer([], [new HumanMessage({ id: "1", content: "Hello" })])).toEqual([new HumanMessage({ id: "1", content: "Hello" })]);
|
|
117
|
+
expect(messagesStateReducer([new HumanMessage({ id: "1", content: "Hello" })], [])).toEqual([new HumanMessage({ id: "1", content: "Hello" })]);
|
|
118
|
+
});
|
|
119
|
+
it("should handle non-array inputs", () => {
|
|
120
|
+
const left = new HumanMessage({ id: "1", content: "Hello" });
|
|
121
|
+
const right = new AIMessage({ id: "2", content: "Hi there!" });
|
|
122
|
+
const result = messagesStateReducer(left, right);
|
|
123
|
+
const expected = [
|
|
124
|
+
new HumanMessage({ id: "1", content: "Hello" }),
|
|
125
|
+
new AIMessage({ id: "2", content: "Hi there!" }),
|
|
126
|
+
];
|
|
127
|
+
expect(result).toEqual(expected);
|
|
128
|
+
});
|
|
129
|
+
it("should remove all messages", () => {
|
|
130
|
+
// simple removal
|
|
131
|
+
expect(messagesStateReducer([new HumanMessage("Hello"), new AIMessage("Hi there!")], [new RemoveMessage({ id: REMOVE_ALL_MESSAGES })])).toEqual([]);
|
|
132
|
+
// removal and update (i.e. overwriting)
|
|
133
|
+
expect(messagesStateReducer([new HumanMessage("Hello"), new AIMessage("Hi there!")], [
|
|
134
|
+
new RemoveMessage({ id: REMOVE_ALL_MESSAGES }),
|
|
135
|
+
new HumanMessage({ id: "1", content: "Updated hello" }),
|
|
136
|
+
])).toEqual([new HumanMessage({ id: "1", content: "Updated hello" })]);
|
|
137
|
+
// test removing preceding messages in the right list
|
|
138
|
+
expect(messagesStateReducer([new HumanMessage("Hello"), new AIMessage("Hi there!")], [
|
|
139
|
+
new HumanMessage("Updated hello"),
|
|
140
|
+
new RemoveMessage({ id: REMOVE_ALL_MESSAGES }),
|
|
141
|
+
new HumanMessage({ id: "1", content: "Updated hi there" }),
|
|
142
|
+
])).toEqual([new HumanMessage({ id: "1", content: "Updated hi there" })]);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
describe("pushMessage", () => {
|
|
146
|
+
it("should throw on message without ID", () => {
|
|
147
|
+
const message = new AIMessage("No ID");
|
|
148
|
+
const config = { callbacks: [] };
|
|
149
|
+
expect(() => pushMessage(message, config)).toThrow("Message ID is required");
|
|
150
|
+
});
|
|
151
|
+
it("should handle message with ID", () => {
|
|
152
|
+
const message = new AIMessage({ id: "1", content: "With ID" });
|
|
153
|
+
const config = { callbacks: [] };
|
|
154
|
+
const result = pushMessage(message, config);
|
|
155
|
+
expect(result).toEqual(message);
|
|
156
|
+
});
|
|
157
|
+
it("should handle message with custom state key", () => {
|
|
158
|
+
const message = new AIMessage({ id: "1", content: "With ID" });
|
|
159
|
+
const config = {
|
|
160
|
+
callbacks: [],
|
|
161
|
+
configurable: {
|
|
162
|
+
__pregel_send: (messages) => {
|
|
163
|
+
expect(messages).toEqual([["custom", message]]);
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
pushMessage(message, config, { stateKey: "custom" });
|
|
168
|
+
});
|
|
169
|
+
it("should push messages in graph", async () => {
|
|
170
|
+
const graph = new StateGraph(MessagesAnnotation)
|
|
171
|
+
.addNode("chat", (state, config) => {
|
|
172
|
+
expect(() => pushMessage(new AIMessage("No ID"), config)).toThrow();
|
|
173
|
+
pushMessage(new AIMessage({ id: "1", content: "First" }), config);
|
|
174
|
+
pushMessage(new HumanMessage({ id: "2", content: "Second" }), config);
|
|
175
|
+
pushMessage(new AIMessage({ id: "3", content: "Third" }), config);
|
|
176
|
+
return state;
|
|
177
|
+
})
|
|
178
|
+
.addEdge(START, "chat")
|
|
179
|
+
.compile();
|
|
180
|
+
const messages = [];
|
|
181
|
+
let values;
|
|
182
|
+
for await (const [event, chunk] of await graph.stream({ messages: [] }, { streamMode: ["messages", "values"] })) {
|
|
183
|
+
if (event === "values") {
|
|
184
|
+
values = chunk.messages;
|
|
185
|
+
}
|
|
186
|
+
else if (event === "messages") {
|
|
187
|
+
const [message] = chunk;
|
|
188
|
+
messages.push(message);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
expect(values).toEqual(messages);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
//# sourceMappingURL=message.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.test.js","sourceRoot":"","sources":["../../src/graph/message.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/* __LC_ALLOW_ENTRYPOINT_SIDE_EFFECTS__ */
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.MessagesAnnotation = void 0;
|
|
4
|
+
exports.MessagesZodState = exports.MessagesAnnotation = void 0;
|
|
5
|
+
const zod_1 = require("zod");
|
|
5
6
|
const annotation_js_1 = require("./annotation.cjs");
|
|
6
7
|
const message_js_1 = require("./message.cjs");
|
|
8
|
+
const state_js_1 = require("./zod/state.cjs");
|
|
7
9
|
/**
|
|
8
10
|
* Prebuilt state annotation that combines returned messages.
|
|
9
11
|
* Can handle standard messages and special modifiers like {@link RemoveMessage}
|
|
@@ -45,4 +47,55 @@ exports.MessagesAnnotation = annotation_js_1.Annotation.Root({
|
|
|
45
47
|
default: () => [],
|
|
46
48
|
}),
|
|
47
49
|
});
|
|
50
|
+
/**
|
|
51
|
+
* Prebuilt state object that uses Zod to combine returned messages.
|
|
52
|
+
* This utility is synonymous with the `MessagesAnnotation` annotation,
|
|
53
|
+
* but uses Zod as the way to express messages state.
|
|
54
|
+
*
|
|
55
|
+
* You can use import and use this prebuilt schema like this:
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* import { MessagesZodState, StateGraph } from "@langchain/langgraph";
|
|
60
|
+
*
|
|
61
|
+
* const graph = new StateGraph(MessagesZodState)
|
|
62
|
+
* .addNode(...)
|
|
63
|
+
* ...
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* Which is equivalent to initializing the schema object manually like this:
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* import { z } from "zod";
|
|
71
|
+
* import type { BaseMessage, BaseMessageLike } from "@langchain/core/messages";
|
|
72
|
+
* import { StateGraph, messagesStateReducer } from "@langchain/langgraph";
|
|
73
|
+
* import "@langchain/langgraph/zod";
|
|
74
|
+
*
|
|
75
|
+
* const AgentState = z.object({
|
|
76
|
+
* messages: z
|
|
77
|
+
* .custom<BaseMessage[]>()
|
|
78
|
+
* .default(() => [])
|
|
79
|
+
* .langgraph.reducer(
|
|
80
|
+
* messagesStateReducer,
|
|
81
|
+
* z.custom<BaseMessageLike | BaseMessageLike[]>()
|
|
82
|
+
* ),
|
|
83
|
+
* });
|
|
84
|
+
* const graph = new StateGraph(AgentState)
|
|
85
|
+
* .addNode(...)
|
|
86
|
+
* ...
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
exports.MessagesZodState = zod_1.z.object({
|
|
90
|
+
messages: (0, state_js_1.withLangGraph)(zod_1.z.custom(), {
|
|
91
|
+
reducer: {
|
|
92
|
+
schema: zod_1.z.custom(),
|
|
93
|
+
fn: message_js_1.messagesStateReducer,
|
|
94
|
+
},
|
|
95
|
+
jsonSchemaExtra: {
|
|
96
|
+
langgraph_type: "messages",
|
|
97
|
+
},
|
|
98
|
+
default: () => [],
|
|
99
|
+
}),
|
|
100
|
+
});
|
|
48
101
|
//# sourceMappingURL=messages_annotation.js.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BaseMessage } from "@langchain/core/messages";
|
|
2
|
+
import { z } from "zod";
|
|
2
3
|
import { Messages } from "./message.js";
|
|
3
4
|
/**
|
|
4
5
|
* Prebuilt state annotation that combines returned messages.
|
|
@@ -38,3 +39,49 @@ import { Messages } from "./message.js";
|
|
|
38
39
|
export declare const MessagesAnnotation: import("./annotation.js").AnnotationRoot<{
|
|
39
40
|
messages: import("../web.js").BinaryOperatorAggregate<BaseMessage[], Messages>;
|
|
40
41
|
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Prebuilt state object that uses Zod to combine returned messages.
|
|
44
|
+
* This utility is synonymous with the `MessagesAnnotation` annotation,
|
|
45
|
+
* but uses Zod as the way to express messages state.
|
|
46
|
+
*
|
|
47
|
+
* You can use import and use this prebuilt schema like this:
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* import { MessagesZodState, StateGraph } from "@langchain/langgraph";
|
|
52
|
+
*
|
|
53
|
+
* const graph = new StateGraph(MessagesZodState)
|
|
54
|
+
* .addNode(...)
|
|
55
|
+
* ...
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* Which is equivalent to initializing the schema object manually like this:
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* import { z } from "zod";
|
|
63
|
+
* import type { BaseMessage, BaseMessageLike } from "@langchain/core/messages";
|
|
64
|
+
* import { StateGraph, messagesStateReducer } from "@langchain/langgraph";
|
|
65
|
+
* import "@langchain/langgraph/zod";
|
|
66
|
+
*
|
|
67
|
+
* const AgentState = z.object({
|
|
68
|
+
* messages: z
|
|
69
|
+
* .custom<BaseMessage[]>()
|
|
70
|
+
* .default(() => [])
|
|
71
|
+
* .langgraph.reducer(
|
|
72
|
+
* messagesStateReducer,
|
|
73
|
+
* z.custom<BaseMessageLike | BaseMessageLike[]>()
|
|
74
|
+
* ),
|
|
75
|
+
* });
|
|
76
|
+
* const graph = new StateGraph(AgentState)
|
|
77
|
+
* .addNode(...)
|
|
78
|
+
* ...
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare const MessagesZodState: z.ZodObject<{
|
|
82
|
+
messages: z.ZodType<BaseMessage[], z.ZodTypeDef, Messages>;
|
|
83
|
+
}, "strip", z.ZodTypeAny, {
|
|
84
|
+
messages: BaseMessage[];
|
|
85
|
+
}, {
|
|
86
|
+
messages: Messages;
|
|
87
|
+
}>;
|