{ "data": { "edges": [ { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "OpenAIModel", "id": "OpenAIModel-t1to9", "name": "text_output", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-n8Wmg", "inputTypes": [ "Message" ], "type": "str" } }, "id": "reactflow__edge-OpenAIModel-t1to9{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-t1to9œ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-n8Wmg{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-n8Wmgœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, "source": "OpenAIModel-t1to9", "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-t1to9œ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", "target": "ChatOutput-n8Wmg", "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-n8Wmgœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "TextInput", "id": "TextInput-0yHbX", "name": "text", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "CONTENT_GUIDELINES", "id": "Prompt-nDs5I", "inputTypes": [ "Message", "Text" ], "type": "str" } }, "id": "reactflow__edge-TextInput-0yHbX{œdataTypeœ:œTextInputœ,œidœ:œTextInput-0yHbXœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-nDs5I{œfieldNameœ:œCONTENT_GUIDELINESœ,œidœ:œPrompt-nDs5Iœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "source": "TextInput-0yHbX", "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-0yHbXœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", "target": "Prompt-nDs5I", "targetHandle": "{œfieldNameœ: œCONTENT_GUIDELINESœ, œidœ: œPrompt-nDs5Iœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "TextInput", "id": "TextInput-HVGJ1", "name": "text", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "OUTPUT_FORMAT", "id": "Prompt-nDs5I", "inputTypes": [ "Message", "Text" ], "type": "str" } }, "id": "reactflow__edge-TextInput-HVGJ1{œdataTypeœ:œTextInputœ,œidœ:œTextInput-HVGJ1œ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-nDs5I{œfieldNameœ:œOUTPUT_FORMATœ,œidœ:œPrompt-nDs5Iœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "source": "TextInput-HVGJ1", "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-HVGJ1œ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", "target": "Prompt-nDs5I", "targetHandle": "{œfieldNameœ: œOUTPUT_FORMATœ, œidœ: œPrompt-nDs5Iœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "TextInput", "id": "TextInput-0s9hL", "name": "text", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "OUTPUT_LANGUAGE", "id": "Prompt-nDs5I", "inputTypes": [ "Message", "Text" ], "type": "str" } }, "id": "reactflow__edge-TextInput-0s9hL{œdataTypeœ:œTextInputœ,œidœ:œTextInput-0s9hLœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-nDs5I{œfieldNameœ:œOUTPUT_LANGUAGEœ,œidœ:œPrompt-nDs5Iœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "source": "TextInput-0s9hL", "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-0s9hLœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", "target": "Prompt-nDs5I", "targetHandle": "{œfieldNameœ: œOUTPUT_LANGUAGEœ, œidœ: œPrompt-nDs5Iœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "TextInput", "id": "TextInput-ZUCJB", "name": "text", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "PROFILE_DETAILS", "id": "Prompt-nDs5I", "inputTypes": [ "Message", "Text" ], "type": "str" } }, "id": "reactflow__edge-TextInput-ZUCJB{œdataTypeœ:œTextInputœ,œidœ:œTextInput-ZUCJBœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-nDs5I{œfieldNameœ:œPROFILE_DETAILSœ,œidœ:œPrompt-nDs5Iœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "source": "TextInput-ZUCJB", "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-ZUCJBœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", "target": "Prompt-nDs5I", "targetHandle": "{œfieldNameœ: œPROFILE_DETAILSœ, œidœ: œPrompt-nDs5Iœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "TextInput", "id": "TextInput-b4m4C", "name": "text", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "PROFILE_TYPE", "id": "Prompt-nDs5I", "inputTypes": [ "Message", "Text" ], "type": "str" } }, "id": "reactflow__edge-TextInput-b4m4C{œdataTypeœ:œTextInputœ,œidœ:œTextInput-b4m4Cœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-nDs5I{œfieldNameœ:œPROFILE_TYPEœ,œidœ:œPrompt-nDs5Iœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "source": "TextInput-b4m4C", "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-b4m4Cœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", "target": "Prompt-nDs5I", "targetHandle": "{œfieldNameœ: œPROFILE_TYPEœ, œidœ: œPrompt-nDs5Iœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "TextInput", "id": "TextInput-hSMuv", "name": "text", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "TONE_AND_STYLE", "id": "Prompt-nDs5I", "inputTypes": [ "Message", "Text" ], "type": "str" } }, "id": "reactflow__edge-TextInput-hSMuv{œdataTypeœ:œTextInputœ,œidœ:œTextInput-hSMuvœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-nDs5I{œfieldNameœ:œTONE_AND_STYLEœ,œidœ:œPrompt-nDs5Iœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "source": "TextInput-hSMuv", "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-hSMuvœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", "target": "Prompt-nDs5I", "targetHandle": "{œfieldNameœ: œTONE_AND_STYLEœ, œidœ: œPrompt-nDs5Iœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "Prompt", "id": "Prompt-nDs5I", "name": "prompt", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "system_message", "id": "OpenAIModel-t1to9", "inputTypes": [ "Message" ], "type": "str" } }, "id": "reactflow__edge-Prompt-nDs5I{œdataTypeœ:œPromptœ,œidœ:œPrompt-nDs5Iœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-t1to9{œfieldNameœ:œsystem_messageœ,œidœ:œOpenAIModel-t1to9œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "source": "Prompt-nDs5I", "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-nDs5Iœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", "target": "OpenAIModel-t1to9", "targetHandle": "{œfieldNameœ: œsystem_messageœ, œidœ: œOpenAIModel-t1to9œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "ChatInput", "id": "ChatInput-tE8u3", "name": "message", "output_types": [ "Message" ] }, "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-t1to9", "inputTypes": [ "Message" ], "type": "str" } }, "id": "reactflow__edge-ChatInput-tE8u3{œdataTypeœ:œChatInputœ,œidœ:œChatInput-tE8u3œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-t1to9{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-t1to9œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "source": "ChatInput-tE8u3", "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-tE8u3œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", "target": "OpenAIModel-t1to9", "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-t1to9œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" } ], "nodes": [ { "data": { "id": "ChatInput-tE8u3", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Get chat inputs from the Playground.", "display_name": "Chat Input", "documentation": "", "edited": false, "field_order": [ "input_value", "should_store_message", "sender", "sender_name", "session_id", "files", "background_color", "chat_icon", "text_color" ], "frozen": false, "icon": "MessagesSquare", "legacy": false, "lf_version": "1.0.19.post2", "metadata": {}, "output_types": [], "outputs": [ { "cache": true, "display_name": "Message", "method": "message_response", "name": "message", "selected": "Message", "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "background_color": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Background Color", "dynamic": false, "info": "The background color of the icon.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "background_color", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "chat_icon": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Icon", "dynamic": false, "info": "The icon of the message.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "chat_icon", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "code": { "advanced": true, "dynamic": true, "fileTypes": [], "file_path": "", "info": "", "list": false, "load_from_db": false, "multiline": true, "name": "code", "password": false, "placeholder": "", "required": true, "show": true, "title_case": false, "type": "code", "value": "from langflow.base.data.utils import IMG_FILE_TYPES, TEXT_FILE_TYPES\nfrom langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import BoolInput\nfrom langflow.io import DropdownInput, FileInput, MessageTextInput, MultilineInput, Output\nfrom langflow.schema.message import Message\nfrom langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_NAME_USER, MESSAGE_SENDER_USER\n\n\nclass ChatInput(ChatComponent):\n display_name = \"Chat Input\"\n description = \"Get chat inputs from the Playground.\"\n icon = \"MessagesSquare\"\n name = \"ChatInput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n value=\"\",\n info=\"Message to be passed as input.\",\n ),\n BoolInput(\n name=\"should_store_message\",\n display_name=\"Store Messages\",\n info=\"Store the message in the history.\",\n value=True,\n advanced=True,\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[MESSAGE_SENDER_AI, MESSAGE_SENDER_USER],\n value=MESSAGE_SENDER_USER,\n info=\"Type of sender.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"sender_name\",\n display_name=\"Sender Name\",\n info=\"Name of the sender.\",\n value=MESSAGE_SENDER_NAME_USER,\n advanced=True,\n ),\n MessageTextInput(\n name=\"session_id\",\n display_name=\"Session ID\",\n info=\"The session ID of the chat. If empty, the current session ID parameter will be used.\",\n advanced=True,\n ),\n FileInput(\n name=\"files\",\n display_name=\"Files\",\n file_types=TEXT_FILE_TYPES + IMG_FILE_TYPES,\n info=\"Files to be sent with the message.\",\n advanced=True,\n is_list=True,\n ),\n MessageTextInput(\n name=\"background_color\",\n display_name=\"Background Color\",\n info=\"The background color of the icon.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"chat_icon\",\n display_name=\"Icon\",\n info=\"The icon of the message.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"text_color\",\n display_name=\"Text Color\",\n info=\"The text color of the name\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n async def message_response(self) -> Message:\n background_color = self.background_color\n text_color = self.text_color\n icon = self.chat_icon\n\n message = await Message.create(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n files=self.files,\n properties={\"background_color\": background_color, \"text_color\": text_color, \"icon\": icon},\n )\n if self.session_id and isinstance(message, Message) and self.should_store_message:\n stored_message = await self.send_message(\n message,\n )\n self.message.value = stored_message\n message = stored_message\n\n self.status = message\n return message\n" }, "files": { "_input_type": "FileInput", "advanced": true, "display_name": "Files", "dynamic": false, "fileTypes": [ "txt", "md", "mdx", "csv", "json", "yaml", "yml", "xml", "html", "htm", "pdf", "docx", "py", "sh", "sql", "js", "ts", "tsx", "jpg", "jpeg", "png", "bmp", "image" ], "file_path": "", "info": "Files to be sent with the message.", "list": true, "name": "files", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "file", "value": "" }, "input_value": { "_input_type": "MultilineInput", "advanced": false, "display_name": "Text", "dynamic": false, "info": "Message to be passed as input.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "multiline": true, "name": "input_value", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "*Objective:* Create an engaging Twitter thread that narrates the innovative journey of our LangFlow project, highlighting how we created a specialized flow for generating dynamic prompts for other flows, culminating in a model specialized in writing tweets/threads. *Project Stages:* 1. *Development in LangFlow:* - Created a flow focused on generating dynamic prompts - System serves as foundation for optimizing prompt generation in other flows 2. *Template Creation:* - Developed specific templates for tweets/threads - Focus on engagement and message clarity 3. *Results:* - 60% reduction in content creation time - Greater message consistency - Better social media engagement - Fully automated process *Thread Objectives:* - Educate about LangFlow's capabilities in content creation - Demonstrate the development process step by step - Inspire other developers to explore LangFlow - Strengthen the developer community" }, "sender": { "_input_type": "DropdownInput", "advanced": true, "combobox": false, "display_name": "Sender Type", "dynamic": false, "info": "Type of sender.", "name": "sender", "options": [ "Machine", "User" ], "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "str", "value": "User" }, "sender_name": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "sender_name", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "User" }, "session_id": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Session ID", "dynamic": false, "info": "The session ID of the chat. If empty, the current session ID parameter will be used.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "session_id", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "should_store_message": { "_input_type": "BoolInput", "advanced": true, "display_name": "Store Messages", "dynamic": false, "info": "Store the message in the history.", "list": false, "name": "should_store_message", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "bool", "value": true }, "text_color": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Text Color", "dynamic": false, "info": "The text color of the name", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "text_color", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" } } }, "type": "ChatInput" }, "dragging": false, "height": 234, "id": "ChatInput-tE8u3", "position": { "x": 863.3241377184722, "y": 1053.9324095084933 }, "positionAbsolute": { "x": 863.3241377184722, "y": 1053.9324095084933 }, "selected": false, "type": "genericNode", "width": 320 }, { "data": { "id": "TextInput-0yHbX", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Get text inputs from the Playground.", "display_name": "Content Guidelines", "documentation": "", "edited": false, "field_order": [ "input_value" ], "frozen": false, "icon": "type", "legacy": false, "lf_version": "1.0.19.post2", "metadata": {}, "output_types": [], "outputs": [ { "cache": true, "display_name": "Text", "method": "text_response", "name": "text", "selected": "Message", "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "code": { "advanced": true, "dynamic": true, "fileTypes": [], "file_path": "", "info": "", "list": false, "load_from_db": false, "multiline": true, "name": "code", "password": false, "placeholder": "", "required": true, "show": true, "title_case": false, "type": "code", "value": "from langflow.base.io.text import TextComponent\nfrom langflow.io import MultilineInput, Output\nfrom langflow.schema.message import Message\n\n\nclass TextInputComponent(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from the Playground.\"\n icon = \"type\"\n name = \"TextInput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as input.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Message:\n return Message(\n text=self.input_value,\n )\n" }, "input_value": { "_input_type": "MultilineInput", "advanced": false, "display_name": "Text", "dynamic": false, "info": "Text to be passed as input.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "multiline": true, "name": "input_value", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "- Thread must be 5-7 tweets long - Each tweet should be self-contained but flow naturally to the next - Include relevant technical details while keeping language accessible - Use emojis sparingly but effectively - Include a clear call-to-action in the final tweet - Highlight key benefits and innovative aspects - Maintain professional but engaging tone" } } }, "type": "TextInput" }, "dragging": false, "height": 234, "id": "TextInput-0yHbX", "position": { "x": 1300.291760633212, "y": 417.7819626108867 }, "positionAbsolute": { "x": 1300.291760633212, "y": 417.7819626108867 }, "selected": false, "type": "genericNode", "width": 320 }, { "data": { "description": "Generates text using OpenAI LLMs.", "display_name": "OpenAI", "id": "OpenAIModel-t1to9", "node": { "base_classes": [ "LanguageModel", "Message" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Generates text using OpenAI LLMs.", "display_name": "OpenAI", "documentation": "", "edited": false, "field_order": [ "input_value", "system_message", "stream", "max_tokens", "model_kwargs", "json_mode", "output_schema", "model_name", "openai_api_base", "api_key", "temperature", "seed", "output_parser" ], "frozen": false, "icon": "OpenAI", "legacy": false, "lf_version": "1.0.19.post2", "metadata": {}, "output_types": [], "outputs": [ { "cache": true, "display_name": "Text", "method": "text_response", "name": "text_output", "required_inputs": [], "selected": "Message", "types": [ "Message" ], "value": "__UNDEFINED__" }, { "cache": true, "display_name": "Language Model", "method": "build_model", "name": "model_output", "required_inputs": [], "selected": "LanguageModel", "types": [ "LanguageModel" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "api_key": { "_input_type": "SecretStrInput", "advanced": false, "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", "input_types": [ "Message" ], "load_from_db": true, "name": "api_key", "password": true, "placeholder": "", "required": false, "show": true, "title_case": false, "type": "str", "value": "OPENAI_API_KEY" }, "code": { "advanced": true, "dynamic": true, "fileTypes": [], "file_path": "", "info": "", "list": false, "load_from_db": false, "multiline": true, "name": "code", "password": false, "placeholder": "", "required": true, "show": true, "title_case": false, "type": "code", "value": "import operator\nfrom functools import reduce\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import OPENAI_MODEL_NAMES\nfrom langflow.field_typing import LanguageModel\nfrom langflow.field_typing.range_spec import RangeSpec\nfrom langflow.inputs import BoolInput, DictInput, DropdownInput, IntInput, SecretStrInput, SliderInput, StrInput\nfrom langflow.inputs.inputs import HandleInput\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n name = \"OpenAIModel\"\n\n inputs = [\n *LCModelComponent._base_inputs,\n IntInput(\n name=\"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 range_spec=RangeSpec(min=0, max=128000),\n ),\n DictInput(\n name=\"model_kwargs\",\n display_name=\"Model Kwargs\",\n advanced=True,\n info=\"Additional keyword arguments to pass to the model.\",\n ),\n BoolInput(\n name=\"json_mode\",\n display_name=\"JSON Mode\",\n advanced=True,\n info=\"If True, it will output JSON regardless of passing a schema.\",\n ),\n DictInput(\n name=\"output_schema\",\n is_list=True,\n display_name=\"Schema\",\n advanced=True,\n info=\"The schema for the Output of the model. \"\n \"You must pass the word JSON in the prompt. \"\n \"If left blank, JSON mode will be disabled. [DEPRECATED]\",\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n advanced=False,\n options=OPENAI_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[0],\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. \"\n \"Defaults to https://api.openai.com/v1. \"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n SliderInput(\n name=\"temperature\", display_name=\"Temperature\", value=0.1, range_spec=RangeSpec(min=0, max=2, step=0.01)\n ),\n IntInput(\n name=\"seed\",\n display_name=\"Seed\",\n info=\"The seed controls the reproducibility of the job.\",\n advanced=True,\n value=1,\n ),\n HandleInput(\n name=\"output_parser\",\n display_name=\"Output Parser\",\n info=\"The parser to use to parse the output of the model\",\n advanced=True,\n input_types=[\"OutputParser\"],\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n # self.output_schema is a list of dictionaries\n # let's convert it to a dictionary\n output_schema_dict: dict[str, str] = reduce(operator.ior, self.output_schema or {}, {})\n openai_api_key = self.api_key\n temperature = self.temperature\n model_name: str = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs or {}\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n json_mode = bool(output_schema_dict) or self.json_mode\n seed = self.seed\n\n api_key = SecretStr(openai_api_key).get_secret_value() if openai_api_key else None\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 if temperature is not None else 0.1,\n seed=seed,\n )\n if json_mode:\n if output_schema_dict:\n output = output.with_structured_output(schema=output_schema_dict, method=\"json_mode\")\n else:\n output = output.bind(response_format={\"type\": \"json_object\"})\n\n return output\n\n def _get_exception_message(self, e: Exception):\n \"\"\"Get a message from an OpenAI exception.\n\n Args:\n e (Exception): The exception to get the message from.\n\n Returns:\n str: The message from the exception.\n \"\"\"\n try:\n from openai import BadRequestError\n except ImportError:\n return None\n if isinstance(e, BadRequestError):\n message = e.body.get(\"message\")\n if message:\n return message\n return None\n" }, "input_value": { "_input_type": "MessageInput", "advanced": false, "display_name": "Input", "dynamic": false, "info": "", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "input_value", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "json_mode": { "_input_type": "BoolInput", "advanced": true, "display_name": "JSON Mode", "dynamic": false, "info": "If True, it will output JSON regardless of passing a schema.", "list": false, "name": "json_mode", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "bool", "value": false }, "max_tokens": { "_input_type": "IntInput", "advanced": true, "display_name": "Max Tokens", "dynamic": false, "info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.", "list": false, "name": "max_tokens", "placeholder": "", "range_spec": { "max": 128000, "min": 0, "step": 0.1, "step_type": "float" }, "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "int", "value": "" }, "model_kwargs": { "_input_type": "DictInput", "advanced": true, "display_name": "Model Kwargs", "dynamic": false, "info": "Additional keyword arguments to pass to the model.", "list": false, "name": "model_kwargs", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "type": "dict", "value": {} }, "model_name": { "_input_type": "DropdownInput", "advanced": false, "combobox": false, "display_name": "Model Name", "dynamic": false, "info": "", "name": "model_name", "options": [ "gpt-4o-mini", "gpt-4o", "gpt-4-turbo", "gpt-4-turbo-preview", "gpt-4", "gpt-3.5-turbo", "gpt-3.5-turbo-0125" ], "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "gpt-4o-mini" }, "openai_api_base": { "_input_type": "StrInput", "advanced": true, "display_name": "OpenAI API Base", "dynamic": false, "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.", "list": false, "load_from_db": false, "name": "openai_api_base", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "str", "value": "" }, "output_parser": { "_input_type": "HandleInput", "advanced": true, "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", "input_types": [ "OutputParser" ], "list": false, "name": "output_parser", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "other", "value": "" }, "output_schema": { "_input_type": "DictInput", "advanced": true, "display_name": "Schema", "dynamic": false, "info": "The schema for the Output of the model. You must pass the word JSON in the prompt. If left blank, JSON mode will be disabled. [DEPRECATED]", "list": true, "name": "output_schema", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "type": "dict", "value": {} }, "seed": { "_input_type": "IntInput", "advanced": true, "display_name": "Seed", "dynamic": false, "info": "The seed controls the reproducibility of the job.", "list": false, "name": "seed", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "int", "value": 1 }, "stream": { "_input_type": "BoolInput", "advanced": false, "display_name": "Stream", "dynamic": false, "info": "Stream the response from the model. Streaming works only in Chat.", "list": false, "name": "stream", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "bool", "value": false }, "system_message": { "_input_type": "MessageTextInput", "advanced": false, "display_name": "System Message", "dynamic": false, "info": "System message to pass to the model.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "system_message", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "temperature": { "_input_type": "FloatInput", "advanced": false, "display_name": "Temperature", "dynamic": false, "info": "", "list": false, "name": "temperature", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "float", "value": 0.1 } }, "tool_mode": false }, "type": "OpenAIModel" }, "dragging": false, "height": 630, "id": "OpenAIModel-t1to9", "position": { "x": 2072.0401998064262, "y": 828.7738120746212 }, "positionAbsolute": { "x": 2072.0401998064262, "y": 828.7738120746212 }, "selected": false, "type": "genericNode", "width": 320 }, { "data": { "description": "Display a chat message in the Playground.", "display_name": "Chat Output", "id": "ChatOutput-n8Wmg", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Display a chat message in the Playground.", "display_name": "Chat Output", "documentation": "", "edited": false, "field_order": [ "input_value", "should_store_message", "sender", "sender_name", "session_id", "data_template", "background_color", "chat_icon", "text_color" ], "frozen": false, "icon": "MessagesSquare", "legacy": false, "lf_version": "1.0.19.post2", "metadata": {}, "output_types": [], "outputs": [ { "cache": true, "display_name": "Message", "method": "message_response", "name": "message", "selected": "Message", "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "background_color": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Background Color", "dynamic": false, "info": "The background color of the icon.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "background_color", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "chat_icon": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Icon", "dynamic": false, "info": "The icon of the message.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "chat_icon", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "code": { "advanced": true, "dynamic": true, "fileTypes": [], "file_path": "", "info": "", "list": false, "load_from_db": false, "multiline": true, "name": "code", "password": false, "placeholder": "", "required": true, "show": true, "title_case": false, "type": "code", "value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.inputs import BoolInput\nfrom langflow.io import DropdownInput, MessageInput, MessageTextInput, Output\nfrom langflow.schema.message import Message\nfrom langflow.schema.properties import Source\nfrom langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_NAME_AI, MESSAGE_SENDER_USER\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"MessagesSquare\"\n name = \"ChatOutput\"\n\n inputs = [\n MessageInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n ),\n BoolInput(\n name=\"should_store_message\",\n display_name=\"Store Messages\",\n info=\"Store the message in the history.\",\n value=True,\n advanced=True,\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[MESSAGE_SENDER_AI, MESSAGE_SENDER_USER],\n value=MESSAGE_SENDER_AI,\n advanced=True,\n info=\"Type of sender.\",\n ),\n MessageTextInput(\n name=\"sender_name\",\n display_name=\"Sender Name\",\n info=\"Name of the sender.\",\n value=MESSAGE_SENDER_NAME_AI,\n advanced=True,\n ),\n MessageTextInput(\n name=\"session_id\",\n display_name=\"Session ID\",\n info=\"The session ID of the chat. If empty, the current session ID parameter will be used.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n MessageTextInput(\n name=\"background_color\",\n display_name=\"Background Color\",\n info=\"The background color of the icon.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"chat_icon\",\n display_name=\"Icon\",\n info=\"The icon of the message.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"text_color\",\n display_name=\"Text Color\",\n info=\"The text color of the name\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(\n display_name=\"Message\",\n name=\"message\",\n method=\"message_response\",\n ),\n ]\n\n def _build_source(self, id_: str | None, display_name: str | None, source: str | None) -> Source:\n source_dict = {}\n if id_:\n source_dict[\"id\"] = id_\n if display_name:\n source_dict[\"display_name\"] = display_name\n if source:\n source_dict[\"source\"] = source\n return Source(**source_dict)\n\n async def message_response(self) -> Message:\n source, icon, display_name, source_id = self.get_properties_from_source_component()\n background_color = self.background_color\n text_color = self.text_color\n if self.chat_icon:\n icon = self.chat_icon\n message = self.input_value if isinstance(self.input_value, Message) else Message(text=self.input_value)\n message.sender = self.sender\n message.sender_name = self.sender_name\n message.session_id = self.session_id\n message.flow_id = self.graph.flow_id if hasattr(self, \"graph\") else None\n message.properties.source = self._build_source(source_id, display_name, source)\n message.properties.icon = icon\n message.properties.background_color = background_color\n message.properties.text_color = text_color\n if self.session_id and isinstance(message, Message) and self.should_store_message:\n stored_message = await self.send_message(\n message,\n )\n self.message.value = stored_message\n message = stored_message\n\n self.status = message\n return message\n" }, "data_template": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Data Template", "dynamic": false, "info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "data_template", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "{text}" }, "input_value": { "_input_type": "MessageInput", "advanced": false, "display_name": "Text", "dynamic": false, "info": "Message to be passed as output.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "input_value", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "sender": { "_input_type": "DropdownInput", "advanced": true, "combobox": false, "display_name": "Sender Type", "dynamic": false, "info": "Type of sender.", "name": "sender", "options": [ "Machine", "User" ], "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "Machine" }, "sender_name": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "sender_name", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "AI" }, "session_id": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Session ID", "dynamic": false, "info": "The session ID of the chat. If empty, the current session ID parameter will be used.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "session_id", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" }, "should_store_message": { "_input_type": "BoolInput", "advanced": true, "display_name": "Store Messages", "dynamic": false, "info": "Store the message in the history.", "list": false, "name": "should_store_message", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_metadata": true, "type": "bool", "value": true }, "text_color": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Text Color", "dynamic": false, "info": "The text color of the name", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "text_color", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" } }, "tool_mode": false }, "type": "ChatOutput" }, "dragging": false, "height": 234, "id": "ChatOutput-n8Wmg", "position": { "x": 2470.223353127597, "y": 1055.4039338762416 }, "positionAbsolute": { "x": 2470.223353127597, "y": 1055.4039338762416 }, "selected": false, "type": "genericNode", "width": 320 }, { "data": { "id": "TextInput-HVGJ1", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Get text inputs from the Playground.", "display_name": "Output Format", "documentation": "", "edited": false, "field_order": [ "input_value" ], "frozen": false, "icon": "type", "legacy": false, "lf_version": "1.0.19.post2", "metadata": {}, "output_types": [], "outputs": [ { "cache": true, "display_name": "Text", "method": "text_response", "name": "text", "selected": "Message", "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "code": { "advanced": true, "dynamic": true, "fileTypes": [], "file_path": "", "info": "", "list": false, "load_from_db": false, "multiline": true, "name": "code", "password": false, "placeholder": "", "required": true, "show": true, "title_case": false, "type": "code", "value": "from langflow.base.io.text import TextComponent\nfrom langflow.io import MultilineInput, Output\nfrom langflow.schema.message import Message\n\n\nclass TextInputComponent(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from the Playground.\"\n icon = \"type\"\n name = \"TextInput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as input.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Message:\n return Message(\n text=self.input_value,\n )\n" }, "input_value": { "_input_type": "MultilineInput", "advanced": false, "display_name": "Text", "dynamic": false, "info": "Text to be passed as input.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "multiline": true, "name": "input_value", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "thread" } } }, "type": "TextInput" }, "dragging": false, "height": 234, "id": "TextInput-HVGJ1", "position": { "x": 1300.639277084099, "y": 665.0274048594538 }, "positionAbsolute": { "x": 1300.639277084099, "y": 665.0274048594538 }, "selected": false, "type": "genericNode", "width": 320 }, { "data": { "id": "TextInput-0s9hL", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Get text inputs from the Playground.", "display_name": "Output Language", "documentation": "", "edited": false, "field_order": [ "input_value" ], "frozen": false, "icon": "type", "legacy": false, "lf_version": "1.0.19.post2", "metadata": {}, "output_types": [], "outputs": [ { "cache": true, "display_name": "Text", "method": "text_response", "name": "text", "selected": "Message", "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "code": { "advanced": true, "dynamic": true, "fileTypes": [], "file_path": "", "info": "", "list": false, "load_from_db": false, "multiline": true, "name": "code", "password": false, "placeholder": "", "required": true, "show": true, "title_case": false, "type": "code", "value": "from langflow.base.io.text import TextComponent\nfrom langflow.io import MultilineInput, Output\nfrom langflow.schema.message import Message\n\n\nclass TextInputComponent(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from the Playground.\"\n icon = \"type\"\n name = \"TextInput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as input.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Message:\n return Message(\n text=self.input_value,\n )\n" }, "input_value": { "_input_type": "MultilineInput", "advanced": false, "display_name": "Text", "dynamic": false, "info": "Text to be passed as input.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "multiline": true, "name": "input_value", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "English" } } }, "type": "TextInput" }, "dragging": false, "height": 234, "id": "TextInput-0s9hL", "position": { "x": 1302.1321888373375, "y": 910.3592488005739 }, "positionAbsolute": { "x": 1302.1321888373375, "y": 910.3592488005739 }, "selected": false, "type": "genericNode", "width": 320 }, { "data": { "id": "TextInput-ZUCJB", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Get text inputs from the Playground.", "display_name": "Profile Details", "documentation": "", "edited": false, "field_order": [ "input_value" ], "frozen": false, "icon": "type", "legacy": false, "lf_version": "1.0.19.post2", "metadata": {}, "output_types": [], "outputs": [ { "cache": true, "display_name": "Text", "method": "text_response", "name": "text", "selected": "Message", "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "code": { "advanced": true, "dynamic": true, "fileTypes": [], "file_path": "", "info": "", "list": false, "load_from_db": false, "multiline": true, "name": "code", "password": false, "placeholder": "", "required": true, "show": true, "title_case": false, "type": "code", "value": "from langflow.base.io.text import TextComponent\nfrom langflow.io import MultilineInput, Output\nfrom langflow.schema.message import Message\n\n\nclass TextInputComponent(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from the Playground.\"\n icon = \"type\"\n name = \"TextInput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as input.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Message:\n return Message(\n text=self.input_value,\n )\n" }, "input_value": { "_input_type": "MultilineInput", "advanced": false, "display_name": "Text", "dynamic": false, "info": "Text to be passed as input.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "multiline": true, "name": "input_value", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "- Tech startup focused on AI/ML innovation - Active in open-source community - Experienced in building developer tools - Known for clear technical communication - Engaged audience of developers and AI enthusiasts" } } }, "type": "TextInput" }, "dragging": false, "height": 234, "id": "TextInput-ZUCJB", "position": { "x": 1302.0774628387737, "y": 1167.3244357663511 }, "positionAbsolute": { "x": 1302.0774628387737, "y": 1167.3244357663511 }, "selected": false, "type": "genericNode", "width": 320 }, { "data": { "id": "TextInput-hSMuv", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Get text inputs from the Playground.", "display_name": "Tone And Style", "documentation": "", "edited": false, "field_order": [ "input_value" ], "frozen": false, "icon": "type", "legacy": false, "lf_version": "1.0.19.post2", "metadata": {}, "output_types": [], "outputs": [ { "cache": true, "display_name": "Text", "method": "text_response", "name": "text", "selected": "Message", "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "code": { "advanced": true, "dynamic": true, "fileTypes": [], "file_path": "", "info": "", "list": false, "load_from_db": false, "multiline": true, "name": "code", "password": false, "placeholder": "", "required": true, "show": true, "title_case": false, "type": "code", "value": "from langflow.base.io.text import TextComponent\nfrom langflow.io import MultilineInput, Output\nfrom langflow.schema.message import Message\n\n\nclass TextInputComponent(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from the Playground.\"\n icon = \"type\"\n name = \"TextInput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as input.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Message:\n return Message(\n text=self.input_value,\n )\n" }, "input_value": { "_input_type": "MultilineInput", "advanced": false, "display_name": "Text", "dynamic": false, "info": "Text to be passed as input.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "multiline": true, "name": "input_value", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "- Professional yet approachable - Technical but accessible - Enthusiastic about innovation - Educational and informative - Collaborative and community-focused - Clear and concise - Solution-oriented" } } }, "type": "TextInput" }, "dragging": false, "height": 234, "id": "TextInput-hSMuv", "position": { "x": 1301.68182643676, "y": 1699.978793221378 }, "positionAbsolute": { "x": 1301.68182643676, "y": 1699.978793221378 }, "selected": false, "type": "genericNode", "width": 320 }, { "data": { "id": "TextInput-b4m4C", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Get text inputs from the Playground.", "display_name": "Profile Type", "documentation": "", "edited": false, "field_order": [ "input_value" ], "frozen": false, "icon": "type", "legacy": false, "lf_version": "1.0.19.post2", "metadata": {}, "output_types": [], "outputs": [ { "cache": true, "display_name": "Text", "method": "text_response", "name": "text", "selected": "Message", "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "_type": "Component", "code": { "advanced": true, "dynamic": true, "fileTypes": [], "file_path": "", "info": "", "list": false, "load_from_db": false, "multiline": true, "name": "code", "password": false, "placeholder": "", "required": true, "show": true, "title_case": false, "type": "code", "value": "from langflow.base.io.text import TextComponent\nfrom langflow.io import MultilineInput, Output\nfrom langflow.schema.message import Message\n\n\nclass TextInputComponent(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from the Playground.\"\n icon = \"type\"\n name = \"TextInput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as input.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Message:\n return Message(\n text=self.input_value,\n )\n" }, "input_value": { "_input_type": "MultilineInput", "advanced": false, "display_name": "Text", "dynamic": false, "info": "Text to be passed as input.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "multiline": true, "name": "input_value", "placeholder": "", "required": false, "show": true, "title_case": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "Tech Company / AI Developer Platform" } } }, "type": "TextInput" }, "dragging": false, "height": 234, "id": "TextInput-b4m4C", "position": { "x": 1301.4778537945892, "y": 1428.1749742780207 }, "positionAbsolute": { "x": 1301.4778537945892, "y": 1428.1749742780207 }, "selected": false, "type": "genericNode", "width": 320 }, { "data": { "id": "note-oQQCJ", "node": { "description": "# Twitter Thread Generator\n\nWelcome to the Twitter Thread Generator! This flow helps you create compelling Twitter threads by transforming your structured inputs into engaging content.\n\n## Instructions\n\n1. Prepare Your Inputs\n - Fill in the \"Context\" with your main message or story\n - Define \"Content Guidelines\" for thread structure and style\n - Specify \"Profile Type\" and \"Profile Details\" to reflect your brand identity\n - Set \"Tone and Style\" to guide the communication approach\n - Choose \"Output Format\" (thread) and desired language\n\n2. Configure the Prompt\n - The flow uses a specialized prompt template to generate content\n - Ensure all input fields are connected to the prompt node\n\n3. Run the Generation\n - Execute the flow to process your inputs\n - The OpenAI model will create the thread based on your specifications\n\n4. Review and Refine\n - Examine the output in the Chat Output node\n - If needed, adjust your inputs and re-run for better results\n\n5. Finalize and Post\n - Once satisfied, copy the generated thread\n - Post to Twitter, maintaining the structure and flow\n\nRemember: Be specific in your context and guidelines for the best results! 🚀\n", "display_name": "", "documentation": "", "template": { "backgroundColor": "amber" } }, "type": "note" }, "dragging": false, "height": 800, "id": "note-oQQCJ", "position": { "x": 675.0099418843004, "y": 233.23451233469402 }, "positionAbsolute": { "x": 675.0099418843004, "y": 233.23451233469402 }, "resizing": false, "selected": false, "style": { "height": 800, "width": 600 }, "type": "noteNode", "width": 600 }, { "data": { "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "id": "Prompt-nDs5I", "node": { "base_classes": [ "Message" ], "beta": false, "conditional_paths": [], "custom_fields": { "template": [ "PROFILE_TYPE", "PROFILE_DETAILS", "CONTENT_GUIDELINES", "TONE_AND_STYLE", "OUTPUT_FORMAT", "OUTPUT_LANGUAGE" ] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, "field_order": [ "template" ], "frozen": false, "icon": "prompts", "legacy": false, "lf_version": "1.0.19.post2", "metadata": {}, "output_types": [], "outputs": [ { "cache": true, "display_name": "Prompt Message", "method": "build_prompt", "name": "prompt", "selected": "Message", "types": [ "Message" ], "value": "__UNDEFINED__" } ], "pinned": false, "template": { "CONTENT_GUIDELINES": { "advanced": false, "display_name": "CONTENT_GUIDELINES", "dynamic": false, "field_type": "str", "fileTypes": [], "file_path": "", "info": "", "input_types": [ "Message", "Text" ], "list": false, "load_from_db": false, "multiline": true, "name": "CONTENT_GUIDELINES", "placeholder": "", "required": false, "show": true, "title_case": false, "type": "str", "value": "" }, "OUTPUT_FORMAT": { "advanced": false, "display_name": "OUTPUT_FORMAT", "dynamic": false, "field_type": "str", "fileTypes": [], "file_path": "", "info": "", "input_types": [ "Message", "Text" ], "list": false, "load_from_db": false, "multiline": true, "name": "OUTPUT_FORMAT", "placeholder": "", "required": false, "show": true, "title_case": false, "type": "str", "value": "" }, "OUTPUT_LANGUAGE": { "advanced": false, "display_name": "OUTPUT_LANGUAGE", "dynamic": false, "field_type": "str", "fileTypes": [], "file_path": "", "info": "", "input_types": [ "Message", "Text" ], "list": false, "load_from_db": false, "multiline": true, "name": "OUTPUT_LANGUAGE", "placeholder": "", "required": false, "show": true, "title_case": false, "type": "str", "value": "" }, "PROFILE_DETAILS": { "advanced": false, "display_name": "PROFILE_DETAILS", "dynamic": false, "field_type": "str", "fileTypes": [], "file_path": "", "info": "", "input_types": [ "Message", "Text" ], "list": false, "load_from_db": false, "multiline": true, "name": "PROFILE_DETAILS", "placeholder": "", "required": false, "show": true, "title_case": false, "type": "str", "value": "" }, "PROFILE_TYPE": { "advanced": false, "display_name": "PROFILE_TYPE", "dynamic": false, "field_type": "str", "fileTypes": [], "file_path": "", "info": "", "input_types": [ "Message", "Text" ], "list": false, "load_from_db": false, "multiline": true, "name": "PROFILE_TYPE", "placeholder": "", "required": false, "show": true, "title_case": false, "type": "str", "value": "" }, "TONE_AND_STYLE": { "advanced": false, "display_name": "TONE_AND_STYLE", "dynamic": false, "field_type": "str", "fileTypes": [], "file_path": "", "info": "", "input_types": [ "Message", "Text" ], "list": false, "load_from_db": false, "multiline": true, "name": "TONE_AND_STYLE", "placeholder": "", "required": false, "show": true, "title_case": false, "type": "str", "value": "" }, "_type": "Component", "code": { "advanced": true, "dynamic": true, "fileTypes": [], "file_path": "", "info": "", "list": false, "load_from_db": false, "multiline": true, "name": "code", "password": false, "placeholder": "", "required": true, "show": true, "title_case": false, "type": "code", "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.inputs.inputs import DefaultPromptField\nfrom langflow.io import MessageTextInput, Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\n\n\nclass PromptComponent(Component):\n display_name: str = \"Prompt\"\n description: str = \"Create a prompt template with dynamic variables.\"\n icon = \"prompts\"\n trace_type = \"prompt\"\n name = \"Prompt\"\n\n inputs = [\n PromptInput(name=\"template\", display_name=\"Template\"),\n MessageTextInput(\n name=\"tool_placeholder\",\n display_name=\"Tool Placeholder\",\n tool_mode=True,\n advanced=True,\n info=\"A placeholder input for tool mode.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Prompt Message\", name=\"prompt\", method=\"build_prompt\"),\n ]\n\n async def build_prompt(self) -> Message:\n prompt = Message.from_template(**self._attributes)\n self.status = prompt.text\n return prompt\n\n def _update_template(self, frontend_node: dict):\n prompt_template = frontend_node[\"template\"][\"template\"][\"value\"]\n custom_fields = frontend_node[\"custom_fields\"]\n frontend_node_template = frontend_node[\"template\"]\n _ = process_prompt_template(\n template=prompt_template,\n name=\"template\",\n custom_fields=custom_fields,\n frontend_node_template=frontend_node_template,\n )\n return frontend_node\n\n def post_code_processing(self, new_frontend_node: dict, current_frontend_node: dict):\n \"\"\"This function is called after the code validation is done.\"\"\"\n frontend_node = super().post_code_processing(new_frontend_node, current_frontend_node)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n # Kept it duplicated for backwards compatibility\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_frontend_node\n # and update the frontend_node with those values\n update_template_values(new_template=frontend_node, previous_template=current_frontend_node[\"template\"])\n return frontend_node\n\n def _get_fallback_input(self, **kwargs):\n return DefaultPromptField(**kwargs)\n" }, "template": { "_input_type": "PromptInput", "advanced": false, "display_name": "Template", "dynamic": false, "info": "", "list": false, "load_from_db": false, "name": "template", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, "type": "prompt", "value": "\nIntroduce the task of generating tweets or tweet threads based on the provided inputs\n\nExplain each input variable:\n\n{{PROFILE_TYPE}}\n\n{{PROFILE_DETAILS}}\n\n{{CONTENT_GUIDELINES}}\n\n{{TONE_AND_STYLE}}\n\n{{CONTEXT}}\n\n{{OUTPUT_FORMAT}}\n\n{{OUTPUT_LANGUAGE}}\n\nProvide step-by-step instructions on how to analyze the inputs to determine if a single tweet or thread is appropriate\n\nGive guidance on generating tweet content that aligns with the profile, guidelines, tone, style, and context\n\nExplain how to format the output based on the {{OUTPUT_FORMAT}} value\n\nProvide tips for creating engaging, coherent tweet content\n\n\n\n\nYou are an AI tweet generator that can create standalone tweets or multi-tweet threads based on a variety of inputs about the desired content. Here are the key inputs you will use to generate the tweet(s):\n\n\n\n{PROFILE_TYPE}\n\n\n\n\n\n{PROFILE_DETAILS}\n\n\n\n\n\n{CONTENT_GUIDELINES}\n\n\n\n\n\n{TONE_AND_STYLE}\n\n\n\n\n\n{OUTPUT_FORMAT}\n\n\n\n\n\n\n{OUTPUT_LANGUAGE}\n\n\n\nTo generate the appropriate tweet(s), follow these steps:\n\n\n\nCarefully analyze the {{PROFILE_TYPE}}, {{PROFILE_DETAILS}}, {{CONTENT_GUIDELINES}}, {{TONE_AND_STYLE}}, and {{CONTEXT}} to determine the depth and breadth of content needed.\n\nIf the {{OUTPUT_FORMAT}} is \"single_tweet\", plan to convey the key information in a concise, standalone tweet.\n\nIf the {{OUTPUT_FORMAT}} is \"thread\" or if the content seems too complex for a single tweet, outline a series of connected tweets that flow together to cover the topic.\n\n\n\n\n\nBrainstorm tweet content that aligns with the {{PROFILE_TYPE}} and {{PROFILE_DETAILS}}, adheres to the {{CONTENT_GUIDELINES}}, matches the {{TONE_AND_STYLE}}, and incorporates the {{CONTEXT}}.\n\nFor a single tweet, craft the most engaging, informative message possible within the 280 character limit.\n\nFor a thread, break down the content into distinct yet connected tweet-sized chunks. Ensure each tweet flows logically into the next to maintain reader engagement. Use transitional phrases as needed to link tweets.\n\n\n\n\nFormat the output based on the {{OUTPUT_FORMAT}}:\n\nFor a single tweet, provide the content.\n\nFor a thread, include each tweet inside numbered markdown list.\n\n \nFocus on creating original, engaging content that provides value to the intended audience.\n\nOptimize the tweet(s) for the 280 character limit. Be concise yet impactful.\n\nMaintain a consistent voice that matches the {{TONE_AND_STYLE}} throughout the tweet(s).\n\nInclude calls-to-action or questions to drive engagement when appropriate.\n\nDouble check that the final output aligns with the {{PROFILE_DETAILS}} and {{CONTENT_GUIDELINES}}.\n\n\n\nNow create a Tweet or Twitter Thread for this context:\n\n" }, "tool_placeholder": { "_input_type": "MessageTextInput", "advanced": true, "display_name": "Tool Placeholder", "dynamic": false, "info": "A placeholder input for tool mode.", "input_types": [ "Message" ], "list": false, "load_from_db": false, "name": "tool_placeholder", "placeholder": "", "required": false, "show": true, "title_case": false, "tool_mode": true, "trace_as_input": true, "trace_as_metadata": true, "type": "str", "value": "" } }, "tool_mode": false }, "type": "Prompt" }, "dragging": false, "height": 779, "id": "Prompt-nDs5I", "position": { "x": 1697.1682096049744, "y": 675.4022940880462 }, "positionAbsolute": { "x": 1697.1682096049744, "y": 675.4022940880462 }, "selected": false, "type": "genericNode", "width": 320 } ], "viewport": { "x": -137.29857182316698, "y": -73.67014598946389, "zoom": 0.49710856297206957 } }, "description": "starterProjects.twitterThread.description", "endpoint_name": null, "gradient": "4", "icon": "TwitterLogoIcon", "id": "e73336f0-7ac5-42a5-827c-4b060a0556c6", "is_component": false, "last_tested_version": "1.0.19.post2", "name": "starterProjects.twitterThread.name", "tags": [ "chatbots", "content-generation" ] }