From 1efb55034584336e33ccfb1ed83d2d2e2f0be3b4 Mon Sep 17 00:00:00 2001 From: Jacob Lee Date: Wed, 5 Feb 2025 12:10:59 -0800 Subject: [PATCH] fix(core): Fix coercion of serialized tool and function messages (#7653) --- .../src/messages/tests/base_message.test.ts | 37 +++++++++++++++++++ langchain-core/src/messages/utils.ts | 10 +++++ 2 files changed, 47 insertions(+) diff --git a/langchain-core/src/messages/tests/base_message.test.ts b/langchain-core/src/messages/tests/base_message.test.ts index 5a1d7aaef455..db771ef0c58c 100644 --- a/langchain-core/src/messages/tests/base_message.test.ts +++ b/langchain-core/src/messages/tests/base_message.test.ts @@ -404,6 +404,43 @@ describe("Message like coercion", () => { }), ]); }); + it("should convert serialized messages", async () => { + const originalMessages = [ + new SystemMessage({ + id: "foobar", + content: "6", + additional_kwargs: {}, + }), + new SystemMessage({ + content: "6.1", + additional_kwargs: { + __openai_role__: "developer", + }, + }), + new HumanMessage({ + content: [{ type: "image_url", image_url: { url: "7.1" } }], + }), + new AIMessage({ + content: [{ type: "text", text: "8.1" }], + tool_calls: [ + { + id: "8.5", + name: "8.4", + args: { "8.2": "8.3" }, + type: "tool_call", + }, + ], + }), + new ToolMessage({ + name: undefined, + content: "10.2", + tool_call_id: "10.2", + }), + ]; + const serialized = JSON.parse(JSON.stringify(originalMessages)); + const deserialized = serialized.map(coerceMessageLikeToMessage); + expect(deserialized).toEqual(originalMessages); + }); }); describe("usage_metadata serialized", () => { diff --git a/langchain-core/src/messages/utils.ts b/langchain-core/src/messages/utils.ts index 01f5beb3f56c..1fd8272f04a1 100644 --- a/langchain-core/src/messages/utils.ts +++ b/langchain-core/src/messages/utils.ts @@ -87,6 +87,16 @@ function _constructMessageFromParams( className === "SystemMessageChunk" ) { type = "system"; + } else if ( + className === "FunctionMessage" || + className === "FunctionMessageChunk" + ) { + type = "function"; + } else if ( + className === "ToolMessage" || + className === "ToolMessageChunk" + ) { + type = "tool"; } else { type = "unknown"; }