From d4f45b1421ec8b56fe6aeed84f81ca1b3f91383f Mon Sep 17 00:00:00 2001 From: Sypherd <50557586+Sypherd@users.noreply.github.com> Date: Fri, 22 Dec 2023 14:12:01 -0700 Subject: [PATCH] core(minor): Allow explicit types for ChatMessageHistory adds (#14967) ## Description Changes the behavior of `add_user_message` and `add_ai_message` to allow for messages of those types to be passed in. Currently, if you want to use the `add_user_message` or `add_ai_message` methods, you have to pass in a string. For `add_message` on `ChatMessageHistory`, however, you have to pass a `BaseMessage`. This behavior seems a bit inconsistent. Personally, I'd love to be able to be explicit that I want to `add_user_message` and pass in a `HumanMessage` without having to grab the `content` attribute. This PR allows `add_user_message` to accept `HumanMessage`s or `str`s and `add_ai_message` to accept `AIMessage`s or `str`s to add that functionality and ensure backwards compatibility. ## Issue * None ## Dependencies * None ## Tag maintainer @hinthornw @baskaryan ## Note `make test` results in `make: *** No rule to make target 'test'. Stop.` --- libs/core/langchain_core/chat_history.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/libs/core/langchain_core/chat_history.py b/libs/core/langchain_core/chat_history.py index 211c7c8466f..f8d9a4dabf8 100644 --- a/libs/core/langchain_core/chat_history.py +++ b/libs/core/langchain_core/chat_history.py @@ -1,7 +1,7 @@ from __future__ import annotations from abc import ABC, abstractmethod -from typing import List +from typing import List, Union from langchain_core.messages import ( AIMessage, @@ -42,21 +42,27 @@ class BaseChatMessageHistory(ABC): messages: List[BaseMessage] """A list of Messages stored in-memory.""" - def add_user_message(self, message: str) -> None: + def add_user_message(self, message: Union[HumanMessage, str]) -> None: """Convenience method for adding a human message string to the store. Args: - message: The string contents of a human message. + message: The human message to add """ - self.add_message(HumanMessage(content=message)) + if isinstance(message, HumanMessage): + self.add_message(message) + else: + self.add_message(HumanMessage(content=message)) - def add_ai_message(self, message: str) -> None: + def add_ai_message(self, message: Union[AIMessage, str]) -> None: """Convenience method for adding an AI message string to the store. Args: - message: The string contents of an AI message. + message: The AI message to add. """ - self.add_message(AIMessage(content=message)) + if isinstance(message, AIMessage): + self.add_message(message) + else: + self.add_message(AIMessage(content=message)) @abstractmethod def add_message(self, message: BaseMessage) -> None: