From 2db5f93bd4870889297eb5b6ea7236a2b6ea8288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dtalo=20Johnny?= Date: Wed, 18 Dec 2024 19:10:01 -0300 Subject: [PATCH] feat!: rename the type BaseChatMessageHistory to Memory (#5190) * chore: rename the type BaseChatMessageHistory to Memory * Added Memory type with same color as BaseChatMessageHistory * [autofix.ci] apply automated fixes --------- Co-authored-by: Lucas Oliveira Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- src/backend/base/langflow/base/memory/model.py | 5 +++-- src/backend/base/langflow/components/helpers/memory.py | 2 +- .../base/langflow/components/helpers/store_message.py | 2 +- src/backend/base/langflow/components/memories/astra_db.py | 4 ++-- src/backend/base/langflow/components/memories/cassandra.py | 4 ++-- src/backend/base/langflow/components/memories/redis.py | 4 ++-- src/backend/base/langflow/components/memories/zep.py | 4 ++-- src/backend/base/langflow/field_typing/constants.py | 4 +++- .../starter_projects/Custom Component Maker.json | 4 ++-- .../starter_projects/Instagram Copywriter.json | 2 +- .../initial_setup/starter_projects/Market Research.json | 2 +- .../initial_setup/starter_projects/Memory Chatbot.json | 4 ++-- .../initial_setup/starter_projects/Research Agent.json | 2 +- .../initial_setup/starter_projects/SaaS Pricing.json | 2 +- .../starter_projects/Sequential Tasks Agents .json | 6 +++--- .../initial_setup/starter_projects/Simple Agent.json | 2 +- .../starter_projects/Travel Planning Agents.json | 6 +++--- src/frontend/src/utils/styleUtils.ts | 2 +- 18 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/backend/base/langflow/base/memory/model.py b/src/backend/base/langflow/base/memory/model.py index a33c7894a..c48227ca7 100644 --- a/src/backend/base/langflow/base/memory/model.py +++ b/src/backend/base/langflow/base/memory/model.py @@ -3,7 +3,8 @@ from abc import abstractmethod from langchain.memory import ConversationBufferMemory from langflow.custom import Component -from langflow.field_typing import BaseChatMemory, BaseChatMessageHistory +from langflow.field_typing import BaseChatMemory +from langflow.field_typing.constants import Memory from langflow.template import Output @@ -32,5 +33,5 @@ class LCChatMemoryComponent(Component): return ConversationBufferMemory(chat_memory=self.build_message_history()) @abstractmethod - def build_message_history(self) -> BaseChatMessageHistory: + def build_message_history(self) -> Memory: """Builds the chat message history memory.""" diff --git a/src/backend/base/langflow/components/helpers/memory.py b/src/backend/base/langflow/components/helpers/memory.py index 81611e292..b098df580 100644 --- a/src/backend/base/langflow/components/helpers/memory.py +++ b/src/backend/base/langflow/components/helpers/memory.py @@ -18,7 +18,7 @@ class MemoryComponent(Component): HandleInput( name="memory", display_name="External Memory", - input_types=["BaseChatMessageHistory"], + input_types=["Memory"], info="Retrieve messages from an external memory. If empty, it will use the Langflow tables.", ), DropdownInput( diff --git a/src/backend/base/langflow/components/helpers/store_message.py b/src/backend/base/langflow/components/helpers/store_message.py index 10ffab6df..544d2a09f 100644 --- a/src/backend/base/langflow/components/helpers/store_message.py +++ b/src/backend/base/langflow/components/helpers/store_message.py @@ -20,7 +20,7 @@ class StoreMessageComponent(Component): HandleInput( name="memory", display_name="External Memory", - input_types=["BaseChatMessageHistory"], + input_types=["Memory"], info="The external memory to store the message. If empty, it will use the Langflow tables.", ), MessageTextInput( diff --git a/src/backend/base/langflow/components/memories/astra_db.py b/src/backend/base/langflow/components/memories/astra_db.py index be53f03e9..6792057bc 100644 --- a/src/backend/base/langflow/components/memories/astra_db.py +++ b/src/backend/base/langflow/components/memories/astra_db.py @@ -3,7 +3,7 @@ import os from astrapy.admin import parse_api_endpoint from langflow.base.memory.model import LCChatMemoryComponent -from langflow.field_typing import BaseChatMessageHistory +from langflow.field_typing.constants import Memory from langflow.inputs import MessageTextInput, SecretStrInput, StrInput @@ -49,7 +49,7 @@ class AstraDBChatMemory(LCChatMemoryComponent): ), ] - def build_message_history(self) -> BaseChatMessageHistory: + def build_message_history(self) -> Memory: try: from langchain_astradb.chat_message_histories import AstraDBChatMessageHistory except ImportError as e: diff --git a/src/backend/base/langflow/components/memories/cassandra.py b/src/backend/base/langflow/components/memories/cassandra.py index 8bb1b6bb4..0eb694d2e 100644 --- a/src/backend/base/langflow/components/memories/cassandra.py +++ b/src/backend/base/langflow/components/memories/cassandra.py @@ -1,5 +1,5 @@ from langflow.base.memory.model import LCChatMemoryComponent -from langflow.field_typing import BaseChatMessageHistory +from langflow.field_typing.constants import Memory from langflow.inputs import DictInput, MessageTextInput, SecretStrInput @@ -49,7 +49,7 @@ class CassandraChatMemory(LCChatMemoryComponent): ), ] - def build_message_history(self) -> BaseChatMessageHistory: + def build_message_history(self) -> Memory: from langchain_community.chat_message_histories import CassandraChatMessageHistory try: diff --git a/src/backend/base/langflow/components/memories/redis.py b/src/backend/base/langflow/components/memories/redis.py index 39838e871..0b0e64665 100644 --- a/src/backend/base/langflow/components/memories/redis.py +++ b/src/backend/base/langflow/components/memories/redis.py @@ -3,7 +3,7 @@ from urllib import parse from langchain_community.chat_message_histories.redis import RedisChatMessageHistory from langflow.base.memory.model import LCChatMemoryComponent -from langflow.field_typing import BaseChatMessageHistory +from langflow.field_typing.constants import Memory from langflow.inputs import IntInput, MessageTextInput, SecretStrInput, StrInput @@ -31,7 +31,7 @@ class RedisIndexChatMemory(LCChatMemoryComponent): ), ] - def build_message_history(self) -> BaseChatMessageHistory: + def build_message_history(self) -> Memory: kwargs = {} password: str | None = self.password if self.key_prefix: diff --git a/src/backend/base/langflow/components/memories/zep.py b/src/backend/base/langflow/components/memories/zep.py index d9a4905cb..a051ee99d 100644 --- a/src/backend/base/langflow/components/memories/zep.py +++ b/src/backend/base/langflow/components/memories/zep.py @@ -1,5 +1,5 @@ from langflow.base.memory.model import LCChatMemoryComponent -from langflow.field_typing import BaseChatMessageHistory +from langflow.field_typing.constants import Memory from langflow.inputs import DropdownInput, MessageTextInput, SecretStrInput @@ -24,7 +24,7 @@ class ZepChatMemory(LCChatMemoryComponent): ), ] - def build_message_history(self) -> BaseChatMessageHistory: + def build_message_history(self) -> Memory: try: # Monkeypatch API_BASE_PATH to # avoid 404 diff --git a/src/backend/base/langflow/field_typing/constants.py b/src/backend/base/langflow/field_typing/constants.py index 3acc0f7ea..3444b659a 100644 --- a/src/backend/base/langflow/field_typing/constants.py +++ b/src/backend/base/langflow/field_typing/constants.py @@ -25,6 +25,8 @@ from langflow.schema.message import Message NestedDict: TypeAlias = dict[str, str | dict] LanguageModel = TypeVar("LanguageModel", BaseLanguageModel, BaseLLM, BaseChatModel) ToolEnabledLanguageModel = TypeVar("ToolEnabledLanguageModel", BaseLanguageModel, BaseLLM, BaseChatModel) +Memory = TypeVar("Memory", bound=BaseChatMessageHistory) + Retriever = TypeVar( "Retriever", BaseRetriever, @@ -65,7 +67,7 @@ LANGCHAIN_BASE_TYPES = { "BaseMemory": BaseMemory, "BaseChatMemory": BaseChatMemory, "BaseChatModel": BaseChatModel, - "BaseChatMessageHistory": BaseChatMessageHistory, + "Memory": Memory, } # Langchain base types plus Python base types CUSTOM_COMPONENT_SUPPORTED_TYPES = { diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Custom Component Maker.json b/src/backend/base/langflow/initial_setup/starter_projects/Custom Component Maker.json index d900fcd5d..28129574e 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Custom Component Maker.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Custom Component Maker.json @@ -573,7 +573,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.inputs import HandleInput\nfrom langflow.io import DropdownInput, IntInput, MessageTextInput, MultilineInput, Output\nfrom langflow.memory import aget_messages\nfrom langflow.schema import Data\nfrom langflow.schema.message import Message\nfrom langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_USER\n\n\nclass MemoryComponent(Component):\n display_name = \"Message History\"\n description = \"Retrieves stored chat messages from Langflow tables or an external memory.\"\n icon = \"message-square-more\"\n name = \"Memory\"\n\n inputs = [\n HandleInput(\n name=\"memory\",\n display_name=\"External Memory\",\n input_types=[\"BaseChatMessageHistory\"],\n info=\"Retrieve messages from an external memory. If empty, it will use the Langflow tables.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[MESSAGE_SENDER_AI, MESSAGE_SENDER_USER, \"Machine and User\"],\n value=\"Machine and User\",\n info=\"Filter by sender type.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"sender_name\",\n display_name=\"Sender Name\",\n info=\"Filter by sender name.\",\n advanced=True,\n ),\n IntInput(\n name=\"n_messages\",\n display_name=\"Number of Messages\",\n value=100,\n info=\"Number of messages to retrieve.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"session_id\",\n display_name=\"Session ID\",\n info=\"The session ID of the chat. If empty, the current session ID parameter will be used.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"order\",\n display_name=\"Order\",\n options=[\"Ascending\", \"Descending\"],\n value=\"Ascending\",\n info=\"Order of the messages.\",\n advanced=True,\n tool_mode=True,\n ),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. \"\n \"It can contain the keys {text}, {sender} or any other key in the message data.\",\n value=\"{sender_name}: {text}\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"messages\", method=\"retrieve_messages\"),\n Output(display_name=\"Text\", name=\"messages_text\", method=\"retrieve_messages_as_text\"),\n ]\n\n async def retrieve_messages(self) -> Data:\n sender = self.sender\n sender_name = self.sender_name\n session_id = self.session_id\n n_messages = self.n_messages\n order = \"DESC\" if self.order == \"Descending\" else \"ASC\"\n\n if sender == \"Machine and User\":\n sender = None\n\n if self.memory:\n # override session_id\n self.memory.session_id = session_id\n\n stored = await self.memory.aget_messages()\n # langchain memories are supposed to return messages in ascending order\n if order == \"DESC\":\n stored = stored[::-1]\n if n_messages:\n stored = stored[:n_messages]\n stored = [Message.from_lc_message(m) for m in stored]\n if sender:\n expected_type = MESSAGE_SENDER_AI if sender == MESSAGE_SENDER_AI else MESSAGE_SENDER_USER\n stored = [m for m in stored if m.type == expected_type]\n else:\n stored = await aget_messages(\n sender=sender,\n sender_name=sender_name,\n session_id=session_id,\n limit=n_messages,\n order=order,\n )\n self.status = stored\n return stored\n\n async def retrieve_messages_as_text(self) -> Message:\n stored_text = data_to_text(self.template, await self.retrieve_messages())\n self.status = stored_text\n return Message(text=stored_text)\n" + "value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.inputs import HandleInput\nfrom langflow.io import DropdownInput, IntInput, MessageTextInput, MultilineInput, Output\nfrom langflow.memory import aget_messages\nfrom langflow.schema import Data\nfrom langflow.schema.message import Message\nfrom langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_USER\n\n\nclass MemoryComponent(Component):\n display_name = \"Message History\"\n description = \"Retrieves stored chat messages from Langflow tables or an external memory.\"\n icon = \"message-square-more\"\n name = \"Memory\"\n\n inputs = [\n HandleInput(\n name=\"memory\",\n display_name=\"External Memory\",\n input_types=[\"Memory\"],\n info=\"Retrieve messages from an external memory. If empty, it will use the Langflow tables.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[MESSAGE_SENDER_AI, MESSAGE_SENDER_USER, \"Machine and User\"],\n value=\"Machine and User\",\n info=\"Filter by sender type.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"sender_name\",\n display_name=\"Sender Name\",\n info=\"Filter by sender name.\",\n advanced=True,\n ),\n IntInput(\n name=\"n_messages\",\n display_name=\"Number of Messages\",\n value=100,\n info=\"Number of messages to retrieve.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"session_id\",\n display_name=\"Session ID\",\n info=\"The session ID of the chat. If empty, the current session ID parameter will be used.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"order\",\n display_name=\"Order\",\n options=[\"Ascending\", \"Descending\"],\n value=\"Ascending\",\n info=\"Order of the messages.\",\n advanced=True,\n tool_mode=True,\n ),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. \"\n \"It can contain the keys {text}, {sender} or any other key in the message data.\",\n value=\"{sender_name}: {text}\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"messages\", method=\"retrieve_messages\"),\n Output(display_name=\"Text\", name=\"messages_text\", method=\"retrieve_messages_as_text\"),\n ]\n\n async def retrieve_messages(self) -> Data:\n sender = self.sender\n sender_name = self.sender_name\n session_id = self.session_id\n n_messages = self.n_messages\n order = \"DESC\" if self.order == \"Descending\" else \"ASC\"\n\n if sender == \"Machine and User\":\n sender = None\n\n if self.memory:\n # override session_id\n self.memory.session_id = session_id\n\n stored = await self.memory.aget_messages()\n # langchain memories are supposed to return messages in ascending order\n if order == \"DESC\":\n stored = stored[::-1]\n if n_messages:\n stored = stored[:n_messages]\n stored = [Message.from_lc_message(m) for m in stored]\n if sender:\n expected_type = MESSAGE_SENDER_AI if sender == MESSAGE_SENDER_AI else MESSAGE_SENDER_USER\n stored = [m for m in stored if m.type == expected_type]\n else:\n stored = await aget_messages(\n sender=sender,\n sender_name=sender_name,\n session_id=session_id,\n limit=n_messages,\n order=order,\n )\n self.status = stored\n return stored\n\n async def retrieve_messages_as_text(self) -> Message:\n stored_text = data_to_text(self.template, await self.retrieve_messages())\n self.status = stored_text\n return Message(text=stored_text)\n" }, "memory": { "_input_type": "HandleInput", @@ -582,7 +582,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Instagram Copywriter.json b/src/backend/base/langflow/initial_setup/starter_projects/Instagram Copywriter.json index 27fd77945..2f6662f95 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Instagram Copywriter.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Instagram Copywriter.json @@ -1838,7 +1838,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Market Research.json b/src/backend/base/langflow/initial_setup/starter_projects/Market Research.json index cdea2d1cd..76343132e 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Market Research.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Market Research.json @@ -2082,7 +2082,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json b/src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json index e414a269a..bb2c0fb98 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json @@ -1128,7 +1128,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.inputs import HandleInput\nfrom langflow.io import DropdownInput, IntInput, MessageTextInput, MultilineInput, Output\nfrom langflow.memory import aget_messages\nfrom langflow.schema import Data\nfrom langflow.schema.message import Message\nfrom langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_USER\n\n\nclass MemoryComponent(Component):\n display_name = \"Message History\"\n description = \"Retrieves stored chat messages from Langflow tables or an external memory.\"\n icon = \"message-square-more\"\n name = \"Memory\"\n\n inputs = [\n HandleInput(\n name=\"memory\",\n display_name=\"External Memory\",\n input_types=[\"BaseChatMessageHistory\"],\n info=\"Retrieve messages from an external memory. If empty, it will use the Langflow tables.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[MESSAGE_SENDER_AI, MESSAGE_SENDER_USER, \"Machine and User\"],\n value=\"Machine and User\",\n info=\"Filter by sender type.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"sender_name\",\n display_name=\"Sender Name\",\n info=\"Filter by sender name.\",\n advanced=True,\n ),\n IntInput(\n name=\"n_messages\",\n display_name=\"Number of Messages\",\n value=100,\n info=\"Number of messages to retrieve.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"session_id\",\n display_name=\"Session ID\",\n info=\"The session ID of the chat. If empty, the current session ID parameter will be used.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"order\",\n display_name=\"Order\",\n options=[\"Ascending\", \"Descending\"],\n value=\"Ascending\",\n info=\"Order of the messages.\",\n advanced=True,\n tool_mode=True,\n ),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. \"\n \"It can contain the keys {text}, {sender} or any other key in the message data.\",\n value=\"{sender_name}: {text}\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"messages\", method=\"retrieve_messages\"),\n Output(display_name=\"Text\", name=\"messages_text\", method=\"retrieve_messages_as_text\"),\n ]\n\n async def retrieve_messages(self) -> Data:\n sender = self.sender\n sender_name = self.sender_name\n session_id = self.session_id\n n_messages = self.n_messages\n order = \"DESC\" if self.order == \"Descending\" else \"ASC\"\n\n if sender == \"Machine and User\":\n sender = None\n\n if self.memory:\n # override session_id\n self.memory.session_id = session_id\n\n stored = await self.memory.aget_messages()\n # langchain memories are supposed to return messages in ascending order\n if order == \"DESC\":\n stored = stored[::-1]\n if n_messages:\n stored = stored[:n_messages]\n stored = [Message.from_lc_message(m) for m in stored]\n if sender:\n expected_type = MESSAGE_SENDER_AI if sender == MESSAGE_SENDER_AI else MESSAGE_SENDER_USER\n stored = [m for m in stored if m.type == expected_type]\n else:\n stored = await aget_messages(\n sender=sender,\n sender_name=sender_name,\n session_id=session_id,\n limit=n_messages,\n order=order,\n )\n self.status = stored\n return stored\n\n async def retrieve_messages_as_text(self) -> Message:\n stored_text = data_to_text(self.template, await self.retrieve_messages())\n self.status = stored_text\n return Message(text=stored_text)\n" + "value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.inputs import HandleInput\nfrom langflow.io import DropdownInput, IntInput, MessageTextInput, MultilineInput, Output\nfrom langflow.memory import aget_messages\nfrom langflow.schema import Data\nfrom langflow.schema.message import Message\nfrom langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_USER\n\n\nclass MemoryComponent(Component):\n display_name = \"Message History\"\n description = \"Retrieves stored chat messages from Langflow tables or an external memory.\"\n icon = \"message-square-more\"\n name = \"Memory\"\n\n inputs = [\n HandleInput(\n name=\"memory\",\n display_name=\"External Memory\",\n input_types=[\"Memory\"],\n info=\"Retrieve messages from an external memory. If empty, it will use the Langflow tables.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[MESSAGE_SENDER_AI, MESSAGE_SENDER_USER, \"Machine and User\"],\n value=\"Machine and User\",\n info=\"Filter by sender type.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"sender_name\",\n display_name=\"Sender Name\",\n info=\"Filter by sender name.\",\n advanced=True,\n ),\n IntInput(\n name=\"n_messages\",\n display_name=\"Number of Messages\",\n value=100,\n info=\"Number of messages to retrieve.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"session_id\",\n display_name=\"Session ID\",\n info=\"The session ID of the chat. If empty, the current session ID parameter will be used.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"order\",\n display_name=\"Order\",\n options=[\"Ascending\", \"Descending\"],\n value=\"Ascending\",\n info=\"Order of the messages.\",\n advanced=True,\n tool_mode=True,\n ),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. \"\n \"It can contain the keys {text}, {sender} or any other key in the message data.\",\n value=\"{sender_name}: {text}\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"messages\", method=\"retrieve_messages\"),\n Output(display_name=\"Text\", name=\"messages_text\", method=\"retrieve_messages_as_text\"),\n ]\n\n async def retrieve_messages(self) -> Data:\n sender = self.sender\n sender_name = self.sender_name\n session_id = self.session_id\n n_messages = self.n_messages\n order = \"DESC\" if self.order == \"Descending\" else \"ASC\"\n\n if sender == \"Machine and User\":\n sender = None\n\n if self.memory:\n # override session_id\n self.memory.session_id = session_id\n\n stored = await self.memory.aget_messages()\n # langchain memories are supposed to return messages in ascending order\n if order == \"DESC\":\n stored = stored[::-1]\n if n_messages:\n stored = stored[:n_messages]\n stored = [Message.from_lc_message(m) for m in stored]\n if sender:\n expected_type = MESSAGE_SENDER_AI if sender == MESSAGE_SENDER_AI else MESSAGE_SENDER_USER\n stored = [m for m in stored if m.type == expected_type]\n else:\n stored = await aget_messages(\n sender=sender,\n sender_name=sender_name,\n session_id=session_id,\n limit=n_messages,\n order=order,\n )\n self.status = stored\n return stored\n\n async def retrieve_messages_as_text(self) -> Message:\n stored_text = data_to_text(self.template, await self.retrieve_messages())\n self.status = stored_text\n return Message(text=stored_text)\n" }, "memory": { "_input_type": "HandleInput", @@ -1137,7 +1137,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Research Agent.json b/src/backend/base/langflow/initial_setup/starter_projects/Research Agent.json index 8557bbdbe..4ad106613 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Research Agent.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Research Agent.json @@ -2329,7 +2329,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/SaaS Pricing.json b/src/backend/base/langflow/initial_setup/starter_projects/SaaS Pricing.json index 2d260d156..054e16740 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/SaaS Pricing.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/SaaS Pricing.json @@ -903,7 +903,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents .json b/src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents .json index 354d7e9e7..f98684ddd 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents .json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents .json @@ -848,7 +848,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", @@ -1424,7 +1424,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", @@ -3315,7 +3315,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Simple Agent.json b/src/backend/base/langflow/initial_setup/starter_projects/Simple Agent.json index 0d95a4599..e248e3f05 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Simple Agent.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Simple Agent.json @@ -384,7 +384,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json b/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json index b3c18f2d4..5d554d7b3 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json @@ -1477,7 +1477,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", @@ -2053,7 +2053,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", @@ -2629,7 +2629,7 @@ "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", "input_types": [ - "BaseChatMessageHistory" + "Memory" ], "list": false, "name": "memory", diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts index e13b3b783..d8576719c 100644 --- a/src/frontend/src/utils/styleUtils.ts +++ b/src/frontend/src/utils/styleUtils.ts @@ -65,7 +65,6 @@ import { CopyPlus, CornerDownLeft, Cpu, - CpuIcon, Database, DatabaseZap, Delete, @@ -477,6 +476,7 @@ export const nodeColorsName: { [char: string]: string } = { Tool: "cyan", BaseChatMemory: "cyan", BaseChatMessageHistory: "orange", + Memory: "orange", }; export const SIDEBAR_CATEGORIES = [