From 7b8891fdc74f1d2156cae5e73c73bad991131218 Mon Sep 17 00:00:00 2001 From: Brace Sproul Date: Thu, 18 Jul 2024 14:44:56 -0700 Subject: [PATCH] aws[patch]: Fix error when processing empty string chunk conent (#6137) * aws[patch]: Fix error when processing empty string chunk conent * chore: lint files --- libs/langchain-aws/src/common.ts | 11 ++--- .../src/tests/chat_models.test.ts | 40 ++++++++++++++++++- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/libs/langchain-aws/src/common.ts b/libs/langchain-aws/src/common.ts index e9dd95759b59..94630eda4a26 100644 --- a/libs/langchain-aws/src/common.ts +++ b/libs/langchain-aws/src/common.ts @@ -381,7 +381,7 @@ export function handleConverseStreamContentBlockDelta( if (!contentBlockDelta.delta) { throw new Error("No delta found in content block."); } - if (contentBlockDelta.delta.text) { + if (typeof contentBlockDelta.delta.text === "string") { return new ChatGenerationChunk({ text: contentBlockDelta.delta.text, message: new AIMessageChunk({ @@ -404,11 +404,12 @@ export function handleConverseStreamContentBlockDelta( }), }); } else { - const unsupportedField = Object.entries(contentBlockDelta.delta).filter( - ([_, value]) => !!value - ); throw new Error( - `Unsupported content block type: ${unsupportedField[0][0]}` + `Unsupported content block type(s): ${JSON.stringify( + contentBlockDelta.delta, + null, + 2 + )}` ); } } diff --git a/libs/langchain-aws/src/tests/chat_models.test.ts b/libs/langchain-aws/src/tests/chat_models.test.ts index 55c9bdc9713a..e944468f8e1c 100644 --- a/libs/langchain-aws/src/tests/chat_models.test.ts +++ b/libs/langchain-aws/src/tests/chat_models.test.ts @@ -3,8 +3,13 @@ import { HumanMessage, AIMessage, ToolMessage, + AIMessageChunk, } from "@langchain/core/messages"; -import { convertToConverseMessages } from "../common.js"; +import { concat } from "@langchain/core/utils/stream"; +import { + convertToConverseMessages, + handleConverseStreamContentBlockDelta, +} from "../common.js"; test("convertToConverseMessages works", () => { const messages = [ @@ -71,3 +76,36 @@ test("convertToConverseMessages works", () => { url: "https://weather.com", }); }); + +test("Streaming supports empty string chunks", async () => { + const contentBlocks = [ + { + contentBlockIndex: 0, + delta: { + text: "Hello ", + }, + }, + { + contentBlockIndex: 0, + delta: { + text: "", + }, + }, + { + contentBlockIndex: 0, + delta: { + text: "world!", + }, + }, + ]; + + let finalChunk: AIMessageChunk | undefined; + for (const block of contentBlocks) { + const chunk = handleConverseStreamContentBlockDelta(block).message; + finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk); + } + + expect(finalChunk).toBeDefined(); + if (!finalChunk) return; + expect(finalChunk.content).toBe("Hello world!"); +});