From ca89f69dcdd8d62ae02780c3f168fba912e1a0ef Mon Sep 17 00:00:00 2001 From: Tat Dat Duong Date: Tue, 15 Jul 2025 17:44:22 +0200 Subject: [PATCH 1/2] feat[core]: message type assertions should accept null | undefined --- langchain-core/src/messages/ai.ts | 8 ++++++-- langchain-core/src/messages/base.ts | 5 +++-- langchain-core/src/messages/chat.ts | 15 ++++++++++++--- langchain-core/src/messages/function.ts | 8 ++++++-- langchain-core/src/messages/human.ts | 8 ++++++-- langchain-core/src/messages/system.ts | 8 ++++++-- langchain-core/src/messages/tool.ts | 15 ++++++++++++--- 7 files changed, 51 insertions(+), 16 deletions(-) diff --git a/langchain-core/src/messages/ai.ts b/langchain-core/src/messages/ai.ts index 61729e29c1a1..9d69ed4eeaa8 100644 --- a/langchain-core/src/messages/ai.ts +++ b/langchain-core/src/messages/ai.ts @@ -219,11 +219,15 @@ export class AIMessage extends BaseMessage { } } -export function isAIMessage(x: BaseMessage): x is AIMessage { +export function isAIMessage(x: BaseMessage | null | undefined): x is AIMessage { + if (x == null) return false; return x._getType() === "ai"; } -export function isAIMessageChunk(x: BaseMessageChunk): x is AIMessageChunk { +export function isAIMessageChunk( + x: BaseMessageChunk | null | undefined +): x is AIMessageChunk { + if (x == null) return false; return x._getType() === "ai"; } diff --git a/langchain-core/src/messages/base.ts b/langchain-core/src/messages/base.ts index f6b47a38c6b0..679e9e847178 100644 --- a/langchain-core/src/messages/base.ts +++ b/langchain-core/src/messages/base.ts @@ -544,13 +544,14 @@ export type BaseMessageLike = | SerializedConstructor; export function isBaseMessage( - messageLike?: unknown + messageLike: unknown | null | undefined ): messageLike is BaseMessage { + if (messageLike == null) return false; return typeof (messageLike as BaseMessage)?._getType === "function"; } export function isBaseMessageChunk( - messageLike?: unknown + messageLike: unknown | null | undefined ): messageLike is BaseMessageChunk { return ( isBaseMessage(messageLike) && diff --git a/langchain-core/src/messages/chat.ts b/langchain-core/src/messages/chat.ts index 376c05cceb84..634c7ec0784d 100644 --- a/langchain-core/src/messages/chat.ts +++ b/langchain-core/src/messages/chat.ts @@ -45,7 +45,10 @@ export class ChatMessage return "generic"; } - static isInstance(message: BaseMessage): message is ChatMessage { + static isInstance( + message: BaseMessage | null | undefined + ): message is ChatMessage { + if (message == null) return false; return message._getType() === "generic"; } @@ -109,10 +112,16 @@ export class ChatMessageChunk extends BaseMessageChunk { } } -export function isChatMessage(x: BaseMessage): x is ChatMessage { +export function isChatMessage( + x: BaseMessage | null | undefined +): x is ChatMessage { + if (x == null) return false; return x._getType() === "generic"; } -export function isChatMessageChunk(x: BaseMessageChunk): x is ChatMessageChunk { +export function isChatMessageChunk( + x: BaseMessageChunk | null | undefined +): x is ChatMessageChunk { + if (x == null) return false; return x._getType() === "generic"; } diff --git a/langchain-core/src/messages/function.ts b/langchain-core/src/messages/function.ts index 7e3455b8ca51..7b6f6dacdf3d 100644 --- a/langchain-core/src/messages/function.ts +++ b/langchain-core/src/messages/function.ts @@ -74,12 +74,16 @@ export class FunctionMessageChunk extends BaseMessageChunk { } } -export function isFunctionMessage(x: BaseMessage): x is FunctionMessage { +export function isFunctionMessage( + x: BaseMessage | null | undefined +): x is FunctionMessage { + if (x == null) return false; return x._getType() === "function"; } export function isFunctionMessageChunk( - x: BaseMessageChunk + x: BaseMessageChunk | null | undefined ): x is FunctionMessageChunk { + if (x == null) return false; return x._getType() === "function"; } diff --git a/langchain-core/src/messages/human.ts b/langchain-core/src/messages/human.ts index ae55eb0c62ef..a58e41fa1b3c 100644 --- a/langchain-core/src/messages/human.ts +++ b/langchain-core/src/messages/human.ts @@ -76,12 +76,16 @@ export class HumanMessageChunk extends BaseMessageChunk { } } -export function isHumanMessage(x: BaseMessage): x is HumanMessage { +export function isHumanMessage( + x: BaseMessage | null | undefined +): x is HumanMessage { + if (x == null) return false; return x.getType() === "human"; } export function isHumanMessageChunk( - x: BaseMessageChunk + x: BaseMessageChunk | null | undefined ): x is HumanMessageChunk { + if (x == null) return false; return x.getType() === "human"; } diff --git a/langchain-core/src/messages/system.ts b/langchain-core/src/messages/system.ts index 3395dc284b89..6f8337137ce9 100644 --- a/langchain-core/src/messages/system.ts +++ b/langchain-core/src/messages/system.ts @@ -75,12 +75,16 @@ export class SystemMessageChunk extends BaseMessageChunk { } } -export function isSystemMessage(x: BaseMessage): x is SystemMessage { +export function isSystemMessage( + x: BaseMessage | null | undefined +): x is SystemMessage { + if (x == null) return false; return x._getType() === "system"; } export function isSystemMessageChunk( - x: BaseMessageChunk + x: BaseMessageChunk | null | undefined ): x is SystemMessageChunk { + if (x == null) return false; return x._getType() === "system"; } diff --git a/langchain-core/src/messages/tool.ts b/langchain-core/src/messages/tool.ts index 9dfe48f6ad76..a199a3cb2816 100644 --- a/langchain-core/src/messages/tool.ts +++ b/langchain-core/src/messages/tool.ts @@ -115,7 +115,10 @@ export class ToolMessage extends BaseMessage implements DirectToolOutput { return "tool"; } - static isInstance(message: BaseMessage): message is ToolMessage { + static isInstance( + message: BaseMessage | null | undefined + ): message is ToolMessage { + if (message == null) return false; return message._getType() === "tool"; } @@ -314,10 +317,16 @@ export function defaultToolCallParser( return [toolCalls, invalidToolCalls]; } -export function isToolMessage(x: BaseMessage): x is ToolMessage { +export function isToolMessage( + x: BaseMessage | null | undefined +): x is ToolMessage { + if (x == null) return false; return x._getType() === "tool"; } -export function isToolMessageChunk(x: BaseMessageChunk): x is ToolMessageChunk { +export function isToolMessageChunk( + x: BaseMessageChunk | null | undefined +): x is ToolMessageChunk { + if (x == null) return false; return x._getType() === "tool"; } From 8dc96d784c1b33bd42c00b5db918341e17f16c64 Mon Sep 17 00:00:00 2001 From: Tat Dat Duong Date: Tue, 15 Jul 2025 20:45:12 +0200 Subject: [PATCH 2/2] Use !x instead --- langchain-core/src/messages/ai.ts | 4 ++-- langchain-core/src/messages/base.ts | 2 +- langchain-core/src/messages/chat.ts | 6 +++--- langchain-core/src/messages/function.ts | 4 ++-- langchain-core/src/messages/human.ts | 4 ++-- langchain-core/src/messages/system.ts | 4 ++-- langchain-core/src/messages/tool.ts | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/langchain-core/src/messages/ai.ts b/langchain-core/src/messages/ai.ts index 9d69ed4eeaa8..119e61a94042 100644 --- a/langchain-core/src/messages/ai.ts +++ b/langchain-core/src/messages/ai.ts @@ -220,14 +220,14 @@ export class AIMessage extends BaseMessage { } export function isAIMessage(x: BaseMessage | null | undefined): x is AIMessage { - if (x == null) return false; + if (!x) return false; return x._getType() === "ai"; } export function isAIMessageChunk( x: BaseMessageChunk | null | undefined ): x is AIMessageChunk { - if (x == null) return false; + if (!x) return false; return x._getType() === "ai"; } diff --git a/langchain-core/src/messages/base.ts b/langchain-core/src/messages/base.ts index 679e9e847178..86468d47e926 100644 --- a/langchain-core/src/messages/base.ts +++ b/langchain-core/src/messages/base.ts @@ -546,7 +546,7 @@ export type BaseMessageLike = export function isBaseMessage( messageLike: unknown | null | undefined ): messageLike is BaseMessage { - if (messageLike == null) return false; + if (!messageLike) return false; return typeof (messageLike as BaseMessage)?._getType === "function"; } diff --git a/langchain-core/src/messages/chat.ts b/langchain-core/src/messages/chat.ts index 634c7ec0784d..49b52521d867 100644 --- a/langchain-core/src/messages/chat.ts +++ b/langchain-core/src/messages/chat.ts @@ -48,7 +48,7 @@ export class ChatMessage static isInstance( message: BaseMessage | null | undefined ): message is ChatMessage { - if (message == null) return false; + if (!message) return false; return message._getType() === "generic"; } @@ -115,13 +115,13 @@ export class ChatMessageChunk extends BaseMessageChunk { export function isChatMessage( x: BaseMessage | null | undefined ): x is ChatMessage { - if (x == null) return false; + if (!x) return false; return x._getType() === "generic"; } export function isChatMessageChunk( x: BaseMessageChunk | null | undefined ): x is ChatMessageChunk { - if (x == null) return false; + if (!x) return false; return x._getType() === "generic"; } diff --git a/langchain-core/src/messages/function.ts b/langchain-core/src/messages/function.ts index 7b6f6dacdf3d..09c1a6bf7fa4 100644 --- a/langchain-core/src/messages/function.ts +++ b/langchain-core/src/messages/function.ts @@ -77,13 +77,13 @@ export class FunctionMessageChunk extends BaseMessageChunk { export function isFunctionMessage( x: BaseMessage | null | undefined ): x is FunctionMessage { - if (x == null) return false; + if (!x) return false; return x._getType() === "function"; } export function isFunctionMessageChunk( x: BaseMessageChunk | null | undefined ): x is FunctionMessageChunk { - if (x == null) return false; + if (!x) return false; return x._getType() === "function"; } diff --git a/langchain-core/src/messages/human.ts b/langchain-core/src/messages/human.ts index a58e41fa1b3c..a87a87d4551d 100644 --- a/langchain-core/src/messages/human.ts +++ b/langchain-core/src/messages/human.ts @@ -79,13 +79,13 @@ export class HumanMessageChunk extends BaseMessageChunk { export function isHumanMessage( x: BaseMessage | null | undefined ): x is HumanMessage { - if (x == null) return false; + if (!x) return false; return x.getType() === "human"; } export function isHumanMessageChunk( x: BaseMessageChunk | null | undefined ): x is HumanMessageChunk { - if (x == null) return false; + if (!x) return false; return x.getType() === "human"; } diff --git a/langchain-core/src/messages/system.ts b/langchain-core/src/messages/system.ts index 6f8337137ce9..9faed2e942eb 100644 --- a/langchain-core/src/messages/system.ts +++ b/langchain-core/src/messages/system.ts @@ -78,13 +78,13 @@ export class SystemMessageChunk extends BaseMessageChunk { export function isSystemMessage( x: BaseMessage | null | undefined ): x is SystemMessage { - if (x == null) return false; + if (!x) return false; return x._getType() === "system"; } export function isSystemMessageChunk( x: BaseMessageChunk | null | undefined ): x is SystemMessageChunk { - if (x == null) return false; + if (!x) return false; return x._getType() === "system"; } diff --git a/langchain-core/src/messages/tool.ts b/langchain-core/src/messages/tool.ts index a199a3cb2816..a02dc80d618c 100644 --- a/langchain-core/src/messages/tool.ts +++ b/langchain-core/src/messages/tool.ts @@ -118,7 +118,7 @@ export class ToolMessage extends BaseMessage implements DirectToolOutput { static isInstance( message: BaseMessage | null | undefined ): message is ToolMessage { - if (message == null) return false; + if (!message) return false; return message._getType() === "tool"; }