diff --git a/src/backend/base/langflow/base/constants.py b/src/backend/base/langflow/base/constants.py index 7eba7d7ff..31d6cc592 100644 --- a/src/backend/base/langflow/base/constants.py +++ b/src/backend/base/langflow/base/constants.py @@ -43,3 +43,4 @@ FIELD_FORMAT_ATTRIBUTES = [ ] SKIPPED_FIELD_ATTRIBUTES = ["advanced"] ORJSON_OPTIONS = orjson.OPT_INDENT_2 | orjson.OPT_SORT_KEYS | orjson.OPT_OMIT_MICROSECONDS +SKIPPED_COMPONENTS = {"LanguageModelComponent"} diff --git a/src/backend/base/langflow/initial_setup/setup.py b/src/backend/base/langflow/initial_setup/setup.py index f6df5b244..e66459d33 100644 --- a/src/backend/base/langflow/initial_setup/setup.py +++ b/src/backend/base/langflow/initial_setup/setup.py @@ -30,6 +30,7 @@ from langflow.base.constants import ( FIELD_FORMAT_ATTRIBUTES, NODE_FORMAT_ATTRIBUTES, ORJSON_OPTIONS, + SKIPPED_COMPONENTS, SKIPPED_FIELD_ATTRIBUTES, ) from langflow.initial_setup.constants import STARTER_FOLDER_DESCRIPTION, STARTER_FOLDER_NAME @@ -65,8 +66,15 @@ def update_projects_components_with_latest_component_versions(project_data, all_ latest_node = all_types_dict_flat.get(node_type) latest_template = latest_node.get("template") node_data["template"]["code"] = latest_template["code"] + # skip components that are having dynamic values that need to be persisted for templates - is_tool_or_agent = node_data.get("tool_mode", False) or node_data.get("key") == "Agent" + if node_data.get("key") in SKIPPED_COMPONENTS: + continue + + is_tool_or_agent = node_data.get("tool_mode", False) or node_data.get("key") in { + "Agent", + "LanguageModelComponent", + } has_tool_outputs = any(output.get("types") == ["Tool"] for output in node_data.get("outputs", [])) if "outputs" in latest_node and not has_tool_outputs and not is_tool_or_agent: # Set selected output as the previous selected output diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Custom Component Maker.json b/src/backend/base/langflow/initial_setup/starter_projects/Custom Component Maker.json index c4b07b9d7..3229a1b09 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Custom Component Maker.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Custom Component Maker.json @@ -1,19 +1,79 @@ { "data": { "edges": [ + { + "animated": false, + "className": "", + "data": { + "sourceHandle": { + "dataType": "ChatInput", + "id": "ChatInput-jaF7s", + "name": "message", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "USER_INPUT", + "id": "Prompt-AyXTF", + "inputTypes": [ + "Message", + "Text" + ], + "type": "str" + } + }, + "id": "reactflow__edge-ChatInput-jaF7s{œdataTypeœ:œChatInputœ,œidœ:œChatInput-jaF7sœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-AyXTF{œfieldNameœ:œUSER_INPUTœ,œidœ:œPrompt-AyXTFœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "selected": false, + "source": "ChatInput-jaF7s", + "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-jaF7sœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-AyXTF", + "targetHandle": "{œfieldNameœ: œUSER_INPUTœ, œidœ: œPrompt-AyXTFœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + }, + { + "animated": false, + "className": "", + "data": { + "sourceHandle": { + "dataType": "Memory", + "id": "Memory-JEHyT", + "name": "messages_text", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "CHAT_HISTORY", + "id": "Prompt-AyXTF", + "inputTypes": [ + "Message", + "Text" + ], + "type": "str" + } + }, + "id": "reactflow__edge-Memory-JEHyT{œdataTypeœ:œMemoryœ,œidœ:œMemory-JEHyTœ,œnameœ:œmessages_textœ,œoutput_typesœ:[œMessageœ]}-Prompt-AyXTF{œfieldNameœ:œCHAT_HISTORYœ,œidœ:œPrompt-AyXTFœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "selected": false, + "source": "Memory-JEHyT", + "sourceHandle": "{œdataTypeœ: œMemoryœ, œidœ: œMemory-JEHyTœ, œnameœ: œmessages_textœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-AyXTF", + "targetHandle": "{œfieldNameœ: œCHAT_HISTORYœ, œidœ: œPrompt-AyXTFœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "URL", - "id": "URL-57sgJ", - "name": "text", - "output_types": [] + "id": "URL-ml2P3", + "name": "raw_results", + "output_types": [ + "Message" + ] }, "targetHandle": { "fieldName": "EXAMPLE_COMPONENTS", - "id": "Prompt-Ap5W5", + "id": "Prompt-AyXTF", "inputTypes": [ "Message", "Text" @@ -21,12 +81,12 @@ "type": "str" } }, - "id": "reactflow__edge-URL-YeUZT{œdataTypeœ:œURLœ,œidœ:œURL-YeUZTœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-Ap5W5{œfieldNameœ:œEXAMPLE_COMPONENTSœ,œidœ:œPrompt-Ap5W5œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-URL-ml2P3{œdataTypeœ:œURLœ,œidœ:œURL-ml2P3œ,œnameœ:œraw_resultsœ,œoutput_typesœ:[œMessageœ]}-Prompt-AyXTF{œfieldNameœ:œEXAMPLE_COMPONENTSœ,œidœ:œPrompt-AyXTFœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "selected": false, - "source": "URL-57sgJ", - "sourceHandle": "{œdataTypeœ: œURLœ, œidœ: œURL-57sgJœ, œnameœ: œtextœ, œoutput_typesœ: []}", - "target": "Prompt-Ap5W5", - "targetHandle": "{œfieldNameœ: œEXAMPLE_COMPONENTSœ, œidœ: œPrompt-Ap5W5œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "source": "URL-ml2P3", + "sourceHandle": "{œdataTypeœ: œURLœ, œidœ: œURL-ml2P3œ, œnameœ: œraw_resultsœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-AyXTF", + "targetHandle": "{œfieldNameœ: œEXAMPLE_COMPONENTSœ, œidœ: œPrompt-AyXTFœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "animated": false, @@ -34,40 +94,15 @@ "data": { "sourceHandle": { "dataType": "URL", - "id": "URL-57sgJ", - "name": "text", - "output_types": [] - }, - "targetHandle": { - "fieldName": "BASE_COMPONENT_CODE", - "id": "Prompt-Ap5W5", - "inputTypes": [ - "Message", - "Text" - ], - "type": "str" - } - }, - "id": "reactflow__edge-URL-57sgJ{œdataTypeœ:œURLœ,œidœ:œURL-57sgJœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-Ap5W5{œfieldNameœ:œBASE_COMPONENT_CODEœ,œidœ:œPrompt-Ap5W5œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", - "selected": false, - "source": "URL-57sgJ", - "sourceHandle": "{œdataTypeœ: œURLœ, œidœ: œURL-57sgJœ, œnameœ: œtextœ, œoutput_typesœ: []}", - "target": "Prompt-Ap5W5", - "targetHandle": "{œfieldNameœ: œBASE_COMPONENT_CODEœ, œidœ: œPrompt-Ap5W5œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" - }, - { - "animated": false, - "className": "", - "data": { - "sourceHandle": { - "dataType": "URL", - "id": "URL-57sgJ", - "name": "text", - "output_types": [] + "id": "URL-zmpPz", + "name": "raw_results", + "output_types": [ + "Message" + ] }, "targetHandle": { "fieldName": "CUSTOM_COMPONENT_CODE", - "id": "Prompt-Ap5W5", + "id": "Prompt-AyXTF", "inputTypes": [ "Message", "Text" @@ -75,12 +110,12 @@ "type": "str" } }, - "id": "reactflow__edge-URL-yrON5{œdataTypeœ:œURLœ,œidœ:œURL-yrON5œ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-Ap5W5{œfieldNameœ:œCUSTOM_COMPONENT_CODEœ,œidœ:œPrompt-Ap5W5œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-URL-zmpPz{œdataTypeœ:œURLœ,œidœ:œURL-zmpPzœ,œnameœ:œraw_resultsœ,œoutput_typesœ:[œMessageœ]}-Prompt-AyXTF{œfieldNameœ:œCUSTOM_COMPONENT_CODEœ,œidœ:œPrompt-AyXTFœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "selected": false, - "source": "URL-57sgJ", - "sourceHandle": "{œdataTypeœ: œURLœ, œidœ: œURL-57sgJœ, œnameœ: œtextœ, œoutput_typesœ: []}", - "target": "Prompt-Ap5W5", - "targetHandle": "{œfieldNameœ: œCUSTOM_COMPONENT_CODEœ, œidœ: œPrompt-Ap5W5œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "source": "URL-zmpPz", + "sourceHandle": "{œdataTypeœ: œURLœ, œidœ: œURL-zmpPzœ, œnameœ: œraw_resultsœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-AyXTF", + "targetHandle": "{œfieldNameœ: œCUSTOM_COMPONENT_CODEœ, œidœ: œPrompt-AyXTFœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "animated": false, @@ -88,7 +123,7 @@ "data": { "sourceHandle": { "dataType": "Prompt", - "id": "Prompt-Ap5W5", + "id": "Prompt-AyXTF", "name": "prompt", "output_types": [ "Message" @@ -96,27 +131,27 @@ }, "targetHandle": { "fieldName": "input_value", - "id": "AnthropicModel-I7I40", + "id": "LanguageModelComponent-KACT4", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "reactflow__edge-Prompt-Ap5W5{œdataTypeœ:œPromptœ,œidœ:œPrompt-Ap5W5œ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-AnthropicModel-I7I40{œfieldNameœ:œinput_valueœ,œidœ:œAnthropicModel-I7I40œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-Prompt-AyXTF{œdataTypeœ:œPromptœ,œidœ:œPrompt-AyXTFœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-LanguageModelComponent-KACT4{œfieldNameœ:œinput_valueœ,œidœ:œLanguageModelComponent-KACT4œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "Prompt-Ap5W5", - "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-Ap5W5œ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", - "target": "AnthropicModel-I7I40", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œAnthropicModel-I7I40œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "source": "Prompt-AyXTF", + "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-AyXTFœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", + "target": "LanguageModelComponent-KACT4", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œLanguageModelComponent-KACT4œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { - "dataType": "AnthropicModel", - "id": "AnthropicModel-I7I40", + "dataType": "LanguageModelComponent", + "id": "LanguageModelComponent-KACT4", "name": "text_output", "output_types": [ "Message" @@ -124,7 +159,7 @@ }, "targetHandle": { "fieldName": "input_value", - "id": "ChatOutput-Z5a3C", + "id": "ChatOutput-vteLS", "inputTypes": [ "Data", "DataFrame", @@ -133,28 +168,28 @@ "type": "other" } }, - "id": "reactflow__edge-AnthropicModel-I7I40{œdataTypeœ:œAnthropicModelœ,œidœ:œAnthropicModel-I7I40œ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-Z5a3C{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-Z5a3Cœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}", + "id": "reactflow__edge-LanguageModelComponent-KACT4{œdataTypeœ:œLanguageModelComponentœ,œidœ:œLanguageModelComponent-KACT4œ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-vteLS{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-vteLSœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}", "selected": false, - "source": "AnthropicModel-I7I40", - "sourceHandle": "{œdataTypeœ: œAnthropicModelœ, œidœ: œAnthropicModel-I7I40œ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "ChatOutput-Z5a3C", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-Z5a3Cœ, œinputTypesœ: [œDataœ, œDataFrameœ, œMessageœ], œtypeœ: œotherœ}" + "source": "LanguageModelComponent-KACT4", + "sourceHandle": "{œdataTypeœ: œLanguageModelComponentœ, œidœ: œLanguageModelComponent-KACT4œ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "ChatOutput-vteLS", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-vteLSœ, œinputTypesœ: [œDataœ, œDataFrameœ, œMessageœ], œtypeœ: œotherœ}" }, { "animated": false, "className": "", "data": { "sourceHandle": { - "dataType": "ChatInput", - "id": "ChatInput-gwwtq", - "name": "message", + "dataType": "URL", + "id": "URL-MwIlU", + "name": "raw_results", "output_types": [ "Message" ] }, "targetHandle": { - "fieldName": "USER_INPUT", - "id": "Prompt-Ap5W5", + "fieldName": "BASE_COMPONENT_CODE", + "id": "Prompt-AyXTF", "inputTypes": [ "Message", "Text" @@ -162,65 +197,12 @@ "type": "str" } }, - "id": "reactflow__edge-ChatInput-gwwtq{œdataTypeœ:œChatInputœ,œidœ:œChatInput-gwwtqœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-Ap5W5{œfieldNameœ:œUSER_INPUTœ,œidœ:œPrompt-Ap5W5œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "id": "xy-edge__URL-MwIlU{œdataTypeœ:œURLœ,œidœ:œURL-MwIlUœ,œnameœ:œraw_resultsœ,œoutput_typesœ:[œMessageœ]}-Prompt-AyXTF{œfieldNameœ:œBASE_COMPONENT_CODEœ,œidœ:œPrompt-AyXTFœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", "selected": false, - "source": "ChatInput-gwwtq", - "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-gwwtqœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-Ap5W5", - "targetHandle": "{œfieldNameœ: œUSER_INPUTœ, œidœ: œPrompt-Ap5W5œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" - }, - { - "data": { - "sourceHandle": { - "dataType": "Memory", - "id": "Memory-Ftk3s", - "name": "dataframe", - "output_types": [ - "DataFrame" - ] - }, - "targetHandle": { - "fieldName": "input_data", - "id": "TypeConverterComponent-Vb89B", - "inputTypes": [ - "Message", - "Data", - "DataFrame" - ], - "type": "other" - } - }, - "id": "xy-edge__Memory-Ftk3s{œdataTypeœ:œMemoryœ,œidœ:œMemory-Ftk3sœ,œnameœ:œdataframeœ,œoutput_typesœ:[œDataFrameœ]}-TypeConverterComponent-Vb89B{œfieldNameœ:œinput_dataœ,œidœ:œTypeConverterComponent-Vb89Bœ,œinputTypesœ:[œMessageœ,œDataœ,œDataFrameœ],œtypeœ:œotherœ}", - "source": "Memory-Ftk3s", - "sourceHandle": "{œdataTypeœ: œMemoryœ, œidœ: œMemory-Ftk3sœ, œnameœ: œdataframeœ, œoutput_typesœ: [œDataFrameœ]}", - "target": "TypeConverterComponent-Vb89B", - "targetHandle": "{œfieldNameœ: œinput_dataœ, œidœ: œTypeConverterComponent-Vb89Bœ, œinputTypesœ: [œMessageœ, œDataœ, œDataFrameœ], œtypeœ: œotherœ}" - }, - { - "data": { - "sourceHandle": { - "dataType": "TypeConverterComponent", - "id": "TypeConverterComponent-Vb89B", - "name": "message_output", - "output_types": [ - "Message" - ] - }, - "targetHandle": { - "fieldName": "CHAT_HISTORY", - "id": "Prompt-Ap5W5", - "inputTypes": [ - "Message", - "Text" - ], - "type": "str" - } - }, - "id": "xy-edge__TypeConverterComponent-Vb89B{œdataTypeœ:œTypeConverterComponentœ,œidœ:œTypeConverterComponent-Vb89Bœ,œnameœ:œmessage_outputœ,œoutput_typesœ:[œMessageœ]}-Prompt-Ap5W5{œfieldNameœ:œCHAT_HISTORYœ,œidœ:œPrompt-Ap5W5œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", - "source": "TypeConverterComponent-Vb89B", - "sourceHandle": "{œdataTypeœ: œTypeConverterComponentœ, œidœ: œTypeConverterComponent-Vb89Bœ, œnameœ: œmessage_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-Ap5W5", - "targetHandle": "{œfieldNameœ: œCHAT_HISTORYœ, œidœ: œPrompt-Ap5W5œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "source": "URL-MwIlU", + "sourceHandle": "{œdataTypeœ: œURLœ, œidœ: œURL-MwIlUœ, œnameœ: œraw_resultsœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-AyXTF", + "targetHandle": "{œfieldNameœ: œBASE_COMPONENT_CODEœ, œidœ: œPrompt-AyXTFœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" } ], "nodes": [ @@ -228,7 +210,7 @@ "data": { "description": "Retrieves stored chat messages from Langflow tables or an external memory.", "display_name": "Chat Memory", - "id": "Memory-Ftk3s", + "id": "Memory-JEHyT", "node": { "base_classes": [ "Data", @@ -253,7 +235,7 @@ "frozen": false, "icon": "message-square-more", "legacy": false, - "lf_version": "1.0.19.post2", + "lf_version": "1.4.3", "metadata": {}, "output_types": [], "outputs": [ @@ -278,7 +260,7 @@ "group_outputs": false, "method": "retrieve_messages_dataframe", "name": "dataframe", - "selected": "DataFrame", + "selected": null, "tool_mode": true, "types": [ "DataFrame" @@ -524,19 +506,19 @@ }, "tool_mode": false }, - "selected_output": "dataframe", + "selected_output": "messages_text", "type": "Memory" }, "dragging": false, "height": 262, - "id": "Memory-Ftk3s", + "id": "Memory-JEHyT", "measured": { "height": 262, "width": 320 }, "position": { - "x": 1832.6206210738642, - "y": 1150.8832220209044 + "x": 1839.8921277807215, + "y": 1158.1547287277615 }, "positionAbsolute": { "x": 1830.6888981898887, @@ -550,7 +532,7 @@ "data": { "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", - "id": "Prompt-Ap5W5", + "id": "Prompt-AyXTF", "node": { "base_classes": [ "Message" @@ -576,7 +558,7 @@ "frozen": false, "icon": "braces", "legacy": false, - "lf_version": "1.0.19.post2", + "lf_version": "1.4.3", "metadata": {}, "output_types": [], "outputs": [ @@ -779,7 +761,7 @@ }, "dragging": false, "height": 685, - "id": "Prompt-Ap5W5", + "id": "Prompt-AyXTF", "measured": { "height": 685, "width": 320 @@ -798,7 +780,7 @@ }, { "data": { - "id": "note-Wm994", + "id": "note-Qj3LB", "node": { "description": "# Fetch Components code \n\nUsing the URL component we are extracting from Github, the code from a few classes to provide as example to the LLM. \n\nThis ensures we are always up to date with recent information from the codebase.", "display_name": "", @@ -809,14 +791,14 @@ }, "dragging": false, "height": 324, - "id": "note-Wm994", + "id": "note-Qj3LB", "measured": { "height": 324, "width": 325 }, "position": { - "x": 1428.2696830085167, - "y": -263.5483680075372 + "x": 1304.6540689919455, + "y": -30.860153388108785 }, "positionAbsolute": { "x": 1430.2014058924922, @@ -828,7 +810,7 @@ }, { "data": { - "id": "note-laDOf", + "id": "note-5Lp7H", "node": { "description": "# 🛠️ Custom Component Generator 🚀\n\nHi! I'm here to help you create custom components for Langflow. Think of me as your technical partner who can help turn your ideas into working components! \n\n## 🎯 How to Work With Me\n\n### 1. 💭 Tell Me What You Want to Build\nSimply describe what you want your component to do in plain English. For example:\n- \"I need a component that sends Slack messages\"\n- \"I want to create a tool that can process CSV files\"\n- \"I need something that can translate text\"\n\n### 2. 📚 Share Any Relevant Information\nIf you're working with a specific:\n- 🔑 API or service (just share the documentation link or main endpoints)\n- 📄 File format\n- 🔄 Data structure\n- 🔧 Existing component you want to modify\n\n### 3. 🎨 Let Me Help Design It\nI'll help by:\n- 📊 Breaking down complex requirements into manageable pieces\n- 💡 Suggesting the best way to structure inputs and outputs\n- ⚙️ Creating the component code\n- 📝 Explaining how to use it\n\n### 4. 🔄 Iterative Refinement\nWe can then:\n- ✅ Test and refine the component\n- ⭐ Add features\n- 🔧 Modify behavior\n- 🛡️ Improve error handling\n- 📖 Add documentation\n\n## 🚀 What I Can Help With\n\nI can help create components that:\n- 📊 Process different file types (CSV, JSON, Excel, etc.)\n- 🔌 Integrate with external APIs\n- 🔄 Transform data\n- 🔀 Route messages\n- 🌐 Handle web requests\n- 🎯 Parse structured data\n- ✨ And much more!\n\n## 💡 Tips for Best Results\n\n1. **Be Specific** 🎯: The more details you provide about what you want to accomplish, the better I can help.\n\n2. **Share Examples** 📋: If you have example data or specific use cases, share them.\n\n3. **Ask Questions** ❓: Don't hesitate to ask for clarification or modifications.\n\nJust start by telling me what kind of component you'd like to create, and I'll guide you through the process! \n\nReady to build something awesome? 🚀 Let's get started!", "display_name": "", @@ -839,14 +821,14 @@ }, "dragging": false, "height": 573, - "id": "note-laDOf", + "id": "note-5Lp7H", "measured": { "height": 573, "width": 620 }, "position": { - "x": 1002.7334076860311, - "y": 538.0401552689275 + "x": 1094.8391593062215, + "y": 494.4111150277846 }, "positionAbsolute": { "x": 807.6293964045135, @@ -863,7 +845,7 @@ }, { "data": { - "id": "URL-57sgJ", + "id": "URL-MwIlU", "node": { "base_classes": [ "Data", @@ -883,7 +865,7 @@ "frozen": false, "icon": "layout-template", "legacy": false, - "lf_version": "1.0.19.post2", + "lf_version": "1.4.3", "metadata": {}, "output_types": [], "outputs": [ @@ -894,7 +876,6 @@ "group_outputs": false, "method": "fetch_content", "name": "page_results", - "selected": "DataFrame", "tool_mode": true, "types": [ "DataFrame" @@ -1102,9 +1083,9 @@ "name": "max_depth", "placeholder": "", "range_spec": { - "max": 5.0, - "min": 1.0, - "step": 1.0, + "max": 5, + "min": 1, + "step": 1, "step_type": "float" }, "required": false, @@ -1196,19 +1177,19 @@ }, "tool_mode": false }, - "selected_output": "text", + "selected_output": "raw_results", "type": "URL" }, "dragging": false, "height": 365, - "id": "URL-57sgJ", + "id": "URL-MwIlU", "measured": { "height": 365, "width": 320 }, "position": { - "x": 1428.8876734924713, - "y": 32.523680276074714 + "x": 1422.737604307548, + "y": 85.36729017597193 }, "positionAbsolute": { "x": 1436.3617127766433, @@ -1220,7 +1201,7 @@ }, { "data": { - "id": "URL-YeUZT", + "id": "URL-ml2P3", "node": { "base_classes": [ "Data", @@ -1240,7 +1221,7 @@ "frozen": false, "icon": "layout-template", "legacy": false, - "lf_version": "1.0.19.post2", + "lf_version": "1.4.3", "metadata": {}, "output_types": [], "outputs": [ @@ -1251,7 +1232,6 @@ "group_outputs": false, "method": "fetch_content", "name": "page_results", - "selected": "DataFrame", "tool_mode": true, "types": [ "DataFrame" @@ -1459,9 +1439,9 @@ "name": "max_depth", "placeholder": "", "range_spec": { - "max": 5.0, - "min": 1.0, - "step": 1.0, + "max": 5, + "min": 1, + "step": 1, "step_type": "float" }, "required": false, @@ -1559,19 +1539,19 @@ }, "tool_mode": false }, - "selected_output": "text", + "selected_output": "raw_results", "type": "URL" }, "dragging": false, "height": 661, - "id": "URL-YeUZT", + "id": "URL-ml2P3", "measured": { "height": 661, "width": 320 }, "position": { - "x": 1831.5895760156684, - "y": 245.62940316018893 + "x": 1824.3180693088113, + "y": 284.41077226342696 }, "positionAbsolute": { "x": 1831.5895760156684, @@ -1583,7 +1563,7 @@ }, { "data": { - "id": "URL-yrON5", + "id": "URL-zmpPz", "node": { "base_classes": [ "Data", @@ -1603,7 +1583,7 @@ "frozen": false, "icon": "layout-template", "legacy": false, - "lf_version": "1.0.19.post2", + "lf_version": "1.4.3", "metadata": {}, "output_types": [], "outputs": [ @@ -1614,7 +1594,6 @@ "group_outputs": false, "method": "fetch_content", "name": "page_results", - "selected": "DataFrame", "tool_mode": true, "types": [ "DataFrame" @@ -1822,9 +1801,9 @@ "name": "max_depth", "placeholder": "", "range_spec": { - "max": 5.0, - "min": 1.0, - "step": 1.0, + "max": 5, + "min": 1, + "step": 1, "step_type": "float" }, "required": false, @@ -1916,19 +1895,19 @@ }, "tool_mode": false }, - "selected_output": "text", + "selected_output": "raw_results", "type": "URL" }, "dragging": false, "height": 365, - "id": "URL-yrON5", + "id": "URL-zmpPz", "measured": { "height": 365, "width": 320 }, "position": { - "x": 1429.5084407373513, - "y": 632.4558314720756 + "x": 1503.311191099216, + "y": 859.9645996406584 }, "positionAbsolute": { "x": 1436.982480021523, @@ -1940,345 +1919,7 @@ }, { "data": { - "id": "AnthropicModel-I7I40", - "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], - "beta": false, - "category": "models", - "conditional_paths": [], - "custom_fields": {}, - "description": "Generate text using Anthropic Chat&Completion LLMs with prefill support.", - "display_name": "Anthropic", - "documentation": "", - "edited": false, - "field_order": [ - "input_value", - "system_message", - "stream", - "max_tokens", - "model_name", - "api_key", - "temperature", - "base_url", - "tool_model_enabled", - "prefill" - ], - "frozen": false, - "icon": "Anthropic", - "key": "AnthropicModel", - "legacy": false, - "metadata": { - "keywords": [ - "model", - "llm", - "language model", - "large language model" - ] - }, - "minimized": false, - "output_types": [], - "outputs": [ - { - "allows_loop": false, - "cache": true, - "display_name": "Model Response", - "group_outputs": false, - "method": "text_response", - "name": "text_output", - "selected": "Message", - "tool_mode": true, - "types": [ - "Message" - ], - "value": "__UNDEFINED__" - }, - { - "allows_loop": false, - "cache": true, - "display_name": "Language Model", - "group_outputs": false, - "method": "build_model", - "name": "model_output", - "selected": "LanguageModel", - "tool_mode": true, - "types": [ - "LanguageModel" - ], - "value": "__UNDEFINED__" - } - ], - "pinned": false, - "score": 0.0005851173668140926, - "template": { - "_type": "Component", - "api_key": { - "_input_type": "SecretStrInput", - "advanced": false, - "display_name": "Anthropic API Key", - "dynamic": false, - "info": "Your Anthropic API key.", - "input_types": [], - "load_from_db": false, - "name": "api_key", - "password": true, - "placeholder": "", - "real_time_refresh": true, - "required": true, - "show": true, - "title_case": false, - "type": "str", - "value": "" - }, - "base_url": { - "_input_type": "MessageTextInput", - "advanced": true, - "display_name": "Anthropic API URL", - "dynamic": false, - "info": "Endpoint of the Anthropic API. Defaults to 'https://api.anthropic.com' if not specified.", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "name": "base_url", - "placeholder": "", - "real_time_refresh": true, - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_input": true, - "trace_as_metadata": true, - "type": "str", - "value": "https://api.anthropic.com" - }, - "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 typing import Any, cast\n\nimport requests\nfrom loguru import logger\nfrom pydantic import ValidationError\n\nfrom langflow.base.models.anthropic_constants import (\n ANTHROPIC_MODELS,\n DEFAULT_ANTHROPIC_API_URL,\n TOOL_CALLING_SUPPORTED_ANTHROPIC_MODELS,\n TOOL_CALLING_UNSUPPORTED_ANTHROPIC_MODELS,\n)\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.field_typing import LanguageModel\nfrom langflow.field_typing.range_spec import RangeSpec\nfrom langflow.io import BoolInput, DropdownInput, IntInput, MessageTextInput, SecretStrInput, SliderInput\nfrom langflow.schema.dotdict import dotdict\n\n\nclass AnthropicModelComponent(LCModelComponent):\n display_name = \"Anthropic\"\n description = \"Generate text using Anthropic Chat&Completion LLMs with prefill support.\"\n icon = \"Anthropic\"\n name = \"AnthropicModel\"\n\n inputs = [\n *LCModelComponent._base_inputs,\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n value=4096,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n options=ANTHROPIC_MODELS,\n refresh_button=True,\n value=ANTHROPIC_MODELS[0],\n combobox=True,\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Anthropic API Key\",\n info=\"Your Anthropic API key.\",\n value=None,\n required=True,\n real_time_refresh=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n info=\"Run inference with this temperature. Must by in the closed interval [0.0, 1.0].\",\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n advanced=True,\n ),\n MessageTextInput(\n name=\"base_url\",\n display_name=\"Anthropic API URL\",\n info=\"Endpoint of the Anthropic API. Defaults to 'https://api.anthropic.com' if not specified.\",\n value=DEFAULT_ANTHROPIC_API_URL,\n real_time_refresh=True,\n advanced=True,\n ),\n BoolInput(\n name=\"tool_model_enabled\",\n display_name=\"Enable Tool Models\",\n info=(\n \"Select if you want to use models that can work with tools. If yes, only those models will be shown.\"\n ),\n advanced=False,\n value=False,\n real_time_refresh=True,\n ),\n MessageTextInput(\n name=\"prefill\", display_name=\"Prefill\", info=\"Prefill text to guide the model's response.\", advanced=True\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n try:\n from langchain_anthropic.chat_models import ChatAnthropic\n except ImportError as e:\n msg = \"langchain_anthropic is not installed. Please install it with `pip install langchain_anthropic`.\"\n raise ImportError(msg) from e\n try:\n max_tokens_value = getattr(self, \"max_tokens\", \"\")\n max_tokens_value = 4096 if max_tokens_value == \"\" else int(max_tokens_value)\n output = ChatAnthropic(\n model=self.model_name,\n anthropic_api_key=self.api_key,\n max_tokens=max_tokens_value,\n temperature=self.temperature,\n anthropic_api_url=self.base_url or DEFAULT_ANTHROPIC_API_URL,\n streaming=self.stream,\n )\n except ValidationError:\n raise\n except Exception as e:\n msg = \"Could not connect to Anthropic API.\"\n raise ValueError(msg) from e\n\n return output\n\n def get_models(self, tool_model_enabled: bool | None = None) -> list[str]:\n try:\n import anthropic\n\n client = anthropic.Anthropic(api_key=self.api_key)\n models = client.models.list(limit=20).data\n model_ids = ANTHROPIC_MODELS + [model.id for model in models]\n except (ImportError, ValueError, requests.exceptions.RequestException) as e:\n logger.exception(f\"Error getting model names: {e}\")\n model_ids = ANTHROPIC_MODELS\n\n if tool_model_enabled:\n try:\n from langchain_anthropic.chat_models import ChatAnthropic\n except ImportError as e:\n msg = \"langchain_anthropic is not installed. Please install it with `pip install langchain_anthropic`.\"\n raise ImportError(msg) from e\n\n # Create a new list instead of modifying while iterating\n filtered_models = []\n for model in model_ids:\n if model in TOOL_CALLING_SUPPORTED_ANTHROPIC_MODELS:\n filtered_models.append(model)\n continue\n\n model_with_tool = ChatAnthropic(\n model=model, # Use the current model being checked\n anthropic_api_key=self.api_key,\n anthropic_api_url=cast(str, self.base_url) or DEFAULT_ANTHROPIC_API_URL,\n )\n\n if (\n not self.supports_tool_calling(model_with_tool)\n or model in TOOL_CALLING_UNSUPPORTED_ANTHROPIC_MODELS\n ):\n continue\n\n filtered_models.append(model)\n\n return filtered_models\n\n return model_ids\n\n def _get_exception_message(self, exception: Exception) -> str | None:\n \"\"\"Get a message from an Anthropic exception.\n\n Args:\n exception (Exception): The exception to get the message from.\n\n Returns:\n str: The message from the exception.\n \"\"\"\n try:\n from anthropic import BadRequestError\n except ImportError:\n return None\n if isinstance(exception, BadRequestError):\n message = exception.body.get(\"error\", {}).get(\"message\")\n if message:\n return message\n return None\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):\n if \"base_url\" in build_config and build_config[\"base_url\"][\"value\"] is None:\n build_config[\"base_url\"][\"value\"] = DEFAULT_ANTHROPIC_API_URL\n self.base_url = DEFAULT_ANTHROPIC_API_URL\n if field_name in {\"base_url\", \"model_name\", \"tool_model_enabled\", \"api_key\"} and field_value:\n try:\n if len(self.api_key) == 0:\n ids = ANTHROPIC_MODELS\n else:\n try:\n ids = self.get_models(tool_model_enabled=self.tool_model_enabled)\n except (ImportError, ValueError, requests.exceptions.RequestException) as e:\n logger.exception(f\"Error getting model names: {e}\")\n ids = ANTHROPIC_MODELS\n build_config[\"model_name\"][\"options\"] = ids\n build_config[\"model_name\"][\"value\"] = ids[0]\n build_config[\"model_name\"][\"combobox\"] = True\n except Exception as e:\n msg = f\"Error getting model names: {e}\"\n raise ValueError(msg) from e\n return build_config\n" - }, - "input_value": { - "_input_type": "MessageInput", - "advanced": false, - "display_name": "Input", - "dynamic": false, - "info": "", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "name": "input_value", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_input": true, - "trace_as_metadata": true, - "type": "str", - "value": "" - }, - "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, - "list_add_label": "Add More", - "name": "max_tokens", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 4096 - }, - "model_name": { - "_input_type": "DropdownInput", - "advanced": false, - "combobox": true, - "dialog_inputs": {}, - "display_name": "Model Name", - "dynamic": false, - "info": "", - "name": "model_name", - "options": [ - "claude-opus-4-20250514", - "claude-sonnet-4-20250514", - "claude-3-7-sonnet-latest", - "claude-3-5-sonnet-latest", - "claude-3-5-haiku-latest", - "claude-3-opus-latest", - "claude-3-sonnet-20240229" - ], - "options_metadata": [], - "placeholder": "", - "refresh_button": true, - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "str", - "value": "claude-opus-4-20250514" - }, - "prefill": { - "_input_type": "MessageTextInput", - "advanced": true, - "display_name": "Prefill", - "dynamic": false, - "info": "Prefill text to guide the model's response.", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "name": "prefill", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_input": true, - "trace_as_metadata": true, - "type": "str", - "value": "" - }, - "stream": { - "_input_type": "BoolInput", - "advanced": true, - "display_name": "Stream", - "dynamic": false, - "info": "Stream the response from the model. Streaming works only in Chat.", - "list": false, - "list_add_label": "Add More", - "name": "stream", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "bool", - "value": false - }, - "system_message": { - "_input_type": "MultilineInput", - "advanced": false, - "display_name": "System Message", - "dynamic": false, - "info": "System message to pass to the model.", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "multiline": true, - "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": "langflow" - }, - "temperature": { - "_input_type": "SliderInput", - "advanced": true, - "display_name": "Temperature", - "dynamic": false, - "info": "Run inference with this temperature. Must by in the closed interval [0.0, 1.0].", - "max_label": "", - "max_label_icon": "", - "min_label": "", - "min_label_icon": "", - "name": "temperature", - "placeholder": "", - "range_spec": { - "max": 1, - "min": 0, - "step": 0.01, - "step_type": "float" - }, - "required": false, - "show": true, - "slider_buttons": false, - "slider_buttons_options": [], - "slider_input": false, - "title_case": false, - "tool_mode": false, - "type": "slider", - "value": 0.1 - }, - "tool_model_enabled": { - "_input_type": "BoolInput", - "advanced": false, - "display_name": "Enable Tool Models", - "dynamic": false, - "info": "Select if you want to use models that can work with tools. If yes, only those models will be shown.", - "list": false, - "list_add_label": "Add More", - "name": "tool_model_enabled", - "placeholder": "", - "real_time_refresh": true, - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "bool", - "value": true - } - }, - "tool_mode": false - }, - "selected_output": "text_output", - "showNode": true, - "type": "AnthropicModel" - }, - "dragging": false, - "id": "AnthropicModel-I7I40", - "measured": { - "height": 507, - "width": 320 - }, - "position": { - "x": 2585.5577736139826, - "y": 454.98013556663204 - }, - "selected": false, - "type": "genericNode" - }, - { - "data": { - "id": "ChatInput-gwwtq", + "id": "ChatInput-jaF7s", "node": { "base_classes": [ "Message" @@ -2306,6 +1947,7 @@ "icon": "MessagesSquare", "key": "ChatInput", "legacy": false, + "lf_version": "1.4.3", "metadata": {}, "minimized": true, "output_types": [], @@ -2577,21 +2219,21 @@ "type": "ChatInput" }, "dragging": false, - "id": "ChatInput-gwwtq", + "id": "ChatInput-jaF7s", "measured": { "height": 48, "width": 192 }, "position": { - "x": 1444.5468159526824, - "y": 1383.8217675906462 + "x": 1570.5862655382064, + "y": 1294.1398515394083 }, "selected": false, "type": "genericNode" }, { "data": { - "id": "ChatOutput-Z5a3C", + "id": "ChatOutput-vteLS", "node": { "base_classes": [ "Message" @@ -2883,68 +2525,118 @@ }, "tool_mode": false }, - "showNode": false, + "showNode": true, "type": "ChatOutput" }, "dragging": false, - "id": "ChatOutput-Z5a3C", + "id": "ChatOutput-vteLS", "measured": { - "height": 48, - "width": 192 + "height": 166, + "width": 320 }, "position": { - "x": 2978.7260774697843, - "y": 1090.820738482898 + "x": 2987.5763483928145, + "y": 865.2708447719162 }, "selected": false, "type": "genericNode" }, { "data": { - "id": "TypeConverterComponent-Vb89B", + "id": "LanguageModelComponent-KACT4", "node": { "base_classes": [ + "LanguageModel", "Message" ], "beta": false, - "category": "processing", + "category": "models", "conditional_paths": [], "custom_fields": {}, - "description": "Convert between different types (Message, Data, DataFrame)", - "display_name": "Type Convert", + "description": "Runs a language model given a specified provider. ", + "display_name": "Language Model", "documentation": "", "edited": false, "field_order": [ - "input_data", - "output_type" + "provider", + "model_name", + "api_key", + "input_value", + "system_message", + "stream", + "temperature" ], "frozen": false, - "icon": "repeat", - "key": "TypeConverterComponent", + "icon": "brain-circuit", + "key": "LanguageModelComponent", "legacy": false, - "metadata": {}, + "metadata": { + "keywords": [ + "model", + "llm", + "language model", + "large language model" + ] + }, "minimized": false, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, - "display_name": "Message Output", + "display_name": "Model Response", "group_outputs": false, - "method": "convert_to_message", - "name": "message_output", + "method": "text_response", + "name": "text_output", + "options": null, + "required_inputs": null, "selected": "Message", "tool_mode": true, "types": [ "Message" ], "value": "__UNDEFINED__" + }, + { + "allows_loop": false, + "cache": true, + "display_name": "Language Model", + "group_outputs": false, + "method": "build_model", + "name": "model_output", + "options": null, + "required_inputs": null, + "selected": "LanguageModel", + "tool_mode": true, + "types": [ + "LanguageModel" + ], + "value": "__UNDEFINED__" } ], "pinned": false, - "score": 0.007568328950209746, + "priority": 0, + "score": 0.28173906304863156, "template": { "_type": "Component", + "api_key": { + "_input_type": "SecretStrInput", + "advanced": false, + "display_name": "Anthropic API Key", + "dynamic": false, + "info": "Model Provider API key", + "input_types": [], + "load_from_db": false, + "name": "api_key", + "password": true, + "placeholder": "", + "real_time_refresh": true, + "required": false, + "show": true, + "title_case": false, + "type": "str", + "value": "" + }, "code": { "advanced": true, "dynamic": true, @@ -2961,83 +2653,198 @@ "show": true, "title_case": false, "type": "code", - "value": "from typing import Any\n\nfrom langflow.custom import Component\nfrom langflow.io import HandleInput, Output, TabInput\nfrom langflow.schema import Data, DataFrame, Message\n\n\ndef convert_to_message(v) -> Message:\n \"\"\"Convert input to Message type.\n\n Args:\n v: Input to convert (Message, Data, DataFrame, or dict)\n\n Returns:\n Message: Converted Message object\n \"\"\"\n return v if isinstance(v, Message) else v.to_message()\n\n\ndef convert_to_data(v: DataFrame | Data | Message | dict) -> Data:\n \"\"\"Convert input to Data type.\n\n Args:\n v: Input to convert (Message, Data, DataFrame, or dict)\n\n Returns:\n Data: Converted Data object\n \"\"\"\n if isinstance(v, dict):\n return Data(v)\n return v if isinstance(v, Data) else v.to_data()\n\n\ndef convert_to_dataframe(v: DataFrame | Data | Message | dict) -> DataFrame:\n \"\"\"Convert input to DataFrame type.\n\n Args:\n v: Input to convert (Message, Data, DataFrame, or dict)\n\n Returns:\n DataFrame: Converted DataFrame object\n \"\"\"\n if isinstance(v, dict):\n return DataFrame([v])\n return v if isinstance(v, DataFrame) else v.to_dataframe()\n\n\nclass TypeConverterComponent(Component):\n display_name = \"Type Convert\"\n description = \"Convert between different types (Message, Data, DataFrame)\"\n icon = \"repeat\"\n\n inputs = [\n HandleInput(\n name=\"input_data\",\n display_name=\"Input\",\n input_types=[\"Message\", \"Data\", \"DataFrame\"],\n info=\"Accept Message, Data or DataFrame as input\",\n required=True,\n ),\n TabInput(\n name=\"output_type\",\n display_name=\"Output Type\",\n options=[\"Message\", \"Data\", \"DataFrame\"],\n info=\"Select the desired output data type\",\n real_time_refresh=True,\n value=\"Message\",\n ),\n ]\n\n outputs = [\n Output(\n display_name=\"Message Output\",\n name=\"message_output\",\n method=\"convert_to_message\",\n )\n ]\n\n def update_outputs(self, frontend_node: dict, field_name: str, field_value: Any) -> dict:\n \"\"\"Dynamically show only the relevant output based on the selected output type.\"\"\"\n if field_name == \"output_type\":\n # Start with empty outputs\n frontend_node[\"outputs\"] = []\n\n # Add only the selected output type\n if field_value == \"Message\":\n frontend_node[\"outputs\"].append(\n Output(\n display_name=\"Message Output\",\n name=\"message_output\",\n method=\"convert_to_message\",\n ).to_dict()\n )\n elif field_value == \"Data\":\n frontend_node[\"outputs\"].append(\n Output(\n display_name=\"Data Output\",\n name=\"data_output\",\n method=\"convert_to_data\",\n ).to_dict()\n )\n elif field_value == \"DataFrame\":\n frontend_node[\"outputs\"].append(\n Output(\n display_name=\"DataFrame Output\",\n name=\"dataframe_output\",\n method=\"convert_to_dataframe\",\n ).to_dict()\n )\n\n return frontend_node\n\n def convert_to_message(self) -> Message:\n \"\"\"Convert input to Message type.\"\"\"\n input_value = self.input_data[0] if isinstance(self.input_data, list) else self.input_data\n\n # Handle string input by converting to Message first\n if isinstance(input_value, str):\n input_value = Message(text=input_value)\n\n result = convert_to_message(input_value)\n self.status = result\n return result\n\n def convert_to_data(self) -> Data:\n \"\"\"Convert input to Data type.\"\"\"\n input_value = self.input_data[0] if isinstance(self.input_data, list) else self.input_data\n\n # Handle string input by converting to Message first\n if isinstance(input_value, str):\n input_value = Message(text=input_value)\n\n result = convert_to_data(input_value)\n self.status = result\n return result\n\n def convert_to_dataframe(self) -> DataFrame:\n \"\"\"Convert input to DataFrame type.\"\"\"\n input_value = self.input_data[0] if isinstance(self.input_data, list) else self.input_data\n\n # Handle string input by converting to Message first\n if isinstance(input_value, str):\n input_value = Message(text=input_value)\n\n result = convert_to_dataframe(input_value)\n self.status = result\n return result\n" + "value": "from typing import Any\n\nfrom langchain_anthropic import ChatAnthropic\nfrom langchain_google_genai import ChatGoogleGenerativeAI\nfrom langchain_openai import ChatOpenAI\n\nfrom langflow.base.models.anthropic_constants import ANTHROPIC_MODELS\nfrom langflow.base.models.google_generative_ai_constants import GOOGLE_GENERATIVE_AI_MODELS\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.inputs import BoolInput\nfrom langflow.io import DropdownInput, MessageInput, MultilineInput, SecretStrInput, SliderInput\nfrom langflow.schema.dotdict import dotdict\n\n\nclass LanguageModelComponent(LCModelComponent):\n display_name = \"Language Model\"\n description = \"Runs a language model given a specified provider. \"\n icon = \"brain-circuit\"\n category = \"models\"\n priority = 0 # Set priority to 0 to make it appear first\n\n inputs = [\n DropdownInput(\n name=\"provider\",\n display_name=\"Model Provider\",\n options=[\"OpenAI\", \"Anthropic\", \"Google\"],\n value=\"OpenAI\",\n info=\"Select the model provider\",\n real_time_refresh=True,\n options_metadata=[{\"icon\": \"OpenAI\"}, {\"icon\": \"Anthropic\"}, {\"icon\": \"Google\"}],\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n options=OPENAI_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[0],\n info=\"Select the model to use\",\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"OpenAI API Key\",\n info=\"Model Provider API key\",\n required=False,\n show=True,\n real_time_refresh=True,\n ),\n MessageInput(\n name=\"input_value\",\n display_name=\"Input\",\n info=\"The input text to send to the model\",\n ),\n MultilineInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"A system message that helps set the behavior of the assistant\",\n advanced=True,\n ),\n BoolInput(\n name=\"stream\",\n display_name=\"Stream\",\n info=\"Whether to stream the response\",\n value=False,\n advanced=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n info=\"Controls randomness in responses\",\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n advanced=True,\n ),\n ]\n\n def build_model(self) -> LanguageModel:\n provider = self.provider\n model_name = self.model_name\n temperature = self.temperature\n stream = self.stream\n\n if provider == \"OpenAI\":\n if not self.api_key:\n msg = \"OpenAI API key is required when using OpenAI provider\"\n raise ValueError(msg)\n return ChatOpenAI(\n model_name=model_name,\n temperature=temperature,\n streaming=stream,\n openai_api_key=self.api_key,\n )\n if provider == \"Anthropic\":\n if not self.api_key:\n msg = \"Anthropic API key is required when using Anthropic provider\"\n raise ValueError(msg)\n return ChatAnthropic(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n anthropic_api_key=self.api_key,\n )\n if provider == \"Google\":\n if not self.api_key:\n msg = \"Google API key is required when using Google provider\"\n raise ValueError(msg)\n return ChatGoogleGenerativeAI(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n google_api_key=self.api_key,\n )\n msg = f\"Unknown provider: {provider}\"\n raise ValueError(msg)\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:\n if field_name == \"provider\":\n if field_value == \"OpenAI\":\n build_config[\"model_name\"][\"options\"] = OPENAI_MODEL_NAMES\n build_config[\"model_name\"][\"value\"] = OPENAI_MODEL_NAMES[0]\n build_config[\"api_key\"][\"display_name\"] = \"OpenAI API Key\"\n elif field_value == \"Anthropic\":\n build_config[\"model_name\"][\"options\"] = ANTHROPIC_MODELS\n build_config[\"model_name\"][\"value\"] = ANTHROPIC_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Anthropic API Key\"\n elif field_value == \"Google\":\n build_config[\"model_name\"][\"options\"] = GOOGLE_GENERATIVE_AI_MODELS\n build_config[\"model_name\"][\"value\"] = GOOGLE_GENERATIVE_AI_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Google API Key\"\n return build_config\n" }, - "input_data": { - "_input_type": "HandleInput", + "input_value": { + "_input_type": "MessageInput", "advanced": false, "display_name": "Input", "dynamic": false, - "info": "Accept Message, Data or DataFrame as input", + "info": "The input text to send to the model", "input_types": [ - "Message", - "Data", - "DataFrame" + "Message" ], "list": false, "list_add_label": "Add More", - "name": "input_data", + "load_from_db": false, + "name": "input_value", "placeholder": "", - "required": true, + "required": false, "show": true, "title_case": false, + "tool_mode": false, + "trace_as_input": true, "trace_as_metadata": true, - "type": "other", + "type": "str", "value": "" }, - "output_type": { - "_input_type": "TabInput", + "model_name": { + "_input_type": "DropdownInput", "advanced": false, - "display_name": "Output Type", + "combobox": false, + "dialog_inputs": {}, + "display_name": "Model Name", "dynamic": false, - "info": "Select the desired output data type", - "name": "output_type", + "info": "Select the model to use", + "name": "model_name", "options": [ - "Message", - "Data", - "DataFrame" + "claude-opus-4-20250514", + "claude-sonnet-4-20250514", + "claude-3-7-sonnet-latest", + "claude-3-5-sonnet-latest", + "claude-3-5-haiku-latest", + "claude-3-opus-latest", + "claude-3-sonnet-20240229" + ], + "options_metadata": [], + "placeholder": "", + "required": false, + "show": true, + "title_case": false, + "toggle": false, + "tool_mode": false, + "trace_as_metadata": true, + "type": "str", + "value": "claude-opus-4-20250514" + }, + "provider": { + "_input_type": "DropdownInput", + "advanced": false, + "combobox": false, + "dialog_inputs": {}, + "display_name": "Model Provider", + "dynamic": false, + "info": "Select the model provider", + "name": "provider", + "options": [ + "OpenAI", + "Anthropic", + "Google" + ], + "options_metadata": [ + { + "icon": "OpenAI" + }, + { + "icon": "Anthropic" + }, + { + "icon": "Google" + } ], "placeholder": "", "real_time_refresh": true, "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, "trace_as_metadata": true, - "type": "tab", - "value": "Message" + "type": "str", + "value": "Anthropic" + }, + "stream": { + "_input_type": "BoolInput", + "advanced": true, + "display_name": "Stream", + "dynamic": false, + "info": "Whether to stream the response", + "list": false, + "list_add_label": "Add More", + "name": "stream", + "placeholder": "", + "required": false, + "show": true, + "title_case": false, + "tool_mode": false, + "trace_as_metadata": true, + "type": "bool", + "value": false + }, + "system_message": { + "_input_type": "MultilineInput", + "advanced": true, + "copy_field": false, + "display_name": "System Message", + "dynamic": false, + "info": "A system message that helps set the behavior of the assistant", + "input_types": [ + "Message" + ], + "list": false, + "list_add_label": "Add More", + "load_from_db": false, + "multiline": true, + "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": "SliderInput", + "advanced": true, + "display_name": "Temperature", + "dynamic": false, + "info": "Controls randomness in responses", + "max_label": "", + "max_label_icon": "", + "min_label": "", + "min_label_icon": "", + "name": "temperature", + "placeholder": "", + "range_spec": { + "max": 1, + "min": 0, + "step": 0.01, + "step_type": "float" + }, + "required": false, + "show": true, + "slider_buttons": false, + "slider_buttons_options": [], + "slider_input": false, + "title_case": false, + "tool_mode": false, + "type": "slider", + "value": 0.1 } }, "tool_mode": false }, - "selected_output": "message_output", "showNode": true, - "type": "TypeConverterComponent" + "type": "LanguageModelComponent" }, - "id": "TypeConverterComponent-Vb89B", + "dragging": false, + "id": "LanguageModelComponent-KACT4", "measured": { - "height": 261, + "height": 451, "width": 320 }, "position": { - "x": 2158.2258554896966, - "y": 1267.3003018282393 + "x": 2595.812486589649, + "y": 559.0945152239169 }, - "selected": true, + "selected": false, "type": "genericNode" } ], "viewport": { - "x": -793.1993033062734, - "y": -123.88385899329182, - "zoom": 0.6019755995423787 + "x": -1401.7054041935717, + "y": 26.674212146193952, + "zoom": 0.8482246183839485 } }, "description": "Generates well-structured code for custom components following Langflow's specifications.", "endpoint_name": null, - "id": "58e796f9-ab44-4962-bb29-7571312e75b2", + "id": "c6e1a733-8f51-454f-a247-43c50bd0ce84", "is_component": false, - "last_tested_version": "1.4.2", + "last_tested_version": "1.4.3", "name": "Custom Component Generator", "tags": [ "coding", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Research Translation Loop.json b/src/backend/base/langflow/initial_setup/starter_projects/Research Translation Loop.json index 25dd2e909..7e435659c 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Research Translation Loop.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Research Translation Loop.json @@ -1,41 +1,13 @@ { "data": { "edges": [ - { - "animated": false, - "className": "", - "data": { - "sourceHandle": { - "dataType": "AnthropicModel", - "id": "AnthropicModel-G2MkR", - "name": "text_output", - "output_types": [ - "Message" - ] - }, - "targetHandle": { - "fieldName": "message", - "id": "MessagetoData-jYebP", - "inputTypes": [ - "Message" - ], - "type": "str" - } - }, - "id": "reactflow__edge-AnthropicModel-G2MkR{œdataTypeœ:œAnthropicModelœ,œidœ:œAnthropicModel-G2MkRœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-MessagetoData-jYebP{œfieldNameœ:œmessageœ,œidœ:œMessagetoData-jYebPœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", - "selected": false, - "source": "AnthropicModel-G2MkR", - "sourceHandle": "{œdataTypeœ: œAnthropicModelœ, œidœ: œAnthropicModel-G2MkRœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "MessagetoData-jYebP", - "targetHandle": "{œfieldNameœ: œmessageœ, œidœ: œMessagetoData-jYebPœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" - }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "ChatInput", - "id": "ChatInput-5o3G0", + "id": "ChatInput-tlH0y", "name": "message", "output_types": [ "Message" @@ -43,47 +15,19 @@ }, "targetHandle": { "fieldName": "search_query", - "id": "ArXivComponent-ylKFb", + "id": "ArXivComponent-gRTc5", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "reactflow__edge-ChatInput-5o3G0{œdataTypeœ:œChatInputœ,œidœ:œChatInput-5o3G0œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-ArXivComponent-ylKFb{œfieldNameœ:œsearch_queryœ,œidœ:œArXivComponent-ylKFbœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-ChatInput-tlH0y{œdataTypeœ:œChatInputœ,œidœ:œChatInput-tlH0yœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-ArXivComponent-gRTc5{œfieldNameœ:œsearch_queryœ,œidœ:œArXivComponent-gRTc5œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "ChatInput-5o3G0", - "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-5o3G0œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", - "target": "ArXivComponent-ylKFb", - "targetHandle": "{œfieldNameœ: œsearch_queryœ, œidœ: œArXivComponent-ylKFbœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" - }, - { - "animated": false, - "className": "", - "data": { - "sourceHandle": { - "dataType": "ParserComponent", - "id": "ParserComponent-ZhlLQ", - "name": "parsed_text", - "output_types": [ - "Message" - ] - }, - "targetHandle": { - "fieldName": "input_value", - "id": "AnthropicModel-G2MkR", - "inputTypes": [ - "Message" - ], - "type": "str" - } - }, - "id": "reactflow__edge-ParserComponent-ZhlLQ{œdataTypeœ:œParserComponentœ,œidœ:œParserComponent-ZhlLQœ,œnameœ:œparsed_textœ,œoutput_typesœ:[œMessageœ]}-AnthropicModel-G2MkR{œfieldNameœ:œinput_valueœ,œidœ:œAnthropicModel-G2MkRœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", - "selected": false, - "source": "ParserComponent-ZhlLQ", - "sourceHandle": "{œdataTypeœ: œParserComponentœ, œidœ: œParserComponent-ZhlLQœ, œnameœ: œparsed_textœ, œoutput_typesœ: [œMessageœ]}", - "target": "AnthropicModel-G2MkR", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œAnthropicModel-G2MkRœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "source": "ChatInput-tlH0y", + "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-tlH0yœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", + "target": "ArXivComponent-gRTc5", + "targetHandle": "{œfieldNameœ: œsearch_queryœ, œidœ: œArXivComponent-gRTc5œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "animated": false, @@ -91,7 +35,7 @@ "data": { "sourceHandle": { "dataType": "ArXivComponent", - "id": "ArXivComponent-ylKFb", + "id": "ArXivComponent-gRTc5", "name": "dataframe", "output_types": [ "DataFrame" @@ -99,19 +43,19 @@ }, "targetHandle": { "fieldName": "data", - "id": "LoopComponent-9BK8B", + "id": "LoopComponent-F5Djy", "inputTypes": [ "DataFrame" ], "type": "other" } }, - "id": "xy-edge__ArXivComponent-ylKFb{œdataTypeœ:œArXivComponentœ,œidœ:œArXivComponent-ylKFbœ,œnameœ:œdataframeœ,œoutput_typesœ:[œDataFrameœ]}-LoopComponent-9BK8B{œfieldNameœ:œdataœ,œidœ:œLoopComponent-9BK8Bœ,œinputTypesœ:[œDataœ,œDataFrameœ],œtypeœ:œotherœ}", + "id": "reactflow__edge-ArXivComponent-gRTc5{œdataTypeœ:œArXivComponentœ,œidœ:œArXivComponent-gRTc5œ,œnameœ:œdataframeœ,œoutput_typesœ:[œDataFrameœ]}-LoopComponent-F5Djy{œfieldNameœ:œdataœ,œidœ:œLoopComponent-F5Djyœ,œinputTypesœ:[œDataFrameœ],œtypeœ:œotherœ}", "selected": false, - "source": "ArXivComponent-ylKFb", - "sourceHandle": "{œdataTypeœ: œArXivComponentœ, œidœ: œArXivComponent-ylKFbœ, œnameœ: œdataframeœ, œoutput_typesœ: [œDataFrameœ]}", - "target": "LoopComponent-9BK8B", - "targetHandle": "{œfieldNameœ: œdataœ, œidœ: œLoopComponent-9BK8Bœ, œinputTypesœ: [œDataFrameœ], œtypeœ: œotherœ}" + "source": "ArXivComponent-gRTc5", + "sourceHandle": "{œdataTypeœ: œArXivComponentœ, œidœ: œArXivComponent-gRTc5œ, œnameœ: œdataframeœ, œoutput_typesœ: [œDataFrameœ]}", + "target": "LoopComponent-F5Djy", + "targetHandle": "{œfieldNameœ: œdataœ, œidœ: œLoopComponent-F5Djyœ, œinputTypesœ: [œDataFrameœ], œtypeœ: œotherœ}" }, { "animated": false, @@ -119,7 +63,7 @@ "data": { "sourceHandle": { "dataType": "LoopComponent", - "id": "LoopComponent-9BK8B", + "id": "LoopComponent-F5Djy", "name": "item", "output_types": [ "Data" @@ -127,7 +71,7 @@ }, "targetHandle": { "fieldName": "input_data", - "id": "ParserComponent-ZhlLQ", + "id": "ParserComponent-fEmaG", "inputTypes": [ "DataFrame", "Data" @@ -135,42 +79,12 @@ "type": "other" } }, - "id": "xy-edge__LoopComponent-9BK8B{œdataTypeœ:œLoopComponentœ,œidœ:œLoopComponent-9BK8Bœ,œnameœ:œitemœ,œoutput_typesœ:[œDataœ]}-ParserComponent-ZhlLQ{œfieldNameœ:œinput_dataœ,œidœ:œParserComponent-ZhlLQœ,œinputTypesœ:[œDataFrameœ,œDataœ],œtypeœ:œotherœ}", + "id": "reactflow__edge-LoopComponent-F5Djy{œdataTypeœ:œLoopComponentœ,œidœ:œLoopComponent-F5Djyœ,œnameœ:œitemœ,œoutput_typesœ:[œDataœ]}-ParserComponent-fEmaG{œfieldNameœ:œinput_dataœ,œidœ:œParserComponent-fEmaGœ,œinputTypesœ:[œDataFrameœ,œDataœ],œtypeœ:œotherœ}", "selected": false, - "source": "LoopComponent-9BK8B", - "sourceHandle": "{œdataTypeœ: œLoopComponentœ, œidœ: œLoopComponent-9BK8Bœ, œnameœ: œitemœ, œoutput_typesœ: [œDataœ]}", - "target": "ParserComponent-ZhlLQ", - "targetHandle": "{œfieldNameœ: œinput_dataœ, œidœ: œParserComponent-ZhlLQœ, œinputTypesœ: [œDataFrameœ, œDataœ], œtypeœ: œotherœ}" - }, - { - "animated": false, - "className": "", - "data": { - "sourceHandle": { - "dataType": "LoopComponent", - "id": "LoopComponent-9BK8B", - "name": "done", - "output_types": [ - "DataFrame" - ] - }, - "targetHandle": { - "fieldName": "input_value", - "id": "ChatOutput-oTh2r", - "inputTypes": [ - "Data", - "DataFrame", - "Message" - ], - "type": "str" - } - }, - "id": "xy-edge__LoopComponent-9BK8B{œdataTypeœ:œLoopComponentœ,œidœ:œLoopComponent-9BK8Bœ,œnameœ:œdoneœ,œoutput_typesœ:[œDataFrameœ]}-ChatOutput-oTh2r{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-oTh2rœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œstrœ}", - "selected": false, - "source": "LoopComponent-9BK8B", - "sourceHandle": "{œdataTypeœ: œLoopComponentœ, œidœ: œLoopComponent-9BK8Bœ, œnameœ: œdoneœ, œoutput_typesœ: [œDataFrameœ]}", - "target": "ChatOutput-oTh2r", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-oTh2rœ, œinputTypesœ: [œDataœ, œDataFrameœ, œMessageœ], œtypeœ: œstrœ}" + "source": "LoopComponent-F5Djy", + "sourceHandle": "{œdataTypeœ: œLoopComponentœ, œidœ: œLoopComponent-F5Djyœ, œnameœ: œitemœ, œoutput_typesœ: [œDataœ]}", + "target": "ParserComponent-fEmaG", + "targetHandle": "{œfieldNameœ: œinput_dataœ, œidœ: œParserComponent-fEmaGœ, œinputTypesœ: [œDataFrameœ, œDataœ], œtypeœ: œotherœ}" }, { "animated": false, @@ -178,7 +92,7 @@ "data": { "sourceHandle": { "dataType": "MessagetoData", - "id": "MessagetoData-jYebP", + "id": "MessagetoData-gTNDz", "name": "data", "output_types": [ "Data" @@ -186,28 +100,142 @@ }, "targetHandle": { "dataType": "LoopComponent", - "id": "LoopComponent-9BK8B", + "id": "LoopComponent-F5Djy", "name": "item", "output_types": [ "Data" ] } }, - "id": "xy-edge__MessagetoData-jYebP{œdataTypeœ:œMessagetoDataœ,œidœ:œMessagetoData-jYebPœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-LoopComponent-9BK8B{œdataTypeœ:œLoopComponentœ,œidœ:œLoopComponent-9BK8Bœ,œnameœ:œitemœ,œoutput_typesœ:[œDataœ]}", + "id": "reactflow__edge-MessagetoData-gTNDz{œdataTypeœ:œMessagetoDataœ,œidœ:œMessagetoData-gTNDzœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-LoopComponent-F5Djy{œdataTypeœ:œLoopComponentœ,œidœ:œLoopComponent-F5Djyœ,œnameœ:œitemœ,œoutput_typesœ:[œDataœ]}", "selected": false, - "source": "MessagetoData-jYebP", - "sourceHandle": "{œdataTypeœ: œMessagetoDataœ, œidœ: œMessagetoData-jYebPœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}", - "target": "LoopComponent-9BK8B", - "targetHandle": "{œdataTypeœ: œLoopComponentœ, œidœ: œLoopComponent-9BK8Bœ, œnameœ: œitemœ, œoutput_typesœ: [œDataœ]}" + "source": "MessagetoData-gTNDz", + "sourceHandle": "{œdataTypeœ: œMessagetoDataœ, œidœ: œMessagetoData-gTNDzœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}", + "target": "LoopComponent-F5Djy", + "targetHandle": "{œdataTypeœ: œLoopComponentœ, œidœ: œLoopComponent-F5Djyœ, œnameœ: œitemœ, œoutput_typesœ: [œDataœ]}" + }, + { + "animated": false, + "className": "", + "data": { + "sourceHandle": { + "dataType": "LoopComponent", + "id": "LoopComponent-F5Djy", + "name": "done", + "output_types": [ + "DataFrame" + ] + }, + "targetHandle": { + "fieldName": "input_data", + "id": "TypeConverterComponent-bRDWF", + "inputTypes": [ + "Message", + "Data", + "DataFrame" + ], + "type": "other" + } + }, + "id": "reactflow__edge-LoopComponent-F5Djy{œdataTypeœ:œLoopComponentœ,œidœ:œLoopComponent-F5Djyœ,œnameœ:œdoneœ,œoutput_typesœ:[œDataFrameœ]}-TypeConverterComponent-bRDWF{œfieldNameœ:œinput_dataœ,œidœ:œTypeConverterComponent-bRDWFœ,œinputTypesœ:[œMessageœ,œDataœ,œDataFrameœ],œtypeœ:œotherœ}", + "selected": false, + "source": "LoopComponent-F5Djy", + "sourceHandle": "{œdataTypeœ: œLoopComponentœ, œidœ: œLoopComponent-F5Djyœ, œnameœ: œdoneœ, œoutput_typesœ: [œDataFrameœ]}", + "target": "TypeConverterComponent-bRDWF", + "targetHandle": "{œfieldNameœ: œinput_dataœ, œidœ: œTypeConverterComponent-bRDWFœ, œinputTypesœ: [œMessageœ, œDataœ, œDataFrameœ], œtypeœ: œotherœ}" + }, + { + "animated": false, + "className": "", + "data": { + "sourceHandle": { + "dataType": "TypeConverterComponent", + "id": "TypeConverterComponent-bRDWF", + "name": "message_output", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "input_value", + "id": "ChatOutput-qmosp", + "inputTypes": [ + "Data", + "DataFrame", + "Message" + ], + "type": "other" + } + }, + "id": "reactflow__edge-TypeConverterComponent-bRDWF{œdataTypeœ:œTypeConverterComponentœ,œidœ:œTypeConverterComponent-bRDWFœ,œnameœ:œmessage_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-qmosp{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-qmospœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}", + "selected": false, + "source": "TypeConverterComponent-bRDWF", + "sourceHandle": "{œdataTypeœ: œTypeConverterComponentœ, œidœ: œTypeConverterComponent-bRDWFœ, œnameœ: œmessage_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "ChatOutput-qmosp", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-qmospœ, œinputTypesœ: [œDataœ, œDataFrameœ, œMessageœ], œtypeœ: œotherœ}" + }, + { + "animated": false, + "data": { + "sourceHandle": { + "dataType": "ParserComponent", + "id": "ParserComponent-fEmaG", + "name": "parsed_text", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "input_value", + "id": "LanguageModelComponent-1OIsN", + "inputTypes": [ + "Message" + ], + "type": "str" + } + }, + "id": "xy-edge__ParserComponent-fEmaG{œdataTypeœ:œParserComponentœ,œidœ:œParserComponent-fEmaGœ,œnameœ:œparsed_textœ,œoutput_typesœ:[œMessageœ]}-LanguageModelComponent-1OIsN{œfieldNameœ:œinput_valueœ,œidœ:œLanguageModelComponent-1OIsNœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "selected": false, + "source": "ParserComponent-fEmaG", + "sourceHandle": "{œdataTypeœ: œParserComponentœ, œidœ: œParserComponent-fEmaGœ, œnameœ: œparsed_textœ, œoutput_typesœ: [œMessageœ]}", + "target": "LanguageModelComponent-1OIsN", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œLanguageModelComponent-1OIsNœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + }, + { + "animated": false, + "data": { + "sourceHandle": { + "dataType": "LanguageModelComponent", + "id": "LanguageModelComponent-1OIsN", + "name": "text_output", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "message", + "id": "MessagetoData-gTNDz", + "inputTypes": [ + "Message" + ], + "type": "str" + } + }, + "id": "xy-edge__LanguageModelComponent-1OIsN{œdataTypeœ:œLanguageModelComponentœ,œidœ:œLanguageModelComponent-1OIsNœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-MessagetoData-gTNDz{œfieldNameœ:œmessageœ,œidœ:œMessagetoData-gTNDzœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "selected": false, + "source": "LanguageModelComponent-1OIsN", + "sourceHandle": "{œdataTypeœ: œLanguageModelComponentœ, œidœ: œLanguageModelComponent-1OIsNœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "MessagetoData-gTNDz", + "targetHandle": "{œfieldNameœ: œmessageœ, œidœ: œMessagetoData-gTNDzœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" } ], "nodes": [ { "data": { - "id": "ArXivComponent-ylKFb", + "id": "ArXivComponent-gRTc5", "node": { "base_classes": [ - "Data" + "DataFrame" ], "beta": false, "conditional_paths": [], @@ -224,7 +252,6 @@ "frozen": false, "icon": "arXiv", "legacy": false, - "lf_version": "1.4.2", "metadata": {}, "minimized": false, "output_types": [], @@ -273,6 +300,7 @@ "info": "Maximum number of results to return", "list": false, "list_add_label": "Add More", + "load_from_db": false, "name": "max_results", "placeholder": "", "required": false, @@ -327,6 +355,7 @@ "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", @@ -336,13 +365,12 @@ "tool_mode": false }, "showNode": true, - "type": "ArXivComponent", - "selected_output": "dataframe" + "type": "ArXivComponent" }, "dragging": false, - "id": "ArXivComponent-ylKFb", + "id": "ArXivComponent-gRTc5", "measured": { - "height": 443, + "height": 369, "width": 320 }, "position": { @@ -354,352 +382,12 @@ }, { "data": { - "id": "AnthropicModel-G2MkR", - "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], - "beta": false, - "category": "models", - "conditional_paths": [], - "custom_fields": {}, - "description": "Generate text using Anthropic Chat&Completion LLMs with prefill support.", - "display_name": "Anthropic", - "documentation": "", - "edited": false, - "field_order": [ - "input_value", - "system_message", - "stream", - "max_tokens", - "model_name", - "api_key", - "temperature", - "base_url", - "tool_model_enabled", - "prefill" - ], - "frozen": false, - "icon": "Anthropic", - "key": "AnthropicModel", - "legacy": false, - "lf_version": "1.1.5", - "metadata": { - "keywords": [ - "model", - "llm", - "language model", - "large language model" - ] - }, - "minimized": false, - "output_types": [], - "outputs": [ - { - "allows_loop": false, - "cache": true, - "display_name": "Model Response", - "group_outputs": false, - "method": "text_response", - "name": "text_output", - "selected": "Message", - "tool_mode": true, - "types": [ - "Message" - ], - "value": "__UNDEFINED__" - }, - { - "allows_loop": false, - "cache": true, - "display_name": "Language Model", - "group_outputs": false, - "method": "build_model", - "name": "model_output", - "selected": "LanguageModel", - "tool_mode": true, - "types": [ - "LanguageModel" - ], - "value": "__UNDEFINED__" - } - ], - "pinned": false, - "score": 0.0005851173668140926, - "template": { - "_type": "Component", - "api_key": { - "_input_type": "SecretStrInput", - "advanced": false, - "display_name": "Anthropic API Key", - "dynamic": false, - "info": "Your Anthropic API key.", - "input_types": [], - "load_from_db": false, - "name": "api_key", - "password": true, - "placeholder": "", - "real_time_refresh": true, - "required": true, - "show": true, - "title_case": false, - "type": "str", - "value": "" - }, - "base_url": { - "_input_type": "MessageTextInput", - "advanced": true, - "display_name": "Anthropic API URL", - "dynamic": false, - "info": "Endpoint of the Anthropic API. Defaults to 'https://api.anthropic.com' if not specified.", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "name": "base_url", - "placeholder": "", - "real_time_refresh": true, - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_input": true, - "trace_as_metadata": true, - "type": "str", - "value": "https://api.anthropic.com" - }, - "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 typing import Any, cast\n\nimport requests\nfrom loguru import logger\nfrom pydantic import ValidationError\n\nfrom langflow.base.models.anthropic_constants import (\n ANTHROPIC_MODELS,\n DEFAULT_ANTHROPIC_API_URL,\n TOOL_CALLING_SUPPORTED_ANTHROPIC_MODELS,\n TOOL_CALLING_UNSUPPORTED_ANTHROPIC_MODELS,\n)\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.field_typing import LanguageModel\nfrom langflow.field_typing.range_spec import RangeSpec\nfrom langflow.io import BoolInput, DropdownInput, IntInput, MessageTextInput, SecretStrInput, SliderInput\nfrom langflow.schema.dotdict import dotdict\n\n\nclass AnthropicModelComponent(LCModelComponent):\n display_name = \"Anthropic\"\n description = \"Generate text using Anthropic Chat&Completion LLMs with prefill support.\"\n icon = \"Anthropic\"\n name = \"AnthropicModel\"\n\n inputs = [\n *LCModelComponent._base_inputs,\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n value=4096,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n options=ANTHROPIC_MODELS,\n refresh_button=True,\n value=ANTHROPIC_MODELS[0],\n combobox=True,\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Anthropic API Key\",\n info=\"Your Anthropic API key.\",\n value=None,\n required=True,\n real_time_refresh=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n info=\"Run inference with this temperature. Must by in the closed interval [0.0, 1.0].\",\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n advanced=True,\n ),\n MessageTextInput(\n name=\"base_url\",\n display_name=\"Anthropic API URL\",\n info=\"Endpoint of the Anthropic API. Defaults to 'https://api.anthropic.com' if not specified.\",\n value=DEFAULT_ANTHROPIC_API_URL,\n real_time_refresh=True,\n advanced=True,\n ),\n BoolInput(\n name=\"tool_model_enabled\",\n display_name=\"Enable Tool Models\",\n info=(\n \"Select if you want to use models that can work with tools. If yes, only those models will be shown.\"\n ),\n advanced=False,\n value=False,\n real_time_refresh=True,\n ),\n MessageTextInput(\n name=\"prefill\", display_name=\"Prefill\", info=\"Prefill text to guide the model's response.\", advanced=True\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n try:\n from langchain_anthropic.chat_models import ChatAnthropic\n except ImportError as e:\n msg = \"langchain_anthropic is not installed. Please install it with `pip install langchain_anthropic`.\"\n raise ImportError(msg) from e\n try:\n max_tokens_value = getattr(self, \"max_tokens\", \"\")\n max_tokens_value = 4096 if max_tokens_value == \"\" else int(max_tokens_value)\n output = ChatAnthropic(\n model=self.model_name,\n anthropic_api_key=self.api_key,\n max_tokens=max_tokens_value,\n temperature=self.temperature,\n anthropic_api_url=self.base_url or DEFAULT_ANTHROPIC_API_URL,\n streaming=self.stream,\n )\n except ValidationError:\n raise\n except Exception as e:\n msg = \"Could not connect to Anthropic API.\"\n raise ValueError(msg) from e\n\n return output\n\n def get_models(self, tool_model_enabled: bool | None = None) -> list[str]:\n try:\n import anthropic\n\n client = anthropic.Anthropic(api_key=self.api_key)\n models = client.models.list(limit=20).data\n model_ids = ANTHROPIC_MODELS + [model.id for model in models]\n except (ImportError, ValueError, requests.exceptions.RequestException) as e:\n logger.exception(f\"Error getting model names: {e}\")\n model_ids = ANTHROPIC_MODELS\n\n if tool_model_enabled:\n try:\n from langchain_anthropic.chat_models import ChatAnthropic\n except ImportError as e:\n msg = \"langchain_anthropic is not installed. Please install it with `pip install langchain_anthropic`.\"\n raise ImportError(msg) from e\n\n # Create a new list instead of modifying while iterating\n filtered_models = []\n for model in model_ids:\n if model in TOOL_CALLING_SUPPORTED_ANTHROPIC_MODELS:\n filtered_models.append(model)\n continue\n\n model_with_tool = ChatAnthropic(\n model=model, # Use the current model being checked\n anthropic_api_key=self.api_key,\n anthropic_api_url=cast(str, self.base_url) or DEFAULT_ANTHROPIC_API_URL,\n )\n\n if (\n not self.supports_tool_calling(model_with_tool)\n or model in TOOL_CALLING_UNSUPPORTED_ANTHROPIC_MODELS\n ):\n continue\n\n filtered_models.append(model)\n\n return filtered_models\n\n return model_ids\n\n def _get_exception_message(self, exception: Exception) -> str | None:\n \"\"\"Get a message from an Anthropic exception.\n\n Args:\n exception (Exception): The exception to get the message from.\n\n Returns:\n str: The message from the exception.\n \"\"\"\n try:\n from anthropic import BadRequestError\n except ImportError:\n return None\n if isinstance(exception, BadRequestError):\n message = exception.body.get(\"error\", {}).get(\"message\")\n if message:\n return message\n return None\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):\n if \"base_url\" in build_config and build_config[\"base_url\"][\"value\"] is None:\n build_config[\"base_url\"][\"value\"] = DEFAULT_ANTHROPIC_API_URL\n self.base_url = DEFAULT_ANTHROPIC_API_URL\n if field_name in {\"base_url\", \"model_name\", \"tool_model_enabled\", \"api_key\"} and field_value:\n try:\n if len(self.api_key) == 0:\n ids = ANTHROPIC_MODELS\n else:\n try:\n ids = self.get_models(tool_model_enabled=self.tool_model_enabled)\n except (ImportError, ValueError, requests.exceptions.RequestException) as e:\n logger.exception(f\"Error getting model names: {e}\")\n ids = ANTHROPIC_MODELS\n build_config[\"model_name\"][\"options\"] = ids\n build_config[\"model_name\"][\"value\"] = ids[0]\n build_config[\"model_name\"][\"combobox\"] = True\n except Exception as e:\n msg = f\"Error getting model names: {e}\"\n raise ValueError(msg) from e\n return build_config\n" - }, - "input_value": { - "_input_type": "MessageInput", - "advanced": false, - "display_name": "Input", - "dynamic": false, - "info": "", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "name": "input_value", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_input": true, - "trace_as_metadata": true, - "type": "str", - "value": "" - }, - "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, - "list_add_label": "Add More", - "name": "max_tokens", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 4096 - }, - "model_name": { - "_input_type": "DropdownInput", - "advanced": false, - "combobox": true, - "dialog_inputs": {}, - "display_name": "Model Name", - "dynamic": false, - "info": "", - "name": "model_name", - "options": [ - "claude-opus-4-20250514", - "claude-sonnet-4-20250514", - "claude-3-7-sonnet-latest", - "claude-3-5-sonnet-latest", - "claude-3-5-haiku-latest", - "claude-3-opus-latest", - "claude-3-sonnet-20240229" - ], - "options_metadata": [], - "placeholder": "", - "refresh_button": true, - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "str", - "value": "claude-3-7-sonnet-latest" - }, - "prefill": { - "_input_type": "MessageTextInput", - "advanced": true, - "display_name": "Prefill", - "dynamic": false, - "info": "Prefill text to guide the model's response.", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "name": "prefill", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_input": true, - "trace_as_metadata": true, - "type": "str", - "value": "" - }, - "stream": { - "_input_type": "BoolInput", - "advanced": true, - "display_name": "Stream", - "dynamic": false, - "info": "Stream the response from the model. Streaming works only in Chat.", - "list": false, - "list_add_label": "Add More", - "name": "stream", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "bool", - "value": false - }, - "system_message": { - "_input_type": "MultilineInput", - "advanced": false, - "display_name": "System Message", - "dynamic": false, - "info": "System message to pass to the model.", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "multiline": true, - "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": "Translate to Portuguese and output in structured format\nReturn only the JSON and no additional text." - }, - "temperature": { - "_input_type": "SliderInput", - "advanced": true, - "display_name": "Temperature", - "dynamic": false, - "info": "Run inference with this temperature. Must by in the closed interval [0.0, 1.0].", - "max_label": "", - "max_label_icon": "", - "min_label": "", - "min_label_icon": "", - "name": "temperature", - "placeholder": "", - "range_spec": { - "max": 1, - "min": 0, - "step": 0.01, - "step_type": "float" - }, - "required": false, - "show": true, - "slider_buttons": false, - "slider_buttons_options": [], - "slider_input": false, - "title_case": false, - "tool_mode": false, - "type": "slider", - "value": 0.1 - }, - "tool_model_enabled": { - "_input_type": "BoolInput", - "advanced": false, - "display_name": "Enable Tool Models", - "dynamic": false, - "info": "Select if you want to use models that can work with tools. If yes, only those models will be shown.", - "list": false, - "list_add_label": "Add More", - "name": "tool_model_enabled", - "placeholder": "", - "real_time_refresh": true, - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "bool", - "value": false - } - }, - "tool_mode": false - }, - "showNode": true, - "type": "AnthropicModel", - "selected_output": "text_output" - }, - "dragging": false, - "id": "AnthropicModel-G2MkR", - "measured": { - "height": 588, - "width": 320 - }, - "position": { - "x": 1493.0259340837038, - "y": -225.9942853677759 - }, - "selected": false, - "type": "genericNode" - }, - { - "data": { - "id": "MessagetoData-jYebP", + "id": "MessagetoData-gTNDz", "node": { "base_classes": [ "Data" ], "beta": true, - "category": "processing", "conditional_paths": [], "custom_fields": {}, "description": "Convert a Message object to a Data object", @@ -711,9 +399,7 @@ ], "frozen": false, "icon": "message-square-share", - "key": "MessagetoData", "legacy": true, - "lf_version": "1.1.5", "metadata": {}, "minimized": false, "output_types": [], @@ -734,7 +420,6 @@ } ], "pinned": false, - "score": 0.008222426499470714, "template": { "_type": "Component", "code": { @@ -782,13 +467,12 @@ "tool_mode": false }, "showNode": true, - "type": "MessagetoData", - "selected_output": "data" + "type": "MessagetoData" }, "dragging": false, - "id": "MessagetoData-jYebP", + "id": "MessagetoData-gTNDz", "measured": { - "height": 230, + "height": 204, "width": 320 }, "position": { @@ -800,7 +484,7 @@ }, { "data": { - "id": "ChatOutput-oTh2r", + "id": "ChatOutput-qmosp", "node": { "base_classes": [ "Message" @@ -821,12 +505,12 @@ "data_template", "background_color", "chat_icon", - "text_color" + "text_color", + "clean_data" ], "frozen": false, "icon": "MessagesSquare", "legacy": false, - "lf_version": "1.4.2", "metadata": {}, "minimized": true, "output_types": [], @@ -955,7 +639,7 @@ "value": "{text}" }, "input_value": { - "_input_type": "MessageInput", + "_input_type": "HandleInput", "advanced": false, "display_name": "Inputs", "dynamic": false, @@ -967,16 +651,13 @@ ], "list": false, "list_add_label": "Add More", - "load_from_db": false, "name": "input_value", "placeholder": "", "required": true, "show": true, "title_case": false, - "tool_mode": false, - "trace_as_input": true, "trace_as_metadata": true, - "type": "str", + "type": "other", "value": "" }, "sender": { @@ -997,6 +678,7 @@ "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", @@ -1096,21 +778,21 @@ "type": "ChatOutput" }, "dragging": false, - "id": "ChatOutput-oTh2r", + "id": "ChatOutput-qmosp", "measured": { - "height": 66, + "height": 48, "width": 192 }, "position": { - "x": 1123.1326758440127, - "y": 502.35977645059677 + "x": 1340.6435418555936, + "y": 570.8905972487661 }, "selected": false, "type": "genericNode" }, { "data": { - "id": "ChatInput-5o3G0", + "id": "ChatInput-tlH0y", "node": { "base_classes": [ "Message" @@ -1136,7 +818,6 @@ "frozen": false, "icon": "MessagesSquare", "legacy": false, - "lf_version": "1.4.2", "metadata": {}, "minimized": true, "output_types": [], @@ -1261,6 +942,7 @@ "placeholder": "", "required": false, "show": true, + "temp_file": true, "title_case": false, "trace_as_metadata": true, "type": "file", @@ -1269,6 +951,7 @@ "input_value": { "_input_type": "MultilineInput", "advanced": false, + "copy_field": false, "display_name": "Input Text", "dynamic": false, "info": "Message to be passed as input.", @@ -1306,6 +989,7 @@ "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", @@ -1402,13 +1086,12 @@ "tool_mode": false }, "showNode": true, - "type": "ChatInput", - "selected_output": "message" + "type": "ChatInput" }, "dragging": false, - "id": "ChatInput-5o3G0", + "id": "ChatInput-tlH0y", "measured": { - "height": 230, + "height": 204, "width": 320 }, "position": { @@ -1420,7 +1103,7 @@ }, { "data": { - "id": "note-Wcn5J", + "id": "note-9tIWh", "node": { "description": "### 💡 Add your Anthropic API key here 👇", "display_name": "", @@ -1433,7 +1116,7 @@ }, "dragging": false, "height": 324, - "id": "note-Wcn5J", + "id": "note-9tIWh", "measured": { "height": 324, "width": 358 @@ -1449,7 +1132,7 @@ }, { "data": { - "id": "note-jY0b1", + "id": "note-Hrxxt", "node": { "description": "# **Langflow Loop Component Template - ArXiv search result Translator** \nThis template translates research paper summaries on ArXiv into Portuguese and summarizes them. \n Using **Langflow’s looping mechanism**, the template iterates through multiple research papers, translates them with the **Anthropic** model component, and outputs an aggregated version of all translated papers. \n\n## Quickstart \n 1. Add your Anthropic API key to the **Anthropic** component. \n2. In the **Playground**, enter a query related to a research topic (for example, “Quantum Computing Advancements”). \n\n The flow fetches a list of research papers from ArXiv matching the query. Each paper in the retrieved list is processed one-by-one using the Langflow **Loop component**. \n\n The abstract of each paper is translated into Portuguese by the **Anthropic** model component. \n\n Once all papers are translated, the system aggregates them into a **single structured output**.", "display_name": "", @@ -1460,7 +1143,7 @@ }, "dragging": false, "height": 647, - "id": "note-jY0b1", + "id": "note-Hrxxt", "measured": { "height": 647, "width": 577 @@ -1476,13 +1159,12 @@ }, { "data": { - "id": "ParserComponent-ZhlLQ", + "id": "ParserComponent-fEmaG", "node": { "base_classes": [ "Message" ], "beta": false, - "category": "processing", "conditional_paths": [], "custom_fields": {}, "description": "Extracts text using a template.", @@ -1490,16 +1172,14 @@ "documentation": "", "edited": false, "field_order": [ + "input_data", "mode", "pattern", - "input_data", "sep" ], "frozen": false, "icon": "braces", - "key": "ParserComponent", "legacy": false, - "lf_version": "1.4.2", "metadata": {}, "minimized": false, "output_types": [], @@ -1520,7 +1200,6 @@ } ], "pinned": false, - "score": 0.001, "template": { "_type": "Component", "code": { @@ -1568,6 +1247,7 @@ "display_name": "Mode", "dynamic": false, "info": "Convert into raw string instead of using a template.", + "load_from_db": false, "name": "mode", "options": [ "Parser", @@ -1600,7 +1280,7 @@ "name": "pattern", "placeholder": "", "required": true, - "show": false, + "show": true, "title_case": false, "tool_mode": false, "trace_as_input": true, @@ -1635,13 +1315,12 @@ "tool_mode": false }, "showNode": true, - "type": "ParserComponent", - "selected_output": "parsed_text" + "type": "ParserComponent" }, "dragging": false, - "id": "ParserComponent-ZhlLQ", + "id": "ParserComponent-fEmaG", "measured": { - "height": 312, + "height": 329, "width": 320 }, "position": { @@ -1653,14 +1332,13 @@ }, { "data": { - "id": "LoopComponent-9BK8B", + "id": "LoopComponent-F5Djy", "node": { "base_classes": [ "Data", "DataFrame" ], "beta": false, - "category": "logic", "conditional_paths": [], "custom_fields": {}, "description": "Iterates over a list of Data objects, outputting one item at a time and aggregating results from loop inputs.", @@ -1672,9 +1350,7 @@ ], "frozen": false, "icon": "infinity", - "key": "LoopComponent", "legacy": false, - "lf_version": "1.4.2", "metadata": {}, "minimized": false, "output_types": [], @@ -1709,7 +1385,6 @@ } ], "pinned": false, - "score": 2.220446049250313e-16, "template": { "_type": "Component", "code": { @@ -1754,13 +1429,12 @@ "tool_mode": false }, "showNode": true, - "type": "LoopComponent", - "selected_output": "done" + "type": "LoopComponent" }, "dragging": false, - "id": "LoopComponent-9BK8B", + "id": "LoopComponent-F5Djy", "measured": { - "height": 280, + "height": 242, "width": 320 }, "position": { @@ -1769,19 +1443,434 @@ }, "selected": false, "type": "genericNode" + }, + { + "data": { + "id": "TypeConverterComponent-bRDWF", + "node": { + "base_classes": [ + "Message" + ], + "beta": false, + "category": "processing", + "conditional_paths": [], + "custom_fields": {}, + "description": "Convert between different types (Message, Data, DataFrame)", + "display_name": "Type Convert", + "documentation": "", + "edited": false, + "field_order": [ + "input_data", + "output_type" + ], + "frozen": false, + "icon": "repeat", + "key": "TypeConverterComponent", + "legacy": false, + "metadata": {}, + "minimized": false, + "output_types": [], + "outputs": [ + { + "allows_loop": false, + "cache": true, + "display_name": "Message Output", + "group_outputs": false, + "method": "convert_to_message", + "name": "message_output", + "selected": "Message", + "tool_mode": true, + "types": [ + "Message" + ], + "value": "__UNDEFINED__" + } + ], + "pinned": false, + "score": 0.008834292878014125, + "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 typing import Any\n\nfrom langflow.custom import Component\nfrom langflow.io import HandleInput, Output, TabInput\nfrom langflow.schema import Data, DataFrame, Message\n\n\ndef convert_to_message(v) -> Message:\n \"\"\"Convert input to Message type.\n\n Args:\n v: Input to convert (Message, Data, DataFrame, or dict)\n\n Returns:\n Message: Converted Message object\n \"\"\"\n return v if isinstance(v, Message) else v.to_message()\n\n\ndef convert_to_data(v: DataFrame | Data | Message | dict) -> Data:\n \"\"\"Convert input to Data type.\n\n Args:\n v: Input to convert (Message, Data, DataFrame, or dict)\n\n Returns:\n Data: Converted Data object\n \"\"\"\n if isinstance(v, dict):\n return Data(v)\n return v if isinstance(v, Data) else v.to_data()\n\n\ndef convert_to_dataframe(v: DataFrame | Data | Message | dict) -> DataFrame:\n \"\"\"Convert input to DataFrame type.\n\n Args:\n v: Input to convert (Message, Data, DataFrame, or dict)\n\n Returns:\n DataFrame: Converted DataFrame object\n \"\"\"\n if isinstance(v, dict):\n return DataFrame([v])\n return v if isinstance(v, DataFrame) else v.to_dataframe()\n\n\nclass TypeConverterComponent(Component):\n display_name = \"Type Convert\"\n description = \"Convert between different types (Message, Data, DataFrame)\"\n icon = \"repeat\"\n\n inputs = [\n HandleInput(\n name=\"input_data\",\n display_name=\"Input\",\n input_types=[\"Message\", \"Data\", \"DataFrame\"],\n info=\"Accept Message, Data or DataFrame as input\",\n required=True,\n ),\n TabInput(\n name=\"output_type\",\n display_name=\"Output Type\",\n options=[\"Message\", \"Data\", \"DataFrame\"],\n info=\"Select the desired output data type\",\n real_time_refresh=True,\n value=\"Message\",\n ),\n ]\n\n outputs = [\n Output(\n display_name=\"Message Output\",\n name=\"message_output\",\n method=\"convert_to_message\",\n )\n ]\n\n def update_outputs(self, frontend_node: dict, field_name: str, field_value: Any) -> dict:\n \"\"\"Dynamically show only the relevant output based on the selected output type.\"\"\"\n if field_name == \"output_type\":\n # Start with empty outputs\n frontend_node[\"outputs\"] = []\n\n # Add only the selected output type\n if field_value == \"Message\":\n frontend_node[\"outputs\"].append(\n Output(\n display_name=\"Message Output\",\n name=\"message_output\",\n method=\"convert_to_message\",\n ).to_dict()\n )\n elif field_value == \"Data\":\n frontend_node[\"outputs\"].append(\n Output(\n display_name=\"Data Output\",\n name=\"data_output\",\n method=\"convert_to_data\",\n ).to_dict()\n )\n elif field_value == \"DataFrame\":\n frontend_node[\"outputs\"].append(\n Output(\n display_name=\"DataFrame Output\",\n name=\"dataframe_output\",\n method=\"convert_to_dataframe\",\n ).to_dict()\n )\n\n return frontend_node\n\n def convert_to_message(self) -> Message:\n \"\"\"Convert input to Message type.\"\"\"\n input_value = self.input_data[0] if isinstance(self.input_data, list) else self.input_data\n\n # Handle string input by converting to Message first\n if isinstance(input_value, str):\n input_value = Message(text=input_value)\n\n result = convert_to_message(input_value)\n self.status = result\n return result\n\n def convert_to_data(self) -> Data:\n \"\"\"Convert input to Data type.\"\"\"\n input_value = self.input_data[0] if isinstance(self.input_data, list) else self.input_data\n\n # Handle string input by converting to Message first\n if isinstance(input_value, str):\n input_value = Message(text=input_value)\n\n result = convert_to_data(input_value)\n self.status = result\n return result\n\n def convert_to_dataframe(self) -> DataFrame:\n \"\"\"Convert input to DataFrame type.\"\"\"\n input_value = self.input_data[0] if isinstance(self.input_data, list) else self.input_data\n\n # Handle string input by converting to Message first\n if isinstance(input_value, str):\n input_value = Message(text=input_value)\n\n result = convert_to_dataframe(input_value)\n self.status = result\n return result\n" + }, + "input_data": { + "_input_type": "HandleInput", + "advanced": false, + "display_name": "Input", + "dynamic": false, + "info": "Accept Message, Data or DataFrame as input", + "input_types": [ + "Message", + "Data", + "DataFrame" + ], + "list": false, + "list_add_label": "Add More", + "name": "input_data", + "placeholder": "", + "required": true, + "show": true, + "title_case": false, + "trace_as_metadata": true, + "type": "other", + "value": "" + }, + "output_type": { + "_input_type": "TabInput", + "advanced": false, + "display_name": "Output Type", + "dynamic": false, + "info": "Select the desired output data type", + "name": "output_type", + "options": [ + "Message", + "Data", + "DataFrame" + ], + "placeholder": "", + "real_time_refresh": true, + "required": false, + "show": true, + "title_case": false, + "tool_mode": false, + "trace_as_metadata": true, + "type": "tab", + "value": "Message" + } + }, + "tool_mode": false + }, + "showNode": true, + "type": "TypeConverterComponent" + }, + "dragging": false, + "id": "TypeConverterComponent-bRDWF", + "measured": { + "height": 262, + "width": 320 + }, + "position": { + "x": 949.5742678542961, + "y": 469.18776022439897 + }, + "selected": false, + "type": "genericNode" + }, + { + "data": { + "id": "LanguageModelComponent-1OIsN", + "node": { + "base_classes": [ + "LanguageModel", + "Message" + ], + "beta": false, + "conditional_paths": [], + "custom_fields": {}, + "description": "Runs a language model given a specified provider. ", + "display_name": "Language Model", + "documentation": "", + "edited": false, + "field_order": [ + "provider", + "model_name", + "api_key", + "input_value", + "system_message", + "stream", + "temperature" + ], + "frozen": false, + "icon": "brain-circuit", + "legacy": false, + "metadata": { + "keywords": [ + "model", + "llm", + "language model", + "large language model" + ] + }, + "minimized": false, + "output_types": [], + "outputs": [ + { + "allows_loop": false, + "cache": true, + "display_name": "Model Response", + "group_outputs": false, + "method": "text_response", + "name": "text_output", + "selected": "Message", + "tool_mode": true, + "types": [ + "Message" + ], + "value": "__UNDEFINED__" + }, + { + "allows_loop": false, + "cache": true, + "display_name": "Language Model", + "group_outputs": false, + "method": "build_model", + "name": "model_output", + "selected": "LanguageModel", + "tool_mode": true, + "types": [ + "LanguageModel" + ], + "value": "__UNDEFINED__" + } + ], + "pinned": false, + "priority": 0, + "template": { + "_type": "Component", + "api_key": { + "_input_type": "SecretStrInput", + "advanced": false, + "display_name": "OpenAI API Key", + "dynamic": false, + "info": "Model Provider API key", + "input_types": [], + "load_from_db": true, + "name": "api_key", + "password": true, + "placeholder": "", + "real_time_refresh": true, + "required": false, + "show": true, + "title_case": false, + "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 typing import Any\n\nfrom langchain_anthropic import ChatAnthropic\nfrom langchain_google_genai import ChatGoogleGenerativeAI\nfrom langchain_openai import ChatOpenAI\n\nfrom langflow.base.models.anthropic_constants import ANTHROPIC_MODELS\nfrom langflow.base.models.google_generative_ai_constants import GOOGLE_GENERATIVE_AI_MODELS\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.inputs import BoolInput\nfrom langflow.io import DropdownInput, MessageInput, MultilineInput, SecretStrInput, SliderInput\nfrom langflow.schema.dotdict import dotdict\n\n\nclass LanguageModelComponent(LCModelComponent):\n display_name = \"Language Model\"\n description = \"Runs a language model given a specified provider. \"\n icon = \"brain-circuit\"\n category = \"models\"\n priority = 0 # Set priority to 0 to make it appear first\n\n inputs = [\n DropdownInput(\n name=\"provider\",\n display_name=\"Model Provider\",\n options=[\"OpenAI\", \"Anthropic\", \"Google\"],\n value=\"OpenAI\",\n info=\"Select the model provider\",\n real_time_refresh=True,\n options_metadata=[{\"icon\": \"OpenAI\"}, {\"icon\": \"Anthropic\"}, {\"icon\": \"Google\"}],\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n options=OPENAI_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[0],\n info=\"Select the model to use\",\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"OpenAI API Key\",\n info=\"Model Provider API key\",\n required=False,\n show=True,\n real_time_refresh=True,\n ),\n MessageInput(\n name=\"input_value\",\n display_name=\"Input\",\n info=\"The input text to send to the model\",\n ),\n MultilineInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"A system message that helps set the behavior of the assistant\",\n advanced=True,\n ),\n BoolInput(\n name=\"stream\",\n display_name=\"Stream\",\n info=\"Whether to stream the response\",\n value=False,\n advanced=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n info=\"Controls randomness in responses\",\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n advanced=True,\n ),\n ]\n\n def build_model(self) -> LanguageModel:\n provider = self.provider\n model_name = self.model_name\n temperature = self.temperature\n stream = self.stream\n\n if provider == \"OpenAI\":\n if not self.api_key:\n msg = \"OpenAI API key is required when using OpenAI provider\"\n raise ValueError(msg)\n return ChatOpenAI(\n model_name=model_name,\n temperature=temperature,\n streaming=stream,\n openai_api_key=self.api_key,\n )\n if provider == \"Anthropic\":\n if not self.api_key:\n msg = \"Anthropic API key is required when using Anthropic provider\"\n raise ValueError(msg)\n return ChatAnthropic(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n anthropic_api_key=self.api_key,\n )\n if provider == \"Google\":\n if not self.api_key:\n msg = \"Google API key is required when using Google provider\"\n raise ValueError(msg)\n return ChatGoogleGenerativeAI(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n google_api_key=self.api_key,\n )\n msg = f\"Unknown provider: {provider}\"\n raise ValueError(msg)\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:\n if field_name == \"provider\":\n if field_value == \"OpenAI\":\n build_config[\"model_name\"][\"options\"] = OPENAI_MODEL_NAMES\n build_config[\"model_name\"][\"value\"] = OPENAI_MODEL_NAMES[0]\n build_config[\"api_key\"][\"display_name\"] = \"OpenAI API Key\"\n elif field_value == \"Anthropic\":\n build_config[\"model_name\"][\"options\"] = ANTHROPIC_MODELS\n build_config[\"model_name\"][\"value\"] = ANTHROPIC_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Anthropic API Key\"\n elif field_value == \"Google\":\n build_config[\"model_name\"][\"options\"] = GOOGLE_GENERATIVE_AI_MODELS\n build_config[\"model_name\"][\"value\"] = GOOGLE_GENERATIVE_AI_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Google API Key\"\n return build_config\n" + }, + "input_value": { + "_input_type": "MessageInput", + "advanced": false, + "display_name": "Input", + "dynamic": false, + "info": "The input text to send to the model", + "input_types": [ + "Message" + ], + "list": false, + "list_add_label": "Add More", + "load_from_db": false, + "name": "input_value", + "placeholder": "", + "required": false, + "show": true, + "title_case": false, + "tool_mode": false, + "trace_as_input": true, + "trace_as_metadata": true, + "type": "str", + "value": "" + }, + "model_name": { + "_input_type": "DropdownInput", + "advanced": false, + "combobox": false, + "dialog_inputs": {}, + "display_name": "Model Name", + "dynamic": false, + "info": "Select the model to use", + "name": "model_name", + "options": [ + "gpt-4o-mini", + "gpt-4o", + "gpt-4.1", + "gpt-4.1-mini", + "gpt-4.1-nano", + "gpt-4.5-preview", + "gpt-4-turbo", + "gpt-4-turbo-preview", + "gpt-4", + "gpt-3.5-turbo" + ], + "options_metadata": [], + "placeholder": "", + "required": false, + "show": true, + "title_case": false, + "toggle": false, + "tool_mode": false, + "trace_as_metadata": true, + "type": "str", + "value": "claude-opus-4-20250514" + }, + "provider": { + "_input_type": "DropdownInput", + "advanced": false, + "combobox": false, + "dialog_inputs": {}, + "display_name": "Model Provider", + "dynamic": false, + "info": "Select the model provider", + "name": "provider", + "options": [ + "OpenAI", + "Anthropic", + "Google" + ], + "options_metadata": [ + { + "icon": "OpenAI" + }, + { + "icon": "Anthropic" + }, + { + "icon": "Google" + } + ], + "placeholder": "", + "real_time_refresh": true, + "required": false, + "show": true, + "title_case": false, + "toggle": false, + "tool_mode": false, + "trace_as_metadata": true, + "type": "str", + "value": "Anthropic" + }, + "stream": { + "_input_type": "BoolInput", + "advanced": true, + "display_name": "Stream", + "dynamic": false, + "info": "Whether to stream the response", + "list": false, + "list_add_label": "Add More", + "name": "stream", + "placeholder": "", + "required": false, + "show": true, + "title_case": false, + "tool_mode": false, + "trace_as_metadata": true, + "type": "bool", + "value": false + }, + "system_message": { + "_input_type": "MultilineInput", + "advanced": false, + "copy_field": false, + "display_name": "System Message", + "dynamic": false, + "info": "A system message that helps set the behavior of the assistant", + "input_types": [ + "Message" + ], + "list": false, + "list_add_label": "Add More", + "load_from_db": false, + "multiline": true, + "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": "Translate to Portuguese and output in structured formatReturn only the JSON and no additional text." + }, + "temperature": { + "_input_type": "SliderInput", + "advanced": true, + "display_name": "Temperature", + "dynamic": false, + "info": "Controls randomness in responses", + "max_label": "", + "max_label_icon": "", + "min_label": "", + "min_label_icon": "", + "name": "temperature", + "placeholder": "", + "range_spec": { + "max": 1, + "min": 0, + "step": 0.01, + "step_type": "float" + }, + "required": false, + "show": true, + "slider_buttons": false, + "slider_buttons_options": [], + "slider_input": false, + "title_case": false, + "tool_mode": false, + "type": "slider", + "value": 0.1 + } + }, + "tool_mode": false + }, + "showNode": true, + "type": "LanguageModelComponent" + }, + "dragging": false, + "id": "LanguageModelComponent-1OIsN", + "measured": { + "height": 534, + "width": 320 + }, + "position": { + "x": 1472.0991866325971, + "y": -182.4108205734875 + }, + "selected": false, + "type": "genericNode" } ], "viewport": { - "x": -116.69751133397563, - "y": 176.89760533769663, - "zoom": 0.5570453295917549 + "x": -542.6575578166919, + "y": 461.5588015794615, + "zoom": 0.638990610387083 } }, "description": "This template iterates over search results using LoopComponent and translates each result into Portuguese automatically. 🚀", "endpoint_name": null, - "id": "105a54e1-198e-468e-8bb2-3a037f4d595a", + "id": "ecfcbade-de2b-4f96-83e3-2eeb365fbed0", "is_component": false, - "last_tested_version": "1.4.2", + "last_tested_version": "1.4.3", "name": "Research Translation Loop", "tags": [ "chatbots", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Text Sentiment Analysis.json b/src/backend/base/langflow/initial_setup/starter_projects/Text Sentiment Analysis.json index 5638895cc..10f1065f0 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Text Sentiment Analysis.json @@ -1,213 +1,13 @@ { "data": { "edges": [ - { - "animated": false, - "className": "", - "data": { - "sourceHandle": { - "dataType": "Prompt", - "id": "Prompt-AJxY8", - "name": "prompt", - "output_types": [ - "Message" - ] - }, - "targetHandle": { - "fieldName": "system_message", - "id": "OpenAIModel-zVeWr", - "inputTypes": [ - "Message" - ], - "type": "str" - } - }, - "id": "reactflow__edge-Prompt-AJxY8{œdataTypeœ:œPromptœ,œidœ:œPrompt-AJxY8œ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-zVeWr{œfieldNameœ:œsystem_messageœ,œidœ:œOpenAIModel-zVeWrœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", - "selected": false, - "source": "Prompt-AJxY8", - "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-AJxY8œ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", - "target": "OpenAIModel-zVeWr", - "targetHandle": "{œfieldNameœ: œsystem_messageœ, œidœ: œOpenAIModel-zVeWrœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" - }, - { - "animated": false, - "className": "", - "data": { - "sourceHandle": { - "dataType": "OpenAIModel", - "id": "OpenAIModel-zVeWr", - "name": "text_output", - "output_types": [ - "Message" - ] - }, - "targetHandle": { - "fieldName": "summary", - "id": "Prompt-nmNbi", - "inputTypes": [ - "Message" - ], - "type": "str" - } - }, - "id": "reactflow__edge-OpenAIModel-zVeWr{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-zVeWrœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-Prompt-nmNbi{œfieldNameœ:œsummaryœ,œidœ:œPrompt-nmNbiœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", - "selected": false, - "source": "OpenAIModel-zVeWr", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-zVeWrœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-nmNbi", - "targetHandle": "{œfieldNameœ: œsummaryœ, œidœ: œPrompt-nmNbiœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" - }, - { - "animated": false, - "className": "", - "data": { - "sourceHandle": { - "dataType": "Prompt", - "id": "Prompt-nmNbi", - "name": "prompt", - "output_types": [ - "Message" - ] - }, - "targetHandle": { - "fieldName": "system_message", - "id": "OpenAIModel-Izkdb", - "inputTypes": [ - "Message" - ], - "type": "str" - } - }, - "id": "reactflow__edge-Prompt-nmNbi{œdataTypeœ:œPromptœ,œidœ:œPrompt-nmNbiœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-Izkdb{œfieldNameœ:œsystem_messageœ,œidœ:œOpenAIModel-Izkdbœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", - "selected": false, - "source": "Prompt-nmNbi", - "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-nmNbiœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", - "target": "OpenAIModel-Izkdb", - "targetHandle": "{œfieldNameœ: œsystem_messageœ, œidœ: œOpenAIModel-Izkdbœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" - }, - { - "animated": false, - "className": "", - "data": { - "sourceHandle": { - "dataType": "Prompt", - "id": "Prompt-LXvg7", - "name": "prompt", - "output_types": [ - "Message" - ] - }, - "targetHandle": { - "fieldName": "system_message", - "id": "OpenAIModel-Hl8vG", - "inputTypes": [ - "Message" - ], - "type": "str" - } - }, - "id": "reactflow__edge-Prompt-LXvg7{œdataTypeœ:œPromptœ,œidœ:œPrompt-LXvg7œ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-Hl8vG{œfieldNameœ:œsystem_messageœ,œidœ:œOpenAIModel-Hl8vGœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", - "selected": false, - "source": "Prompt-LXvg7", - "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-LXvg7œ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", - "target": "OpenAIModel-Hl8vG", - "targetHandle": "{œfieldNameœ: œsystem_messageœ, œidœ: œOpenAIModel-Hl8vGœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" - }, - { - "animated": false, - "className": "", - "data": { - "sourceHandle": { - "dataType": "OpenAIModel", - "id": "OpenAIModel-Hl8vG", - "name": "text_output", - "output_types": [ - "Message" - ] - }, - "targetHandle": { - "fieldName": "input_value", - "id": "ChatOutput-NS8z5", - "inputTypes": [ - "Data", - "DataFrame", - "Message" - ], - "type": "other" - } - }, - "id": "reactflow__edge-OpenAIModel-Hl8vG{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-Hl8vGœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-NS8z5{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-NS8z5œ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}", - "selected": false, - "source": "OpenAIModel-Hl8vG", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-Hl8vGœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "ChatOutput-NS8z5", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-NS8z5œ, œinputTypesœ: [œDataœ, œDataFrameœ, œMessageœ], œtypeœ: œotherœ}" - }, - { - "animated": false, - "className": "", - "data": { - "sourceHandle": { - "dataType": "OpenAIModel", - "id": "OpenAIModel-Izkdb", - "name": "text_output", - "output_types": [ - "Message" - ] - }, - "targetHandle": { - "fieldName": "input_value", - "id": "ChatOutput-GzAXT", - "inputTypes": [ - "Data", - "DataFrame", - "Message" - ], - "type": "other" - } - }, - "id": "reactflow__edge-OpenAIModel-Izkdb{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-Izkdbœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-GzAXT{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-GzAXTœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}", - "selected": false, - "source": "OpenAIModel-Izkdb", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-Izkdbœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "ChatOutput-GzAXT", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-GzAXTœ, œinputTypesœ: [œDataœ, œDataFrameœ, œMessageœ], œtypeœ: œotherœ}" - }, { "animated": false, "className": "", "data": { "sourceHandle": { "dataType": "File", - "id": "File-m5GWE", - "name": "message", - "output_types": [ - "Message" - ] - }, - "targetHandle": { - "fieldName": "input_value", - "id": "OpenAIModel-Hl8vG", - "inputTypes": [ - "Message" - ], - "type": "str" - } - }, - "id": "xy-edge__File-m5GWE{œdataTypeœ:œFileœ,œidœ:œFile-m5GWEœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-Hl8vG{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-Hl8vGœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", - "selected": false, - "source": "File-m5GWE", - "sourceHandle": "{œdataTypeœ: œFileœ, œidœ: œFile-m5GWEœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", - "target": "OpenAIModel-Hl8vG", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-Hl8vGœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" - }, - { - "animated": false, - "className": "", - "data": { - "sourceHandle": { - "dataType": "File", - "id": "File-m5GWE", + "id": "File-fosKE", "name": "message", "output_types": [ "Message" @@ -215,31 +15,224 @@ }, "targetHandle": { "fieldName": "text", - "id": "Prompt-AJxY8", + "id": "Prompt-3IzFz", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "xy-edge__File-m5GWE{œdataTypeœ:œFileœ,œidœ:œFile-m5GWEœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-AJxY8{œfieldNameœ:œtextœ,œidœ:œPrompt-AJxY8œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-File-fosKE{œdataTypeœ:œFileœ,œidœ:œFile-fosKEœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-3IzFz{œfieldNameœ:œtextœ,œidœ:œPrompt-3IzFzœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "File-m5GWE", - "sourceHandle": "{œdataTypeœ: œFileœ, œidœ: œFile-m5GWEœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-AJxY8", - "targetHandle": "{œfieldNameœ: œtextœ, œidœ: œPrompt-AJxY8œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "source": "File-fosKE", + "sourceHandle": "{œdataTypeœ: œFileœ, œidœ: œFile-fosKEœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-3IzFz", + "targetHandle": "{œfieldNameœ: œtextœ, œidœ: œPrompt-3IzFzœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + }, + { + "animated": false, + "data": { + "sourceHandle": { + "dataType": "Prompt", + "id": "Prompt-3IzFz", + "name": "prompt", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "input_value", + "id": "LanguageModelComponent-oBZy3", + "inputTypes": [ + "Message" + ], + "type": "str" + } + }, + "id": "xy-edge__Prompt-3IzFz{œdataTypeœ:œPromptœ,œidœ:œPrompt-3IzFzœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-LanguageModelComponent-oBZy3{œfieldNameœ:œinput_valueœ,œidœ:œLanguageModelComponent-oBZy3œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "selected": false, + "source": "Prompt-3IzFz", + "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-3IzFzœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", + "target": "LanguageModelComponent-oBZy3", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œLanguageModelComponent-oBZy3œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + }, + { + "animated": false, + "data": { + "sourceHandle": { + "dataType": "LanguageModelComponent", + "id": "LanguageModelComponent-oBZy3", + "name": "text_output", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "summary", + "id": "Prompt-roFWL", + "inputTypes": [ + "Message" + ], + "type": "str" + } + }, + "id": "xy-edge__LanguageModelComponent-oBZy3{œdataTypeœ:œLanguageModelComponentœ,œidœ:œLanguageModelComponent-oBZy3œ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-Prompt-roFWL{œfieldNameœ:œsummaryœ,œidœ:œPrompt-roFWLœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "selected": false, + "source": "LanguageModelComponent-oBZy3", + "sourceHandle": "{œdataTypeœ: œLanguageModelComponentœ, œidœ: œLanguageModelComponent-oBZy3œ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-roFWL", + "targetHandle": "{œfieldNameœ: œsummaryœ, œidœ: œPrompt-roFWLœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + }, + { + "animated": false, + "data": { + "sourceHandle": { + "dataType": "Prompt", + "id": "Prompt-roFWL", + "name": "prompt", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "input_value", + "id": "LanguageModelComponent-k9uIC", + "inputTypes": [ + "Message" + ], + "type": "str" + } + }, + "id": "xy-edge__Prompt-roFWL{œdataTypeœ:œPromptœ,œidœ:œPrompt-roFWLœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-LanguageModelComponent-k9uIC{œfieldNameœ:œinput_valueœ,œidœ:œLanguageModelComponent-k9uICœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "selected": false, + "source": "Prompt-roFWL", + "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-roFWLœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", + "target": "LanguageModelComponent-k9uIC", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œLanguageModelComponent-k9uICœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + }, + { + "animated": false, + "data": { + "sourceHandle": { + "dataType": "LanguageModelComponent", + "id": "LanguageModelComponent-k9uIC", + "name": "text_output", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "input_value", + "id": "ChatOutput-C9zZD", + "inputTypes": [ + "Data", + "DataFrame", + "Message" + ], + "type": "other" + } + }, + "id": "xy-edge__LanguageModelComponent-k9uIC{œdataTypeœ:œLanguageModelComponentœ,œidœ:œLanguageModelComponent-k9uICœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-C9zZD{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-C9zZDœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}", + "selected": false, + "source": "LanguageModelComponent-k9uIC", + "sourceHandle": "{œdataTypeœ: œLanguageModelComponentœ, œidœ: œLanguageModelComponent-k9uICœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "ChatOutput-C9zZD", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-C9zZDœ, œinputTypesœ: [œDataœ, œDataFrameœ, œMessageœ], œtypeœ: œotherœ}" + }, + { + "animated": false, + "data": { + "sourceHandle": { + "dataType": "Prompt", + "id": "Prompt-ryDcq", + "name": "prompt", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "system_message", + "id": "LanguageModelComponent-e7Tpe", + "inputTypes": [ + "Message" + ], + "type": "str" + } + }, + "id": "xy-edge__Prompt-ryDcq{œdataTypeœ:œPromptœ,œidœ:œPrompt-ryDcqœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-LanguageModelComponent-e7Tpe{œfieldNameœ:œsystem_messageœ,œidœ:œLanguageModelComponent-e7Tpeœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "selected": false, + "source": "Prompt-ryDcq", + "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-ryDcqœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", + "target": "LanguageModelComponent-e7Tpe", + "targetHandle": "{œfieldNameœ: œsystem_messageœ, œidœ: œLanguageModelComponent-e7Tpeœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + }, + { + "animated": false, + "data": { + "sourceHandle": { + "dataType": "File", + "id": "File-fosKE", + "name": "message", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "input_value", + "id": "LanguageModelComponent-e7Tpe", + "inputTypes": [ + "Message" + ], + "type": "str" + } + }, + "id": "xy-edge__File-fosKE{œdataTypeœ:œFileœ,œidœ:œFile-fosKEœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-LanguageModelComponent-e7Tpe{œfieldNameœ:œinput_valueœ,œidœ:œLanguageModelComponent-e7Tpeœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "selected": false, + "source": "File-fosKE", + "sourceHandle": "{œdataTypeœ: œFileœ, œidœ: œFile-fosKEœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", + "target": "LanguageModelComponent-e7Tpe", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œLanguageModelComponent-e7Tpeœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + }, + { + "animated": false, + "data": { + "sourceHandle": { + "dataType": "LanguageModelComponent", + "id": "LanguageModelComponent-e7Tpe", + "name": "text_output", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "input_value", + "id": "ChatOutput-0vZ51", + "inputTypes": [ + "Data", + "DataFrame", + "Message" + ], + "type": "other" + } + }, + "id": "xy-edge__LanguageModelComponent-e7Tpe{œdataTypeœ:œLanguageModelComponentœ,œidœ:œLanguageModelComponent-e7Tpeœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-0vZ51{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-0vZ51œ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}", + "selected": false, + "source": "LanguageModelComponent-e7Tpe", + "sourceHandle": "{œdataTypeœ: œLanguageModelComponentœ, œidœ: œLanguageModelComponent-e7Tpeœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "ChatOutput-0vZ51", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-0vZ51œ, œinputTypesœ: [œDataœ, œDataFrameœ, œMessageœ], œtypeœ: œotherœ}" } ], "nodes": [ { "data": { - "id": "File-m5GWE", + "id": "File-fosKE", "node": { "base_classes": [ - "Data" + "DataFrame", + "Message" ], "beta": false, - "category": "data", "conditional_paths": [], "custom_fields": {}, "description": "Loads content from one or more files as a DataFrame.", @@ -249,6 +242,7 @@ "field_order": [ "path", "file_path", + "separator", "silent_errors", "delete_server_file_after_processing", "ignore_unsupported_extensions", @@ -258,9 +252,7 @@ ], "frozen": false, "icon": "file-text", - "key": "File", "legacy": false, - "lf_version": "1.2.0", "metadata": {}, "minimized": false, "output_types": [], @@ -272,7 +264,7 @@ "group_outputs": false, "method": "load_files", "name": "dataframe", - "selected": "DataFrame", + "selected": null, "tool_mode": true, "types": [ "DataFrame" @@ -295,7 +287,6 @@ } ], "pinned": false, - "score": 0.0004124940109183525, "template": { "_type": "Component", "code": { @@ -511,26 +502,26 @@ }, "tool_mode": false }, + "selected_output": "message", "showNode": true, - "type": "File", - "selected_output": "message" + "type": "File" }, "dragging": false, - "id": "File-m5GWE", + "id": "File-fosKE", "measured": { - "height": 336, + "height": 230, "width": 320 }, "position": { - "x": -2283.1962393600293, - "y": 660.3497479382216 + "x": -2114.5031608334, + "y": 681.3411437663555 }, "selected": false, "type": "genericNode" }, { "data": { - "id": "Prompt-nmNbi", + "id": "Prompt-roFWL", "node": { "base_classes": [ "Message" @@ -546,22 +537,15 @@ "display_name": "Prompt", "documentation": "", "edited": false, - "error": null, "field_order": [ "template", "tool_placeholder" ], "frozen": false, - "full_path": null, "icon": "braces", - "is_composition": null, - "is_input": null, - "is_output": null, "legacy": false, - "lf_version": "1.2.0", "metadata": {}, "minimized": false, - "name": "", "output_types": [], "outputs": [ { @@ -630,6 +614,7 @@ "info": "", "list": false, "list_add_label": "Add More", + "load_from_db": false, "name": "template", "placeholder": "", "required": false, @@ -667,13 +652,12 @@ "tool_mode": false }, "showNode": true, - "type": "Prompt", - "selected_output": "prompt" + "type": "Prompt" }, "dragging": false, - "id": "Prompt-nmNbi", + "id": "Prompt-roFWL", "measured": { - "height": 413, + "height": 367, "width": 320 }, "position": { @@ -685,7 +669,7 @@ }, { "data": { - "id": "Prompt-AJxY8", + "id": "Prompt-3IzFz", "node": { "base_classes": [ "Message" @@ -701,22 +685,15 @@ "display_name": "Prompt", "documentation": "", "edited": false, - "error": null, "field_order": [ "template", "tool_placeholder" ], "frozen": false, - "full_path": null, "icon": "braces", - "is_composition": null, - "is_input": null, - "is_output": null, "legacy": false, - "lf_version": "1.2.0", "metadata": {}, "minimized": false, - "name": "", "output_types": [], "outputs": [ { @@ -763,6 +740,7 @@ "info": "", "list": false, "list_add_label": "Add More", + "load_from_db": false, "name": "template", "placeholder": "", "required": false, @@ -822,17 +800,16 @@ "tool_mode": false }, "showNode": true, - "type": "Prompt", - "selected_output": "prompt" + "type": "Prompt" }, "dragging": false, - "id": "Prompt-AJxY8", + "id": "Prompt-3IzFz", "measured": { - "height": 413, + "height": 367, "width": 320 }, "position": { - "x": -1662.7141678649673, + "x": -1691.3505617322087, "y": 1010.953782441708 }, "selected": false, @@ -840,787 +817,7 @@ }, { "data": { - "id": "OpenAIModel-zVeWr", - "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", - "model_name", - "openai_api_base", - "api_key", - "temperature", - "seed", - "max_retries", - "timeout" - ], - "frozen": false, - "icon": "OpenAI", - "legacy": false, - "lf_version": "1.2.0", - "metadata": { - "keywords": [ - "model", - "llm", - "language model", - "large language model" - ] - }, - "minimized": false, - "output_types": [], - "outputs": [ - { - "allows_loop": false, - "cache": true, - "display_name": "Model Response", - "group_outputs": false, - "method": "text_response", - "name": "text_output", - "selected": "Message", - "tool_mode": true, - "types": [ - "Message" - ], - "value": "__UNDEFINED__" - }, - { - "allows_loop": false, - "cache": true, - "display_name": "Language Model", - "group_outputs": false, - "method": "build_model", - "name": "model_output", - "selected": "LanguageModel", - "tool_mode": true, - "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": [], - "load_from_db": true, - "name": "api_key", - "password": true, - "placeholder": "", - "required": true, - "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": "from typing import Any\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 (\n OPENAI_MODEL_NAMES,\n OPENAI_REASONING_MODEL_NAMES,\n)\nfrom langflow.field_typing import LanguageModel\nfrom langflow.field_typing.range_spec import RangeSpec\nfrom langflow.inputs.inputs import BoolInput, DictInput, DropdownInput, IntInput, SecretStrInput, SliderInput, StrInput\nfrom langflow.logging import logger\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 DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n advanced=False,\n options=OPENAI_MODEL_NAMES + OPENAI_REASONING_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[1],\n combobox=True,\n real_time_refresh=True,\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 required=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n show=True,\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 IntInput(\n name=\"max_retries\",\n display_name=\"Max Retries\",\n info=\"The maximum number of retries to make when generating.\",\n advanced=True,\n value=5,\n ),\n IntInput(\n name=\"timeout\",\n display_name=\"Timeout\",\n info=\"The timeout for requests to OpenAI completion API.\",\n advanced=True,\n value=700,\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n parameters = {\n \"api_key\": SecretStr(self.api_key).get_secret_value() if self.api_key else None,\n \"model_name\": self.model_name,\n \"max_tokens\": self.max_tokens or None,\n \"model_kwargs\": self.model_kwargs or {},\n \"base_url\": self.openai_api_base or \"https://api.openai.com/v1\",\n \"seed\": self.seed,\n \"max_retries\": self.max_retries,\n \"timeout\": self.timeout,\n \"temperature\": self.temperature if self.temperature is not None else 0.1,\n }\n\n logger.info(f\"Model name: {self.model_name}\")\n if self.model_name in OPENAI_REASONING_MODEL_NAMES:\n logger.info(\"Getting reasoning model parameters\")\n parameters.pop(\"temperature\")\n parameters.pop(\"seed\")\n output = ChatOpenAI(**parameters)\n if self.json_mode:\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\n def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:\n if field_name in {\"base_url\", \"model_name\", \"api_key\"} and field_value in OPENAI_REASONING_MODEL_NAMES:\n build_config[\"temperature\"][\"show\"] = False\n build_config[\"seed\"][\"show\"] = False\n if field_name in {\"base_url\", \"model_name\", \"api_key\"} and field_value in OPENAI_MODEL_NAMES:\n build_config[\"temperature\"][\"show\"] = True\n build_config[\"seed\"][\"show\"] = True\n return build_config\n" - }, - "input_value": { - "_input_type": "MessageInput", - "advanced": false, - "display_name": "Input", - "dynamic": false, - "info": "", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "name": "input_value", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": 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, - "list_add_label": "Add More", - "name": "json_mode", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "bool", - "value": false - }, - "max_retries": { - "_input_type": "IntInput", - "advanced": true, - "display_name": "Max Retries", - "dynamic": false, - "info": "The maximum number of retries to make when generating.", - "list": false, - "list_add_label": "Add More", - "name": "max_retries", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 5 - }, - "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, - "list_add_label": "Add More", - "name": "max_tokens", - "placeholder": "", - "range_spec": { - "max": 128000, - "min": 0, - "step": 0.1, - "step_type": "float" - }, - "required": false, - "show": true, - "title_case": false, - "tool_mode": 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, - "list_add_label": "Add More", - "name": "model_kwargs", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_input": true, - "type": "dict", - "value": {} - }, - "model_name": { - "_input_type": "DropdownInput", - "advanced": false, - "combobox": true, - "dialog_inputs": {}, - "display_name": "Model Name", - "dynamic": false, - "info": "", - "name": "model_name", - "options": [ - "gpt-4o-mini", - "gpt-4o", - "gpt-4.1", - "gpt-4.1-mini", - "gpt-4.1-nano", - "gpt-4.5-preview", - "gpt-4-turbo", - "gpt-4-turbo-preview", - "gpt-4", - "gpt-3.5-turbo", - "o1" - ], - "options_metadata": [], - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "str", - "value": "gpt-4.1-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, - "list_add_label": "Add More", - "load_from_db": false, - "name": "openai_api_base", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "str", - "value": "" - }, - "seed": { - "_input_type": "IntInput", - "advanced": true, - "display_name": "Seed", - "dynamic": false, - "info": "The seed controls the reproducibility of the job.", - "list": false, - "list_add_label": "Add More", - "name": "seed", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 1 - }, - "stream": { - "_input_type": "BoolInput", - "advanced": true, - "display_name": "Stream", - "dynamic": false, - "info": "Stream the response from the model. Streaming works only in Chat.", - "list": false, - "list_add_label": "Add More", - "name": "stream", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "bool", - "value": false - }, - "system_message": { - "_input_type": "MultilineInput", - "advanced": false, - "display_name": "System Message", - "dynamic": false, - "info": "System message to pass to the model.", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "multiline": true, - "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": "SliderInput", - "advanced": false, - "display_name": "Temperature", - "dynamic": false, - "info": "", - "max_label": "", - "max_label_icon": "", - "min_label": "", - "min_label_icon": "", - "name": "temperature", - "placeholder": "", - "range_spec": { - "max": 1, - "min": 0, - "step": 0.01, - "step_type": "float" - }, - "required": false, - "show": true, - "slider_buttons": false, - "slider_buttons_options": [], - "slider_input": false, - "title_case": false, - "tool_mode": false, - "type": "slider", - "value": 0.1 - }, - "timeout": { - "_input_type": "IntInput", - "advanced": true, - "display_name": "Timeout", - "dynamic": false, - "info": "The timeout for requests to OpenAI completion API.", - "list": false, - "list_add_label": "Add More", - "name": "timeout", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 700 - } - }, - "tool_mode": false - }, - "showNode": true, - "type": "OpenAIModel", - "selected_output": "text_output" - }, - "dragging": false, - "id": "OpenAIModel-zVeWr", - "measured": { - "height": 525, - "width": 320 - }, - "position": { - "x": -1310.5197628463882, - "y": 973.1747844967928 - }, - "selected": false, - "type": "genericNode" - }, - { - "data": { - "id": "OpenAIModel-Izkdb", - "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", - "model_name", - "openai_api_base", - "api_key", - "temperature", - "seed", - "max_retries", - "timeout" - ], - "frozen": false, - "icon": "OpenAI", - "legacy": false, - "lf_version": "1.2.0", - "metadata": { - "keywords": [ - "model", - "llm", - "language model", - "large language model" - ] - }, - "minimized": false, - "output_types": [], - "outputs": [ - { - "allows_loop": false, - "cache": true, - "display_name": "Model Response", - "group_outputs": false, - "method": "text_response", - "name": "text_output", - "selected": "Message", - "tool_mode": true, - "types": [ - "Message" - ], - "value": "__UNDEFINED__" - }, - { - "allows_loop": false, - "cache": true, - "display_name": "Language Model", - "group_outputs": false, - "method": "build_model", - "name": "model_output", - "selected": "LanguageModel", - "tool_mode": true, - "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": [], - "load_from_db": true, - "name": "api_key", - "password": true, - "placeholder": "", - "required": true, - "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": "from typing import Any\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 (\n OPENAI_MODEL_NAMES,\n OPENAI_REASONING_MODEL_NAMES,\n)\nfrom langflow.field_typing import LanguageModel\nfrom langflow.field_typing.range_spec import RangeSpec\nfrom langflow.inputs.inputs import BoolInput, DictInput, DropdownInput, IntInput, SecretStrInput, SliderInput, StrInput\nfrom langflow.logging import logger\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 DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n advanced=False,\n options=OPENAI_MODEL_NAMES + OPENAI_REASONING_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[1],\n combobox=True,\n real_time_refresh=True,\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 required=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n show=True,\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 IntInput(\n name=\"max_retries\",\n display_name=\"Max Retries\",\n info=\"The maximum number of retries to make when generating.\",\n advanced=True,\n value=5,\n ),\n IntInput(\n name=\"timeout\",\n display_name=\"Timeout\",\n info=\"The timeout for requests to OpenAI completion API.\",\n advanced=True,\n value=700,\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n parameters = {\n \"api_key\": SecretStr(self.api_key).get_secret_value() if self.api_key else None,\n \"model_name\": self.model_name,\n \"max_tokens\": self.max_tokens or None,\n \"model_kwargs\": self.model_kwargs or {},\n \"base_url\": self.openai_api_base or \"https://api.openai.com/v1\",\n \"seed\": self.seed,\n \"max_retries\": self.max_retries,\n \"timeout\": self.timeout,\n \"temperature\": self.temperature if self.temperature is not None else 0.1,\n }\n\n logger.info(f\"Model name: {self.model_name}\")\n if self.model_name in OPENAI_REASONING_MODEL_NAMES:\n logger.info(\"Getting reasoning model parameters\")\n parameters.pop(\"temperature\")\n parameters.pop(\"seed\")\n output = ChatOpenAI(**parameters)\n if self.json_mode:\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\n def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:\n if field_name in {\"base_url\", \"model_name\", \"api_key\"} and field_value in OPENAI_REASONING_MODEL_NAMES:\n build_config[\"temperature\"][\"show\"] = False\n build_config[\"seed\"][\"show\"] = False\n if field_name in {\"base_url\", \"model_name\", \"api_key\"} and field_value in OPENAI_MODEL_NAMES:\n build_config[\"temperature\"][\"show\"] = True\n build_config[\"seed\"][\"show\"] = True\n return build_config\n" - }, - "input_value": { - "_input_type": "MessageInput", - "advanced": false, - "display_name": "Input", - "dynamic": false, - "info": "", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "name": "input_value", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": 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, - "list_add_label": "Add More", - "name": "json_mode", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "bool", - "value": false - }, - "max_retries": { - "_input_type": "IntInput", - "advanced": true, - "display_name": "Max Retries", - "dynamic": false, - "info": "The maximum number of retries to make when generating.", - "list": false, - "list_add_label": "Add More", - "name": "max_retries", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 5 - }, - "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, - "list_add_label": "Add More", - "name": "max_tokens", - "placeholder": "", - "range_spec": { - "max": 128000, - "min": 0, - "step": 0.1, - "step_type": "float" - }, - "required": false, - "show": true, - "title_case": false, - "tool_mode": 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, - "list_add_label": "Add More", - "name": "model_kwargs", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_input": true, - "type": "dict", - "value": {} - }, - "model_name": { - "_input_type": "DropdownInput", - "advanced": false, - "combobox": true, - "dialog_inputs": {}, - "display_name": "Model Name", - "dynamic": false, - "info": "", - "name": "model_name", - "options": [ - "gpt-4o-mini", - "gpt-4o", - "gpt-4.1", - "gpt-4.1-mini", - "gpt-4.1-nano", - "gpt-4.5-preview", - "gpt-4-turbo", - "gpt-4-turbo-preview", - "gpt-4", - "gpt-3.5-turbo", - "o1" - ], - "options_metadata": [], - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "str", - "value": "gpt-4.1-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, - "list_add_label": "Add More", - "load_from_db": false, - "name": "openai_api_base", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "str", - "value": "" - }, - "seed": { - "_input_type": "IntInput", - "advanced": true, - "display_name": "Seed", - "dynamic": false, - "info": "The seed controls the reproducibility of the job.", - "list": false, - "list_add_label": "Add More", - "name": "seed", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 1 - }, - "stream": { - "_input_type": "BoolInput", - "advanced": true, - "display_name": "Stream", - "dynamic": false, - "info": "Stream the response from the model. Streaming works only in Chat.", - "list": false, - "list_add_label": "Add More", - "name": "stream", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "bool", - "value": false - }, - "system_message": { - "_input_type": "MultilineInput", - "advanced": false, - "display_name": "System Message", - "dynamic": false, - "info": "System message to pass to the model.", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "multiline": true, - "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": "SliderInput", - "advanced": false, - "display_name": "Temperature", - "dynamic": false, - "info": "", - "max_label": "", - "max_label_icon": "", - "min_label": "", - "min_label_icon": "", - "name": "temperature", - "placeholder": "", - "range_spec": { - "max": 1, - "min": 0, - "step": 0.01, - "step_type": "float" - }, - "required": false, - "show": true, - "slider_buttons": false, - "slider_buttons_options": [], - "slider_input": false, - "title_case": false, - "tool_mode": false, - "type": "slider", - "value": 0.1 - }, - "timeout": { - "_input_type": "IntInput", - "advanced": true, - "display_name": "Timeout", - "dynamic": false, - "info": "The timeout for requests to OpenAI completion API.", - "list": false, - "list_add_label": "Add More", - "name": "timeout", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 700 - } - }, - "tool_mode": false - }, - "showNode": true, - "type": "OpenAIModel", - "selected_output": "text_output" - }, - "dragging": false, - "id": "OpenAIModel-Izkdb", - "measured": { - "height": 525, - "width": 320 - }, - "position": { - "x": -618.8663500710704, - "y": 974.1327278776446 - }, - "selected": false, - "type": "genericNode" - }, - { - "data": { - "id": "Prompt-LXvg7", + "id": "Prompt-ryDcq", "node": { "base_classes": [ "Message" @@ -1634,22 +831,15 @@ "display_name": "Prompt", "documentation": "", "edited": false, - "error": null, "field_order": [ "template", "tool_placeholder" ], "frozen": false, - "full_path": null, "icon": "braces", - "is_composition": null, - "is_input": null, - "is_output": null, "legacy": false, - "lf_version": "1.2.0", "metadata": {}, "minimized": false, - "name": "", "output_types": [], "outputs": [ { @@ -1696,6 +886,7 @@ "info": "", "list": false, "list_add_label": "Add More", + "load_from_db": false, "name": "template", "placeholder": "", "required": false, @@ -1733,13 +924,12 @@ "tool_mode": false }, "showNode": true, - "type": "Prompt", - "selected_output": "prompt" + "type": "Prompt" }, "dragging": false, - "id": "Prompt-LXvg7", + "id": "Prompt-ryDcq", "measured": { - "height": 330, + "height": 284, "width": 320 }, "position": { @@ -1751,38 +941,757 @@ }, { "data": { - "id": "OpenAIModel-Hl8vG", + "id": "note-gFBr6", + "node": { + "description": "# Sentiment Analysis Flow \n\nThis flow processes text data, analyzes sentiment, and provides structured insights. \n\n## Prerequisite\n\n* [OpenAI API key](https://platform.openai.com/docs/)\n\n## Quickstart\n\n1. Add your [OpenAI API key](https://platform.openai.com/docs/) to the OpenAI model components.\n2. In the **File Component**, load text data in `.txt`, `.csv`, or `.json` formats.\n3. Open the **Playground** to see the analysis and recommendation the flow constructs.\n\n## How It Works \n\n1. The **Data to Message** component converts raw data into structured messages. \n\n2. The **NLP expert** prompt provides sentiment analysis, while the **Analyzing messages** prompt summarizes messages from a discussion board.\n\n3. The final **Prompt Component** creates a structured recommendation prompt to ensure that the AI model receives well-formatted input. \n\n4. The **OpenAI Model Component** processes the text and classifies the sentiment as **Positive, Neutral, or Negative**. \n\n", + "display_name": "", + "documentation": "", + "template": {} + }, + "type": "note" + }, + "dragging": false, + "height": 574, + "id": "note-gFBr6", + "measured": { + "height": 574, + "width": 413 + }, + "position": { + "x": -2891.3528304066394, + "y": 384.370168260918 + }, + "resizing": false, + "selected": false, + "type": "noteNode", + "width": 412 + }, + { + "data": { + "id": "ChatOutput-0vZ51", + "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", + "clean_data" + ], + "frozen": false, + "icon": "MessagesSquare", + "legacy": false, + "metadata": {}, + "minimized": true, + "output_types": [], + "outputs": [ + { + "allows_loop": false, + "cache": true, + "display_name": "Output Message", + "group_outputs": false, + "method": "message_response", + "name": "message", + "selected": "Message", + "tool_mode": true, + "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, + "list_add_label": "Add More", + "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, + "list_add_label": "Add More", + "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": "" + }, + "clean_data": { + "_input_type": "BoolInput", + "advanced": true, + "display_name": "Basic Clean Data", + "dynamic": false, + "info": "Whether to clean the data", + "list": false, + "list_add_label": "Add More", + "name": "clean_data", + "placeholder": "", + "required": false, + "show": true, + "title_case": false, + "tool_mode": false, + "trace_as_metadata": true, + "type": "bool", + "value": true + }, + "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 collections.abc import Generator\nfrom typing import Any\n\nimport orjson\nfrom fastapi.encoders import jsonable_encoder\n\nfrom langflow.base.io.chat import ChatComponent\nfrom langflow.helpers.data import safe_convert\nfrom langflow.inputs.inputs import BoolInput, DropdownInput, HandleInput, MessageTextInput\nfrom langflow.schema.data import Data\nfrom langflow.schema.dataframe import DataFrame\nfrom langflow.schema.message import Message\nfrom langflow.schema.properties import Source\nfrom langflow.template.field.base import Output\nfrom langflow.utils.constants import (\n MESSAGE_SENDER_AI,\n MESSAGE_SENDER_NAME_AI,\n MESSAGE_SENDER_USER,\n)\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 minimized = True\n\n inputs = [\n HandleInput(\n name=\"input_value\",\n display_name=\"Inputs\",\n info=\"Message to be passed as output.\",\n input_types=[\"Data\", \"DataFrame\", \"Message\"],\n required=True,\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 BoolInput(\n name=\"clean_data\",\n display_name=\"Basic Clean Data\",\n value=True,\n info=\"Whether to clean the data\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(\n display_name=\"Output 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 # Handle case where source is a ChatOpenAI object\n if hasattr(source, \"model_name\"):\n source_dict[\"source\"] = source.model_name\n elif hasattr(source, \"model\"):\n source_dict[\"source\"] = str(source.model)\n else:\n source_dict[\"source\"] = str(source)\n return Source(**source_dict)\n\n async def message_response(self) -> Message:\n # First convert the input to string if needed\n text = self.convert_to_string()\n\n # Get source properties\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\n # Create or use existing Message object\n if isinstance(self.input_value, Message):\n message = self.input_value\n # Update message properties\n message.text = text\n else:\n message = Message(text=text)\n\n # Set message properties\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\n # Store message if needed\n if self.session_id and self.should_store_message:\n stored_message = await self.send_message(message)\n self.message.value = stored_message\n message = stored_message\n\n self.status = message\n return message\n\n def _serialize_data(self, data: Data) -> str:\n \"\"\"Serialize Data object to JSON string.\"\"\"\n # Convert data.data to JSON-serializable format\n serializable_data = jsonable_encoder(data.data)\n # Serialize with orjson, enabling pretty printing with indentation\n json_bytes = orjson.dumps(serializable_data, option=orjson.OPT_INDENT_2)\n # Convert bytes to string and wrap in Markdown code blocks\n return \"```json\\n\" + json_bytes.decode(\"utf-8\") + \"\\n```\"\n\n def _validate_input(self) -> None:\n \"\"\"Validate the input data and raise ValueError if invalid.\"\"\"\n if self.input_value is None:\n msg = \"Input data cannot be None\"\n raise ValueError(msg)\n if isinstance(self.input_value, list) and not all(\n isinstance(item, Message | Data | DataFrame | str) for item in self.input_value\n ):\n invalid_types = [\n type(item).__name__\n for item in self.input_value\n if not isinstance(item, Message | Data | DataFrame | str)\n ]\n msg = f\"Expected Data or DataFrame or Message or str, got {invalid_types}\"\n raise TypeError(msg)\n if not isinstance(\n self.input_value,\n Message | Data | DataFrame | str | list | Generator | type(None),\n ):\n type_name = type(self.input_value).__name__\n msg = f\"Expected Data or DataFrame or Message or str, Generator or None, got {type_name}\"\n raise TypeError(msg)\n\n def convert_to_string(self) -> str | Generator[Any, None, None]:\n \"\"\"Convert input data to string with proper error handling.\"\"\"\n self._validate_input()\n if isinstance(self.input_value, list):\n return \"\\n\".join([safe_convert(item, clean_data=self.clean_data) for item in self.input_value])\n if isinstance(self.input_value, Generator):\n return self.input_value\n return safe_convert(self.input_value)\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, + "list_add_label": "Add More", + "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": "HandleInput", + "advanced": false, + "display_name": "Inputs", + "dynamic": false, + "info": "Message to be passed as output.", + "input_types": [ + "Data", + "DataFrame", + "Message" + ], + "list": false, + "list_add_label": "Add More", + "name": "input_value", + "placeholder": "", + "required": true, + "show": true, + "title_case": false, + "trace_as_metadata": true, + "type": "other", + "value": "" + }, + "sender": { + "_input_type": "DropdownInput", + "advanced": true, + "combobox": false, + "dialog_inputs": {}, + "display_name": "Sender Type", + "dynamic": false, + "info": "Type of sender.", + "name": "sender", + "options": [ + "Machine", + "User" + ], + "options_metadata": [], + "placeholder": "", + "required": false, + "show": true, + "title_case": false, + "toggle": 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, + "list_add_label": "Add More", + "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, + "list_add_label": "Add More", + "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, + "list_add_label": "Add More", + "name": "should_store_message", + "placeholder": "", + "required": false, + "show": true, + "title_case": false, + "tool_mode": 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, + "list_add_label": "Add More", + "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 + }, + "showNode": false, + "type": "ChatOutput" + }, + "dragging": false, + "id": "ChatOutput-0vZ51", + "measured": { + "height": 48, + "width": 192 + }, + "position": { + "x": -729.8594083908358, + "y": 571.9033552511398 + }, + "selected": false, + "type": "genericNode" + }, + { + "data": { + "id": "ChatOutput-C9zZD", + "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", + "clean_data" + ], + "frozen": false, + "icon": "MessagesSquare", + "legacy": false, + "metadata": {}, + "minimized": true, + "output_types": [], + "outputs": [ + { + "allows_loop": false, + "cache": true, + "display_name": "Output Message", + "group_outputs": false, + "method": "message_response", + "name": "message", + "selected": "Message", + "tool_mode": true, + "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, + "list_add_label": "Add More", + "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, + "list_add_label": "Add More", + "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": "" + }, + "clean_data": { + "_input_type": "BoolInput", + "advanced": true, + "display_name": "Basic Clean Data", + "dynamic": false, + "info": "Whether to clean the data", + "list": false, + "list_add_label": "Add More", + "name": "clean_data", + "placeholder": "", + "required": false, + "show": true, + "title_case": false, + "tool_mode": false, + "trace_as_metadata": true, + "type": "bool", + "value": true + }, + "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 collections.abc import Generator\nfrom typing import Any\n\nimport orjson\nfrom fastapi.encoders import jsonable_encoder\n\nfrom langflow.base.io.chat import ChatComponent\nfrom langflow.helpers.data import safe_convert\nfrom langflow.inputs.inputs import BoolInput, DropdownInput, HandleInput, MessageTextInput\nfrom langflow.schema.data import Data\nfrom langflow.schema.dataframe import DataFrame\nfrom langflow.schema.message import Message\nfrom langflow.schema.properties import Source\nfrom langflow.template.field.base import Output\nfrom langflow.utils.constants import (\n MESSAGE_SENDER_AI,\n MESSAGE_SENDER_NAME_AI,\n MESSAGE_SENDER_USER,\n)\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 minimized = True\n\n inputs = [\n HandleInput(\n name=\"input_value\",\n display_name=\"Inputs\",\n info=\"Message to be passed as output.\",\n input_types=[\"Data\", \"DataFrame\", \"Message\"],\n required=True,\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 BoolInput(\n name=\"clean_data\",\n display_name=\"Basic Clean Data\",\n value=True,\n info=\"Whether to clean the data\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(\n display_name=\"Output 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 # Handle case where source is a ChatOpenAI object\n if hasattr(source, \"model_name\"):\n source_dict[\"source\"] = source.model_name\n elif hasattr(source, \"model\"):\n source_dict[\"source\"] = str(source.model)\n else:\n source_dict[\"source\"] = str(source)\n return Source(**source_dict)\n\n async def message_response(self) -> Message:\n # First convert the input to string if needed\n text = self.convert_to_string()\n\n # Get source properties\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\n # Create or use existing Message object\n if isinstance(self.input_value, Message):\n message = self.input_value\n # Update message properties\n message.text = text\n else:\n message = Message(text=text)\n\n # Set message properties\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\n # Store message if needed\n if self.session_id and self.should_store_message:\n stored_message = await self.send_message(message)\n self.message.value = stored_message\n message = stored_message\n\n self.status = message\n return message\n\n def _serialize_data(self, data: Data) -> str:\n \"\"\"Serialize Data object to JSON string.\"\"\"\n # Convert data.data to JSON-serializable format\n serializable_data = jsonable_encoder(data.data)\n # Serialize with orjson, enabling pretty printing with indentation\n json_bytes = orjson.dumps(serializable_data, option=orjson.OPT_INDENT_2)\n # Convert bytes to string and wrap in Markdown code blocks\n return \"```json\\n\" + json_bytes.decode(\"utf-8\") + \"\\n```\"\n\n def _validate_input(self) -> None:\n \"\"\"Validate the input data and raise ValueError if invalid.\"\"\"\n if self.input_value is None:\n msg = \"Input data cannot be None\"\n raise ValueError(msg)\n if isinstance(self.input_value, list) and not all(\n isinstance(item, Message | Data | DataFrame | str) for item in self.input_value\n ):\n invalid_types = [\n type(item).__name__\n for item in self.input_value\n if not isinstance(item, Message | Data | DataFrame | str)\n ]\n msg = f\"Expected Data or DataFrame or Message or str, got {invalid_types}\"\n raise TypeError(msg)\n if not isinstance(\n self.input_value,\n Message | Data | DataFrame | str | list | Generator | type(None),\n ):\n type_name = type(self.input_value).__name__\n msg = f\"Expected Data or DataFrame or Message or str, Generator or None, got {type_name}\"\n raise TypeError(msg)\n\n def convert_to_string(self) -> str | Generator[Any, None, None]:\n \"\"\"Convert input data to string with proper error handling.\"\"\"\n self._validate_input()\n if isinstance(self.input_value, list):\n return \"\\n\".join([safe_convert(item, clean_data=self.clean_data) for item in self.input_value])\n if isinstance(self.input_value, Generator):\n return self.input_value\n return safe_convert(self.input_value)\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, + "list_add_label": "Add More", + "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": "HandleInput", + "advanced": false, + "display_name": "Inputs", + "dynamic": false, + "info": "Message to be passed as output.", + "input_types": [ + "Data", + "DataFrame", + "Message" + ], + "list": false, + "list_add_label": "Add More", + "name": "input_value", + "placeholder": "", + "required": true, + "show": true, + "title_case": false, + "trace_as_metadata": true, + "type": "other", + "value": "" + }, + "sender": { + "_input_type": "DropdownInput", + "advanced": true, + "combobox": false, + "dialog_inputs": {}, + "display_name": "Sender Type", + "dynamic": false, + "info": "Type of sender.", + "name": "sender", + "options": [ + "Machine", + "User" + ], + "options_metadata": [], + "placeholder": "", + "required": false, + "show": true, + "title_case": false, + "toggle": 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, + "list_add_label": "Add More", + "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, + "list_add_label": "Add More", + "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, + "list_add_label": "Add More", + "name": "should_store_message", + "placeholder": "", + "required": false, + "show": true, + "title_case": false, + "tool_mode": 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, + "list_add_label": "Add More", + "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 + }, + "showNode": false, + "type": "ChatOutput" + }, + "dragging": false, + "id": "ChatOutput-C9zZD", + "measured": { + "height": 48, + "width": 192 + }, + "position": { + "x": -155.57589738233636, + "y": 1127.8168564025477 + }, + "selected": false, + "type": "genericNode" + }, + { + "data": { + "id": "note-DnDfL", + "node": { + "description": "### 💡 Add your OpenAI API key here 👇", + "display_name": "", + "documentation": "", + "template": { + "backgroundColor": "transparent" + } + }, + "type": "note" + }, + "dragging": false, + "height": 326, + "id": "note-DnDfL", + "measured": { + "height": 326, + "width": 352 + }, + "position": { + "x": -1296.8149861584823, + "y": 204.32200781235414 + }, + "resizing": false, + "selected": false, + "type": "noteNode", + "width": 353 + }, + { + "data": { + "id": "note-k5kCc", + "node": { + "description": "### 💡 Add your OpenAI API key here 👇", + "display_name": "", + "documentation": "", + "template": { + "backgroundColor": "transparent" + } + }, + "type": "note" + }, + "dragging": false, + "id": "note-k5kCc", + "measured": { + "height": 324, + "width": 324 + }, + "position": { + "x": -619.6308693439651, + "y": 957.9933268279298 + }, + "selected": false, + "type": "noteNode" + }, + { + "data": { + "id": "note-FFvLx", + "node": { + "description": "### 💡 Add your OpenAI API key here 👇", + "display_name": "", + "documentation": "", + "template": { + "backgroundColor": "transparent" + } + }, + "type": "note" + }, + "dragging": false, + "id": "note-FFvLx", + "measured": { + "height": 324, + "width": 324 + }, + "position": { + "x": -1309.8036340068625, + "y": 925.6888138443481 + }, + "selected": false, + "type": "noteNode" + }, + { + "data": { + "id": "LanguageModelComponent-oBZy3", "node": { "base_classes": [ "LanguageModel", "Message" ], "beta": false, + "category": "models", "conditional_paths": [], "custom_fields": {}, - "description": "Generates text using OpenAI LLMs.", - "display_name": "OpenAI", + "description": "Runs a language model given a specified provider. ", + "display_name": "Language Model", "documentation": "", "edited": false, "field_order": [ + "provider", + "model_name", + "api_key", "input_value", "system_message", "stream", - "max_tokens", - "model_kwargs", - "json_mode", - "model_name", - "openai_api_base", - "api_key", - "temperature", - "seed", - "max_retries", - "timeout" + "temperature" ], "frozen": false, - "icon": "OpenAI", + "icon": "brain-circuit", + "key": "LanguageModelComponent", "legacy": false, - "lf_version": "1.2.0", "metadata": { "keywords": [ "model", @@ -1824,6 +1733,8 @@ } ], "pinned": false, + "priority": 0, + "score": 0.28173906304863156, "template": { "_type": "Component", "api_key": { @@ -1831,17 +1742,18 @@ "advanced": false, "display_name": "OpenAI API Key", "dynamic": false, - "info": "The OpenAI API Key to use for the OpenAI model.", + "info": "Model Provider API key", "input_types": [], - "load_from_db": true, + "load_from_db": false, "name": "api_key", "password": true, "placeholder": "", - "required": true, + "real_time_refresh": true, + "required": false, "show": true, "title_case": false, "type": "str", - "value": "OPENAI_API_KEY" + "value": "" }, "code": { "advanced": true, @@ -1859,14 +1771,14 @@ "show": true, "title_case": false, "type": "code", - "value": "from typing import Any\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 (\n OPENAI_MODEL_NAMES,\n OPENAI_REASONING_MODEL_NAMES,\n)\nfrom langflow.field_typing import LanguageModel\nfrom langflow.field_typing.range_spec import RangeSpec\nfrom langflow.inputs.inputs import BoolInput, DictInput, DropdownInput, IntInput, SecretStrInput, SliderInput, StrInput\nfrom langflow.logging import logger\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 DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n advanced=False,\n options=OPENAI_MODEL_NAMES + OPENAI_REASONING_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[1],\n combobox=True,\n real_time_refresh=True,\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 required=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n show=True,\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 IntInput(\n name=\"max_retries\",\n display_name=\"Max Retries\",\n info=\"The maximum number of retries to make when generating.\",\n advanced=True,\n value=5,\n ),\n IntInput(\n name=\"timeout\",\n display_name=\"Timeout\",\n info=\"The timeout for requests to OpenAI completion API.\",\n advanced=True,\n value=700,\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n parameters = {\n \"api_key\": SecretStr(self.api_key).get_secret_value() if self.api_key else None,\n \"model_name\": self.model_name,\n \"max_tokens\": self.max_tokens or None,\n \"model_kwargs\": self.model_kwargs or {},\n \"base_url\": self.openai_api_base or \"https://api.openai.com/v1\",\n \"seed\": self.seed,\n \"max_retries\": self.max_retries,\n \"timeout\": self.timeout,\n \"temperature\": self.temperature if self.temperature is not None else 0.1,\n }\n\n logger.info(f\"Model name: {self.model_name}\")\n if self.model_name in OPENAI_REASONING_MODEL_NAMES:\n logger.info(\"Getting reasoning model parameters\")\n parameters.pop(\"temperature\")\n parameters.pop(\"seed\")\n output = ChatOpenAI(**parameters)\n if self.json_mode:\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\n def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:\n if field_name in {\"base_url\", \"model_name\", \"api_key\"} and field_value in OPENAI_REASONING_MODEL_NAMES:\n build_config[\"temperature\"][\"show\"] = False\n build_config[\"seed\"][\"show\"] = False\n if field_name in {\"base_url\", \"model_name\", \"api_key\"} and field_value in OPENAI_MODEL_NAMES:\n build_config[\"temperature\"][\"show\"] = True\n build_config[\"seed\"][\"show\"] = True\n return build_config\n" + "value": "from typing import Any\n\nfrom langchain_anthropic import ChatAnthropic\nfrom langchain_google_genai import ChatGoogleGenerativeAI\nfrom langchain_openai import ChatOpenAI\n\nfrom langflow.base.models.anthropic_constants import ANTHROPIC_MODELS\nfrom langflow.base.models.google_generative_ai_constants import GOOGLE_GENERATIVE_AI_MODELS\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.inputs import BoolInput\nfrom langflow.io import DropdownInput, MessageInput, MultilineInput, SecretStrInput, SliderInput\nfrom langflow.schema.dotdict import dotdict\n\n\nclass LanguageModelComponent(LCModelComponent):\n display_name = \"Language Model\"\n description = \"Runs a language model given a specified provider. \"\n icon = \"brain-circuit\"\n category = \"models\"\n priority = 0 # Set priority to 0 to make it appear first\n\n inputs = [\n DropdownInput(\n name=\"provider\",\n display_name=\"Model Provider\",\n options=[\"OpenAI\", \"Anthropic\", \"Google\"],\n value=\"OpenAI\",\n info=\"Select the model provider\",\n real_time_refresh=True,\n options_metadata=[{\"icon\": \"OpenAI\"}, {\"icon\": \"Anthropic\"}, {\"icon\": \"Google\"}],\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n options=OPENAI_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[0],\n info=\"Select the model to use\",\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"OpenAI API Key\",\n info=\"Model Provider API key\",\n required=False,\n show=True,\n real_time_refresh=True,\n ),\n MessageInput(\n name=\"input_value\",\n display_name=\"Input\",\n info=\"The input text to send to the model\",\n ),\n MultilineInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"A system message that helps set the behavior of the assistant\",\n advanced=True,\n ),\n BoolInput(\n name=\"stream\",\n display_name=\"Stream\",\n info=\"Whether to stream the response\",\n value=False,\n advanced=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n info=\"Controls randomness in responses\",\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n advanced=True,\n ),\n ]\n\n def build_model(self) -> LanguageModel:\n provider = self.provider\n model_name = self.model_name\n temperature = self.temperature\n stream = self.stream\n\n if provider == \"OpenAI\":\n if not self.api_key:\n msg = \"OpenAI API key is required when using OpenAI provider\"\n raise ValueError(msg)\n return ChatOpenAI(\n model_name=model_name,\n temperature=temperature,\n streaming=stream,\n openai_api_key=self.api_key,\n )\n if provider == \"Anthropic\":\n if not self.api_key:\n msg = \"Anthropic API key is required when using Anthropic provider\"\n raise ValueError(msg)\n return ChatAnthropic(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n anthropic_api_key=self.api_key,\n )\n if provider == \"Google\":\n if not self.api_key:\n msg = \"Google API key is required when using Google provider\"\n raise ValueError(msg)\n return ChatGoogleGenerativeAI(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n google_api_key=self.api_key,\n )\n msg = f\"Unknown provider: {provider}\"\n raise ValueError(msg)\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:\n if field_name == \"provider\":\n if field_value == \"OpenAI\":\n build_config[\"model_name\"][\"options\"] = OPENAI_MODEL_NAMES\n build_config[\"model_name\"][\"value\"] = OPENAI_MODEL_NAMES[0]\n build_config[\"api_key\"][\"display_name\"] = \"OpenAI API Key\"\n elif field_value == \"Anthropic\":\n build_config[\"model_name\"][\"options\"] = ANTHROPIC_MODELS\n build_config[\"model_name\"][\"value\"] = ANTHROPIC_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Anthropic API Key\"\n elif field_value == \"Google\":\n build_config[\"model_name\"][\"options\"] = GOOGLE_GENERATIVE_AI_MODELS\n build_config[\"model_name\"][\"value\"] = GOOGLE_GENERATIVE_AI_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Google API Key\"\n return build_config\n" }, "input_value": { "_input_type": "MessageInput", "advanced": false, "display_name": "Input", "dynamic": false, - "info": "", + "info": "The input text to send to the model", "input_types": [ "Message" ], @@ -1884,92 +1796,14 @@ "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, - "list_add_label": "Add More", - "name": "json_mode", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "bool", - "value": false - }, - "max_retries": { - "_input_type": "IntInput", - "advanced": true, - "display_name": "Max Retries", - "dynamic": false, - "info": "The maximum number of retries to make when generating.", - "list": false, - "list_add_label": "Add More", - "name": "max_retries", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 5 - }, - "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, - "list_add_label": "Add More", - "name": "max_tokens", - "placeholder": "", - "range_spec": { - "max": 128000, - "min": 0, - "step": 0.1, - "step_type": "float" - }, - "required": false, - "show": true, - "title_case": false, - "tool_mode": 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, - "list_add_label": "Add More", - "name": "model_kwargs", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_input": true, - "type": "dict", - "value": {} - }, "model_name": { "_input_type": "DropdownInput", "advanced": false, - "combobox": true, + "combobox": false, "dialog_inputs": {}, "display_name": "Model Name", "dynamic": false, - "info": "", + "info": "Select the model to use", "name": "model_name", "options": [ "gpt-4o-mini", @@ -1981,62 +1815,61 @@ "gpt-4-turbo", "gpt-4-turbo-preview", "gpt-4", - "gpt-3.5-turbo", - "o1" + "gpt-3.5-turbo" ], "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", - "value": "gpt-4.1-mini" + "value": "gpt-4o-mini" }, - "openai_api_base": { - "_input_type": "StrInput", - "advanced": true, - "display_name": "OpenAI API Base", + "provider": { + "_input_type": "DropdownInput", + "advanced": false, + "combobox": false, + "dialog_inputs": {}, + "display_name": "Model Provider", "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, - "list_add_label": "Add More", - "load_from_db": false, - "name": "openai_api_base", + "info": "Select the model provider", + "name": "provider", + "options": [ + "OpenAI", + "Anthropic", + "Google" + ], + "options_metadata": [ + { + "icon": "OpenAI" + }, + { + "icon": "Anthropic" + }, + { + "icon": "Google" + } + ], "placeholder": "", + "real_time_refresh": true, "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", - "value": "" - }, - "seed": { - "_input_type": "IntInput", - "advanced": true, - "display_name": "Seed", - "dynamic": false, - "info": "The seed controls the reproducibility of the job.", - "list": false, - "list_add_label": "Add More", - "name": "seed", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 1 + "value": "OpenAI" }, "stream": { "_input_type": "BoolInput", "advanced": true, "display_name": "Stream", "dynamic": false, - "info": "Stream the response from the model. Streaming works only in Chat.", + "info": "Whether to stream the response", "list": false, "list_add_label": "Add More", "name": "stream", @@ -2051,10 +1884,11 @@ }, "system_message": { "_input_type": "MultilineInput", - "advanced": false, + "advanced": true, + "copy_field": false, "display_name": "System Message", "dynamic": false, - "info": "System message to pass to the model.", + "info": "A system message that helps set the behavior of the assistant", "input_types": [ "Message" ], @@ -2075,10 +1909,10 @@ }, "temperature": { "_input_type": "SliderInput", - "advanced": false, + "advanced": true, "display_name": "Temperature", "dynamic": false, - "info": "", + "info": "Controls randomness in responses", "max_label": "", "max_label_icon": "", "min_label": "", @@ -2100,188 +1934,118 @@ "tool_mode": false, "type": "slider", "value": 0.1 - }, - "timeout": { - "_input_type": "IntInput", - "advanced": true, - "display_name": "Timeout", - "dynamic": false, - "info": "The timeout for requests to OpenAI completion API.", - "list": false, - "list_add_label": "Add More", - "name": "timeout", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 700 } }, "tool_mode": false }, "showNode": true, - "type": "OpenAIModel", - "selected_output": "text_output" + "type": "LanguageModelComponent" }, "dragging": false, - "id": "OpenAIModel-Hl8vG", + "id": "LanguageModelComponent-oBZy3", "measured": { - "height": 525, + "height": 451, "width": 320 }, "position": { - "x": -1297.2469651919287, - "y": 254.12590003703684 + "x": -1319.462305610481, + "y": 976.7543982544241 }, "selected": false, "type": "genericNode" }, { "data": { - "id": "note-D3g3A", - "node": { - "description": "# Sentiment Analysis Flow \n\nThis flow processes text data, analyzes sentiment, and provides structured insights. \n\n## Prerequisite\n\n* [OpenAI API key](https://platform.openai.com/docs/)\n\n## Quickstart\n\n1. Add your [OpenAI API key](https://platform.openai.com/docs/) to the OpenAI model components.\n2. In the **File Component**, load text data in `.txt`, `.csv`, or `.json` formats.\n3. Open the **Playground** to see the analysis and recommendation the flow constructs.\n\n## How It Works \n\n1. The **Data to Message** component converts raw data into structured messages. \n\n2. The **NLP expert** prompt provides sentiment analysis, while the **Analyzing messages** prompt summarizes messages from a discussion board.\n\n3. The final **Prompt Component** creates a structured recommendation prompt to ensure that the AI model receives well-formatted input. \n\n4. The **OpenAI Model Component** processes the text and classifies the sentiment as **Positive, Neutral, or Negative**. \n\n", - "display_name": "", - "documentation": "", - "template": {} - }, - "type": "note" - }, - "dragging": false, - "height": 574, - "id": "note-D3g3A", - "measured": { - "height": 574, - "width": 413 - }, - "position": { - "x": -2891.3528304066394, - "y": 384.370168260918 - }, - "resizing": false, - "selected": false, - "type": "noteNode", - "width": 412 - }, - { - "data": { - "id": "ChatOutput-NS8z5", + "id": "LanguageModelComponent-k9uIC", "node": { "base_classes": [ + "LanguageModel", "Message" ], "beta": false, + "category": "models", "conditional_paths": [], "custom_fields": {}, - "description": "Display a chat message in the Playground.", - "display_name": "Chat Output", + "description": "Runs a language model given a specified provider. ", + "display_name": "Language Model", "documentation": "", "edited": false, "field_order": [ + "provider", + "model_name", + "api_key", "input_value", - "should_store_message", - "sender", - "sender_name", - "session_id", - "data_template", - "background_color", - "chat_icon", - "text_color", - "clean_data" + "system_message", + "stream", + "temperature" ], "frozen": false, - "icon": "MessagesSquare", + "icon": "brain-circuit", + "key": "LanguageModelComponent", "legacy": false, - "lf_version": "1.2.0", - "metadata": {}, - "minimized": true, + "metadata": { + "keywords": [ + "model", + "llm", + "language model", + "large language model" + ] + }, + "minimized": false, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, - "display_name": "Output Message", + "display_name": "Model Response", "group_outputs": false, - "method": "message_response", - "name": "message", + "method": "text_response", + "name": "text_output", "selected": "Message", "tool_mode": true, "types": [ "Message" ], "value": "__UNDEFINED__" + }, + { + "allows_loop": false, + "cache": true, + "display_name": "Language Model", + "group_outputs": false, + "method": "build_model", + "name": "model_output", + "selected": "LanguageModel", + "tool_mode": true, + "types": [ + "LanguageModel" + ], + "value": "__UNDEFINED__" } ], "pinned": false, + "priority": 0, + "score": 0.28173906304863156, "template": { "_type": "Component", - "background_color": { - "_input_type": "MessageTextInput", - "advanced": true, - "display_name": "Background Color", + "api_key": { + "_input_type": "SecretStrInput", + "advanced": false, + "display_name": "OpenAI API Key", "dynamic": false, - "info": "The background color of the icon.", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", + "info": "Model Provider API key", + "input_types": [], "load_from_db": false, - "name": "background_color", + "name": "api_key", + "password": true, "placeholder": "", + "real_time_refresh": true, "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, - "list_add_label": "Add More", - "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": "" - }, - "clean_data": { - "_input_type": "BoolInput", - "advanced": true, - "display_name": "Basic Clean Data", - "dynamic": false, - "info": "Whether to clean the data", - "list": false, - "list_add_label": "Add More", - "name": "clean_data", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "bool", - "value": true - }, "code": { "advanced": true, "dynamic": true, @@ -2298,21 +2062,21 @@ "show": true, "title_case": false, "type": "code", - "value": "from collections.abc import Generator\nfrom typing import Any\n\nimport orjson\nfrom fastapi.encoders import jsonable_encoder\n\nfrom langflow.base.io.chat import ChatComponent\nfrom langflow.helpers.data import safe_convert\nfrom langflow.inputs.inputs import BoolInput, DropdownInput, HandleInput, MessageTextInput\nfrom langflow.schema.data import Data\nfrom langflow.schema.dataframe import DataFrame\nfrom langflow.schema.message import Message\nfrom langflow.schema.properties import Source\nfrom langflow.template.field.base import Output\nfrom langflow.utils.constants import (\n MESSAGE_SENDER_AI,\n MESSAGE_SENDER_NAME_AI,\n MESSAGE_SENDER_USER,\n)\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 minimized = True\n\n inputs = [\n HandleInput(\n name=\"input_value\",\n display_name=\"Inputs\",\n info=\"Message to be passed as output.\",\n input_types=[\"Data\", \"DataFrame\", \"Message\"],\n required=True,\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 BoolInput(\n name=\"clean_data\",\n display_name=\"Basic Clean Data\",\n value=True,\n info=\"Whether to clean the data\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(\n display_name=\"Output 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 # Handle case where source is a ChatOpenAI object\n if hasattr(source, \"model_name\"):\n source_dict[\"source\"] = source.model_name\n elif hasattr(source, \"model\"):\n source_dict[\"source\"] = str(source.model)\n else:\n source_dict[\"source\"] = str(source)\n return Source(**source_dict)\n\n async def message_response(self) -> Message:\n # First convert the input to string if needed\n text = self.convert_to_string()\n\n # Get source properties\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\n # Create or use existing Message object\n if isinstance(self.input_value, Message):\n message = self.input_value\n # Update message properties\n message.text = text\n else:\n message = Message(text=text)\n\n # Set message properties\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\n # Store message if needed\n if self.session_id and self.should_store_message:\n stored_message = await self.send_message(message)\n self.message.value = stored_message\n message = stored_message\n\n self.status = message\n return message\n\n def _serialize_data(self, data: Data) -> str:\n \"\"\"Serialize Data object to JSON string.\"\"\"\n # Convert data.data to JSON-serializable format\n serializable_data = jsonable_encoder(data.data)\n # Serialize with orjson, enabling pretty printing with indentation\n json_bytes = orjson.dumps(serializable_data, option=orjson.OPT_INDENT_2)\n # Convert bytes to string and wrap in Markdown code blocks\n return \"```json\\n\" + json_bytes.decode(\"utf-8\") + \"\\n```\"\n\n def _validate_input(self) -> None:\n \"\"\"Validate the input data and raise ValueError if invalid.\"\"\"\n if self.input_value is None:\n msg = \"Input data cannot be None\"\n raise ValueError(msg)\n if isinstance(self.input_value, list) and not all(\n isinstance(item, Message | Data | DataFrame | str) for item in self.input_value\n ):\n invalid_types = [\n type(item).__name__\n for item in self.input_value\n if not isinstance(item, Message | Data | DataFrame | str)\n ]\n msg = f\"Expected Data or DataFrame or Message or str, got {invalid_types}\"\n raise TypeError(msg)\n if not isinstance(\n self.input_value,\n Message | Data | DataFrame | str | list | Generator | type(None),\n ):\n type_name = type(self.input_value).__name__\n msg = f\"Expected Data or DataFrame or Message or str, Generator or None, got {type_name}\"\n raise TypeError(msg)\n\n def convert_to_string(self) -> str | Generator[Any, None, None]:\n \"\"\"Convert input data to string with proper error handling.\"\"\"\n self._validate_input()\n if isinstance(self.input_value, list):\n return \"\\n\".join([safe_convert(item, clean_data=self.clean_data) for item in self.input_value])\n if isinstance(self.input_value, Generator):\n return self.input_value\n return safe_convert(self.input_value)\n" + "value": "from typing import Any\n\nfrom langchain_anthropic import ChatAnthropic\nfrom langchain_google_genai import ChatGoogleGenerativeAI\nfrom langchain_openai import ChatOpenAI\n\nfrom langflow.base.models.anthropic_constants import ANTHROPIC_MODELS\nfrom langflow.base.models.google_generative_ai_constants import GOOGLE_GENERATIVE_AI_MODELS\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.inputs import BoolInput\nfrom langflow.io import DropdownInput, MessageInput, MultilineInput, SecretStrInput, SliderInput\nfrom langflow.schema.dotdict import dotdict\n\n\nclass LanguageModelComponent(LCModelComponent):\n display_name = \"Language Model\"\n description = \"Runs a language model given a specified provider. \"\n icon = \"brain-circuit\"\n category = \"models\"\n priority = 0 # Set priority to 0 to make it appear first\n\n inputs = [\n DropdownInput(\n name=\"provider\",\n display_name=\"Model Provider\",\n options=[\"OpenAI\", \"Anthropic\", \"Google\"],\n value=\"OpenAI\",\n info=\"Select the model provider\",\n real_time_refresh=True,\n options_metadata=[{\"icon\": \"OpenAI\"}, {\"icon\": \"Anthropic\"}, {\"icon\": \"Google\"}],\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n options=OPENAI_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[0],\n info=\"Select the model to use\",\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"OpenAI API Key\",\n info=\"Model Provider API key\",\n required=False,\n show=True,\n real_time_refresh=True,\n ),\n MessageInput(\n name=\"input_value\",\n display_name=\"Input\",\n info=\"The input text to send to the model\",\n ),\n MultilineInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"A system message that helps set the behavior of the assistant\",\n advanced=True,\n ),\n BoolInput(\n name=\"stream\",\n display_name=\"Stream\",\n info=\"Whether to stream the response\",\n value=False,\n advanced=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n info=\"Controls randomness in responses\",\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n advanced=True,\n ),\n ]\n\n def build_model(self) -> LanguageModel:\n provider = self.provider\n model_name = self.model_name\n temperature = self.temperature\n stream = self.stream\n\n if provider == \"OpenAI\":\n if not self.api_key:\n msg = \"OpenAI API key is required when using OpenAI provider\"\n raise ValueError(msg)\n return ChatOpenAI(\n model_name=model_name,\n temperature=temperature,\n streaming=stream,\n openai_api_key=self.api_key,\n )\n if provider == \"Anthropic\":\n if not self.api_key:\n msg = \"Anthropic API key is required when using Anthropic provider\"\n raise ValueError(msg)\n return ChatAnthropic(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n anthropic_api_key=self.api_key,\n )\n if provider == \"Google\":\n if not self.api_key:\n msg = \"Google API key is required when using Google provider\"\n raise ValueError(msg)\n return ChatGoogleGenerativeAI(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n google_api_key=self.api_key,\n )\n msg = f\"Unknown provider: {provider}\"\n raise ValueError(msg)\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:\n if field_name == \"provider\":\n if field_value == \"OpenAI\":\n build_config[\"model_name\"][\"options\"] = OPENAI_MODEL_NAMES\n build_config[\"model_name\"][\"value\"] = OPENAI_MODEL_NAMES[0]\n build_config[\"api_key\"][\"display_name\"] = \"OpenAI API Key\"\n elif field_value == \"Anthropic\":\n build_config[\"model_name\"][\"options\"] = ANTHROPIC_MODELS\n build_config[\"model_name\"][\"value\"] = ANTHROPIC_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Anthropic API Key\"\n elif field_value == \"Google\":\n build_config[\"model_name\"][\"options\"] = GOOGLE_GENERATIVE_AI_MODELS\n build_config[\"model_name\"][\"value\"] = GOOGLE_GENERATIVE_AI_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Google API Key\"\n return build_config\n" }, - "data_template": { - "_input_type": "MessageTextInput", - "advanced": true, - "display_name": "Data Template", + "input_value": { + "_input_type": "MessageInput", + "advanced": false, + "display_name": "Input", "dynamic": false, - "info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.", + "info": "The input text to send to the model", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, - "name": "data_template", + "name": "input_value", "placeholder": "", "required": false, "show": true, @@ -2321,108 +2085,85 @@ "trace_as_input": true, "trace_as_metadata": true, "type": "str", - "value": "{text}" - }, - "input_value": { - "_input_type": "HandleInput", - "advanced": false, - "display_name": "Inputs", - "dynamic": false, - "info": "Message to be passed as output.", - "input_types": [ - "Data", - "DataFrame", - "Message" - ], - "list": false, - "list_add_label": "Add More", - "name": "input_value", - "placeholder": "", - "required": true, - "show": true, - "title_case": false, - "trace_as_metadata": true, - "type": "other", "value": "" }, - "sender": { + "model_name": { "_input_type": "DropdownInput", - "advanced": true, + "advanced": false, "combobox": false, "dialog_inputs": {}, - "display_name": "Sender Type", + "display_name": "Model Name", "dynamic": false, - "info": "Type of sender.", - "name": "sender", + "info": "Select the model to use", + "name": "model_name", "options": [ - "Machine", - "User" + "gpt-4o-mini", + "gpt-4o", + "gpt-4.1", + "gpt-4.1-mini", + "gpt-4.1-nano", + "gpt-4.5-preview", + "gpt-4-turbo", + "gpt-4-turbo-preview", + "gpt-4", + "gpt-3.5-turbo" ], "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", - "value": "Machine" + "value": "gpt-4o-mini" }, - "sender_name": { - "_input_type": "MessageTextInput", - "advanced": true, - "display_name": "Sender Name", + "provider": { + "_input_type": "DropdownInput", + "advanced": false, + "combobox": false, + "dialog_inputs": {}, + "display_name": "Model Provider", "dynamic": false, - "info": "Name of the sender.", - "input_types": [ - "Message" + "info": "Select the model provider", + "name": "provider", + "options": [ + "OpenAI", + "Anthropic", + "Google" + ], + "options_metadata": [ + { + "icon": "OpenAI" + }, + { + "icon": "Anthropic" + }, + { + "icon": "Google" + } ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "name": "sender_name", "placeholder": "", + "real_time_refresh": true, "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, - "trace_as_input": true, "trace_as_metadata": true, "type": "str", - "value": "AI" + "value": "OpenAI" }, - "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, - "list_add_label": "Add More", - "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": { + "stream": { "_input_type": "BoolInput", "advanced": true, - "display_name": "Store Messages", + "display_name": "Stream", "dynamic": false, - "info": "Store the message in the history.", + "info": "Whether to stream the response", "list": false, "list_add_label": "Add More", - "name": "should_store_message", + "name": "stream", "placeholder": "", "required": false, "show": true, @@ -2430,21 +2171,23 @@ "tool_mode": false, "trace_as_metadata": true, "type": "bool", - "value": true + "value": false }, - "text_color": { - "_input_type": "MessageTextInput", + "system_message": { + "_input_type": "MultilineInput", "advanced": true, - "display_name": "Text Color", + "copy_field": false, + "display_name": "System Message", "dynamic": false, - "info": "The text color of the name", + "info": "A system message that helps set the behavior of the assistant", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, - "name": "text_color", + "multiline": true, + "name": "system_message", "placeholder": "", "required": false, "show": true, @@ -2454,142 +2197,146 @@ "trace_as_metadata": true, "type": "str", "value": "" + }, + "temperature": { + "_input_type": "SliderInput", + "advanced": true, + "display_name": "Temperature", + "dynamic": false, + "info": "Controls randomness in responses", + "max_label": "", + "max_label_icon": "", + "min_label": "", + "min_label_icon": "", + "name": "temperature", + "placeholder": "", + "range_spec": { + "max": 1, + "min": 0, + "step": 0.01, + "step_type": "float" + }, + "required": false, + "show": true, + "slider_buttons": false, + "slider_buttons_options": [], + "slider_input": false, + "title_case": false, + "tool_mode": false, + "type": "slider", + "value": 0.1 } }, "tool_mode": false }, "showNode": true, - "type": "ChatOutput" + "type": "LanguageModelComponent" }, "dragging": false, - "id": "ChatOutput-NS8z5", + "id": "LanguageModelComponent-k9uIC", "measured": { - "height": 192, + "height": 451, "width": 320 }, "position": { - "x": -957.5187396354046, - "y": 574.7669946378641 + "x": -610.7115573962577, + "y": 1009.6862512017519 }, "selected": false, "type": "genericNode" }, { "data": { - "id": "ChatOutput-GzAXT", + "id": "LanguageModelComponent-e7Tpe", "node": { "base_classes": [ + "LanguageModel", "Message" ], "beta": false, + "category": "models", "conditional_paths": [], "custom_fields": {}, - "description": "Display a chat message in the Playground.", - "display_name": "Chat Output", + "description": "Runs a language model given a specified provider. ", + "display_name": "Language Model", "documentation": "", "edited": false, "field_order": [ + "provider", + "model_name", + "api_key", "input_value", - "should_store_message", - "sender", - "sender_name", - "session_id", - "data_template", - "background_color", - "chat_icon", - "text_color", - "clean_data" + "system_message", + "stream", + "temperature" ], "frozen": false, - "icon": "MessagesSquare", + "icon": "brain-circuit", + "key": "LanguageModelComponent", "legacy": false, - "lf_version": "1.2.0", - "metadata": {}, - "minimized": true, + "metadata": { + "keywords": [ + "model", + "llm", + "language model", + "large language model" + ] + }, + "minimized": false, "output_types": [], "outputs": [ { "allows_loop": false, "cache": true, - "display_name": "Output Message", + "display_name": "Model Response", "group_outputs": false, - "method": "message_response", - "name": "message", + "method": "text_response", + "name": "text_output", "selected": "Message", "tool_mode": true, "types": [ "Message" ], "value": "__UNDEFINED__" + }, + { + "allows_loop": false, + "cache": true, + "display_name": "Language Model", + "group_outputs": false, + "method": "build_model", + "name": "model_output", + "selected": "LanguageModel", + "tool_mode": true, + "types": [ + "LanguageModel" + ], + "value": "__UNDEFINED__" } ], "pinned": false, + "priority": 0, + "score": 0.28173906304863156, "template": { "_type": "Component", - "background_color": { - "_input_type": "MessageTextInput", - "advanced": true, - "display_name": "Background Color", + "api_key": { + "_input_type": "SecretStrInput", + "advanced": false, + "display_name": "OpenAI API Key", "dynamic": false, - "info": "The background color of the icon.", - "input_types": [ - "Message" - ], - "list": false, - "list_add_label": "Add More", + "info": "Model Provider API key", + "input_types": [], "load_from_db": false, - "name": "background_color", + "name": "api_key", + "password": true, "placeholder": "", + "real_time_refresh": true, "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, - "list_add_label": "Add More", - "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": "" - }, - "clean_data": { - "_input_type": "BoolInput", - "advanced": true, - "display_name": "Basic Clean Data", - "dynamic": false, - "info": "Whether to clean the data", - "list": false, - "list_add_label": "Add More", - "name": "clean_data", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "bool", - "value": true - }, "code": { "advanced": true, "dynamic": true, @@ -2606,21 +2353,21 @@ "show": true, "title_case": false, "type": "code", - "value": "from collections.abc import Generator\nfrom typing import Any\n\nimport orjson\nfrom fastapi.encoders import jsonable_encoder\n\nfrom langflow.base.io.chat import ChatComponent\nfrom langflow.helpers.data import safe_convert\nfrom langflow.inputs.inputs import BoolInput, DropdownInput, HandleInput, MessageTextInput\nfrom langflow.schema.data import Data\nfrom langflow.schema.dataframe import DataFrame\nfrom langflow.schema.message import Message\nfrom langflow.schema.properties import Source\nfrom langflow.template.field.base import Output\nfrom langflow.utils.constants import (\n MESSAGE_SENDER_AI,\n MESSAGE_SENDER_NAME_AI,\n MESSAGE_SENDER_USER,\n)\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 minimized = True\n\n inputs = [\n HandleInput(\n name=\"input_value\",\n display_name=\"Inputs\",\n info=\"Message to be passed as output.\",\n input_types=[\"Data\", \"DataFrame\", \"Message\"],\n required=True,\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 BoolInput(\n name=\"clean_data\",\n display_name=\"Basic Clean Data\",\n value=True,\n info=\"Whether to clean the data\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(\n display_name=\"Output 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 # Handle case where source is a ChatOpenAI object\n if hasattr(source, \"model_name\"):\n source_dict[\"source\"] = source.model_name\n elif hasattr(source, \"model\"):\n source_dict[\"source\"] = str(source.model)\n else:\n source_dict[\"source\"] = str(source)\n return Source(**source_dict)\n\n async def message_response(self) -> Message:\n # First convert the input to string if needed\n text = self.convert_to_string()\n\n # Get source properties\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\n # Create or use existing Message object\n if isinstance(self.input_value, Message):\n message = self.input_value\n # Update message properties\n message.text = text\n else:\n message = Message(text=text)\n\n # Set message properties\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\n # Store message if needed\n if self.session_id and self.should_store_message:\n stored_message = await self.send_message(message)\n self.message.value = stored_message\n message = stored_message\n\n self.status = message\n return message\n\n def _serialize_data(self, data: Data) -> str:\n \"\"\"Serialize Data object to JSON string.\"\"\"\n # Convert data.data to JSON-serializable format\n serializable_data = jsonable_encoder(data.data)\n # Serialize with orjson, enabling pretty printing with indentation\n json_bytes = orjson.dumps(serializable_data, option=orjson.OPT_INDENT_2)\n # Convert bytes to string and wrap in Markdown code blocks\n return \"```json\\n\" + json_bytes.decode(\"utf-8\") + \"\\n```\"\n\n def _validate_input(self) -> None:\n \"\"\"Validate the input data and raise ValueError if invalid.\"\"\"\n if self.input_value is None:\n msg = \"Input data cannot be None\"\n raise ValueError(msg)\n if isinstance(self.input_value, list) and not all(\n isinstance(item, Message | Data | DataFrame | str) for item in self.input_value\n ):\n invalid_types = [\n type(item).__name__\n for item in self.input_value\n if not isinstance(item, Message | Data | DataFrame | str)\n ]\n msg = f\"Expected Data or DataFrame or Message or str, got {invalid_types}\"\n raise TypeError(msg)\n if not isinstance(\n self.input_value,\n Message | Data | DataFrame | str | list | Generator | type(None),\n ):\n type_name = type(self.input_value).__name__\n msg = f\"Expected Data or DataFrame or Message or str, Generator or None, got {type_name}\"\n raise TypeError(msg)\n\n def convert_to_string(self) -> str | Generator[Any, None, None]:\n \"\"\"Convert input data to string with proper error handling.\"\"\"\n self._validate_input()\n if isinstance(self.input_value, list):\n return \"\\n\".join([safe_convert(item, clean_data=self.clean_data) for item in self.input_value])\n if isinstance(self.input_value, Generator):\n return self.input_value\n return safe_convert(self.input_value)\n" + "value": "from typing import Any\n\nfrom langchain_anthropic import ChatAnthropic\nfrom langchain_google_genai import ChatGoogleGenerativeAI\nfrom langchain_openai import ChatOpenAI\n\nfrom langflow.base.models.anthropic_constants import ANTHROPIC_MODELS\nfrom langflow.base.models.google_generative_ai_constants import GOOGLE_GENERATIVE_AI_MODELS\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.inputs import BoolInput\nfrom langflow.io import DropdownInput, MessageInput, MultilineInput, SecretStrInput, SliderInput\nfrom langflow.schema.dotdict import dotdict\n\n\nclass LanguageModelComponent(LCModelComponent):\n display_name = \"Language Model\"\n description = \"Runs a language model given a specified provider. \"\n icon = \"brain-circuit\"\n category = \"models\"\n priority = 0 # Set priority to 0 to make it appear first\n\n inputs = [\n DropdownInput(\n name=\"provider\",\n display_name=\"Model Provider\",\n options=[\"OpenAI\", \"Anthropic\", \"Google\"],\n value=\"OpenAI\",\n info=\"Select the model provider\",\n real_time_refresh=True,\n options_metadata=[{\"icon\": \"OpenAI\"}, {\"icon\": \"Anthropic\"}, {\"icon\": \"Google\"}],\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n options=OPENAI_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[0],\n info=\"Select the model to use\",\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"OpenAI API Key\",\n info=\"Model Provider API key\",\n required=False,\n show=True,\n real_time_refresh=True,\n ),\n MessageInput(\n name=\"input_value\",\n display_name=\"Input\",\n info=\"The input text to send to the model\",\n ),\n MultilineInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"A system message that helps set the behavior of the assistant\",\n advanced=True,\n ),\n BoolInput(\n name=\"stream\",\n display_name=\"Stream\",\n info=\"Whether to stream the response\",\n value=False,\n advanced=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n info=\"Controls randomness in responses\",\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n advanced=True,\n ),\n ]\n\n def build_model(self) -> LanguageModel:\n provider = self.provider\n model_name = self.model_name\n temperature = self.temperature\n stream = self.stream\n\n if provider == \"OpenAI\":\n if not self.api_key:\n msg = \"OpenAI API key is required when using OpenAI provider\"\n raise ValueError(msg)\n return ChatOpenAI(\n model_name=model_name,\n temperature=temperature,\n streaming=stream,\n openai_api_key=self.api_key,\n )\n if provider == \"Anthropic\":\n if not self.api_key:\n msg = \"Anthropic API key is required when using Anthropic provider\"\n raise ValueError(msg)\n return ChatAnthropic(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n anthropic_api_key=self.api_key,\n )\n if provider == \"Google\":\n if not self.api_key:\n msg = \"Google API key is required when using Google provider\"\n raise ValueError(msg)\n return ChatGoogleGenerativeAI(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n google_api_key=self.api_key,\n )\n msg = f\"Unknown provider: {provider}\"\n raise ValueError(msg)\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:\n if field_name == \"provider\":\n if field_value == \"OpenAI\":\n build_config[\"model_name\"][\"options\"] = OPENAI_MODEL_NAMES\n build_config[\"model_name\"][\"value\"] = OPENAI_MODEL_NAMES[0]\n build_config[\"api_key\"][\"display_name\"] = \"OpenAI API Key\"\n elif field_value == \"Anthropic\":\n build_config[\"model_name\"][\"options\"] = ANTHROPIC_MODELS\n build_config[\"model_name\"][\"value\"] = ANTHROPIC_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Anthropic API Key\"\n elif field_value == \"Google\":\n build_config[\"model_name\"][\"options\"] = GOOGLE_GENERATIVE_AI_MODELS\n build_config[\"model_name\"][\"value\"] = GOOGLE_GENERATIVE_AI_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Google API Key\"\n return build_config\n" }, - "data_template": { - "_input_type": "MessageTextInput", - "advanced": true, - "display_name": "Data Template", + "input_value": { + "_input_type": "MessageInput", + "advanced": false, + "display_name": "Input", "dynamic": false, - "info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.", + "info": "The input text to send to the model", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, - "name": "data_template", + "name": "input_value", "placeholder": "", "required": false, "show": true, @@ -2629,108 +2376,85 @@ "trace_as_input": true, "trace_as_metadata": true, "type": "str", - "value": "{text}" - }, - "input_value": { - "_input_type": "HandleInput", - "advanced": false, - "display_name": "Inputs", - "dynamic": false, - "info": "Message to be passed as output.", - "input_types": [ - "Data", - "DataFrame", - "Message" - ], - "list": false, - "list_add_label": "Add More", - "name": "input_value", - "placeholder": "", - "required": true, - "show": true, - "title_case": false, - "trace_as_metadata": true, - "type": "other", "value": "" }, - "sender": { + "model_name": { "_input_type": "DropdownInput", - "advanced": true, + "advanced": false, "combobox": false, "dialog_inputs": {}, - "display_name": "Sender Type", + "display_name": "Model Name", "dynamic": false, - "info": "Type of sender.", - "name": "sender", + "info": "Select the model to use", + "name": "model_name", "options": [ - "Machine", - "User" + "gpt-4o-mini", + "gpt-4o", + "gpt-4.1", + "gpt-4.1-mini", + "gpt-4.1-nano", + "gpt-4.5-preview", + "gpt-4-turbo", + "gpt-4-turbo-preview", + "gpt-4", + "gpt-3.5-turbo" ], "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", - "value": "Machine" + "value": "gpt-4o-mini" }, - "sender_name": { - "_input_type": "MessageTextInput", - "advanced": true, - "display_name": "Sender Name", + "provider": { + "_input_type": "DropdownInput", + "advanced": false, + "combobox": false, + "dialog_inputs": {}, + "display_name": "Model Provider", "dynamic": false, - "info": "Name of the sender.", - "input_types": [ - "Message" + "info": "Select the model provider", + "name": "provider", + "options": [ + "OpenAI", + "Anthropic", + "Google" + ], + "options_metadata": [ + { + "icon": "OpenAI" + }, + { + "icon": "Anthropic" + }, + { + "icon": "Google" + } ], - "list": false, - "list_add_label": "Add More", - "load_from_db": false, - "name": "sender_name", "placeholder": "", + "real_time_refresh": true, "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, - "trace_as_input": true, "trace_as_metadata": true, "type": "str", - "value": "AI" + "value": "OpenAI" }, - "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, - "list_add_label": "Add More", - "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": { + "stream": { "_input_type": "BoolInput", "advanced": true, - "display_name": "Store Messages", + "display_name": "Stream", "dynamic": false, - "info": "Store the message in the history.", + "info": "Whether to stream the response", "list": false, "list_add_label": "Add More", - "name": "should_store_message", + "name": "stream", "placeholder": "", "required": false, "show": true, @@ -2738,21 +2462,23 @@ "tool_mode": false, "trace_as_metadata": true, "type": "bool", - "value": true + "value": false }, - "text_color": { - "_input_type": "MessageTextInput", - "advanced": true, - "display_name": "Text Color", + "system_message": { + "_input_type": "MultilineInput", + "advanced": false, + "copy_field": false, + "display_name": "System Message", "dynamic": false, - "info": "The text color of the name", + "info": "A system message that helps set the behavior of the assistant", "input_types": [ "Message" ], "list": false, "list_add_label": "Add More", "load_from_db": false, - "name": "text_color", + "multiline": true, + "name": "system_message", "placeholder": "", "required": false, "show": true, @@ -2762,119 +2488,66 @@ "trace_as_metadata": true, "type": "str", "value": "" + }, + "temperature": { + "_input_type": "SliderInput", + "advanced": true, + "display_name": "Temperature", + "dynamic": false, + "info": "Controls randomness in responses", + "max_label": "", + "max_label_icon": "", + "min_label": "", + "min_label_icon": "", + "name": "temperature", + "placeholder": "", + "range_spec": { + "max": 1, + "min": 0, + "step": 0.01, + "step_type": "float" + }, + "required": false, + "show": true, + "slider_buttons": false, + "slider_buttons_options": [], + "slider_input": false, + "title_case": false, + "tool_mode": false, + "type": "slider", + "value": 0.1 } }, "tool_mode": false }, "showNode": true, - "type": "ChatOutput" + "type": "LanguageModelComponent" }, "dragging": false, - "id": "ChatOutput-GzAXT", + "id": "LanguageModelComponent-e7Tpe", "measured": { - "height": 192, + "height": 534, "width": 320 }, "position": { - "x": -278.71239101147415, - "y": 1127.8168564025477 + "x": -1273.6440754228947, + "y": 303.799142374253 }, "selected": false, "type": "genericNode" - }, - { - "data": { - "id": "note-Sg6zZ", - "node": { - "description": "### 💡 Add your OpenAI API key here 👇", - "display_name": "", - "documentation": "", - "template": { - "backgroundColor": "transparent" - } - }, - "type": "note" - }, - "dragging": false, - "height": 326, - "id": "note-Sg6zZ", - "measured": { - "height": 326, - "width": 352 - }, - "position": { - "x": -1296.8149861584823, - "y": 204.32200781235414 - }, - "resizing": false, - "selected": false, - "type": "noteNode", - "width": 353 - }, - { - "data": { - "id": "note-oCG60", - "node": { - "description": "### 💡 Add your OpenAI API key here 👇", - "display_name": "", - "documentation": "", - "template": { - "backgroundColor": "transparent" - } - }, - "type": "note" - }, - "dragging": false, - "id": "note-oCG60", - "measured": { - "height": 324, - "width": 324 - }, - "position": { - "x": -628.2217875041375, - "y": 923.6296541872401 - }, - "selected": false, - "type": "noteNode" - }, - { - "data": { - "id": "note-hEufz", - "node": { - "description": "### 💡 Add your OpenAI API key here 👇", - "display_name": "", - "documentation": "", - "template": { - "backgroundColor": "transparent" - } - }, - "type": "note" - }, - "dragging": false, - "id": "note-hEufz", - "measured": { - "height": 324, - "width": 324 - }, - "position": { - "x": -1309.8036340068625, - "y": 925.6888138443481 - }, - "selected": false, - "type": "noteNode" } ], "viewport": { - "x": 1195.5900912340421, - "y": 170.90395042473165, - "zoom": 0.5503258036709812 + "x": 1080.3151798224526, + "y": 124.02808893189399, + "zoom": 0.5594767841952385 } }, "description": "Load text data from various file formats, process it into structured messages, and analyze sentiment using AI-powered classification.", "endpoint_name": null, - "id": "ee875a1c-3b8a-4500-8a6b-bb5d1534b5de", + "id": "42caf1cb-f860-4ce1-badc-644cf4ba8556", "is_component": false, - "last_tested_version": "1.2.0", + "last_tested_version": "1.4.3", "name": "Text Sentiment Analysis", "tags": [ "classification" diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Twitter Thread Generator.json b/src/backend/base/langflow/initial_setup/starter_projects/Twitter Thread Generator.json index 332017d31..a6393ea0e 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Twitter Thread Generator.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Twitter Thread Generator.json @@ -7,7 +7,7 @@ "data": { "sourceHandle": { "dataType": "TextInput", - "id": "TextInput-eClq5", + "id": "TextInput-i5Z2Y", "name": "text", "output_types": [ "Message" @@ -15,20 +15,19 @@ }, "targetHandle": { "fieldName": "CONTENT_GUIDELINES", - "id": "Prompt-AWZtN", + "id": "Prompt-JXzxV", "inputTypes": [ - "Message", - "Text" + "Message" ], "type": "str" } }, - "id": "reactflow__edge-TextInput-eClq5{œdataTypeœ:œTextInputœ,œidœ:œTextInput-eClq5œ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-AWZtN{œfieldNameœ:œCONTENT_GUIDELINESœ,œidœ:œPrompt-AWZtNœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-TextInput-i5Z2Y{œdataTypeœ:œTextInputœ,œidœ:œTextInput-i5Z2Yœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-JXzxV{œfieldNameœ:œCONTENT_GUIDELINESœ,œidœ:œPrompt-JXzxVœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "TextInput-eClq5", - "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-eClq5œ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-AWZtN", - "targetHandle": "{œfieldNameœ: œCONTENT_GUIDELINESœ, œidœ: œPrompt-AWZtNœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "source": "TextInput-i5Z2Y", + "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-i5Z2Yœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-JXzxV", + "targetHandle": "{œfieldNameœ: œCONTENT_GUIDELINESœ, œidœ: œPrompt-JXzxVœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "animated": false, @@ -36,7 +35,7 @@ "data": { "sourceHandle": { "dataType": "TextInput", - "id": "TextInput-IpoG7", + "id": "TextInput-OAt8o", "name": "text", "output_types": [ "Message" @@ -44,20 +43,19 @@ }, "targetHandle": { "fieldName": "OUTPUT_FORMAT", - "id": "Prompt-AWZtN", + "id": "Prompt-JXzxV", "inputTypes": [ - "Message", - "Text" + "Message" ], "type": "str" } }, - "id": "reactflow__edge-TextInput-IpoG7{œdataTypeœ:œTextInputœ,œidœ:œTextInput-IpoG7œ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-AWZtN{œfieldNameœ:œOUTPUT_FORMATœ,œidœ:œPrompt-AWZtNœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-TextInput-OAt8o{œdataTypeœ:œTextInputœ,œidœ:œTextInput-OAt8oœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-JXzxV{œfieldNameœ:œOUTPUT_FORMATœ,œidœ:œPrompt-JXzxVœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "TextInput-IpoG7", - "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-IpoG7œ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-AWZtN", - "targetHandle": "{œfieldNameœ: œOUTPUT_FORMATœ, œidœ: œPrompt-AWZtNœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "source": "TextInput-OAt8o", + "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-OAt8oœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-JXzxV", + "targetHandle": "{œfieldNameœ: œOUTPUT_FORMATœ, œidœ: œPrompt-JXzxVœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "animated": false, @@ -65,7 +63,7 @@ "data": { "sourceHandle": { "dataType": "TextInput", - "id": "TextInput-npraC", + "id": "TextInput-58oH9", "name": "text", "output_types": [ "Message" @@ -73,20 +71,19 @@ }, "targetHandle": { "fieldName": "OUTPUT_LANGUAGE", - "id": "Prompt-AWZtN", + "id": "Prompt-JXzxV", "inputTypes": [ - "Message", - "Text" + "Message" ], "type": "str" } }, - "id": "reactflow__edge-TextInput-npraC{œdataTypeœ:œTextInputœ,œidœ:œTextInput-npraCœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-AWZtN{œfieldNameœ:œOUTPUT_LANGUAGEœ,œidœ:œPrompt-AWZtNœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-TextInput-58oH9{œdataTypeœ:œTextInputœ,œidœ:œTextInput-58oH9œ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-JXzxV{œfieldNameœ:œOUTPUT_LANGUAGEœ,œidœ:œPrompt-JXzxVœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "TextInput-npraC", - "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-npraCœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-AWZtN", - "targetHandle": "{œfieldNameœ: œOUTPUT_LANGUAGEœ, œidœ: œPrompt-AWZtNœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "source": "TextInput-58oH9", + "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-58oH9œ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-JXzxV", + "targetHandle": "{œfieldNameœ: œOUTPUT_LANGUAGEœ, œidœ: œPrompt-JXzxVœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "animated": false, @@ -94,7 +91,7 @@ "data": { "sourceHandle": { "dataType": "TextInput", - "id": "TextInput-EZaR7", + "id": "TextInput-3nKXg", "name": "text", "output_types": [ "Message" @@ -102,20 +99,19 @@ }, "targetHandle": { "fieldName": "PROFILE_DETAILS", - "id": "Prompt-AWZtN", + "id": "Prompt-JXzxV", "inputTypes": [ - "Message", - "Text" + "Message" ], "type": "str" } }, - "id": "reactflow__edge-TextInput-EZaR7{œdataTypeœ:œTextInputœ,œidœ:œTextInput-EZaR7œ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-AWZtN{œfieldNameœ:œPROFILE_DETAILSœ,œidœ:œPrompt-AWZtNœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-TextInput-3nKXg{œdataTypeœ:œTextInputœ,œidœ:œTextInput-3nKXgœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-JXzxV{œfieldNameœ:œPROFILE_DETAILSœ,œidœ:œPrompt-JXzxVœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "TextInput-EZaR7", - "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-EZaR7œ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-AWZtN", - "targetHandle": "{œfieldNameœ: œPROFILE_DETAILSœ, œidœ: œPrompt-AWZtNœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "source": "TextInput-3nKXg", + "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-3nKXgœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-JXzxV", + "targetHandle": "{œfieldNameœ: œPROFILE_DETAILSœ, œidœ: œPrompt-JXzxVœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "animated": false, @@ -123,7 +119,7 @@ "data": { "sourceHandle": { "dataType": "TextInput", - "id": "TextInput-fKGcs", + "id": "TextInput-MlxGC", "name": "text", "output_types": [ "Message" @@ -131,20 +127,19 @@ }, "targetHandle": { "fieldName": "PROFILE_TYPE", - "id": "Prompt-AWZtN", + "id": "Prompt-JXzxV", "inputTypes": [ - "Message", - "Text" + "Message" ], "type": "str" } }, - "id": "reactflow__edge-TextInput-fKGcs{œdataTypeœ:œTextInputœ,œidœ:œTextInput-fKGcsœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-AWZtN{œfieldNameœ:œPROFILE_TYPEœ,œidœ:œPrompt-AWZtNœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-TextInput-MlxGC{œdataTypeœ:œTextInputœ,œidœ:œTextInput-MlxGCœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-JXzxV{œfieldNameœ:œPROFILE_TYPEœ,œidœ:œPrompt-JXzxVœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "TextInput-fKGcs", - "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-fKGcsœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-AWZtN", - "targetHandle": "{œfieldNameœ: œPROFILE_TYPEœ, œidœ: œPrompt-AWZtNœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "source": "TextInput-MlxGC", + "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-MlxGCœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-JXzxV", + "targetHandle": "{œfieldNameœ: œPROFILE_TYPEœ, œidœ: œPrompt-JXzxVœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "animated": false, @@ -152,7 +147,7 @@ "data": { "sourceHandle": { "dataType": "TextInput", - "id": "TextInput-92vEK", + "id": "TextInput-rIJMY", "name": "text", "output_types": [ "Message" @@ -160,54 +155,26 @@ }, "targetHandle": { "fieldName": "TONE_AND_STYLE", - "id": "Prompt-AWZtN", - "inputTypes": [ - "Message", - "Text" - ], - "type": "str" - } - }, - "id": "reactflow__edge-TextInput-92vEK{œdataTypeœ:œTextInputœ,œidœ:œTextInput-92vEKœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-AWZtN{œfieldNameœ:œTONE_AND_STYLEœ,œidœ:œPrompt-AWZtNœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", - "selected": false, - "source": "TextInput-92vEK", - "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-92vEKœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-AWZtN", - "targetHandle": "{œfieldNameœ: œTONE_AND_STYLEœ, œidœ: œPrompt-AWZtNœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" - }, - { - "className": "", - "data": { - "sourceHandle": { - "dataType": "ChatInput", - "id": "ChatInput-ECcN8", - "name": "message", - "output_types": [ - "Message" - ] - }, - "targetHandle": { - "fieldName": "input_value", - "id": "OpenAIModel-p0R9m", + "id": "Prompt-JXzxV", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "reactflow__edge-ChatInput-ECcN8{œdataTypeœ:œChatInputœ,œidœ:œChatInput-ECcN8œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-p0R9m{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-p0R9mœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-TextInput-rIJMY{œdataTypeœ:œTextInputœ,œidœ:œTextInput-rIJMYœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-JXzxV{œfieldNameœ:œTONE_AND_STYLEœ,œidœ:œPrompt-JXzxVœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "ChatInput-ECcN8", - "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-ECcN8œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", - "target": "OpenAIModel-p0R9m", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-p0R9mœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "source": "TextInput-rIJMY", + "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-rIJMYœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-JXzxV", + "targetHandle": "{œfieldNameœ: œTONE_AND_STYLEœ, œidœ: œPrompt-JXzxVœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { - "className": "", + "animated": false, "data": { "sourceHandle": { "dataType": "Prompt", - "id": "Prompt-AWZtN", + "id": "Prompt-JXzxV", "name": "prompt", "output_types": [ "Message" @@ -215,26 +182,53 @@ }, "targetHandle": { "fieldName": "system_message", - "id": "OpenAIModel-p0R9m", + "id": "LanguageModelComponent-URKKz", "inputTypes": [ "Message" ], "type": "str" } }, - "id": "reactflow__edge-Prompt-AWZtN{œdataTypeœ:œPromptœ,œidœ:œPrompt-AWZtNœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-p0R9m{œfieldNameœ:œsystem_messageœ,œidœ:œOpenAIModel-p0R9mœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "xy-edge__Prompt-JXzxV{œdataTypeœ:œPromptœ,œidœ:œPrompt-JXzxVœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-LanguageModelComponent-URKKz{œfieldNameœ:œsystem_messageœ,œidœ:œLanguageModelComponent-URKKzœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "Prompt-AWZtN", - "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-AWZtNœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", - "target": "OpenAIModel-p0R9m", - "targetHandle": "{œfieldNameœ: œsystem_messageœ, œidœ: œOpenAIModel-p0R9mœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "source": "Prompt-JXzxV", + "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-JXzxVœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", + "target": "LanguageModelComponent-URKKz", + "targetHandle": "{œfieldNameœ: œsystem_messageœ, œidœ: œLanguageModelComponent-URKKzœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { - "className": "", + "animated": false, "data": { "sourceHandle": { - "dataType": "OpenAIModel", - "id": "OpenAIModel-p0R9m", + "dataType": "ChatInput", + "id": "ChatInput-JpNZb", + "name": "message", + "output_types": [ + "Message" + ] + }, + "targetHandle": { + "fieldName": "input_value", + "id": "LanguageModelComponent-URKKz", + "inputTypes": [ + "Message" + ], + "type": "str" + } + }, + "id": "xy-edge__ChatInput-JpNZb{œdataTypeœ:œChatInputœ,œidœ:œChatInput-JpNZbœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-LanguageModelComponent-URKKz{œfieldNameœ:œinput_valueœ,œidœ:œLanguageModelComponent-URKKzœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "selected": false, + "source": "ChatInput-JpNZb", + "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-JpNZbœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", + "target": "LanguageModelComponent-URKKz", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œLanguageModelComponent-URKKzœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + }, + { + "animated": false, + "data": { + "sourceHandle": { + "dataType": "LanguageModelComponent", + "id": "LanguageModelComponent-URKKz", "name": "text_output", "output_types": [ "Message" @@ -242,27 +236,27 @@ }, "targetHandle": { "fieldName": "input_value", - "id": "ChatOutput-0jDYx", + "id": "ChatOutput-GgTGu", "inputTypes": [ "Data", "DataFrame", "Message" ], - "type": "str" + "type": "other" } }, - "id": "reactflow__edge-OpenAIModel-p0R9m{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-p0R9mœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-0jDYx{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-0jDYxœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "xy-edge__LanguageModelComponent-URKKz{œdataTypeœ:œLanguageModelComponentœ,œidœ:œLanguageModelComponent-URKKzœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-GgTGu{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-GgTGuœ,œinputTypesœ:[œDataœ,œDataFrameœ,œMessageœ],œtypeœ:œotherœ}", "selected": false, - "source": "OpenAIModel-p0R9m", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-p0R9mœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "ChatOutput-0jDYx", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-0jDYxœ, œinputTypesœ: [œDataœ, œDataFrameœ, œMessageœ], œtypeœ: œstrœ}" + "source": "LanguageModelComponent-URKKz", + "sourceHandle": "{œdataTypeœ: œLanguageModelComponentœ, œidœ: œLanguageModelComponent-URKKzœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "ChatOutput-GgTGu", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-GgTGuœ, œinputTypesœ: [œDataœ, œDataFrameœ, œMessageœ], œtypeœ: œotherœ}" } ], "nodes": [ { "data": { - "id": "ChatInput-ECcN8", + "id": "ChatInput-JpNZb", "node": { "base_classes": [ "Message" @@ -288,8 +282,8 @@ "frozen": false, "icon": "MessagesSquare", "legacy": false, - "lf_version": "1.0.19.post2", "metadata": {}, + "minimized": true, "output_types": [], "outputs": [ { @@ -320,12 +314,14 @@ "Message" ], "list": false, + "list_add_label": "Add More", "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", @@ -341,12 +337,14 @@ "Message" ], "list": false, + "list_add_label": "Add More", "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", @@ -403,6 +401,7 @@ "file_path": "", "info": "Files to be sent with the message.", "list": true, + "list_add_label": "Add More", "name": "files", "placeholder": "", "required": false, @@ -416,11 +415,13 @@ "input_value": { "_input_type": "MultilineInput", "advanced": false, + "copy_field": false, "display_name": "Input Text", "dynamic": false, "info": "Message to be passed as input.", "input_types": [], "list": false, + "list_add_label": "Add More", "load_from_db": false, "multiline": true, "name": "input_value", @@ -428,6 +429,7 @@ "required": false, "show": true, "title_case": false, + "tool_mode": false, "trace_as_input": true, "trace_as_metadata": true, "type": "str", @@ -437,6 +439,7 @@ "_input_type": "DropdownInput", "advanced": true, "combobox": false, + "dialog_inputs": {}, "display_name": "Sender Type", "dynamic": false, "info": "Type of sender.", @@ -445,10 +448,13 @@ "Machine", "User" ], + "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, + "toggle": false, + "tool_mode": false, "trace_as_metadata": true, "type": "str", "value": "User" @@ -463,12 +469,14 @@ "Message" ], "list": false, + "list_add_label": "Add More", "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", @@ -484,12 +492,14 @@ "Message" ], "list": false, + "list_add_label": "Add More", "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", @@ -502,11 +512,13 @@ "dynamic": false, "info": "Store the message in the history.", "list": false, + "list_add_label": "Add More", "name": "should_store_message", "placeholder": "", "required": false, "show": true, "title_case": false, + "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": true @@ -521,25 +533,27 @@ "Message" ], "list": false, + "list_add_label": "Add More", "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": "ChatInput", - "selected_output": "message" + "type": "ChatInput" }, "dragging": false, "height": 234, - "id": "ChatInput-ECcN8", + "id": "ChatInput-JpNZb", "measured": { "height": 234, "width": 320 @@ -558,7 +572,7 @@ }, { "data": { - "id": "TextInput-eClq5", + "id": "TextInput-i5Z2Y", "node": { "base_classes": [ "Message" @@ -640,12 +654,11 @@ } } }, - "type": "TextInput", - "selected_output": "text" + "type": "TextInput" }, "dragging": false, "height": 234, - "id": "TextInput-eClq5", + "id": "TextInput-i5Z2Y", "measured": { "height": 234, "width": 320 @@ -666,7 +679,7 @@ "data": { "description": "Display a chat message in the Playground.", "display_name": "Chat Output", - "id": "ChatOutput-0jDYx", + "id": "ChatOutput-GgTGu", "node": { "base_classes": [ "Message" @@ -687,13 +700,14 @@ "data_template", "background_color", "chat_icon", - "text_color" + "text_color", + "clean_data" ], "frozen": false, "icon": "MessagesSquare", "legacy": false, - "lf_version": "1.0.19.post2", "metadata": {}, + "minimized": true, "output_types": [], "outputs": [ { @@ -724,6 +738,7 @@ "Message" ], "list": false, + "list_add_label": "Add More", "load_from_db": false, "name": "background_color", "placeholder": "", @@ -746,6 +761,7 @@ "Message" ], "list": false, + "list_add_label": "Add More", "load_from_db": false, "name": "chat_icon", "placeholder": "", @@ -804,6 +820,7 @@ "Message" ], "list": false, + "list_add_label": "Add More", "load_from_db": false, "name": "data_template", "placeholder": "", @@ -817,7 +834,7 @@ "value": "{text}" }, "input_value": { - "_input_type": "MessageInput", + "_input_type": "HandleInput", "advanced": false, "display_name": "Inputs", "dynamic": false, @@ -828,21 +845,21 @@ "Message" ], "list": false, - "load_from_db": false, + "list_add_label": "Add More", "name": "input_value", "placeholder": "", "required": true, "show": true, "title_case": false, - "trace_as_input": true, "trace_as_metadata": true, - "type": "str", + "type": "other", "value": "" }, "sender": { "_input_type": "DropdownInput", "advanced": true, "combobox": false, + "dialog_inputs": {}, "display_name": "Sender Type", "dynamic": false, "info": "Type of sender.", @@ -851,10 +868,12 @@ "Machine", "User" ], + "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", @@ -870,6 +889,7 @@ "Message" ], "list": false, + "list_add_label": "Add More", "load_from_db": false, "name": "sender_name", "placeholder": "", @@ -892,6 +912,7 @@ "Message" ], "list": false, + "list_add_label": "Add More", "load_from_db": false, "name": "session_id", "placeholder": "", @@ -911,11 +932,13 @@ "dynamic": false, "info": "Store the message in the history.", "list": false, + "list_add_label": "Add More", "name": "should_store_message", "placeholder": "", "required": false, "show": true, "title_case": false, + "tool_mode": false, "trace_as_metadata": true, "type": "bool", "value": true @@ -930,6 +953,7 @@ "Message" ], "list": false, + "list_add_label": "Add More", "load_from_db": false, "name": "text_color", "placeholder": "", @@ -945,17 +969,18 @@ }, "tool_mode": false }, + "showNode": false, "type": "ChatOutput" }, - "dragging": true, + "dragging": false, "height": 234, - "id": "ChatOutput-0jDYx", + "id": "ChatOutput-GgTGu", "measured": { "height": 234, - "width": 320 + "width": 192 }, "position": { - "x": 2451.4525968502526, + "x": 2663.1409807478503, "y": 1049.1470151171268 }, "positionAbsolute": { @@ -968,7 +993,7 @@ }, { "data": { - "id": "TextInput-IpoG7", + "id": "TextInput-OAt8o", "node": { "base_classes": [ "Message" @@ -1050,12 +1075,11 @@ } } }, - "type": "TextInput", - "selected_output": "text" + "type": "TextInput" }, "dragging": false, "height": 234, - "id": "TextInput-IpoG7", + "id": "TextInput-OAt8o", "measured": { "height": 234, "width": 320 @@ -1074,7 +1098,7 @@ }, { "data": { - "id": "TextInput-npraC", + "id": "TextInput-58oH9", "node": { "base_classes": [ "Message" @@ -1156,12 +1180,11 @@ } } }, - "type": "TextInput", - "selected_output": "text" + "type": "TextInput" }, "dragging": false, "height": 234, - "id": "TextInput-npraC", + "id": "TextInput-58oH9", "measured": { "height": 234, "width": 320 @@ -1180,7 +1203,7 @@ }, { "data": { - "id": "TextInput-EZaR7", + "id": "TextInput-3nKXg", "node": { "base_classes": [ "Message" @@ -1262,12 +1285,11 @@ } } }, - "type": "TextInput", - "selected_output": "text" + "type": "TextInput" }, "dragging": false, "height": 234, - "id": "TextInput-EZaR7", + "id": "TextInput-3nKXg", "measured": { "height": 234, "width": 320 @@ -1286,7 +1308,7 @@ }, { "data": { - "id": "TextInput-92vEK", + "id": "TextInput-rIJMY", "node": { "base_classes": [ "Message" @@ -1368,12 +1390,11 @@ } } }, - "type": "TextInput", - "selected_output": "text" + "type": "TextInput" }, "dragging": false, "height": 234, - "id": "TextInput-92vEK", + "id": "TextInput-rIJMY", "measured": { "height": 234, "width": 320 @@ -1392,7 +1413,7 @@ }, { "data": { - "id": "TextInput-fKGcs", + "id": "TextInput-MlxGC", "node": { "base_classes": [ "Message" @@ -1474,12 +1495,11 @@ } } }, - "type": "TextInput", - "selected_output": "text" + "type": "TextInput" }, "dragging": false, "height": 234, - "id": "TextInput-fKGcs", + "id": "TextInput-MlxGC", "measured": { "height": 234, "width": 320 @@ -1498,7 +1518,7 @@ }, { "data": { - "id": "note-OjsTI", + "id": "note-RMLbR", "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": "", @@ -1511,10 +1531,10 @@ }, "dragging": false, "height": 800, - "id": "note-OjsTI", + "id": "note-RMLbR", "measured": { - "height": 784, - "width": 324 + "height": 800, + "width": 325 }, "position": { "x": 675.0099418843004, @@ -1537,7 +1557,7 @@ "data": { "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", - "id": "Prompt-AWZtN", + "id": "Prompt-JXzxV", "node": { "base_classes": [ "Message" @@ -1559,13 +1579,14 @@ "documentation": "", "edited": false, "field_order": [ - "template" + "template", + "tool_placeholder" ], "frozen": false, "icon": "braces", "legacy": false, - "lf_version": "1.0.19.post2", "metadata": {}, + "minimized": false, "output_types": [], "outputs": [ { @@ -1594,8 +1615,7 @@ "file_path": "", "info": "", "input_types": [ - "Message", - "Text" + "Message" ], "list": false, "load_from_db": false, @@ -1617,8 +1637,7 @@ "file_path": "", "info": "", "input_types": [ - "Message", - "Text" + "Message" ], "list": false, "load_from_db": false, @@ -1640,8 +1659,7 @@ "file_path": "", "info": "", "input_types": [ - "Message", - "Text" + "Message" ], "list": false, "load_from_db": false, @@ -1663,8 +1681,7 @@ "file_path": "", "info": "", "input_types": [ - "Message", - "Text" + "Message" ], "list": false, "load_from_db": false, @@ -1686,8 +1703,7 @@ "file_path": "", "info": "", "input_types": [ - "Message", - "Text" + "Message" ], "list": false, "load_from_db": false, @@ -1709,8 +1725,7 @@ "file_path": "", "info": "", "input_types": [ - "Message", - "Text" + "Message" ], "list": false, "load_from_db": false, @@ -1749,6 +1764,7 @@ "dynamic": false, "info": "", "list": false, + "list_add_label": "Add More", "load_from_db": false, "name": "template", "placeholder": "", @@ -1770,6 +1786,7 @@ "Message" ], "list": false, + "list_add_label": "Add More", "load_from_db": false, "name": "tool_placeholder", "placeholder": "", @@ -1785,12 +1802,11 @@ }, "tool_mode": false }, - "type": "Prompt", - "selected_output": "prompt" + "type": "Prompt" }, "dragging": false, "height": 779, - "id": "Prompt-AWZtN", + "id": "Prompt-JXzxV", "measured": { "height": 779, "width": 320 @@ -1809,36 +1825,30 @@ }, { "data": { - "id": "OpenAIModel-p0R9m", + "id": "LanguageModelComponent-URKKz", "node": { "base_classes": [ "LanguageModel", "Message" ], "beta": false, - "category": "models", "conditional_paths": [], "custom_fields": {}, - "description": "Generates text using OpenAI LLMs.", - "display_name": "OpenAI", + "description": "Runs a language model given a specified provider. ", + "display_name": "Language Model", "documentation": "", "edited": false, "field_order": [ + "provider", + "model_name", + "api_key", "input_value", "system_message", "stream", - "max_tokens", - "model_kwargs", - "json_mode", - "model_name", - "openai_api_base", - "api_key", - "temperature", - "seed" + "temperature" ], "frozen": false, - "icon": "OpenAI", - "key": "OpenAIModel", + "icon": "brain-circuit", "legacy": false, "metadata": { "keywords": [ @@ -1881,7 +1891,7 @@ } ], "pinned": false, - "score": 0.14285714285714285, + "priority": 0, "template": { "_type": "Component", "api_key": { @@ -1889,17 +1899,18 @@ "advanced": false, "display_name": "OpenAI API Key", "dynamic": false, - "info": "The OpenAI API Key to use for the OpenAI model.", + "info": "Model Provider API key", "input_types": [], - "load_from_db": true, + "load_from_db": false, "name": "api_key", "password": true, "placeholder": "", - "required": true, + "real_time_refresh": true, + "required": false, "show": true, "title_case": false, "type": "str", - "value": "OPENAI_API_KEY" + "value": "" }, "code": { "advanced": true, @@ -1917,14 +1928,14 @@ "show": true, "title_case": false, "type": "code", - "value": "from typing import Any\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 (\n OPENAI_MODEL_NAMES,\n OPENAI_REASONING_MODEL_NAMES,\n)\nfrom langflow.field_typing import LanguageModel\nfrom langflow.field_typing.range_spec import RangeSpec\nfrom langflow.inputs.inputs import BoolInput, DictInput, DropdownInput, IntInput, SecretStrInput, SliderInput, StrInput\nfrom langflow.logging import logger\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 DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n advanced=False,\n options=OPENAI_MODEL_NAMES + OPENAI_REASONING_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[1],\n combobox=True,\n real_time_refresh=True,\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 required=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n show=True,\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 IntInput(\n name=\"max_retries\",\n display_name=\"Max Retries\",\n info=\"The maximum number of retries to make when generating.\",\n advanced=True,\n value=5,\n ),\n IntInput(\n name=\"timeout\",\n display_name=\"Timeout\",\n info=\"The timeout for requests to OpenAI completion API.\",\n advanced=True,\n value=700,\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n parameters = {\n \"api_key\": SecretStr(self.api_key).get_secret_value() if self.api_key else None,\n \"model_name\": self.model_name,\n \"max_tokens\": self.max_tokens or None,\n \"model_kwargs\": self.model_kwargs or {},\n \"base_url\": self.openai_api_base or \"https://api.openai.com/v1\",\n \"seed\": self.seed,\n \"max_retries\": self.max_retries,\n \"timeout\": self.timeout,\n \"temperature\": self.temperature if self.temperature is not None else 0.1,\n }\n\n logger.info(f\"Model name: {self.model_name}\")\n if self.model_name in OPENAI_REASONING_MODEL_NAMES:\n logger.info(\"Getting reasoning model parameters\")\n parameters.pop(\"temperature\")\n parameters.pop(\"seed\")\n output = ChatOpenAI(**parameters)\n if self.json_mode:\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\n def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:\n if field_name in {\"base_url\", \"model_name\", \"api_key\"} and field_value in OPENAI_REASONING_MODEL_NAMES:\n build_config[\"temperature\"][\"show\"] = False\n build_config[\"seed\"][\"show\"] = False\n if field_name in {\"base_url\", \"model_name\", \"api_key\"} and field_value in OPENAI_MODEL_NAMES:\n build_config[\"temperature\"][\"show\"] = True\n build_config[\"seed\"][\"show\"] = True\n return build_config\n" + "value": "from typing import Any\n\nfrom langchain_anthropic import ChatAnthropic\nfrom langchain_google_genai import ChatGoogleGenerativeAI\nfrom langchain_openai import ChatOpenAI\n\nfrom langflow.base.models.anthropic_constants import ANTHROPIC_MODELS\nfrom langflow.base.models.google_generative_ai_constants import GOOGLE_GENERATIVE_AI_MODELS\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.inputs import BoolInput\nfrom langflow.io import DropdownInput, MessageInput, MultilineInput, SecretStrInput, SliderInput\nfrom langflow.schema.dotdict import dotdict\n\n\nclass LanguageModelComponent(LCModelComponent):\n display_name = \"Language Model\"\n description = \"Runs a language model given a specified provider. \"\n icon = \"brain-circuit\"\n category = \"models\"\n priority = 0 # Set priority to 0 to make it appear first\n\n inputs = [\n DropdownInput(\n name=\"provider\",\n display_name=\"Model Provider\",\n options=[\"OpenAI\", \"Anthropic\", \"Google\"],\n value=\"OpenAI\",\n info=\"Select the model provider\",\n real_time_refresh=True,\n options_metadata=[{\"icon\": \"OpenAI\"}, {\"icon\": \"Anthropic\"}, {\"icon\": \"Google\"}],\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n options=OPENAI_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[0],\n info=\"Select the model to use\",\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"OpenAI API Key\",\n info=\"Model Provider API key\",\n required=False,\n show=True,\n real_time_refresh=True,\n ),\n MessageInput(\n name=\"input_value\",\n display_name=\"Input\",\n info=\"The input text to send to the model\",\n ),\n MultilineInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"A system message that helps set the behavior of the assistant\",\n advanced=True,\n ),\n BoolInput(\n name=\"stream\",\n display_name=\"Stream\",\n info=\"Whether to stream the response\",\n value=False,\n advanced=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n info=\"Controls randomness in responses\",\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n advanced=True,\n ),\n ]\n\n def build_model(self) -> LanguageModel:\n provider = self.provider\n model_name = self.model_name\n temperature = self.temperature\n stream = self.stream\n\n if provider == \"OpenAI\":\n if not self.api_key:\n msg = \"OpenAI API key is required when using OpenAI provider\"\n raise ValueError(msg)\n return ChatOpenAI(\n model_name=model_name,\n temperature=temperature,\n streaming=stream,\n openai_api_key=self.api_key,\n )\n if provider == \"Anthropic\":\n if not self.api_key:\n msg = \"Anthropic API key is required when using Anthropic provider\"\n raise ValueError(msg)\n return ChatAnthropic(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n anthropic_api_key=self.api_key,\n )\n if provider == \"Google\":\n if not self.api_key:\n msg = \"Google API key is required when using Google provider\"\n raise ValueError(msg)\n return ChatGoogleGenerativeAI(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n google_api_key=self.api_key,\n )\n msg = f\"Unknown provider: {provider}\"\n raise ValueError(msg)\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:\n if field_name == \"provider\":\n if field_value == \"OpenAI\":\n build_config[\"model_name\"][\"options\"] = OPENAI_MODEL_NAMES\n build_config[\"model_name\"][\"value\"] = OPENAI_MODEL_NAMES[0]\n build_config[\"api_key\"][\"display_name\"] = \"OpenAI API Key\"\n elif field_value == \"Anthropic\":\n build_config[\"model_name\"][\"options\"] = ANTHROPIC_MODELS\n build_config[\"model_name\"][\"value\"] = ANTHROPIC_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Anthropic API Key\"\n elif field_value == \"Google\":\n build_config[\"model_name\"][\"options\"] = GOOGLE_GENERATIVE_AI_MODELS\n build_config[\"model_name\"][\"value\"] = GOOGLE_GENERATIVE_AI_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Google API Key\"\n return build_config\n" }, "input_value": { "_input_type": "MessageInput", "advanced": false, "display_name": "Input", "dynamic": false, - "info": "", + "info": "The input text to send to the model", "input_types": [ "Message" ], @@ -1942,92 +1953,14 @@ "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, - "list_add_label": "Add More", - "name": "json_mode", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "bool", - "value": false - }, - "max_retries": { - "_input_type": "IntInput", - "advanced": true, - "display_name": "Max Retries", - "dynamic": false, - "info": "The maximum number of retries to make when generating.", - "list": false, - "list_add_label": "Add More", - "name": "max_retries", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 5 - }, - "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, - "list_add_label": "Add More", - "name": "max_tokens", - "placeholder": "", - "range_spec": { - "max": 128000, - "min": 0, - "step": 0.1, - "step_type": "float" - }, - "required": false, - "show": true, - "title_case": false, - "tool_mode": 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, - "list_add_label": "Add More", - "name": "model_kwargs", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_input": true, - "type": "dict", - "value": {} - }, "model_name": { "_input_type": "DropdownInput", "advanced": false, - "combobox": true, + "combobox": false, "dialog_inputs": {}, "display_name": "Model Name", "dynamic": false, - "info": "", + "info": "Select the model to use", "name": "model_name", "options": [ "gpt-4o-mini", @@ -2039,62 +1972,61 @@ "gpt-4-turbo", "gpt-4-turbo-preview", "gpt-4", - "gpt-3.5-turbo", - "o1" + "gpt-3.5-turbo" ], "options_metadata": [], "placeholder": "", "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", - "value": "gpt-4.1-mini" + "value": "gpt-4o-mini" }, - "openai_api_base": { - "_input_type": "StrInput", - "advanced": true, - "display_name": "OpenAI API Base", + "provider": { + "_input_type": "DropdownInput", + "advanced": false, + "combobox": false, + "dialog_inputs": {}, + "display_name": "Model Provider", "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, - "list_add_label": "Add More", - "load_from_db": false, - "name": "openai_api_base", + "info": "Select the model provider", + "name": "provider", + "options": [ + "OpenAI", + "Anthropic", + "Google" + ], + "options_metadata": [ + { + "icon": "OpenAI" + }, + { + "icon": "Anthropic" + }, + { + "icon": "Google" + } + ], "placeholder": "", + "real_time_refresh": true, "required": false, "show": true, "title_case": false, + "toggle": false, "tool_mode": false, "trace_as_metadata": true, "type": "str", - "value": "" - }, - "seed": { - "_input_type": "IntInput", - "advanced": true, - "display_name": "Seed", - "dynamic": false, - "info": "The seed controls the reproducibility of the job.", - "list": false, - "list_add_label": "Add More", - "name": "seed", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 1 + "value": "OpenAI" }, "stream": { "_input_type": "BoolInput", "advanced": true, "display_name": "Stream", "dynamic": false, - "info": "Stream the response from the model. Streaming works only in Chat.", + "info": "Whether to stream the response", "list": false, "list_add_label": "Add More", "name": "stream", @@ -2110,9 +2042,10 @@ "system_message": { "_input_type": "MultilineInput", "advanced": false, + "copy_field": false, "display_name": "System Message", "dynamic": false, - "info": "System message to pass to the model.", + "info": "A system message that helps set the behavior of the assistant", "input_types": [ "Message" ], @@ -2133,10 +2066,10 @@ }, "temperature": { "_input_type": "SliderInput", - "advanced": false, + "advanced": true, "display_name": "Temperature", "dynamic": false, - "info": "", + "info": "Controls randomness in responses", "max_label": "", "max_label_icon": "", "min_label": "", @@ -2158,59 +2091,38 @@ "tool_mode": false, "type": "slider", "value": 0.1 - }, - "timeout": { - "_input_type": "IntInput", - "advanced": true, - "display_name": "Timeout", - "dynamic": false, - "info": "The timeout for requests to OpenAI completion API.", - "list": false, - "list_add_label": "Add More", - "name": "timeout", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "tool_mode": false, - "trace_as_metadata": true, - "type": "int", - "value": 700 } }, "tool_mode": false }, "showNode": true, - "type": "OpenAIModel", - "selected_output": "text_output" + "type": "LanguageModelComponent" }, "dragging": false, - "id": "OpenAIModel-p0R9m", + "id": "LanguageModelComponent-URKKz", "measured": { - "height": 653, + "height": 534, "width": 320 }, "position": { - "x": 2077.6929601219513, - "y": 749.5994771046013 + "x": 2182.7940856919763, + "y": 761.5508208654511 }, "selected": false, "type": "genericNode" } ], "viewport": { - "x": -37.82574897322547, - "y": -72.05604403499899, - "zoom": 0.47946922686660903 + "x": -575.4285404980087, + "y": -63.90852790656527, + "zoom": 0.5526991979710968 } }, "description": "Transform structured inputs into engaging Twitter threads with this prompt-based flow, maintaining brand voice and technical accuracy.", "endpoint_name": null, - "gradient": "4", - "icon": "TwitterLogoIcon", - "id": "e73336f0-7ac5-42a5-827c-4b060a0556c6", + "id": "0c3995a1-e452-43cf-8fc9-a3d3338e5eca", "is_component": false, - "last_tested_version": "1.0.19.post2", + "last_tested_version": "1.4.3", "name": "Twitter Thread Generator", "tags": [ "chatbots", diff --git a/src/frontend/tests/core/integrations/Research Translation Loop.spec.ts b/src/frontend/tests/core/integrations/Research Translation Loop.spec.ts index b1956eb81..f5ed97850 100644 --- a/src/frontend/tests/core/integrations/Research Translation Loop.spec.ts +++ b/src/frontend/tests/core/integrations/Research Translation Loop.spec.ts @@ -35,6 +35,9 @@ withEventDeliveryModes( skipSelectGptModel: true, }); + await page.getByTestId("dropdown_str_provider").click(); + await page.getByTestId("Anthropic-1-option").click(); + await page .getByTestId("popover-anchor-input-api_key") .last() diff --git a/src/frontend/tests/core/integrations/Text Sentiment Analysis.spec.ts b/src/frontend/tests/core/integrations/Text Sentiment Analysis.spec.ts index e2fc964b5..65b22e800 100644 --- a/src/frontend/tests/core/integrations/Text Sentiment Analysis.spec.ts +++ b/src/frontend/tests/core/integrations/Text Sentiment Analysis.spec.ts @@ -39,10 +39,14 @@ withEventDeliveryModes( await page.waitForTimeout(500); await page.getByTestId("select-files-modal-button").click(); - await page.waitForSelector('[data-testid="button_run_chat output"]', { + await page.waitForSelector('[data-testid="title-Chat Output"]', { timeout: 3000, }); + await page.getByTestId("title-Chat Output").last().click(); + await page.getByTestId("icon-MoreHorizontal").click(); + await page.getByText("Expand").click(); + await page.getByTestId("button_run_chat output").last().click(); await page.waitForSelector("text=built successfully", { timeout: 30000 }); diff --git a/src/frontend/tests/core/integrations/Twitter Thread Generator.spec.ts b/src/frontend/tests/core/integrations/Twitter Thread Generator.spec.ts index 0ad746dc5..cc290e56a 100644 --- a/src/frontend/tests/core/integrations/Twitter Thread Generator.spec.ts +++ b/src/frontend/tests/core/integrations/Twitter Thread Generator.spec.ts @@ -34,6 +34,10 @@ withEventDeliveryModes( await initialGPTsetup(page); + await page.getByTestId("title-Chat Output").click(); + await page.getByTestId("icon-MoreHorizontal").click(); + await page.getByText("Expand").click(); + await page.getByTestId("button_run_chat output").click(); await page.waitForSelector("text=built successfully", { timeout: 30000 });