From 5a7263a7cba244be186c165f2c50dc9fa9342ae9 Mon Sep 17 00:00:00 2001 From: ogabrielluiz Date: Fri, 7 Jun 2024 15:32:45 -0300 Subject: [PATCH 1/3] Allow models to receive Record as well --- .../base/langflow/components/models/AmazonBedrockModel.py | 2 +- .../base/langflow/components/models/AnthropicModel.py | 2 +- .../base/langflow/components/models/AzureOpenAIModel.py | 2 +- .../langflow/components/models/BaiduQianfanChatModel.py | 2 +- .../base/langflow/components/models/ChatLiteLLMModel.py | 2 +- .../base/langflow/components/models/CohereModel.py | 8 +++++--- .../base/langflow/components/models/HuggingFaceModel.py | 6 ++++-- .../base/langflow/components/models/MistralModel.py | 2 +- .../base/langflow/components/models/OllamaModel.py | 2 +- .../base/langflow/components/models/OpenAIModel.py | 2 +- .../base/langflow/components/models/VertexAiModel.py | 3 +-- 11 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/backend/base/langflow/components/models/AmazonBedrockModel.py b/src/backend/base/langflow/components/models/AmazonBedrockModel.py index 1015f1684..2ab1f426e 100644 --- a/src/backend/base/langflow/components/models/AmazonBedrockModel.py +++ b/src/backend/base/langflow/components/models/AmazonBedrockModel.py @@ -58,7 +58,7 @@ class AmazonBedrockComponent(LCModelComponent): "advanced": True, }, "cache": {"display_name": "Cache"}, - "input_value": {"display_name": "Input"}, + "input_value": {"display_name": "Input", "input_types": ["Text", "Record"]}, "system_message": { "display_name": "System Message", "info": "System message to pass to the model.", diff --git a/src/backend/base/langflow/components/models/AnthropicModel.py b/src/backend/base/langflow/components/models/AnthropicModel.py index cfe9ed900..8ea796f0d 100644 --- a/src/backend/base/langflow/components/models/AnthropicModel.py +++ b/src/backend/base/langflow/components/models/AnthropicModel.py @@ -63,7 +63,7 @@ class AnthropicLLM(LCModelComponent): "info": "Endpoint of the Anthropic API. Defaults to 'https://api.anthropic.com' if not specified.", }, "code": {"show": False}, - "input_value": {"display_name": "Input"}, + "input_value": {"display_name": "Input", "input_types": ["Text", "Record"]}, "stream": { "display_name": "Stream", "advanced": True, diff --git a/src/backend/base/langflow/components/models/AzureOpenAIModel.py b/src/backend/base/langflow/components/models/AzureOpenAIModel.py index c296a8fae..54ac1ec84 100644 --- a/src/backend/base/langflow/components/models/AzureOpenAIModel.py +++ b/src/backend/base/langflow/components/models/AzureOpenAIModel.py @@ -78,7 +78,7 @@ class AzureChatOpenAIComponent(LCModelComponent): "info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.", }, "code": {"show": False}, - "input_value": {"display_name": "Input"}, + "input_value": {"display_name": "Input", "input_types": ["Text", "Record"]}, "stream": { "display_name": "Stream", "info": STREAM_INFO_TEXT, diff --git a/src/backend/base/langflow/components/models/BaiduQianfanChatModel.py b/src/backend/base/langflow/components/models/BaiduQianfanChatModel.py index f5e6497d0..8ff9a424f 100644 --- a/src/backend/base/langflow/components/models/BaiduQianfanChatModel.py +++ b/src/backend/base/langflow/components/models/BaiduQianfanChatModel.py @@ -81,7 +81,7 @@ class QianfanChatEndpointComponent(LCModelComponent): "info": "Endpoint of the Qianfan LLM, required if custom model used.", }, "code": {"show": False}, - "input_value": {"display_name": "Input"}, + "input_value": {"display_name": "Input", "input_types": ["Text", "Record"]}, "stream": { "display_name": "Stream", "info": STREAM_INFO_TEXT, diff --git a/src/backend/base/langflow/components/models/ChatLiteLLMModel.py b/src/backend/base/langflow/components/models/ChatLiteLLMModel.py index 054b59d12..6d03f613e 100644 --- a/src/backend/base/langflow/components/models/ChatLiteLLMModel.py +++ b/src/backend/base/langflow/components/models/ChatLiteLLMModel.py @@ -111,7 +111,7 @@ class ChatLiteLLMModelComponent(LCModelComponent): "required": False, "default": False, }, - "input_value": {"display_name": "Input"}, + "input_value": {"display_name": "Input", "input_types": ["Text", "Record"]}, "stream": { "display_name": "Stream", "info": STREAM_INFO_TEXT, diff --git a/src/backend/base/langflow/components/models/CohereModel.py b/src/backend/base/langflow/components/models/CohereModel.py index 3bd12c095..a223a1455 100644 --- a/src/backend/base/langflow/components/models/CohereModel.py +++ b/src/backend/base/langflow/components/models/CohereModel.py @@ -1,10 +1,11 @@ from typing import Optional +from langchain_cohere import ChatCohere from pydantic.v1 import SecretStr -from langflow.field_typing import Text + from langflow.base.constants import STREAM_INFO_TEXT from langflow.base.models.model import LCModelComponent -from langchain_cohere import ChatCohere +from langflow.field_typing import Text class CohereComponent(LCModelComponent): @@ -42,7 +43,7 @@ class CohereComponent(LCModelComponent): "type": "float", "show": True, }, - "input_value": {"display_name": "Input"}, + "input_value": {"display_name": "Input", "input_types": ["Text", "Record"]}, "stream": { "display_name": "Stream", "info": STREAM_INFO_TEXT, @@ -69,3 +70,4 @@ class CohereComponent(LCModelComponent): temperature=temperature, ) return self.get_chat_result(output, stream, input_value, system_message) + return self.get_chat_result(output, stream, input_value, system_message) diff --git a/src/backend/base/langflow/components/models/HuggingFaceModel.py b/src/backend/base/langflow/components/models/HuggingFaceModel.py index 19750ef9f..9b7949bc7 100644 --- a/src/backend/base/langflow/components/models/HuggingFaceModel.py +++ b/src/backend/base/langflow/components/models/HuggingFaceModel.py @@ -2,9 +2,10 @@ from typing import Optional from langchain_community.chat_models.huggingface import ChatHuggingFace from langchain_community.llms.huggingface_endpoint import HuggingFaceEndpoint -from langflow.field_typing import Text + from langflow.base.constants import STREAM_INFO_TEXT from langflow.base.models.model import LCModelComponent +from langflow.field_typing import Text class HuggingFaceEndpointsComponent(LCModelComponent): @@ -36,7 +37,7 @@ class HuggingFaceEndpointsComponent(LCModelComponent): "advanced": True, }, "code": {"show": False}, - "input_value": {"display_name": "Input"}, + "input_value": {"display_name": "Input", "input_types": ["Text", "Record"]}, "stream": { "display_name": "Stream", "info": STREAM_INFO_TEXT, @@ -72,3 +73,4 @@ class HuggingFaceEndpointsComponent(LCModelComponent): raise ValueError("Could not connect to HuggingFace Endpoints API.") from e output = ChatHuggingFace(llm=llm) return self.get_chat_result(output, stream, input_value, system_message) + return self.get_chat_result(output, stream, input_value, system_message) diff --git a/src/backend/base/langflow/components/models/MistralModel.py b/src/backend/base/langflow/components/models/MistralModel.py index 305a45e4b..dc77655b0 100644 --- a/src/backend/base/langflow/components/models/MistralModel.py +++ b/src/backend/base/langflow/components/models/MistralModel.py @@ -27,7 +27,7 @@ class MistralAIModelComponent(LCModelComponent): def build_config(self): return { - "input_value": {"display_name": "Input"}, + "input_value": {"display_name": "Input", "input_types": ["Text", "Record"]}, "max_tokens": { "display_name": "Max Tokens", "advanced": True, diff --git a/src/backend/base/langflow/components/models/OllamaModel.py b/src/backend/base/langflow/components/models/OllamaModel.py index f591e4a5c..a68fff9e3 100644 --- a/src/backend/base/langflow/components/models/OllamaModel.py +++ b/src/backend/base/langflow/components/models/OllamaModel.py @@ -194,7 +194,7 @@ class ChatOllamaComponent(LCModelComponent): "info": "Template to use for generating text.", "advanced": True, }, - "input_value": {"display_name": "Input"}, + "input_value": {"display_name": "Input", "input_types": ["Text", "Record"]}, "stream": { "display_name": "Stream", "info": STREAM_INFO_TEXT, diff --git a/src/backend/base/langflow/components/models/OpenAIModel.py b/src/backend/base/langflow/components/models/OpenAIModel.py index 0aedce495..94e0a78ee 100644 --- a/src/backend/base/langflow/components/models/OpenAIModel.py +++ b/src/backend/base/langflow/components/models/OpenAIModel.py @@ -28,7 +28,7 @@ class OpenAIModelComponent(LCModelComponent): def build_config(self): return { - "input_value": {"display_name": "Input"}, + "input_value": {"display_name": "Input", "input_types": ["Text", "Record"]}, "max_tokens": { "display_name": "Max Tokens", "advanced": True, diff --git a/src/backend/base/langflow/components/models/VertexAiModel.py b/src/backend/base/langflow/components/models/VertexAiModel.py index a992447f4..b5af1fac2 100644 --- a/src/backend/base/langflow/components/models/VertexAiModel.py +++ b/src/backend/base/langflow/components/models/VertexAiModel.py @@ -1,6 +1,5 @@ from typing import Optional - from langflow.base.constants import STREAM_INFO_TEXT from langflow.base.models.model import LCModelComponent from langflow.field_typing import Text @@ -74,7 +73,7 @@ class ChatVertexAIComponent(LCModelComponent): "value": False, "advanced": True, }, - "input_value": {"display_name": "Input"}, + "input_value": {"display_name": "Input", "input_types": ["Text", "Record"]}, "stream": { "display_name": "Stream", "info": STREAM_INFO_TEXT, From 880cf81fa30478c983894167cb60f3a5e6cee5cb Mon Sep 17 00:00:00 2001 From: ogabrielluiz Date: Fri, 7 Jun 2024 15:33:05 -0300 Subject: [PATCH 2/3] update projects --- .../Basic Prompting (Hello, world!).json | 153 ++++-- .../Langflow Blog Writter.json | 194 +++++-- .../Langflow Document QA.json | 169 +++++-- .../Langflow Memory Conversation.json | 234 +++++++-- .../Langflow Prompt Chaining.json | 323 +++++++++--- .../VectorStore-RAG-Flows.json | 473 ++++++++++++++---- 6 files changed, 1209 insertions(+), 337 deletions(-) diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting (Hello, world!).json b/src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting (Hello, world!).json index 4b0fc24e3..e14ae756d 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting (Hello, world!).json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting (Hello, world!).json @@ -45,7 +45,9 @@ "name": "template", "display_name": "Template", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -84,14 +86,22 @@ "is_input": null, "is_output": null, "is_composition": null, - "base_classes": ["object", "str", "Text"], + "base_classes": [ + "object", + "str", + "Text" + ], "name": "", "display_name": "Prompt", "documentation": "", "custom_fields": { - "template": ["user_input"] + "template": [ + "user_input" + ] }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "full_path": null, "field_formatters": {}, "frozen": false, @@ -140,7 +150,10 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text", + "Record" + ] }, "code": { "type": "code", @@ -149,7 +162,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\"},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", + "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\", \"input_types\": [\"Text\", \"Record\"]},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", "fileTypes": [], "file_path": "", "password": false, @@ -223,7 +236,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_base": { "type": "str", @@ -242,7 +257,9 @@ "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_key": { "type": "str", @@ -261,7 +278,9 @@ "info": "The OpenAI API Key to use for the OpenAI model.", "load_from_db": true, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "OPENAI_API_KEY" }, "stream": { @@ -300,7 +319,9 @@ "info": "System message to pass to the model.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "temperature": { "type": "float", @@ -331,7 +352,11 @@ }, "description": "Generates text using OpenAI LLMs.", "icon": "OpenAI", - "base_classes": ["object", "Text", "str"], + "base_classes": [ + "object", + "Text", + "str" + ], "display_name": "OpenAI", "documentation": "", "custom_fields": { @@ -345,7 +370,9 @@ "stream": null, "system_message": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [ @@ -416,7 +443,9 @@ "name": "input_value", "display_name": "Message", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -440,7 +469,9 @@ "info": "In case of Message being a Record, this template will be used to convert it to text.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "return_record": { "type": "bool", @@ -472,7 +503,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "name": "sender", "display_name": "Sender Type", "advanced": true, @@ -480,7 +514,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender_name": { "type": "str", @@ -500,7 +536,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "session_id": { "type": "str", @@ -519,13 +557,20 @@ "info": "If provided, the message will be stored in the memory.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Display a chat message in the Playground.", "icon": "ChatOutput", - "base_classes": ["Record", "Text", "str", "object"], + "base_classes": [ + "Record", + "Text", + "str", + "object" + ], "display_name": "Chat Output", "documentation": "", "custom_fields": { @@ -536,7 +581,10 @@ "return_record": null, "record_template": null }, - "output_types": ["Text", "Record"], + "output_types": [ + "Text", + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -632,7 +680,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "name": "sender", "display_name": "Sender Type", "advanced": true, @@ -640,7 +691,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender_name": { "type": "str", @@ -660,7 +713,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "session_id": { "type": "str", @@ -679,13 +734,20 @@ "info": "If provided, the message will be stored in the memory.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Get chat inputs from the Playground.", "icon": "ChatInput", - "base_classes": ["object", "Record", "str", "Text"], + "base_classes": [ + "object", + "Record", + "str", + "Text" + ], "display_name": "Chat Input", "documentation": "", "custom_fields": { @@ -695,7 +757,10 @@ "session_id": null, "return_record": null }, - "output_types": ["Text", "Record"], + "output_types": [ + "Text", + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -723,11 +788,17 @@ "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-njtka", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "Text", "str"], + "baseClasses": [ + "object", + "Text", + "str" + ], "dataType": "OpenAIModel", "id": "OpenAIModel-k39HS" } @@ -747,11 +818,17 @@ "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-k39HS", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "str", "Text"], + "baseClasses": [ + "object", + "str", + "Text" + ], "dataType": "Prompt", "id": "Prompt-uxBqP" } @@ -771,11 +848,21 @@ "targetHandle": { "fieldName": "user_input", "id": "Prompt-uxBqP", - "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"], + "inputTypes": [ + "Document", + "BaseOutputParser", + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "Record", "str", "Text"], + "baseClasses": [ + "object", + "Record", + "str", + "Text" + ], "dataType": "ChatInput", "id": "ChatInput-P3fgL" } @@ -797,4 +884,4 @@ "name": "Basic Prompting (Hello, World)", "last_tested_version": "1.0.0a4", "is_component": false -} +} \ No newline at end of file diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Langflow Blog Writter.json b/src/backend/base/langflow/initial_setup/starter_projects/Langflow Blog Writter.json index 2a7d0ff06..3cecca755 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Langflow Blog Writter.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Langflow Blog Writter.json @@ -45,7 +45,9 @@ "name": "template", "display_name": "Template", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -136,14 +138,24 @@ "is_input": null, "is_output": null, "is_composition": null, - "base_classes": ["object", "Text", "str"], + "base_classes": [ + "object", + "Text", + "str" + ], "name": "", "display_name": "Prompt", "documentation": "", "custom_fields": { - "template": ["reference_1", "reference_2", "instructions"] + "template": [ + "reference_1", + "reference_2", + "instructions" + ] }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "full_path": null, "field_formatters": {}, "frozen": false, @@ -210,7 +222,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": [ "https://www.promptingguide.ai/techniques/prompt_chaining" ] @@ -219,13 +233,17 @@ }, "description": "Fetch content from one or more URLs.", "icon": "layout-template", - "base_classes": ["Record"], + "base_classes": [ + "Record" + ], "display_name": "URL", "documentation": "", "custom_fields": { "urls": null }, - "output_types": ["Record"], + "output_types": [ + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -284,7 +302,9 @@ "name": "input_value", "display_name": "Message", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -308,7 +328,9 @@ "info": "In case of Message being a Record, this template will be used to convert it to text.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "return_record": { "type": "bool", @@ -340,7 +362,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "name": "sender", "display_name": "Sender Type", "advanced": true, @@ -348,7 +373,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender_name": { "type": "str", @@ -368,7 +395,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "session_id": { "type": "str", @@ -387,13 +416,20 @@ "info": "If provided, the message will be stored in the memory.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Display a chat message in the Playground.", "icon": "ChatOutput", - "base_classes": ["Text", "Record", "object", "str"], + "base_classes": [ + "Text", + "Record", + "object", + "str" + ], "display_name": "Chat Output", "documentation": "", "custom_fields": { @@ -404,7 +440,10 @@ "return_record": null, "record_template": null }, - "output_types": ["Text", "Record"], + "output_types": [ + "Text", + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -444,7 +483,10 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text", + "Record" + ] }, "code": { "type": "code", @@ -453,7 +495,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\"},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", + "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\", \"input_types\": [\"Text\", \"Record\"]},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", "fileTypes": [], "file_path": "", "password": false, @@ -527,7 +569,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_base": { "type": "str", @@ -546,7 +590,9 @@ "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_key": { "type": "str", @@ -565,7 +611,9 @@ "info": "The OpenAI API Key to use for the OpenAI model.", "load_from_db": false, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "OPENAI_API_KEY" }, "stream": { @@ -604,7 +652,9 @@ "info": "System message to pass to the model.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "temperature": { "type": "float", @@ -635,7 +685,11 @@ }, "description": "Generates text using OpenAI LLMs.", "icon": "OpenAI", - "base_classes": ["str", "Text", "object"], + "base_classes": [ + "str", + "Text", + "object" + ], "display_name": "OpenAI", "documentation": "", "custom_fields": { @@ -649,7 +703,9 @@ "stream": null, "system_message": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [ @@ -722,20 +778,28 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"], - "value": ["https://www.promptingguide.ai/introduction/basics"] + "input_types": [ + "Text" + ], + "value": [ + "https://www.promptingguide.ai/introduction/basics" + ] }, "_type": "CustomComponent" }, "description": "Fetch content from one or more URLs.", "icon": "layout-template", - "base_classes": ["Record"], + "base_classes": [ + "Record" + ], "display_name": "URL", "documentation": "", "custom_fields": { "urls": null }, - "output_types": ["Record"], + "output_types": [ + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -795,7 +859,10 @@ "name": "input_value", "display_name": "Value", "advanced": false, - "input_types": ["Record", "Text"], + "input_types": [ + "Record", + "Text" + ], "dynamic": false, "info": "Text or Record to be passed as input.", "load_from_db": false, @@ -819,20 +886,28 @@ "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Get text inputs from the Playground.", "icon": "type", - "base_classes": ["object", "Text", "str"], + "base_classes": [ + "object", + "Text", + "str" + ], "display_name": "Instructions", "documentation": "", "custom_fields": { "input_value": null, "record_template": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -861,11 +936,18 @@ "targetHandle": { "fieldName": "reference_2", "id": "Prompt-Rse03", - "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"], + "inputTypes": [ + "Document", + "BaseOutputParser", + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["Record"], + "baseClasses": [ + "Record" + ], "dataType": "URL", "id": "URL-HYPkR" } @@ -885,11 +967,17 @@ "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-JPlxl", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["str", "Text", "object"], + "baseClasses": [ + "str", + "Text", + "object" + ], "dataType": "OpenAIModel", "id": "OpenAIModel-gi29P" } @@ -909,11 +997,18 @@ "targetHandle": { "fieldName": "reference_1", "id": "Prompt-Rse03", - "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"], + "inputTypes": [ + "Document", + "BaseOutputParser", + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["Record"], + "baseClasses": [ + "Record" + ], "dataType": "URL", "id": "URL-2cX90" } @@ -933,11 +1028,20 @@ "targetHandle": { "fieldName": "instructions", "id": "Prompt-Rse03", - "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"], + "inputTypes": [ + "Document", + "BaseOutputParser", + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "Text", "str"], + "baseClasses": [ + "object", + "Text", + "str" + ], "dataType": "TextInput", "id": "TextInput-og8Or" } @@ -957,11 +1061,17 @@ "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-gi29P", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "Text", "str"], + "baseClasses": [ + "object", + "Text", + "str" + ], "dataType": "Prompt", "id": "Prompt-Rse03" } @@ -984,4 +1094,4 @@ "name": "Blog Writer", "last_tested_version": "1.0.0a0", "is_component": false -} +} \ No newline at end of file diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Langflow Document QA.json b/src/backend/base/langflow/initial_setup/starter_projects/Langflow Document QA.json index f559c5236..8c93967a9 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Langflow Document QA.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Langflow Document QA.json @@ -45,7 +45,9 @@ "name": "template", "display_name": "Template", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -110,14 +112,23 @@ "is_input": null, "is_output": null, "is_composition": null, - "base_classes": ["object", "str", "Text"], + "base_classes": [ + "object", + "str", + "Text" + ], "name": "", "display_name": "Prompt", "documentation": "", "custom_fields": { - "template": ["Document", "Question"] + "template": [ + "Document", + "Question" + ] }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "full_path": null, "field_formatters": {}, "frozen": false, @@ -220,14 +231,18 @@ "_type": "CustomComponent" }, "description": "A generic file loader.", - "base_classes": ["Record"], + "base_classes": [ + "Record" + ], "display_name": "Files", "documentation": "", "custom_fields": { "path": null, "silent_errors": null }, - "output_types": ["Record"], + "output_types": [ + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -323,7 +338,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "name": "sender", "display_name": "Sender Type", "advanced": true, @@ -331,7 +349,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender_name": { "type": "str", @@ -351,7 +371,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "session_id": { "type": "str", @@ -370,13 +392,20 @@ "info": "If provided, the message will be stored in the memory.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Get chat inputs from the Playground.", "icon": "ChatInput", - "base_classes": ["str", "Record", "Text", "object"], + "base_classes": [ + "str", + "Record", + "Text", + "object" + ], "display_name": "Chat Input", "documentation": "", "custom_fields": { @@ -386,7 +415,10 @@ "session_id": null, "return_record": null }, - "output_types": ["Text", "Record"], + "output_types": [ + "Text", + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -445,7 +477,9 @@ "name": "input_value", "display_name": "Message", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -481,7 +515,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "name": "sender", "display_name": "Sender Type", "advanced": true, @@ -489,7 +526,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender_name": { "type": "str", @@ -509,7 +548,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "session_id": { "type": "str", @@ -528,13 +569,20 @@ "info": "If provided, the message will be stored in the memory.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Display a chat message in the Playground.", "icon": "ChatOutput", - "base_classes": ["str", "Record", "Text", "object"], + "base_classes": [ + "str", + "Record", + "Text", + "object" + ], "display_name": "Chat Output", "documentation": "", "custom_fields": { @@ -544,7 +592,10 @@ "session_id": null, "return_record": null }, - "output_types": ["Text", "Record"], + "output_types": [ + "Text", + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -589,7 +640,10 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text", + "Record" + ] }, "code": { "type": "code", @@ -598,7 +652,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\"},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", + "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\", \"input_types\": [\"Text\", \"Record\"]},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", "fileTypes": [], "file_path": "", "password": false, @@ -672,7 +726,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_base": { "type": "str", @@ -691,7 +747,9 @@ "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_key": { "type": "str", @@ -710,7 +768,9 @@ "info": "The OpenAI API Key to use for the OpenAI model.", "load_from_db": false, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "OPENAI_API_KEY" }, "stream": { @@ -749,7 +809,9 @@ "info": "System message to pass to the model.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "temperature": { "type": "float", @@ -780,7 +842,11 @@ }, "description": "Generates text using OpenAI LLMs.", "icon": "OpenAI", - "base_classes": ["object", "str", "Text"], + "base_classes": [ + "object", + "str", + "Text" + ], "display_name": "OpenAI", "documentation": "", "custom_fields": { @@ -794,7 +860,9 @@ "stream": null, "system_message": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [ @@ -832,11 +900,21 @@ "targetHandle": { "fieldName": "Question", "id": "Prompt-tHwPf", - "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"], + "inputTypes": [ + "Document", + "BaseOutputParser", + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["str", "Record", "Text", "object"], + "baseClasses": [ + "str", + "Record", + "Text", + "object" + ], "dataType": "ChatInput", "id": "ChatInput-MsSJ9" } @@ -856,11 +934,18 @@ "targetHandle": { "fieldName": "Document", "id": "Prompt-tHwPf", - "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"], + "inputTypes": [ + "Document", + "BaseOutputParser", + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["Record"], + "baseClasses": [ + "Record" + ], "dataType": "File", "id": "File-6TEsD" } @@ -880,11 +965,17 @@ "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-Bt067", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "str", "Text"], + "baseClasses": [ + "object", + "str", + "Text" + ], "dataType": "Prompt", "id": "Prompt-tHwPf" } @@ -904,11 +995,17 @@ "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-F5Awj", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "str", "Text"], + "baseClasses": [ + "object", + "str", + "Text" + ], "dataType": "OpenAIModel", "id": "OpenAIModel-Bt067" } @@ -930,4 +1027,4 @@ "name": "Document QA", "last_tested_version": "1.0.0a0", "is_component": false -} +} \ No newline at end of file diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Langflow Memory Conversation.json b/src/backend/base/langflow/initial_setup/starter_projects/Langflow Memory Conversation.json index c16b47d39..18c81d063 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Langflow Memory Conversation.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Langflow Memory Conversation.json @@ -83,7 +83,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "name": "sender", "display_name": "Sender Type", "advanced": true, @@ -91,7 +94,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender_name": { "type": "str", @@ -111,7 +116,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "session_id": { "type": "str", @@ -130,14 +137,21 @@ "info": "If provided, the message will be stored in the memory.", "load_from_db": false, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "MySessionID" }, "_type": "CustomComponent" }, "description": "Get chat inputs from the Playground.", "icon": "ChatInput", - "base_classes": ["Text", "object", "Record", "str"], + "base_classes": [ + "Text", + "object", + "Record", + "str" + ], "display_name": "Chat Input", "documentation": "", "custom_fields": { @@ -147,7 +161,10 @@ "session_id": null, "return_record": null }, - "output_types": ["Text", "Record"], + "output_types": [ + "Text", + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -206,7 +223,9 @@ "name": "input_value", "display_name": "Message", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -242,7 +261,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "name": "sender", "display_name": "Sender Type", "advanced": true, @@ -250,7 +272,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender_name": { "type": "str", @@ -270,7 +294,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "session_id": { "type": "str", @@ -289,14 +315,21 @@ "info": "If provided, the message will be stored in the memory.", "load_from_db": false, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "MySessionID" }, "_type": "CustomComponent" }, "description": "Display a chat message in the Playground.", "icon": "ChatOutput", - "base_classes": ["Text", "object", "Record", "str"], + "base_classes": [ + "Text", + "object", + "Record", + "str" + ], "display_name": "Chat Output", "documentation": "", "custom_fields": { @@ -306,7 +339,10 @@ "session_id": null, "return_record": null }, - "output_types": ["Text", "Record"], + "output_types": [ + "Text", + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -382,7 +418,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Ascending", "Descending"], + "options": [ + "Ascending", + "Descending" + ], "name": "order", "display_name": "Order", "advanced": true, @@ -390,7 +429,9 @@ "info": "Order of the messages.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "record_template": { "type": "str", @@ -410,7 +451,9 @@ "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender": { "type": "str", @@ -423,7 +466,11 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Machine", "User", "Machine and User"], + "options": [ + "Machine", + "User", + "Machine and User" + ], "name": "sender", "display_name": "Sender Type", "advanced": false, @@ -431,7 +478,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender_name": { "type": "str", @@ -450,7 +499,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "session_id": { "type": "str", @@ -465,7 +516,9 @@ "name": "session_id", "display_name": "Session ID", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "Session ID of the chat history.", "load_from_db": false, @@ -476,7 +529,11 @@ }, "description": "Retrieves stored chat messages given a specific Session ID.", "icon": "history", - "base_classes": ["str", "Text", "object"], + "base_classes": [ + "str", + "Text", + "object" + ], "display_name": "Chat Memory", "documentation": "", "custom_fields": { @@ -487,7 +544,9 @@ "order": null, "record_template": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -549,7 +608,9 @@ "name": "template", "display_name": "Template", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -614,14 +675,23 @@ "is_input": null, "is_output": null, "is_composition": null, - "base_classes": ["Text", "str", "object"], + "base_classes": [ + "Text", + "str", + "object" + ], "name": "", "display_name": "Prompt", "documentation": "", "custom_fields": { - "template": ["context", "user_message"] + "template": [ + "context", + "user_message" + ] }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "full_path": null, "field_formatters": {}, "frozen": false, @@ -670,7 +740,10 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text", + "Record" + ] }, "code": { "type": "code", @@ -679,7 +752,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\"},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", + "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\", \"input_types\": [\"Text\", \"Record\"]},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", "fileTypes": [], "file_path": "", "password": false, @@ -753,7 +826,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_base": { "type": "str", @@ -772,7 +847,9 @@ "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_key": { "type": "str", @@ -791,7 +868,9 @@ "info": "The OpenAI API Key to use for the OpenAI model.", "load_from_db": false, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "OPENAI_API_KEY" }, "stream": { @@ -830,7 +909,9 @@ "info": "System message to pass to the model.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "temperature": { "type": "float", @@ -861,7 +942,11 @@ }, "description": "Generates text using OpenAI LLMs.", "icon": "OpenAI", - "base_classes": ["str", "object", "Text"], + "base_classes": [ + "str", + "object", + "Text" + ], "display_name": "OpenAI", "documentation": "", "custom_fields": { @@ -875,7 +960,9 @@ "stream": null, "system_message": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [ @@ -927,7 +1014,10 @@ "name": "input_value", "display_name": "Value", "advanced": false, - "input_types": ["Record", "Text"], + "input_types": [ + "Record", + "Text" + ], "dynamic": false, "info": "Text or Record to be passed as output.", "load_from_db": false, @@ -969,20 +1059,28 @@ "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Display a text output in the Playground.", "icon": "type", - "base_classes": ["str", "object", "Text"], + "base_classes": [ + "str", + "object", + "Text" + ], "display_name": "Inspect Memory", "documentation": "", "custom_fields": { "input_value": null, "record_template": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -1011,10 +1109,19 @@ "fieldName": "context", "type": "str", "id": "Prompt-ODkUx", - "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"] + "inputTypes": [ + "Document", + "BaseOutputParser", + "Record", + "Text" + ] }, "sourceHandle": { - "baseClasses": ["str", "Text", "object"], + "baseClasses": [ + "str", + "Text", + "object" + ], "dataType": "MemoryComponent", "id": "MemoryComponent-cdA1J" } @@ -1036,10 +1143,20 @@ "fieldName": "user_message", "type": "str", "id": "Prompt-ODkUx", - "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"] + "inputTypes": [ + "Document", + "BaseOutputParser", + "Record", + "Text" + ] }, "sourceHandle": { - "baseClasses": ["Text", "object", "Record", "str"], + "baseClasses": [ + "Text", + "object", + "Record", + "str" + ], "dataType": "ChatInput", "id": "ChatInput-t7F8v" } @@ -1060,11 +1177,17 @@ "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-9RykF", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["Text", "str", "object"], + "baseClasses": [ + "Text", + "str", + "object" + ], "dataType": "Prompt", "id": "Prompt-ODkUx" } @@ -1084,11 +1207,17 @@ "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-P1jEe", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["str", "object", "Text"], + "baseClasses": [ + "str", + "object", + "Text" + ], "dataType": "OpenAIModel", "id": "OpenAIModel-9RykF" } @@ -1108,11 +1237,18 @@ "targetHandle": { "fieldName": "input_value", "id": "TextOutput-vrs6T", - "inputTypes": ["Record", "Text"], + "inputTypes": [ + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["str", "Text", "object"], + "baseClasses": [ + "str", + "Text", + "object" + ], "dataType": "MemoryComponent", "id": "MemoryComponent-cdA1J" } @@ -1134,4 +1270,4 @@ "name": "Memory Chatbot", "last_tested_version": "1.0.0a0", "is_component": false -} +} \ No newline at end of file diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Langflow Prompt Chaining.json b/src/backend/base/langflow/initial_setup/starter_projects/Langflow Prompt Chaining.json index 04b4607c8..e7d78268c 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Langflow Prompt Chaining.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Langflow Prompt Chaining.json @@ -45,7 +45,9 @@ "name": "template", "display_name": "Template", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -84,14 +86,22 @@ "is_input": null, "is_output": null, "is_composition": null, - "base_classes": ["object", "str", "Text"], + "base_classes": [ + "object", + "str", + "Text" + ], "name": "", "display_name": "Prompt", "documentation": "", "custom_fields": { - "template": ["document"] + "template": [ + "document" + ] }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "full_path": null, "field_formatters": {}, "frozen": false, @@ -155,7 +165,9 @@ "name": "template", "display_name": "Template", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -194,14 +206,22 @@ "is_input": null, "is_output": null, "is_composition": null, - "base_classes": ["object", "str", "Text"], + "base_classes": [ + "object", + "str", + "Text" + ], "name": "", "display_name": "Prompt", "documentation": "", "custom_fields": { - "template": ["summary"] + "template": [ + "summary" + ] }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "full_path": null, "field_formatters": {}, "frozen": false, @@ -260,7 +280,9 @@ "name": "input_value", "display_name": "Message", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -284,7 +306,9 @@ "info": "In case of Message being a Record, this template will be used to convert it to text.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "return_record": { "type": "bool", @@ -316,7 +340,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "name": "sender", "display_name": "Sender Type", "advanced": true, @@ -324,7 +351,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender_name": { "type": "str", @@ -344,7 +373,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "session_id": { "type": "str", @@ -363,13 +394,20 @@ "info": "If provided, the message will be stored in the memory.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Display a chat message in the Playground.", "icon": "ChatOutput", - "base_classes": ["object", "Record", "Text", "str"], + "base_classes": [ + "object", + "Record", + "Text", + "str" + ], "display_name": "Chat Output", "documentation": "", "custom_fields": { @@ -380,7 +418,10 @@ "return_record": null, "record_template": null }, - "output_types": ["Text", "Record"], + "output_types": [ + "Text", + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -435,7 +476,9 @@ "name": "input_value", "display_name": "Message", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -459,7 +502,9 @@ "info": "In case of Message being a Record, this template will be used to convert it to text.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "return_record": { "type": "bool", @@ -491,7 +536,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "name": "sender", "display_name": "Sender Type", "advanced": true, @@ -499,7 +547,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender_name": { "type": "str", @@ -519,7 +569,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "session_id": { "type": "str", @@ -538,13 +590,20 @@ "info": "If provided, the message will be stored in the memory.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Display a chat message in the Playground.", "icon": "ChatOutput", - "base_classes": ["object", "Record", "Text", "str"], + "base_classes": [ + "object", + "Record", + "Text", + "str" + ], "display_name": "Chat Output", "documentation": "", "custom_fields": { @@ -555,7 +614,10 @@ "return_record": null, "record_template": null }, - "output_types": ["Text", "Record"], + "output_types": [ + "Text", + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -610,7 +672,10 @@ "name": "input_value", "display_name": "Value", "advanced": false, - "input_types": ["Record", "Text"], + "input_types": [ + "Record", + "Text" + ], "dynamic": false, "info": "Text or Record to be passed as input.", "load_from_db": false, @@ -634,20 +699,28 @@ "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Get text inputs from the Playground.", "icon": "type", - "base_classes": ["str", "Text", "object"], + "base_classes": [ + "str", + "Text", + "object" + ], "display_name": "Text Input", "documentation": "", "custom_fields": { "input_value": null, "record_template": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -689,7 +762,10 @@ "name": "input_value", "display_name": "Value", "advanced": false, - "input_types": ["Record", "Text"], + "input_types": [ + "Record", + "Text" + ], "dynamic": false, "info": "Text or Record to be passed as output.", "load_from_db": false, @@ -731,20 +807,28 @@ "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Display a text output in the Playground.", "icon": "type", - "base_classes": ["str", "Text", "object"], + "base_classes": [ + "str", + "Text", + "object" + ], "display_name": "First Prompt", "documentation": "", "custom_fields": { "input_value": null, "record_template": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -789,7 +873,10 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text", + "Record" + ] }, "code": { "type": "code", @@ -798,7 +885,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\"},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", + "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\", \"input_types\": [\"Text\", \"Record\"]},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", "fileTypes": [], "file_path": "", "password": false, @@ -872,7 +959,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_base": { "type": "str", @@ -891,7 +980,9 @@ "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_key": { "type": "str", @@ -910,7 +1001,9 @@ "info": "The OpenAI API Key to use for the OpenAI model.", "load_from_db": false, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "OPENAI_API_KEY" }, "stream": { @@ -949,7 +1042,9 @@ "info": "System message to pass to the model.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "temperature": { "type": "float", @@ -980,7 +1075,11 @@ }, "description": "Generates text using OpenAI LLMs.", "icon": "OpenAI", - "base_classes": ["str", "Text", "object"], + "base_classes": [ + "str", + "Text", + "object" + ], "display_name": "OpenAI", "documentation": "", "custom_fields": { @@ -994,7 +1093,9 @@ "stream": null, "system_message": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [ @@ -1046,7 +1147,10 @@ "name": "input_value", "display_name": "Value", "advanced": false, - "input_types": ["Record", "Text"], + "input_types": [ + "Record", + "Text" + ], "dynamic": false, "info": "Text or Record to be passed as output.", "load_from_db": false, @@ -1088,20 +1192,28 @@ "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Display a text output in the Playground.", "icon": "type", - "base_classes": ["str", "Text", "object"], + "base_classes": [ + "str", + "Text", + "object" + ], "display_name": "Second Prompt", "documentation": "", "custom_fields": { "input_value": null, "record_template": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -1146,7 +1258,10 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text", + "Record" + ] }, "code": { "type": "code", @@ -1155,7 +1270,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\"},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", + "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\", \"input_types\": [\"Text\", \"Record\"]},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", "fileTypes": [], "file_path": "", "password": false, @@ -1229,7 +1344,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_base": { "type": "str", @@ -1248,7 +1365,9 @@ "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_key": { "type": "str", @@ -1267,7 +1386,9 @@ "info": "The OpenAI API Key to use for the OpenAI model.", "load_from_db": false, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "" }, "stream": { @@ -1306,7 +1427,9 @@ "info": "System message to pass to the model.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "temperature": { "type": "float", @@ -1337,7 +1460,11 @@ }, "description": "Generates text using OpenAI LLMs.", "icon": "OpenAI", - "base_classes": ["str", "Text", "object"], + "base_classes": [ + "str", + "Text", + "object" + ], "display_name": "OpenAI", "documentation": "", "custom_fields": { @@ -1351,7 +1478,9 @@ "stream": null, "system_message": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [ @@ -1389,11 +1518,20 @@ "targetHandle": { "fieldName": "document", "id": "Prompt-amqBu", - "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"], + "inputTypes": [ + "Document", + "BaseOutputParser", + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["str", "Text", "object"], + "baseClasses": [ + "str", + "Text", + "object" + ], "dataType": "TextInput", "id": "TextInput-sptaH" } @@ -1413,11 +1551,18 @@ "targetHandle": { "fieldName": "input_value", "id": "TextOutput-2MS4a", - "inputTypes": ["Record", "Text"], + "inputTypes": [ + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "str", "Text"], + "baseClasses": [ + "object", + "str", + "Text" + ], "dataType": "Prompt", "id": "Prompt-amqBu" } @@ -1437,11 +1582,17 @@ "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-uYXZJ", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "str", "Text"], + "baseClasses": [ + "object", + "str", + "Text" + ], "dataType": "Prompt", "id": "Prompt-amqBu" } @@ -1461,11 +1612,20 @@ "targetHandle": { "fieldName": "summary", "id": "Prompt-gTNiz", - "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"], + "inputTypes": [ + "Document", + "BaseOutputParser", + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["str", "Text", "object"], + "baseClasses": [ + "str", + "Text", + "object" + ], "dataType": "OpenAIModel", "id": "OpenAIModel-uYXZJ" } @@ -1485,11 +1645,17 @@ "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-EJkG3", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["str", "Text", "object"], + "baseClasses": [ + "str", + "Text", + "object" + ], "dataType": "OpenAIModel", "id": "OpenAIModel-uYXZJ" } @@ -1509,11 +1675,18 @@ "targetHandle": { "fieldName": "input_value", "id": "TextOutput-MUDOR", - "inputTypes": ["Record", "Text"], + "inputTypes": [ + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "str", "Text"], + "baseClasses": [ + "object", + "str", + "Text" + ], "dataType": "Prompt", "id": "Prompt-gTNiz" } @@ -1533,11 +1706,17 @@ "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-XawYB", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "str", "Text"], + "baseClasses": [ + "object", + "str", + "Text" + ], "dataType": "Prompt", "id": "Prompt-gTNiz" } @@ -1557,11 +1736,17 @@ "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-DNmvg", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["str", "Text", "object"], + "baseClasses": [ + "str", + "Text", + "object" + ], "dataType": "OpenAIModel", "id": "OpenAIModel-XawYB" } @@ -1583,4 +1768,4 @@ "name": "Prompt Chaining", "last_tested_version": "1.0.0a0", "is_component": false -} +} \ No newline at end of file diff --git a/src/backend/base/langflow/initial_setup/starter_projects/VectorStore-RAG-Flows.json b/src/backend/base/langflow/initial_setup/starter_projects/VectorStore-RAG-Flows.json index a49f9a744..8038ae841 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/VectorStore-RAG-Flows.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/VectorStore-RAG-Flows.json @@ -81,7 +81,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "name": "sender", "display_name": "Sender Type", "advanced": true, @@ -89,7 +92,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender_name": { "type": "str", @@ -109,7 +114,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "session_id": { "type": "str", @@ -128,13 +135,20 @@ "info": "If provided, the message will be stored in the memory.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Get chat inputs from the Playground.", "icon": "ChatInput", - "base_classes": ["Text", "str", "object", "Record"], + "base_classes": [ + "Text", + "str", + "object", + "Record" + ], "display_name": "Chat Input", "documentation": "", "custom_fields": { @@ -144,7 +158,10 @@ "session_id": null, "return_record": null }, - "output_types": ["Text", "Record"], + "output_types": [ + "Text", + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -181,7 +198,10 @@ "name": "input_value", "display_name": "Value", "advanced": false, - "input_types": ["Record", "Text"], + "input_types": [ + "Record", + "Text" + ], "dynamic": false, "info": "Text or Record to be passed as output.", "load_from_db": false, @@ -223,20 +243,28 @@ "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Display a text output in the Playground.", "icon": "type", - "base_classes": ["object", "Text", "str"], + "base_classes": [ + "object", + "Text", + "str" + ], "display_name": "Extracted Chunks", "documentation": "", "custom_fields": { "input_value": null, "record_template": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -282,7 +310,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "chunk_size": { "type": "int", @@ -394,7 +424,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "disallowed_special": { "type": "str", @@ -403,7 +435,9 @@ "list": false, "show": true, "multiline": false, - "value": ["all"], + "value": [ + "all" + ], "fileTypes": [], "file_path": "", "password": false, @@ -414,7 +448,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "embedding_ctx_length": { "type": "int", @@ -477,7 +513,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "model_kwargs": { "type": "NestedDict", @@ -515,7 +553,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_key": { "type": "str", @@ -534,7 +574,9 @@ "info": "", "load_from_db": true, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "OPENAI_API_KEY" }, "openai_api_type": { @@ -554,7 +596,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_version": { "type": "str", @@ -573,7 +617,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_organization": { "type": "str", @@ -592,7 +638,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_proxy": { "type": "str", @@ -611,7 +659,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "request_timeout": { "type": "float", @@ -711,12 +761,16 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Generate embeddings using OpenAI models.", - "base_classes": ["Embeddings"], + "base_classes": [ + "Embeddings" + ], "display_name": "OpenAI Embeddings", "documentation": "", "custom_fields": { @@ -743,7 +797,9 @@ "tiktoken_enable": null, "tiktoken_model_name": null }, - "output_types": ["Embeddings"], + "output_types": [ + "Embeddings" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -784,7 +840,10 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text", + "Record" + ] }, "code": { "type": "code", @@ -793,7 +852,7 @@ "list": false, "show": true, "multiline": true, - "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\"},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", + "value": "from typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import NestedDict, Text\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n field_order = [\n \"max_tokens\",\n \"model_kwargs\",\n \"model_name\",\n \"openai_api_base\",\n \"openai_api_key\",\n \"temperature\",\n \"input_value\",\n \"system_message\",\n \"stream\",\n ]\n\n def build_config(self):\n return {\n \"input_value\": {\"display_name\": \"Input\", \"input_types\": [\"Text\", \"Record\"]},\n \"max_tokens\": {\n \"display_name\": \"Max Tokens\",\n \"advanced\": True,\n \"info\": \"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n },\n \"model_kwargs\": {\n \"display_name\": \"Model Kwargs\",\n \"advanced\": True,\n },\n \"model_name\": {\n \"display_name\": \"Model Name\",\n \"advanced\": False,\n \"options\": MODEL_NAMES,\n },\n \"openai_api_base\": {\n \"display_name\": \"OpenAI API Base\",\n \"advanced\": True,\n \"info\": (\n \"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\\n\\n\"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\"\n ),\n },\n \"openai_api_key\": {\n \"display_name\": \"OpenAI API Key\",\n \"info\": \"The OpenAI API Key to use for the OpenAI model.\",\n \"advanced\": False,\n \"password\": True,\n },\n \"temperature\": {\n \"display_name\": \"Temperature\",\n \"advanced\": False,\n \"value\": 0.1,\n },\n \"stream\": {\n \"display_name\": \"Stream\",\n \"info\": STREAM_INFO_TEXT,\n \"advanced\": True,\n },\n \"system_message\": {\n \"display_name\": \"System Message\",\n \"info\": \"System message to pass to the model.\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n input_value: Text,\n openai_api_key: str,\n temperature: float = 0.1,\n model_name: str = \"gpt-4o\",\n max_tokens: Optional[int] = 256,\n model_kwargs: NestedDict = {},\n openai_api_base: Optional[str] = None,\n stream: bool = False,\n system_message: Optional[str] = None,\n ) -> Text:\n if not openai_api_base:\n openai_api_base = \"https://api.openai.com/v1\"\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature,\n )\n\n return self.get_chat_result(output, stream, input_value, system_message)\n", "fileTypes": [], "file_path": "", "password": false, @@ -867,7 +926,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_base": { "type": "str", @@ -886,7 +947,9 @@ "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_key": { "type": "str", @@ -905,7 +968,9 @@ "info": "The OpenAI API Key to use for the OpenAI model.", "load_from_db": true, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "OPENAI_API_KEY" }, "stream": { @@ -944,7 +1009,9 @@ "info": "System message to pass to the model.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "temperature": { "type": "float", @@ -975,7 +1042,11 @@ }, "description": "Generates text using OpenAI LLMs.", "icon": "OpenAI", - "base_classes": ["object", "Text", "str"], + "base_classes": [ + "object", + "Text", + "str" + ], "display_name": "OpenAI", "documentation": "", "custom_fields": { @@ -989,7 +1060,9 @@ "stream": null, "system_message": null }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "field_formatters": {}, "frozen": false, "field_order": [ @@ -1059,7 +1132,9 @@ "name": "template", "display_name": "Template", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -1124,14 +1199,23 @@ "is_input": null, "is_output": null, "is_composition": null, - "base_classes": ["object", "Text", "str"], + "base_classes": [ + "object", + "Text", + "str" + ], "name": "", "display_name": "Prompt", "documentation": "", "custom_fields": { - "template": ["context", "question"] + "template": [ + "context", + "question" + ] }, - "output_types": ["Text"], + "output_types": [ + "Text" + ], "full_path": null, "field_formatters": {}, "frozen": false, @@ -1194,7 +1278,9 @@ "name": "input_value", "display_name": "Message", "advanced": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "dynamic": false, "info": "", "load_from_db": false, @@ -1218,7 +1304,9 @@ "info": "In case of Message being a Record, this template will be used to convert it to text.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "return_record": { "type": "bool", @@ -1250,7 +1338,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "name": "sender", "display_name": "Sender Type", "advanced": true, @@ -1258,7 +1349,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "sender_name": { "type": "str", @@ -1278,7 +1371,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "session_id": { "type": "str", @@ -1297,13 +1392,20 @@ "info": "If provided, the message will be stored in the memory.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Display a chat message in the Playground.", "icon": "ChatOutput", - "base_classes": ["object", "Text", "Record", "str"], + "base_classes": [ + "object", + "Text", + "Record", + "str" + ], "display_name": "Chat Output", "documentation": "", "custom_fields": { @@ -1314,7 +1416,10 @@ "return_record": null, "record_template": null }, - "output_types": ["Text", "Record"], + "output_types": [ + "Text", + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -1421,14 +1526,18 @@ }, "description": "A generic file loader.", "icon": "file-text", - "base_classes": ["Record"], + "base_classes": [ + "Record" + ], "display_name": "File", "documentation": "", "custom_fields": { "path": null, "silent_errors": null }, - "output_types": ["Record"], + "output_types": [ + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -1469,7 +1578,10 @@ "name": "inputs", "display_name": "Input", "advanced": false, - "input_types": ["Document", "Record"], + "input_types": [ + "Document", + "Record" + ], "dynamic": false, "info": "The texts to split.", "load_from_db": false, @@ -1548,13 +1660,19 @@ "info": "The characters to split on.\nIf left empty defaults to [\"\\n\\n\", \"\\n\", \" \", \"\"].", "load_from_db": false, "title_case": false, - "input_types": ["Text"], - "value": [""] + "input_types": [ + "Text" + ], + "value": [ + "" + ] }, "_type": "CustomComponent" }, "description": "Split text into chunks of a specified length.", - "base_classes": ["Record"], + "base_classes": [ + "Record" + ], "display_name": "Recursive Character Text Splitter", "documentation": "https://docs.langflow.org/components/text-splitters#recursivecharactertextsplitter", "custom_fields": { @@ -1563,7 +1681,9 @@ "chunk_size": null, "chunk_overlap": null }, - "output_types": ["Record"], + "output_types": [ + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -1626,7 +1746,9 @@ "info": "Input value to search", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "api_endpoint": { "type": "str", @@ -1645,7 +1767,9 @@ "info": "API endpoint URL for the Astra DB service.", "load_from_db": true, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "ASTRA_DB_API_ENDPOINT" }, "batch_size": { @@ -1773,7 +1897,9 @@ "info": "The name of the collection within Astra DB where the vectors will be stored.", "load_from_db": false, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "langflow" }, "metadata_indexing_exclude": { @@ -1793,7 +1919,9 @@ "info": "Optional list of metadata fields to exclude from the indexing.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "metadata_indexing_include": { "type": "str", @@ -1812,7 +1940,9 @@ "info": "Optional list of metadata fields to include in the indexing.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "metric": { "type": "str", @@ -1831,7 +1961,9 @@ "info": "Optional distance metric for vector comparisons in the vector store.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "namespace": { "type": "str", @@ -1850,7 +1982,9 @@ "info": "Optional namespace within Astra DB to use for the collection.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "number_of_results": { "type": "int", @@ -1901,7 +2035,10 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Similarity", "MMR"], + "options": [ + "Similarity", + "MMR" + ], "name": "search_type", "display_name": "Search Type", "advanced": false, @@ -1909,7 +2046,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "setup_mode": { "type": "str", @@ -1922,7 +2061,11 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Sync", "Async", "Off"], + "options": [ + "Sync", + "Async", + "Off" + ], "name": "setup_mode", "display_name": "Setup Mode", "advanced": true, @@ -1930,7 +2073,9 @@ "info": "Configuration mode for setting up the vector store, with options like “Sync”, “Async”, or “Off”.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "token": { "type": "str", @@ -1949,14 +2094,18 @@ "info": "Authentication token for accessing Astra DB.", "load_from_db": true, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "ASTRA_DB_APPLICATION_TOKEN" }, "_type": "CustomComponent" }, "description": "Searches an existing Astra DB Vector Store.", "icon": "AstraDB", - "base_classes": ["Record"], + "base_classes": [ + "Record" + ], "display_name": "Astra DB Search", "documentation": "", "custom_fields": { @@ -1979,7 +2128,9 @@ "metadata_indexing_exclude": null, "collection_indexing_policy": null }, - "output_types": ["Record"], + "output_types": [ + "Record" + ], "field_formatters": {}, "frozen": false, "field_order": [ @@ -2066,7 +2217,9 @@ "info": "API endpoint URL for the Astra DB service.", "load_from_db": true, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "ASTRA_DB_API_ENDPOINT" }, "batch_size": { @@ -2194,7 +2347,9 @@ "info": "The name of the collection within Astra DB where the vectors will be stored.", "load_from_db": false, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "langflow" }, "metadata_indexing_exclude": { @@ -2214,7 +2369,9 @@ "info": "Optional list of metadata fields to exclude from the indexing.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "metadata_indexing_include": { "type": "str", @@ -2233,7 +2390,9 @@ "info": "Optional list of metadata fields to include in the indexing.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "metric": { "type": "str", @@ -2252,7 +2411,9 @@ "info": "Optional distance metric for vector comparisons in the vector store.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "namespace": { "type": "str", @@ -2271,7 +2432,9 @@ "info": "Optional namespace within Astra DB to use for the collection.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "pre_delete_collection": { "type": "bool", @@ -2303,7 +2466,11 @@ "fileTypes": [], "file_path": "", "password": false, - "options": ["Sync", "Async", "Off"], + "options": [ + "Sync", + "Async", + "Off" + ], "name": "setup_mode", "display_name": "Setup Mode", "advanced": true, @@ -2311,7 +2478,9 @@ "info": "Configuration mode for setting up the vector store, with options like “Sync”, “Async”, or “Off”.", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "token": { "type": "str", @@ -2330,14 +2499,18 @@ "info": "Authentication token for accessing Astra DB.", "load_from_db": true, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "ASTRA_DB_APPLICATION_TOKEN" }, "_type": "CustomComponent" }, "description": "Builds or loads an Astra DB Vector Store.", "icon": "AstraDB", - "base_classes": ["VectorStore"], + "base_classes": [ + "VectorStore" + ], "display_name": "Astra DB", "documentation": "", "custom_fields": { @@ -2358,7 +2531,9 @@ "metadata_indexing_exclude": null, "collection_indexing_policy": null }, - "output_types": ["VectorStore"], + "output_types": [ + "VectorStore" + ], "field_formatters": {}, "frozen": false, "field_order": [ @@ -2410,7 +2585,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "chunk_size": { "type": "int", @@ -2522,7 +2699,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "disallowed_special": { "type": "str", @@ -2531,7 +2710,9 @@ "list": false, "show": true, "multiline": false, - "value": ["all"], + "value": [ + "all" + ], "fileTypes": [], "file_path": "", "password": false, @@ -2542,7 +2723,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "embedding_ctx_length": { "type": "int", @@ -2605,7 +2788,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "model_kwargs": { "type": "NestedDict", @@ -2643,7 +2828,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_key": { "type": "str", @@ -2662,7 +2849,9 @@ "info": "", "load_from_db": true, "title_case": false, - "input_types": ["Text"], + "input_types": [ + "Text" + ], "value": "OPENAI_API_KEY" }, "openai_api_type": { @@ -2682,7 +2871,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_api_version": { "type": "str", @@ -2701,7 +2892,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_organization": { "type": "str", @@ -2720,7 +2913,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "openai_proxy": { "type": "str", @@ -2739,7 +2934,9 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "request_timeout": { "type": "float", @@ -2839,12 +3036,16 @@ "info": "", "load_from_db": false, "title_case": false, - "input_types": ["Text"] + "input_types": [ + "Text" + ] }, "_type": "CustomComponent" }, "description": "Generate embeddings using OpenAI models.", - "base_classes": ["Embeddings"], + "base_classes": [ + "Embeddings" + ], "display_name": "OpenAI Embeddings", "documentation": "", "custom_fields": { @@ -2871,7 +3072,9 @@ "tiktoken_enable": null, "tiktoken_model_name": null }, - "output_types": ["Embeddings"], + "output_types": [ + "Embeddings" + ], "field_formatters": {}, "frozen": false, "field_order": [], @@ -2900,11 +3103,20 @@ "targetHandle": { "fieldName": "context", "id": "Prompt-xeI6K", - "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"], + "inputTypes": [ + "Document", + "BaseOutputParser", + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "Text", "str"], + "baseClasses": [ + "object", + "Text", + "str" + ], "dataType": "TextOutput", "id": "TextOutput-BDknO" } @@ -2925,11 +3137,21 @@ "targetHandle": { "fieldName": "question", "id": "Prompt-xeI6K", - "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"], + "inputTypes": [ + "Document", + "BaseOutputParser", + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["Text", "str", "object", "Record"], + "baseClasses": [ + "Text", + "str", + "object", + "Record" + ], "dataType": "ChatInput", "id": "ChatInput-yxMKE" } @@ -2950,11 +3172,17 @@ "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-EjXlN", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "Text", "str"], + "baseClasses": [ + "object", + "Text", + "str" + ], "dataType": "Prompt", "id": "Prompt-xeI6K" } @@ -2975,11 +3203,17 @@ "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-Q39I8", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["object", "Text", "str"], + "baseClasses": [ + "object", + "Text", + "str" + ], "dataType": "OpenAIModel", "id": "OpenAIModel-EjXlN" } @@ -3000,11 +3234,16 @@ "targetHandle": { "fieldName": "inputs", "id": "RecursiveCharacterTextSplitter-tR9QM", - "inputTypes": ["Document", "Record"], + "inputTypes": [ + "Document", + "Record" + ], "type": "Document" }, "sourceHandle": { - "baseClasses": ["Record"], + "baseClasses": [ + "Record" + ], "dataType": "File", "id": "File-t0a6a" } @@ -3028,7 +3267,9 @@ "type": "Embeddings" }, "sourceHandle": { - "baseClasses": ["Embeddings"], + "baseClasses": [ + "Embeddings" + ], "dataType": "OpenAIEmbeddings", "id": "OpenAIEmbeddings-ZlOk1" } @@ -3048,11 +3289,18 @@ "targetHandle": { "fieldName": "input_value", "id": "AstraDBSearch-41nRz", - "inputTypes": ["Text"], + "inputTypes": [ + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["Text", "str", "object", "Record"], + "baseClasses": [ + "Text", + "str", + "object", + "Record" + ], "dataType": "ChatInput", "id": "ChatInput-yxMKE" } @@ -3076,7 +3324,9 @@ "type": "Record" }, "sourceHandle": { - "baseClasses": ["Record"], + "baseClasses": [ + "Record" + ], "dataType": "RecursiveCharacterTextSplitter", "id": "RecursiveCharacterTextSplitter-tR9QM" } @@ -3101,7 +3351,9 @@ "type": "Embeddings" }, "sourceHandle": { - "baseClasses": ["Embeddings"], + "baseClasses": [ + "Embeddings" + ], "dataType": "OpenAIEmbeddings", "id": "OpenAIEmbeddings-9TPjc" } @@ -3122,11 +3374,16 @@ "targetHandle": { "fieldName": "input_value", "id": "TextOutput-BDknO", - "inputTypes": ["Record", "Text"], + "inputTypes": [ + "Record", + "Text" + ], "type": "str" }, "sourceHandle": { - "baseClasses": ["Record"], + "baseClasses": [ + "Record" + ], "dataType": "AstraDBSearch", "id": "AstraDBSearch-41nRz" } @@ -3148,4 +3405,4 @@ "name": "Vector Store RAG", "last_tested_version": "1.0.0a0", "is_component": false -} +} \ No newline at end of file From 0db23d275633fc4f8531e97e02390a5591dd9f9d Mon Sep 17 00:00:00 2001 From: ogabrielluiz Date: Fri, 7 Jun 2024 15:57:08 -0300 Subject: [PATCH 3/3] refactor: Update TransactionModel and TransactionModelResponse fields --- .../base/langflow/services/monitor/schema.py | 33 +++++-------------- .../base/langflow/services/monitor/utils.py | 11 ++----- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/src/backend/base/langflow/services/monitor/schema.py b/src/backend/base/langflow/services/monitor/schema.py index 70a20534f..c5264f3a1 100644 --- a/src/backend/base/langflow/services/monitor/schema.py +++ b/src/backend/base/langflow/services/monitor/schema.py @@ -11,10 +11,9 @@ if TYPE_CHECKING: class TransactionModel(BaseModel): index: Optional[int] = Field(default=None) timestamp: Optional[datetime] = Field(default_factory=datetime.now, alias="timestamp") - flow_id: str - source: str - target: str - target_args: dict + vertex_id: str + inputs: dict + outputs: dict status: str error: Optional[str] = None @@ -23,13 +22,13 @@ class TransactionModel(BaseModel): populate_by_name = True # validate target_args in case it is a JSON - @field_validator("target_args", mode="before") + @field_validator("outputs", "inputs", mode="before") def validate_target_args(cls, v): if isinstance(v, str): return json.loads(v) return v - @field_serializer("target_args") + @field_serializer("outputs", "inputs") def serialize_target_args(v): if isinstance(v, dict): return json.dumps(v) @@ -39,10 +38,9 @@ class TransactionModel(BaseModel): class TransactionModelResponse(BaseModel): index: Optional[int] = Field(default=None) timestamp: Optional[datetime] = Field(default_factory=datetime.now, alias="timestamp") - flow_id: str - source: str - target: str - target_args: dict + vertex_id: str + inputs: dict + outputs: dict status: str error: Optional[str] = None @@ -51,7 +49,7 @@ class TransactionModelResponse(BaseModel): populate_by_name = True # validate target_args in case it is a JSON - @field_validator("target_args", mode="before") + @field_validator("outputs", "inputs", mode="before") def validate_target_args(cls, v): if isinstance(v, str): return json.loads(v) @@ -76,7 +74,6 @@ class MessageModel(BaseModel): session_id: str message: str files: list[str] = [] - artifacts: dict class Config: from_attributes = True @@ -88,12 +85,6 @@ class MessageModel(BaseModel): return json.loads(v) return v - @field_validator("artifacts", mode="before") - def validate_target_args(cls, v): - if isinstance(v, str): - return json.loads(v) - return v - @classmethod def from_record(cls, record: "Record", flow_id: Optional[str] = None): # first check if the record has all the required fields @@ -114,12 +105,6 @@ class MessageModel(BaseModel): class MessageModelResponse(MessageModel): index: Optional[int] = Field(default=None) - @field_validator("artifacts", mode="before") - def serialize_artifacts(v): - if isinstance(v, str): - return json.loads(v) - return v - @field_validator("index", mode="before") def validate_id(cls, v): if isinstance(v, float): diff --git a/src/backend/base/langflow/services/monitor/utils.py b/src/backend/base/langflow/services/monitor/utils.py index f603b3fde..0c94c121d 100644 --- a/src/backend/base/langflow/services/monitor/utils.py +++ b/src/backend/base/langflow/services/monitor/utils.py @@ -119,21 +119,16 @@ async def log_message( sender_name: str, message: str, session_id: str, - artifacts: Optional[dict] = None, + files: Optional[list] = None, flow_id: Optional[str] = None, ): try: - from langflow.graph.vertex.base import Vertex - - if isinstance(session_id, Vertex): - session_id = await session_id.build() # type: ignore - monitor_service = get_monitor_service() row = { "sender": sender, "sender_name": sender_name, "message": message, - "artifacts": artifacts or {}, + "files": files or [], "session_id": session_id, "timestamp": monitor_service.get_timestamp(), "flow_id": flow_id, @@ -190,7 +185,7 @@ def log_transaction(vertex: "Vertex", status, error=None): data = { "vertex_id": vertex.id, "inputs": clean_params, - "output": str(vertex.result), + "outputs": vertex.result.model_dump_json(), "timestamp": monitor_service.get_timestamp(), "status": status, "error": error,