Skip to content

Commit

Permalink
fix(langgraph): Update messagesStateReducer behavior to apply rightMe…
Browse files Browse the repository at this point in the history
…ssages in order (#847)
  • Loading branch information
jacoblee93 authored Feb 6, 2025
1 parent ae6e5b2 commit d0cb9ea
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 6 deletions.
11 changes: 5 additions & 6 deletions libs/langgraph/src/graph/message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export function messagesStateReducer(
const leftMessages = (leftArray as BaseMessageLike[]).map(
coerceMessageLikeToMessage
);
let rightMessages = (rightArray as BaseMessageLike[]).map(
const rightMessages = (rightArray as BaseMessageLike[]).map(
coerceMessageLikeToMessage
);
// assign missing ids
Expand All @@ -36,25 +36,23 @@ export function messagesStateReducer(
m.lc_kwargs.id = m.id;
}
}
const dedupeMap = new Map();
for (const m of rightMessages) {
if (m.id === null || m.id === undefined) {
m.id = v4();
m.lc_kwargs.id = m.id;
}
dedupeMap.set(m.id, m);
}
rightMessages = Array.from(dedupeMap.values());
// merge
const leftIdxById = new Map(leftMessages.map((m, i) => [m.id, i]));
const merged = [...leftMessages];
const mergedById = new Map(merged.map((m, i) => [m.id, i]));
const idsToRemove = new Set();
for (const m of rightMessages) {
const existingIdx = leftIdxById.get(m.id);
const existingIdx = mergedById.get(m.id);
if (existingIdx !== undefined) {
if (m._getType() === "remove") {
idsToRemove.add(m.id);
} else {
idsToRemove.delete(m.id);
merged[existingIdx] = m;
}
} else {
Expand All @@ -63,6 +61,7 @@ export function messagesStateReducer(
`Attempting to delete a message with an ID that doesn't exist ('${m.id}')`
);
}
mergedById.set(m.id, merged.length);
merged.push(m);
}
}
Expand Down
15 changes: 15 additions & 0 deletions libs/langgraph/src/tests/prebuilt.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
AIMessage,
BaseMessage,
HumanMessage,
RemoveMessage,
SystemMessage,
ToolMessage,
} from "@langchain/core/messages";
Expand Down Expand Up @@ -811,4 +812,18 @@ describe("messagesStateReducer", () => {
expect(deduped.length).toEqual(1);
expect(deduped[0].content).toEqual("bar2");
});

it("should apply right-side messages in order", () => {
const messages = [
new RemoveMessage({ id: "foo" }),
new HumanMessage({ id: "foo", content: "bar" }),
new HumanMessage({ id: "foo", content: "bar2" }),
];
const deduped = messagesStateReducer(
[new HumanMessage({ id: "foo", content: "bar3" })],
messages
);
expect(deduped.length).toEqual(1);
expect(deduped[0].content).toEqual("bar2");
});
});

0 comments on commit d0cb9ea

Please sign in to comment.