diff --git a/src/backend/base/langflow/initial_setup/setup.py b/src/backend/base/langflow/initial_setup/setup.py index 2ee117d47..75d67b5c1 100644 --- a/src/backend/base/langflow/initial_setup/setup.py +++ b/src/backend/base/langflow/initial_setup/setup.py @@ -14,7 +14,11 @@ from emoji import demojize, purely_emoji from loguru import logger from sqlmodel import select -from langflow.base.constants import FIELD_FORMAT_ATTRIBUTES, NODE_FORMAT_ATTRIBUTES, ORJSON_OPTIONS +from langflow.base.constants import ( + FIELD_FORMAT_ATTRIBUTES, + NODE_FORMAT_ATTRIBUTES, + ORJSON_OPTIONS, +) from langflow.graph.graph.base import Graph from langflow.services.auth.utils import create_super_user from langflow.services.database.models.flow.model import Flow, FlowCreate @@ -24,7 +28,12 @@ from langflow.services.database.models.folder.utils import ( get_default_folder_id, ) from langflow.services.database.models.user.crud import get_user_by_username -from langflow.services.deps import get_settings_service, get_storage_service, get_variable_service, session_scope +from langflow.services.deps import ( + get_settings_service, + get_storage_service, + get_variable_service, + session_scope, +) from langflow.template.field.prompt import DEFAULT_PROMPT_INTUT_TYPES from langflow.utils.util import escape_json_dump @@ -237,10 +246,12 @@ def update_edges_with_latest_component_versions(project_data): target_handle = scape_json_parse(target_handle) # Now find the source and target nodes in the nodes list source_node = next( - (node for node in project_data.get("nodes", []) if node.get("id") == edge.get("source")), None + (node for node in project_data.get("nodes", []) if node.get("id") == edge.get("source")), + None, ) target_node = next( - (node for node in project_data.get("nodes", []) if node.get("id") == edge.get("target")), None + (node for node in project_data.get("nodes", []) if node.get("id") == edge.get("target")), + None, ) if source_node and target_node: source_node_data = source_node.get("data").get("node") @@ -397,8 +408,10 @@ def get_project_data(project): updated_at_datetime = datetime.fromisoformat(project_updated_at) project_data = project.get("data") project_icon = project.get("icon") - project_icon = demojize(project_icon) if project_icon and purely_emoji(project_icon) else "" + project_icon = demojize(project_icon) if project_icon and purely_emoji(project_icon) else project_icon project_icon_bg_color = project.get("icon_bg_color") + project_gradient = project.get("gradient") + project_tags = project.get("tags") return ( project_name, project_description, @@ -407,6 +420,8 @@ def get_project_data(project): project_data, project_icon, project_icon_bg_color, + project_gradient, + project_tags, ) @@ -444,6 +459,8 @@ def create_new_project( project_is_component, updated_at_datetime, project_data, + project_gradient, + project_tags, project_icon, project_icon_bg_color, new_folder_id, @@ -458,6 +475,8 @@ def create_new_project( is_component=project_is_component, updated_at=updated_at_datetime, folder_id=new_folder_id, + gradient=project_gradient, + tags=project_tags, ) db_flow = Flow.model_validate(new_project, from_attributes=True) session.add(db_flow) @@ -595,6 +614,8 @@ async def create_or_update_starter_projects(get_all_components_coro: Awaitable[d project_data, project_icon, project_icon_bg_color, + project_gradient, + project_tags, ) = get_project_data(project) updated_project_data = update_projects_components_with_latest_component_versions( project_data.copy(), all_types_dict @@ -614,15 +635,17 @@ async def create_or_update_starter_projects(get_all_components_coro: Awaitable[d session.delete(existing_project) create_new_project( - session, - project_name, - project_description, - project_is_component, - updated_at_datetime, - project_data, - project_icon, - project_icon_bg_color, - new_folder.id, + session=session, + project_name=project_name, + project_description=project_description, + project_is_component=project_is_component, + updated_at_datetime=updated_at_datetime, + project_data=project_data, + project_icon=project_icon, + project_icon_bg_color=project_icon_bg_color, + project_gradient=project_gradient, + project_tags=project_tags, + new_folder_id=new_folder.id, ) diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Agent Flow.json b/src/backend/base/langflow/initial_setup/starter_projects/Agent Flow.json index 88c6dd14a..7dca2ddd9 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Agent Flow.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Agent Flow.json @@ -8,16 +8,12 @@ "dataType": "ToolCallingAgent", "id": "ToolCallingAgent-mf0BN", "name": "response", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-Ag9YG", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -34,16 +30,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-1ioeW", "name": "model_output", - "output_types": [ - "LanguageModel" - ] + "output_types": ["LanguageModel"] }, "targetHandle": { "fieldName": "llm", "id": "ToolCallingAgent-mf0BN", - "inputTypes": [ - "LanguageModel" - ], + "inputTypes": ["LanguageModel"], "type": "other" } }, @@ -60,17 +52,12 @@ "dataType": "CalculatorTool", "id": "CalculatorTool-Nb4P5", "name": "api_build_tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "ToolCallingAgent-mf0BN", - "inputTypes": [ - "Tool", - "BaseTool" - ], + "inputTypes": ["Tool", "BaseTool"], "type": "other" } }, @@ -87,16 +74,12 @@ "dataType": "ChatInput", "id": "ChatInput-X3ARP", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ToolCallingAgent-mf0BN", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -112,17 +95,12 @@ "dataType": "PythonREPLTool", "id": "PythonREPLTool-i922a", "name": "api_build_tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "ToolCallingAgent-mf0BN", - "inputTypes": [ - "Tool", - "BaseTool" - ], + "inputTypes": ["Tool", "BaseTool"], "type": "other" } }, @@ -138,9 +116,7 @@ "data": { "id": "ChatInput-X3ARP", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -168,9 +144,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -243,9 +217,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as input.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -267,10 +239,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -285,9 +254,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -306,9 +273,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -360,9 +325,7 @@ "data": { "id": "ChatOutput-Ag9YG", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -390,9 +353,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -423,9 +384,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "data_template", @@ -444,9 +403,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as output.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -467,10 +424,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -485,9 +439,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -506,9 +458,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -562,10 +512,7 @@ "display_name": "OpenAI", "id": "OpenAIModel-1ioeW", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -598,15 +545,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -626,9 +567,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -641,9 +580,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -678,9 +615,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -796,9 +731,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -863,9 +796,7 @@ "display_name": "System Message", "dynamic": false, "info": "System message to pass to the model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "system_message", @@ -917,10 +848,7 @@ "data": { "id": "ToolCallingAgent-mf0BN", "node": { - "base_classes": [ - "AgentExecutor", - "Message" - ], + "base_classes": ["AgentExecutor", "Message"], "beta": true, "conditional_paths": [], "custom_fields": {}, @@ -951,9 +879,7 @@ "method": "build_agent", "name": "agent", "selected": "AgentExecutor", - "types": [ - "AgentExecutor" - ], + "types": ["AgentExecutor"], "value": "__UNDEFINED__" }, { @@ -962,9 +888,7 @@ "method": "message_response", "name": "response", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -977,9 +901,7 @@ "display_name": "Chat History", "dynamic": false, "info": "", - "input_types": [ - "Data" - ], + "input_types": ["Data"], "list": true, "name": "chat_history", "placeholder": "", @@ -1031,9 +953,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -1052,9 +972,7 @@ "display_name": "Language Model", "dynamic": false, "info": "", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "llm", "placeholder": "", @@ -1087,9 +1005,7 @@ "display_name": "System Prompt", "dynamic": false, "info": "System prompt for the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1109,10 +1025,7 @@ "display_name": "Tools", "dynamic": false, "info": "", - "input_types": [ - "Tool", - "BaseTool" - ], + "input_types": ["Tool", "BaseTool"], "list": true, "load_from_db": false, "name": "tools", @@ -1130,9 +1043,7 @@ "display_name": "Prompt", "dynamic": false, "info": "This prompt must contain 'input' key.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1185,12 +1096,7 @@ "data": { "id": "CalculatorTool-Nb4P5", "node": { - "base_classes": [ - "Data", - "list", - "Sequence", - "Tool" - ], + "base_classes": ["Data", "list", "Sequence", "Tool"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1198,9 +1104,7 @@ "display_name": "Calculator", "documentation": "", "edited": false, - "field_order": [ - "expression" - ], + "field_order": ["expression"], "frozen": false, "icon": "calculator", "lf_version": "1.0.16", @@ -1213,13 +1117,9 @@ "display_name": "Data", "method": "run_model", "name": "api_run_model", - "required_inputs": [ - "expression" - ], + "required_inputs": ["expression"], "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -1227,13 +1127,9 @@ "display_name": "Tool", "method": "build_tool", "name": "api_build_tool", - "required_inputs": [ - "expression" - ], + "required_inputs": ["expression"], "selected": "Tool", - "types": [ - "Tool" - ], + "types": ["Tool"], "value": "__UNDEFINED__" } ], @@ -1264,9 +1160,7 @@ "display_name": "Expression", "dynamic": false, "info": "The arithmetic expression to evaluate (e.g., '4*4*(33/22)+12-20').", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "expression", @@ -1304,10 +1198,7 @@ "display_name": "Python REPL Tool", "id": "PythonREPLTool-i922a", "node": { - "base_classes": [ - "Data", - "Tool" - ], + "base_classes": ["Data", "Tool"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1315,12 +1206,7 @@ "display_name": "Python REPL Tool", "documentation": "", "edited": false, - "field_order": [ - "name", - "description", - "global_imports", - "code" - ], + "field_order": ["name", "description", "global_imports", "code"], "frozen": false, "metadata": {}, "output_types": [], @@ -1337,9 +1223,7 @@ "name" ], "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -1354,9 +1238,7 @@ "name" ], "selected": "Tool", - "types": [ - "Tool" - ], + "types": ["Tool"], "value": "__UNDEFINED__" } ], @@ -1460,8 +1342,10 @@ }, "description": "Single Agent Flow to get you started. This flow contains a calculator and a Python REPL tool, that could be used by our tool calling agent.", "endpoint_name": null, + "icon": "Users", "id": "beda74a3-7e03-4c14-a148-a7740e810dbf", "is_component": false, "last_tested_version": "1.0.17", - "name": "Simple Agent" -} \ No newline at end of file + "name": "Simple Agent", + "tags": ["agents", "openai", "chatbots"] +} diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting (Hello, World).json b/src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting (Hello, World).json index 0e3a825ac..198db018f 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting (Hello, World).json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting (Hello, World).json @@ -8,17 +8,12 @@ "dataType": "ChatInput", "id": "ChatInput-AwB1F", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "user_input", "id": "Prompt-bHLxK", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -35,16 +30,12 @@ "dataType": "Prompt", "id": "Prompt-bHLxK", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-tnzXU", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -61,16 +52,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-tnzXU", "name": "text_output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-wbcyd", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -88,9 +75,7 @@ "display_name": "Chat Input", "id": "ChatInput-AwB1F", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -117,9 +102,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -190,9 +173,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as input.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -212,10 +193,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -229,9 +207,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -249,9 +225,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -305,23 +279,17 @@ "display_name": "Prompt", "id": "Prompt-bHLxK", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "user_input" - ] + "template": ["user_input"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "icon": "prompts", "metadata": {}, @@ -333,9 +301,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -384,10 +350,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -425,9 +388,7 @@ "display_name": "Chat Output", "id": "ChatOutput-wbcyd", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -454,9 +415,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -486,9 +445,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "data_template", @@ -506,9 +463,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as output.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -527,10 +482,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -544,9 +496,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -564,9 +514,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -620,10 +568,7 @@ "display_name": "OpenAI", "id": "OpenAIModel-tnzXU", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -655,15 +600,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -683,9 +622,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -698,9 +635,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -734,9 +669,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -839,9 +772,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -988,8 +919,11 @@ }, "description": "This flow will get you experimenting with the basics of the UI, the Chat and the Prompt component. \n\nTry changing the Template in it to see how the model behaves. \nYou can change it to this and a Text Input into the `type_of_person` variable : \"Answer the user as if you were a pirate.\n\nUser: {user_input}\n\nAnswer: \" ", "endpoint_name": null, + "gradient": "oaidfnoaienfwpiawjde", + "icon": "BotMessageSquare", "id": "fd36e130-512d-48e6-96cc-f1e03c5d3a18", "is_component": false, "last_tested_version": "1.0.18", - "name": "Basic Prompting (Hello, World)" -} \ No newline at end of file + "name": "Basic Prompting (Hello, World)", + "tags": ["chatbots", "openai"] +} diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json b/src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json index 5c89d1243..a60a29148 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json @@ -8,16 +8,12 @@ "dataType": "URL", "id": "URL-46k0m", "name": "data", - "output_types": [ - "Data" - ] + "output_types": ["Data"] }, "targetHandle": { "fieldName": "data", "id": "ParseData-jUQRS", - "inputTypes": [ - "Data" - ], + "inputTypes": ["Data"], "type": "other" } }, @@ -34,17 +30,12 @@ "dataType": "ParseData", "id": "ParseData-jUQRS", "name": "text", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "references", "id": "Prompt-Pf4QQ", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -61,17 +52,12 @@ "dataType": "TextInput", "id": "TextInput-slCbp", "name": "text", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "instructions", "id": "Prompt-Pf4QQ", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -88,16 +74,12 @@ "dataType": "Prompt", "id": "Prompt-Pf4QQ", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-o0Gr0", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -114,16 +96,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-o0Gr0", "name": "text_output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-eIVde", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -141,9 +119,7 @@ "display_name": "URL", "id": "URL-46k0m", "node": { - "base_classes": [ - "Data" - ], + "base_classes": ["Data"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -151,9 +127,7 @@ "display_name": "URL", "documentation": "", "edited": false, - "field_order": [ - "urls" - ], + "field_order": ["urls"], "frozen": false, "icon": "layout-template", "metadata": {}, @@ -165,9 +139,7 @@ "method": "fetch_content", "name": "data", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -176,9 +148,7 @@ "method": "fetch_content_text", "name": "text", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -211,10 +181,7 @@ "dynamic": false, "info": "Output format. Use 'Text' to extract the text from the HTML or 'Raw HTML' for the raw HTML content.", "name": "format", - "options": [ - "Text", - "Raw HTML" - ], + "options": ["Text", "Raw HTML"], "placeholder": "", "required": false, "show": true, @@ -228,9 +195,7 @@ "display_name": "URLs", "dynamic": false, "info": "Enter one or more URLs, by clicking the '+' button.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": true, "load_from_db": false, "name": "urls", @@ -241,10 +206,7 @@ "trace_as_input": true, "trace_as_metadata": true, "type": "str", - "value": [ - "langflow.org/", - "docs.langflow.org/" - ] + "value": ["langflow.org/", "docs.langflow.org/"] } } }, @@ -271,9 +233,7 @@ "display_name": "Parse Data", "id": "ParseData-jUQRS", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -281,11 +241,7 @@ "display_name": "Parse Data", "documentation": "", "edited": false, - "field_order": [ - "data", - "template", - "sep" - ], + "field_order": ["data", "template", "sep"], "frozen": false, "icon": "braces", "metadata": {}, @@ -297,9 +253,7 @@ "method": "parse_data", "name": "text", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -329,9 +283,7 @@ "display_name": "Data", "dynamic": false, "info": "The data to convert to text.", - "input_types": [ - "Data" - ], + "input_types": ["Data"], "list": false, "name": "data", "placeholder": "", @@ -364,9 +316,7 @@ "display_name": "Template", "dynamic": false, "info": "The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -405,24 +355,17 @@ "display_name": "Prompt", "id": "Prompt-Pf4QQ", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "references", - "instructions" - ] + "template": ["references", "instructions"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "icon": "prompts", "metadata": {}, @@ -434,9 +377,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -469,10 +410,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -493,10 +431,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -550,9 +485,7 @@ "display_name": "Instructions", "id": "TextInput-slCbp", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -560,9 +493,7 @@ "display_name": "Instructions", "documentation": "", "edited": false, - "field_order": [ - "input_value" - ], + "field_order": ["input_value"], "frozen": false, "icon": "type", "output_types": [], @@ -573,9 +504,7 @@ "method": "text_response", "name": "text", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -606,9 +535,7 @@ "display_name": "Text", "dynamic": false, "info": "Text to be passed as input.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -647,9 +574,7 @@ "display_name": "Chat Output", "id": "ChatOutput-eIVde", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -676,9 +601,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -708,9 +631,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "data_template", @@ -728,9 +649,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as output.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -749,10 +668,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -766,9 +682,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -786,9 +700,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -842,10 +754,7 @@ "display_name": "OpenAI", "id": "OpenAIModel-o0Gr0", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -877,15 +786,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -905,9 +808,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -920,9 +821,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -956,9 +855,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -1061,9 +958,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -1178,8 +1073,10 @@ }, "description": "This flow can be used to create a blog post following instructions from the user, using two other blogs as reference.", "endpoint_name": null, + "icon": "FileText", "id": "92d42e25-91d4-4108-8187-92fc53fc9778", "is_component": false, "last_tested_version": "1.0.17", - "name": "Blog Writer" -} \ No newline at end of file + "name": "Blog Writer", + "tags": ["chatbots"] +} diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Complex Agent.json b/src/backend/base/langflow/initial_setup/starter_projects/Complex Agent.json index eda11b1b5..41a0800a6 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Complex Agent.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Complex Agent.json @@ -8,16 +8,12 @@ "dataType": "HierarchicalCrewComponent", "id": "HierarchicalCrewComponent-3JGY1", "name": "output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-8FKry", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -35,16 +31,12 @@ "dataType": "HierarchicalTaskComponent", "id": "HierarchicalTaskComponent-GuXH7", "name": "task_output", - "output_types": [ - "HierarchicalTask" - ] + "output_types": ["HierarchicalTask"] }, "targetHandle": { "fieldName": "tasks", "id": "HierarchicalCrewComponent-3JGY1", - "inputTypes": [ - "HierarchicalTask" - ], + "inputTypes": ["HierarchicalTask"], "type": "other" } }, @@ -62,16 +54,12 @@ "dataType": "CrewAIAgentComponent", "id": "CrewAIAgentComponent-ViX9d", "name": "output", - "output_types": [ - "Agent" - ] + "output_types": ["Agent"] }, "targetHandle": { "fieldName": "agents", "id": "HierarchicalCrewComponent-3JGY1", - "inputTypes": [ - "Agent" - ], + "inputTypes": ["Agent"], "type": "other" } }, @@ -89,16 +77,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-ucjrK", "name": "model_output", - "output_types": [ - "LanguageModel" - ] + "output_types": ["LanguageModel"] }, "targetHandle": { "fieldName": "llm", "id": "CrewAIAgentComponent-ViX9d", - "inputTypes": [ - "LanguageModel" - ], + "inputTypes": ["LanguageModel"], "type": "other" } }, @@ -116,16 +100,12 @@ "dataType": "CrewAIAgentComponent", "id": "CrewAIAgentComponent-aCLi7", "name": "output", - "output_types": [ - "Agent" - ] + "output_types": ["Agent"] }, "targetHandle": { "fieldName": "manager_agent", "id": "HierarchicalCrewComponent-3JGY1", - "inputTypes": [ - "Agent" - ], + "inputTypes": ["Agent"], "type": "other" } }, @@ -143,16 +123,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-wMVJn", "name": "model_output", - "output_types": [ - "LanguageModel" - ] + "output_types": ["LanguageModel"] }, "targetHandle": { "fieldName": "llm", "id": "CrewAIAgentComponent-aCLi7", - "inputTypes": [ - "LanguageModel" - ], + "inputTypes": ["LanguageModel"], "type": "other" } }, @@ -170,16 +146,12 @@ "dataType": "Prompt", "id": "Prompt-gbnQU", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "task_description", "id": "HierarchicalTaskComponent-GuXH7", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -197,17 +169,12 @@ "dataType": "ChatInput", "id": "ChatInput-1Gki8", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "query", "id": "Prompt-gbnQU", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -225,16 +192,12 @@ "dataType": "YFinanceTool", "id": "YFinanceTool-gzeyq", "name": "tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "CrewAIAgentComponent-ViX9d", - "inputTypes": [ - "Tool" - ], + "inputTypes": ["Tool"], "type": "other" } }, @@ -252,16 +215,12 @@ "dataType": "Prompt", "id": "Prompt-qCC5T", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-KnjCY", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -279,16 +238,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-KnjCY", "name": "text_output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "role", "id": "CrewAIAgentComponent-ViX9d", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -306,17 +261,12 @@ "dataType": "ChatInput", "id": "ChatInput-1Gki8", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "query", "id": "Prompt-5wrVb", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -334,17 +284,12 @@ "dataType": "ChatInput", "id": "ChatInput-1Gki8", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "query", "id": "Prompt-qCC5T", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -362,16 +307,12 @@ "dataType": "Prompt", "id": "Prompt-5wrVb", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-wOSDH", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -389,17 +330,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-KnjCY", "name": "text_output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "role", "id": "Prompt-5wrVb", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -417,16 +353,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-wOSDH", "name": "text_output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "goal", "id": "CrewAIAgentComponent-ViX9d", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -444,16 +376,12 @@ "dataType": "Prompt", "id": "Prompt-g5dyc", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-lajm6", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -471,17 +399,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-wOSDH", "name": "text_output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "goal", "id": "Prompt-g5dyc", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -498,17 +421,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-KnjCY", "name": "text_output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "role", "id": "Prompt-g5dyc", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -525,17 +443,12 @@ "dataType": "ChatInput", "id": "ChatInput-1Gki8", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "query", "id": "Prompt-g5dyc", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -552,16 +465,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-lajm6", "name": "text_output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "backstory", "id": "CrewAIAgentComponent-ViX9d", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -578,16 +487,12 @@ "dataType": "SearchAPI", "id": "SearchAPI-1mPpu", "name": "api_build_tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "CrewAIAgentComponent-ViX9d", - "inputTypes": [ - "Tool" - ], + "inputTypes": ["Tool"], "type": "other" } }, @@ -605,9 +510,7 @@ "display_name": "Hierarchical Crew", "id": "HierarchicalCrewComponent-3JGY1", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -639,9 +542,7 @@ "name": "output", "required_inputs": [], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -653,9 +554,7 @@ "display_name": "Agents", "dynamic": false, "info": "", - "input_types": [ - "Agent" - ], + "input_types": ["Agent"], "list": true, "name": "agents", "placeholder": "", @@ -689,9 +588,7 @@ "display_name": "Function Calling LLM", "dynamic": false, "info": "Turns the ReAct CrewAI agent into a function-calling agent", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "function_calling_llm", "placeholder": "", @@ -707,9 +604,7 @@ "display_name": "Manager Agent", "dynamic": false, "info": "", - "input_types": [ - "Agent" - ], + "input_types": ["Agent"], "list": false, "name": "manager_agent", "placeholder": "", @@ -725,9 +620,7 @@ "display_name": "Manager LLM", "dynamic": false, "info": "", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "manager_llm", "placeholder": "", @@ -788,9 +681,7 @@ "display_name": "Tasks", "dynamic": false, "info": "", - "input_types": [ - "HierarchicalTask" - ], + "input_types": ["HierarchicalTask"], "list": true, "name": "tasks", "placeholder": "", @@ -849,10 +740,7 @@ "data": { "id": "OpenAIModel-ucjrK", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -884,15 +772,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -912,9 +794,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -927,9 +807,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -963,9 +841,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -1068,9 +944,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -1182,9 +1056,7 @@ "display_name": "Chat Output", "id": "ChatOutput-8FKry", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1211,9 +1083,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1243,9 +1113,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "data_template", @@ -1263,9 +1131,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as output.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -1284,10 +1150,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -1301,9 +1164,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -1321,9 +1182,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -1371,9 +1230,7 @@ "display_name": "Hierarchical Task", "id": "HierarchicalTaskComponent-GuXH7", "node": { - "base_classes": [ - "HierarchicalTask" - ], + "base_classes": ["HierarchicalTask"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1381,11 +1238,7 @@ "display_name": "Hierarchical Task", "documentation": "", "edited": false, - "field_order": [ - "task_description", - "expected_output", - "tools" - ], + "field_order": ["task_description", "expected_output", "tools"], "frozen": false, "icon": "CrewAI", "metadata": {}, @@ -1397,9 +1250,7 @@ "method": "build_task", "name": "task_output", "selected": "HierarchicalTask", - "types": [ - "HierarchicalTask" - ], + "types": ["HierarchicalTask"], "value": "__UNDEFINED__" } ], @@ -1429,9 +1280,7 @@ "display_name": "Expected Output", "dynamic": false, "info": "Clear definition of expected task outcome.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1450,9 +1299,7 @@ "display_name": "Description", "dynamic": false, "info": "Descriptive text detailing task's purpose and execution.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1471,9 +1318,7 @@ "display_name": "Tools", "dynamic": false, "info": "List of tools/resources limited for task execution. Uses the Agent tools by default.", - "input_types": [ - "Tool" - ], + "input_types": ["Tool"], "list": true, "name": "tools", "placeholder": "", @@ -1504,9 +1349,7 @@ "display_name": "CrewAI Agent", "id": "CrewAIAgentComponent-ViX9d", "node": { - "base_classes": [ - "Agent" - ], + "base_classes": ["Agent"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1537,9 +1380,7 @@ "method": "build_output", "name": "output", "selected": "Agent", - "types": [ - "Agent" - ], + "types": ["Agent"], "value": "__UNDEFINED__" } ], @@ -1581,9 +1422,7 @@ "display_name": "Backstory", "dynamic": false, "info": "The backstory of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1620,9 +1459,7 @@ "display_name": "Goal", "dynamic": false, "info": "The objective of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1656,9 +1493,7 @@ "display_name": "Language Model", "dynamic": false, "info": "Language model that will run the agent.", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "llm", "placeholder": "", @@ -1689,9 +1524,7 @@ "display_name": "Role", "dynamic": false, "info": "The role of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1710,9 +1543,7 @@ "display_name": "Tools", "dynamic": false, "info": "Tools at agents disposal", - "input_types": [ - "Tool" - ], + "input_types": ["Tool"], "list": true, "name": "tools", "placeholder": "", @@ -1759,9 +1590,7 @@ "display_name": "CrewAI Agent", "id": "CrewAIAgentComponent-aCLi7", "node": { - "base_classes": [ - "Agent" - ], + "base_classes": ["Agent"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1792,9 +1621,7 @@ "method": "build_output", "name": "output", "selected": "Agent", - "types": [ - "Agent" - ], + "types": ["Agent"], "value": "__UNDEFINED__" } ], @@ -1836,9 +1663,7 @@ "display_name": "Backstory", "dynamic": false, "info": "The backstory of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1875,9 +1700,7 @@ "display_name": "Goal", "dynamic": false, "info": "The objective of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1911,9 +1734,7 @@ "display_name": "Language Model", "dynamic": false, "info": "Language model that will run the agent.", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "llm", "placeholder": "", @@ -1944,9 +1765,7 @@ "display_name": "Role", "dynamic": false, "info": "The role of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1965,9 +1784,7 @@ "display_name": "Tools", "dynamic": false, "info": "Tools at agents disposal", - "input_types": [ - "Tool" - ], + "input_types": ["Tool"], "list": true, "name": "tools", "placeholder": "", @@ -2016,10 +1833,7 @@ "data": { "id": "OpenAIModel-wMVJn", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2051,15 +1865,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -2079,9 +1887,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -2094,9 +1900,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -2130,9 +1934,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -2235,9 +2037,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -2349,24 +2149,18 @@ "display_name": "Prompt", "id": "Prompt-gbnQU", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "query" - ] + "template": ["query"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, "error": null, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "full_path": null, "icon": "prompts", @@ -2383,9 +2177,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -2418,10 +2210,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -2468,9 +2257,7 @@ "data": { "id": "ChatInput-1Gki8", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2497,9 +2284,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -2570,9 +2355,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as input.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2592,10 +2375,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -2609,9 +2389,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -2629,9 +2407,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -2684,9 +2460,7 @@ "display_name": "Yahoo Finance News Tool", "id": "YFinanceTool-gzeyq", "node": { - "base_classes": [ - "Tool" - ], + "base_classes": ["Tool"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2705,9 +2479,7 @@ "method": "run_model", "name": "api_run_model", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -2716,9 +2488,7 @@ "method": "build_tool", "name": "tool", "selected": "Tool", - "types": [ - "Tool" - ], + "types": ["Tool"], "value": "__UNDEFINED__" } ], @@ -2749,9 +2519,7 @@ "display_name": "Query", "dynamic": false, "info": "Input should be a company ticker. For example, AAPL for Apple, MSFT for Microsoft.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -2787,10 +2555,7 @@ "data": { "id": "OpenAIModel-KnjCY", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2822,15 +2587,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -2850,9 +2609,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -2865,9 +2622,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -2901,9 +2656,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -3006,9 +2759,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -3120,23 +2871,17 @@ "display_name": "Role Prompt", "id": "Prompt-qCC5T", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "query" - ] + "template": ["query"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Role Prompt", "documentation": "", "edited": false, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "icon": "prompts", "output_types": [], @@ -3147,9 +2892,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -3182,10 +2925,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -3237,10 +2977,7 @@ "data": { "id": "OpenAIModel-wOSDH", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -3272,15 +3009,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -3300,9 +3031,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -3315,9 +3044,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -3351,9 +3078,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -3456,9 +3181,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -3570,24 +3293,17 @@ "display_name": "Goal Prompt", "id": "Prompt-5wrVb", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "query", - "role" - ] + "template": ["query", "role"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Goal Prompt", "documentation": "", "edited": false, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "icon": "prompts", "output_types": [], @@ -3598,9 +3314,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -3633,10 +3347,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -3656,10 +3367,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -3711,10 +3419,7 @@ "data": { "id": "OpenAIModel-lajm6", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -3746,15 +3451,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -3774,9 +3473,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -3789,9 +3486,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -3825,9 +3520,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -3930,9 +3623,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -4044,26 +3735,18 @@ "display_name": "Prompt", "id": "Prompt-g5dyc", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "query", - "role", - "goal" - ] + "template": ["query", "role", "goal"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, "error": null, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "full_path": null, "icon": "prompts", @@ -4080,9 +3763,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -4115,10 +3796,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -4139,10 +3817,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -4163,10 +3838,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -4219,10 +3891,7 @@ "display_name": "Search API", "id": "SearchAPI-1mPpu", "node": { - "base_classes": [ - "Data", - "Tool" - ], + "base_classes": ["Data", "Tool"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -4254,9 +3923,7 @@ "search_params" ], "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -4273,9 +3940,7 @@ "search_params" ], "selected": "Tool", - "types": [ - "Tool" - ], + "types": ["Tool"], "value": "__UNDEFINED__" } ], @@ -4287,9 +3952,7 @@ "display_name": "SearchAPI API Key", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -4323,9 +3986,7 @@ "display_name": "Engine", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "engine", @@ -4343,9 +4004,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -4434,8 +4093,10 @@ }, "description": "This Agent is created on the fly based on what the user asks and a Manager Agent calls it if needed.", "endpoint_name": null, + "icon": "Users", "id": "93709197-049c-41fa-ab4d-f871c20e83eb", "is_component": false, "last_tested_version": "1.0.17", - "name": "Dynamic Agent" -} \ No newline at end of file + "name": "Dynamic Agent", + "tags": ["agents", "openai", "chatbots"] +} diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Document QA.json b/src/backend/base/langflow/initial_setup/starter_projects/Document QA.json index a8a2b78f4..1a15398d8 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Document QA.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Document QA.json @@ -8,17 +8,12 @@ "dataType": "ChatInput", "id": "ChatInput-Emi4q", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "Question", "id": "Prompt-n8yRL", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -35,16 +30,12 @@ "dataType": "Prompt", "id": "Prompt-n8yRL", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-1hwZ2", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -61,16 +52,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-1hwZ2", "name": "text_output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-sD0lp", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -87,17 +74,12 @@ "dataType": "ParseData", "id": "ParseData-qYLes", "name": "text", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "Document", "id": "Prompt-n8yRL", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -114,16 +96,12 @@ "dataType": "File", "id": "File-0oa6O", "name": "data", - "output_types": [ - "Data" - ] + "output_types": ["Data"] }, "targetHandle": { "fieldName": "data", "id": "ParseData-qYLes", - "inputTypes": [ - "Data" - ], + "inputTypes": ["Data"], "type": "other" } }, @@ -141,24 +119,17 @@ "display_name": "Prompt", "id": "Prompt-n8yRL", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "Document", - "Question" - ] + "template": ["Document", "Question"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "icon": "prompts", "metadata": {}, @@ -170,9 +141,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -186,10 +155,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -210,10 +176,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -286,9 +249,7 @@ "display_name": "Chat Input", "id": "ChatInput-Emi4q", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -315,9 +276,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -388,9 +347,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as input.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -410,10 +367,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -427,9 +381,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -447,9 +399,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -503,9 +453,7 @@ "display_name": "Chat Output", "id": "ChatOutput-sD0lp", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -532,9 +480,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -564,9 +510,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "data_template", @@ -584,9 +528,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as output.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -605,10 +547,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -622,9 +561,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -642,9 +579,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -698,10 +633,7 @@ "display_name": "OpenAI", "id": "OpenAIModel-1hwZ2", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -733,15 +665,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -761,9 +687,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -776,9 +700,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -812,9 +734,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -917,9 +837,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -1031,9 +949,7 @@ "display_name": "Parse Data", "id": "ParseData-qYLes", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1041,11 +957,7 @@ "display_name": "Parse Data", "documentation": "", "edited": false, - "field_order": [ - "data", - "template", - "sep" - ], + "field_order": ["data", "template", "sep"], "frozen": false, "icon": "braces", "metadata": {}, @@ -1057,9 +969,7 @@ "method": "parse_data", "name": "text", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1089,9 +999,7 @@ "display_name": "Data", "dynamic": false, "info": "The data to convert to text.", - "input_types": [ - "Data" - ], + "input_types": ["Data"], "list": false, "name": "data", "placeholder": "", @@ -1124,9 +1032,7 @@ "display_name": "Template", "dynamic": false, "info": "The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1165,9 +1071,7 @@ "display_name": "File", "id": "File-0oa6O", "node": { - "base_classes": [ - "Data" - ], + "base_classes": ["Data"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1175,10 +1079,7 @@ "display_name": "File", "documentation": "", "edited": false, - "field_order": [ - "path", - "silent_errors" - ], + "field_order": ["path", "silent_errors"], "frozen": false, "icon": "file-text", "metadata": {}, @@ -1190,9 +1091,7 @@ "method": "load_file", "name": "data", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" } ], @@ -1296,8 +1195,10 @@ }, "description": "This flow integrates PDF reading with a language model to answer document-specific questions. Ideal for small-scale texts, it facilitates direct queries with immediate insights.", "endpoint_name": null, + "icon": "FileText", "id": "6fb449a7-563c-446e-82d2-36f3defb9a48", "is_component": false, "last_tested_version": "1.0.9", - "name": "Document QA" -} \ No newline at end of file + "name": "Document QA", + "tags": ["chatbots", "openai"] +} diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Hierarchical Agent.json b/src/backend/base/langflow/initial_setup/starter_projects/Hierarchical Agent.json index 39a38a3ab..ccd2d07ba 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Hierarchical Agent.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Hierarchical Agent.json @@ -8,16 +8,12 @@ "dataType": "HierarchicalCrewComponent", "id": "HierarchicalCrewComponent-Y0Uvf", "name": "output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-VzVJK", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -35,16 +31,12 @@ "dataType": "HierarchicalTaskComponent", "id": "HierarchicalTaskComponent-hE8H5", "name": "task_output", - "output_types": [ - "HierarchicalTask" - ] + "output_types": ["HierarchicalTask"] }, "targetHandle": { "fieldName": "tasks", "id": "HierarchicalCrewComponent-Y0Uvf", - "inputTypes": [ - "HierarchicalTask" - ], + "inputTypes": ["HierarchicalTask"], "type": "other" } }, @@ -62,16 +54,12 @@ "dataType": "CrewAIAgentComponent", "id": "CrewAIAgentComponent-EbpXd", "name": "output", - "output_types": [ - "Agent" - ] + "output_types": ["Agent"] }, "targetHandle": { "fieldName": "agents", "id": "HierarchicalCrewComponent-Y0Uvf", - "inputTypes": [ - "Agent" - ], + "inputTypes": ["Agent"], "type": "other" } }, @@ -89,16 +77,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-Yjtpu", "name": "model_output", - "output_types": [ - "LanguageModel" - ] + "output_types": ["LanguageModel"] }, "targetHandle": { "fieldName": "llm", "id": "CrewAIAgentComponent-EbpXd", - "inputTypes": [ - "LanguageModel" - ], + "inputTypes": ["LanguageModel"], "type": "other" } }, @@ -116,16 +100,12 @@ "dataType": "CrewAIAgentComponent", "id": "CrewAIAgentComponent-9D8ao", "name": "output", - "output_types": [ - "Agent" - ] + "output_types": ["Agent"] }, "targetHandle": { "fieldName": "manager_agent", "id": "HierarchicalCrewComponent-Y0Uvf", - "inputTypes": [ - "Agent" - ], + "inputTypes": ["Agent"], "type": "other" } }, @@ -143,16 +123,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-HgNnu", "name": "model_output", - "output_types": [ - "LanguageModel" - ] + "output_types": ["LanguageModel"] }, "targetHandle": { "fieldName": "llm", "id": "CrewAIAgentComponent-9D8ao", - "inputTypes": [ - "LanguageModel" - ], + "inputTypes": ["LanguageModel"], "type": "other" } }, @@ -170,16 +146,12 @@ "dataType": "Prompt", "id": "Prompt-eqGhn", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "task_description", "id": "HierarchicalTaskComponent-hE8H5", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -196,17 +168,12 @@ "dataType": "ChatInput", "id": "ChatInput-xgRl9", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "query", "id": "Prompt-eqGhn", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -223,16 +190,12 @@ "dataType": "CrewAIAgentComponent", "id": "CrewAIAgentComponent-UMpxO", "name": "output", - "output_types": [ - "Agent" - ] + "output_types": ["Agent"] }, "targetHandle": { "fieldName": "agents", "id": "HierarchicalCrewComponent-Y0Uvf", - "inputTypes": [ - "Agent" - ], + "inputTypes": ["Agent"], "type": "other" } }, @@ -249,16 +212,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-Yjtpu", "name": "model_output", - "output_types": [ - "LanguageModel" - ] + "output_types": ["LanguageModel"] }, "targetHandle": { "fieldName": "llm", "id": "CrewAIAgentComponent-UMpxO", - "inputTypes": [ - "LanguageModel" - ], + "inputTypes": ["LanguageModel"], "type": "other" } }, @@ -275,16 +234,12 @@ "dataType": "SearchAPI", "id": "SearchAPI-Yokat", "name": "api_build_tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "CrewAIAgentComponent-EbpXd", - "inputTypes": [ - "Tool" - ], + "inputTypes": ["Tool"], "type": "other" } }, @@ -302,9 +257,7 @@ "display_name": "Hierarchical Crew", "id": "HierarchicalCrewComponent-Y0Uvf", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -336,9 +289,7 @@ "name": "output", "required_inputs": [], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -350,9 +301,7 @@ "display_name": "Agents", "dynamic": false, "info": "", - "input_types": [ - "Agent" - ], + "input_types": ["Agent"], "list": true, "name": "agents", "placeholder": "", @@ -386,9 +335,7 @@ "display_name": "Function Calling LLM", "dynamic": false, "info": "Turns the ReAct CrewAI agent into a function-calling agent", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "function_calling_llm", "placeholder": "", @@ -404,9 +351,7 @@ "display_name": "Manager Agent", "dynamic": false, "info": "", - "input_types": [ - "Agent" - ], + "input_types": ["Agent"], "list": false, "name": "manager_agent", "placeholder": "", @@ -422,9 +367,7 @@ "display_name": "Manager LLM", "dynamic": false, "info": "", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "manager_llm", "placeholder": "", @@ -485,9 +428,7 @@ "display_name": "Tasks", "dynamic": false, "info": "", - "input_types": [ - "HierarchicalTask" - ], + "input_types": ["HierarchicalTask"], "list": true, "name": "tasks", "placeholder": "", @@ -549,10 +490,7 @@ "display_name": "OpenAI", "id": "OpenAIModel-Yjtpu", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -584,15 +522,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -612,9 +544,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -626,9 +556,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -662,9 +590,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -768,9 +694,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -831,9 +755,7 @@ "display_name": "System Message", "dynamic": false, "info": "System message to pass to the model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "system_message", @@ -886,9 +808,7 @@ "display_name": "Chat Output", "id": "ChatOutput-VzVJK", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -915,9 +835,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -947,9 +865,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "data_template", @@ -967,9 +883,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as output.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -988,10 +902,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -1005,9 +916,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -1025,9 +934,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -1080,9 +987,7 @@ "display_name": "Hierarchical Task", "id": "HierarchicalTaskComponent-hE8H5", "node": { - "base_classes": [ - "HierarchicalTask" - ], + "base_classes": ["HierarchicalTask"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1090,11 +995,7 @@ "display_name": "Hierarchical Task", "documentation": "", "edited": false, - "field_order": [ - "task_description", - "expected_output", - "tools" - ], + "field_order": ["task_description", "expected_output", "tools"], "frozen": false, "icon": "CrewAI", "metadata": {}, @@ -1106,9 +1007,7 @@ "method": "build_task", "name": "task_output", "selected": "HierarchicalTask", - "types": [ - "HierarchicalTask" - ], + "types": ["HierarchicalTask"], "value": "__UNDEFINED__" } ], @@ -1138,9 +1037,7 @@ "display_name": "Expected Output", "dynamic": false, "info": "Clear definition of expected task outcome.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1159,9 +1056,7 @@ "display_name": "Description", "dynamic": false, "info": "Descriptive text detailing task's purpose and execution.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1180,9 +1075,7 @@ "display_name": "Tools", "dynamic": false, "info": "List of tools/resources limited for task execution. Uses the Agent tools by default.", - "input_types": [ - "Tool" - ], + "input_types": ["Tool"], "list": true, "name": "tools", "placeholder": "", @@ -1218,9 +1111,7 @@ "display_name": "CrewAI Agent", "id": "CrewAIAgentComponent-EbpXd", "node": { - "base_classes": [ - "Agent" - ], + "base_classes": ["Agent"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1251,9 +1142,7 @@ "method": "build_output", "name": "output", "selected": "Agent", - "types": [ - "Agent" - ], + "types": ["Agent"], "value": "__UNDEFINED__" } ], @@ -1295,9 +1184,7 @@ "display_name": "Backstory", "dynamic": false, "info": "The backstory of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1334,9 +1221,7 @@ "display_name": "Goal", "dynamic": false, "info": "The objective of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1370,9 +1255,7 @@ "display_name": "Language Model", "dynamic": false, "info": "Language model that will run the agent.", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "llm", "placeholder": "", @@ -1403,9 +1286,7 @@ "display_name": "Role", "dynamic": false, "info": "The role of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1424,9 +1305,7 @@ "display_name": "Tools", "dynamic": false, "info": "Tools at agents disposal", - "input_types": [ - "Tool" - ], + "input_types": ["Tool"], "list": true, "name": "tools", "placeholder": "", @@ -1477,9 +1356,7 @@ "display_name": "CrewAI Agent", "id": "CrewAIAgentComponent-9D8ao", "node": { - "base_classes": [ - "Agent" - ], + "base_classes": ["Agent"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1510,9 +1387,7 @@ "method": "build_output", "name": "output", "selected": "Agent", - "types": [ - "Agent" - ], + "types": ["Agent"], "value": "__UNDEFINED__" } ], @@ -1554,9 +1429,7 @@ "display_name": "Backstory", "dynamic": false, "info": "The backstory of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1593,9 +1466,7 @@ "display_name": "Goal", "dynamic": false, "info": "The objective of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1629,9 +1500,7 @@ "display_name": "Language Model", "dynamic": false, "info": "Language model that will run the agent.", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "llm", "placeholder": "", @@ -1662,9 +1531,7 @@ "display_name": "Role", "dynamic": false, "info": "The role of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1683,9 +1550,7 @@ "display_name": "Tools", "dynamic": false, "info": "Tools at agents disposal", - "input_types": [ - "Tool" - ], + "input_types": ["Tool"], "list": true, "name": "tools", "placeholder": "", @@ -1736,10 +1601,7 @@ "display_name": "OpenAI", "id": "OpenAIModel-HgNnu", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1771,15 +1633,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -1799,9 +1655,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -1813,9 +1667,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -1849,9 +1701,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -1955,9 +1805,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -2018,9 +1866,7 @@ "display_name": "System Message", "dynamic": false, "info": "System message to pass to the model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "system_message", @@ -2073,24 +1919,18 @@ "display_name": "Prompt", "id": "Prompt-eqGhn", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "query" - ] + "template": ["query"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, "error": null, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "full_path": null, "icon": "prompts", @@ -2107,9 +1947,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -2142,10 +1980,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -2196,9 +2031,7 @@ "data": { "id": "ChatInput-xgRl9", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2225,9 +2058,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -2298,9 +2129,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as input.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2320,10 +2149,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -2337,9 +2163,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -2357,9 +2181,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -2412,9 +2234,7 @@ "display_name": "CrewAI Agent", "id": "CrewAIAgentComponent-UMpxO", "node": { - "base_classes": [ - "Agent" - ], + "base_classes": ["Agent"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2445,9 +2265,7 @@ "method": "build_output", "name": "output", "selected": "Agent", - "types": [ - "Agent" - ], + "types": ["Agent"], "value": "__UNDEFINED__" } ], @@ -2489,9 +2307,7 @@ "display_name": "Backstory", "dynamic": false, "info": "The backstory of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2528,9 +2344,7 @@ "display_name": "Goal", "dynamic": false, "info": "The objective of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2564,9 +2378,7 @@ "display_name": "Language Model", "dynamic": false, "info": "Language model that will run the agent.", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "llm", "placeholder": "", @@ -2597,9 +2409,7 @@ "display_name": "Role", "dynamic": false, "info": "The role of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2618,9 +2428,7 @@ "display_name": "Tools", "dynamic": false, "info": "Tools at agents disposal", - "input_types": [ - "Tool" - ], + "input_types": ["Tool"], "list": true, "name": "tools", "placeholder": "", @@ -2669,10 +2477,7 @@ "data": { "id": "SearchAPI-Yokat", "node": { - "base_classes": [ - "Data", - "Tool" - ], + "base_classes": ["Data", "Tool"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2704,9 +2509,7 @@ "search_params" ], "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -2723,9 +2526,7 @@ "search_params" ], "selected": "Tool", - "types": [ - "Tool" - ], + "types": ["Tool"], "value": "__UNDEFINED__" } ], @@ -2737,9 +2538,7 @@ "display_name": "SearchAPI API Key", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -2773,9 +2572,7 @@ "display_name": "Engine", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "engine", @@ -2793,9 +2590,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2884,8 +2679,10 @@ }, "description": "This Agentic Flow has a Manager and a couple Workers. The manager can answer the user's question straightaway or delegate the task to other agents.", "endpoint_name": null, + "icon": "GitFork", "id": "6302081f-5af2-4b9f-bd19-2baaf7218ba6", "is_component": false, "last_tested_version": "1.0.12", - "name": "Hierarchical Tasks Agent" -} \ No newline at end of file + "name": "Hierarchical Tasks Agent", + "tags": ["agents", "openai", "chatbots"] +} diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json b/src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json index c80d99a80..4cc925545 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json @@ -8,17 +8,12 @@ "dataType": "ChatInput", "id": "ChatInput-6yuNd", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "user_message", "id": "Prompt-tifRl", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -35,16 +30,12 @@ "dataType": "Prompt", "id": "Prompt-tifRl", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-ZIeE0", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -61,16 +52,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-ZIeE0", "name": "text_output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-c3v9q", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -87,17 +74,12 @@ "dataType": "Memory", "id": "Memory-6s5g1", "name": "messages_text", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "context", "id": "Prompt-tifRl", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -115,24 +97,17 @@ "display_name": "Prompt", "id": "Prompt-tifRl", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "context", - "user_message" - ] + "template": ["context", "user_message"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "icon": "prompts", "metadata": {}, @@ -144,9 +119,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -179,10 +152,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -219,10 +189,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -260,9 +227,7 @@ "display_name": "Chat Input", "id": "ChatInput-6yuNd", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -289,9 +254,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -362,9 +325,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as input.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -384,10 +345,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -401,9 +359,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -421,9 +377,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -477,10 +431,7 @@ "display_name": "OpenAI", "id": "OpenAIModel-ZIeE0", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -512,15 +463,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -540,9 +485,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -555,9 +498,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -591,9 +532,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -696,9 +635,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -810,9 +747,7 @@ "display_name": "Chat Output", "id": "ChatOutput-c3v9q", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -839,9 +774,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -871,9 +804,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "data_template", @@ -891,9 +822,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as output.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -912,10 +841,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -929,9 +855,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -949,9 +873,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -1000,11 +922,7 @@ "display_name": "Chat Memory", "id": "Memory-6s5g1", "node": { - "base_classes": [ - "BaseChatMemory", - "Data", - "Message" - ], + "base_classes": ["BaseChatMemory", "Data", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1032,9 +950,7 @@ "method": "retrieve_messages", "name": "messages", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -1043,9 +959,7 @@ "method": "retrieve_messages_as_text", "name": "messages_text", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -1054,9 +968,7 @@ "method": "build_lc_memory", "name": "lc_memory", "selected": "BaseChatMemory", - "types": [ - "BaseChatMemory" - ], + "types": ["BaseChatMemory"], "value": "__UNDEFINED__" } ], @@ -1086,9 +998,7 @@ "display_name": "External Memory", "dynamic": false, "info": "Retrieve messages from an external memory. If empty, it will use the Langflow tables.", - "input_types": [ - "BaseChatMessageHistory" - ], + "input_types": ["BaseChatMessageHistory"], "list": false, "name": "memory", "placeholder": "", @@ -1120,10 +1030,7 @@ "dynamic": false, "info": "Order of the messages.", "name": "order", - "options": [ - "Ascending", - "Descending" - ], + "options": ["Ascending", "Descending"], "placeholder": "", "required": false, "show": true, @@ -1138,11 +1045,7 @@ "dynamic": false, "info": "Filter by sender type.", "name": "sender", - "options": [ - "Machine", - "User", - "Machine and User" - ], + "options": ["Machine", "User", "Machine and User"], "placeholder": "", "required": false, "show": true, @@ -1156,9 +1059,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Filter by sender name.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -1176,9 +1077,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -1196,9 +1095,7 @@ "display_name": "Template", "dynamic": false, "info": "The template to use for formatting the data. It can contain the keys {text}, {sender} or any other key in the message data.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1240,8 +1137,10 @@ }, "description": "This project can be used as a starting point for building a Chat experience with user specific memory. You can set a different Session ID to start a new message history.", "endpoint_name": null, + "icon": "MessagesSquare", "id": "ff6810d0-1d7b-4455-9b35-c9f54f7d63b6", "is_component": false, "last_tested_version": "1.0.9", - "name": "Memory Chatbot" -} \ No newline at end of file + "name": "Memory Chatbot", + "tags": ["chatbots", "openai"] +} diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Sequential Agent.json b/src/backend/base/langflow/initial_setup/starter_projects/Sequential Agent.json index e801f1089..8880a2fd0 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Sequential Agent.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Sequential Agent.json @@ -8,16 +8,12 @@ "dataType": "SequentialCrewComponent", "id": "SequentialCrewComponent-3dbbB", "name": "output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-nwCjg", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -34,17 +30,12 @@ "dataType": "TextInput", "id": "TextInput-6QUGr", "name": "text", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "topic", "id": "Prompt-GOdlL", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -61,17 +52,12 @@ "dataType": "TextInput", "id": "TextInput-6QUGr", "name": "text", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "topic", "id": "Prompt-824D7", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -88,17 +74,12 @@ "dataType": "TextInput", "id": "TextInput-6QUGr", "name": "text", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "topic", "id": "Prompt-0vHob", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -115,16 +96,12 @@ "dataType": "Prompt", "id": "Prompt-GOdlL", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "task_description", "id": "SequentialTaskAgentComponent-GWMA1", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -141,16 +118,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-lQ5HF", "name": "model_output", - "output_types": [ - "LanguageModel" - ] + "output_types": ["LanguageModel"] }, "targetHandle": { "fieldName": "llm", "id": "SequentialTaskAgentComponent-GWMA1", - "inputTypes": [ - "LanguageModel" - ], + "inputTypes": ["LanguageModel"], "type": "other" } }, @@ -166,16 +139,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-lQ5HF", "name": "model_output", - "output_types": [ - "LanguageModel" - ] + "output_types": ["LanguageModel"] }, "targetHandle": { "fieldName": "llm", "id": "SequentialTaskAgentComponent-5i4Wg", - "inputTypes": [ - "LanguageModel" - ], + "inputTypes": ["LanguageModel"], "type": "other" } }, @@ -191,16 +160,12 @@ "dataType": "Prompt", "id": "Prompt-824D7", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "task_description", "id": "SequentialTaskAgentComponent-5i4Wg", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -216,16 +181,12 @@ "dataType": "SequentialTaskAgentComponent", "id": "SequentialTaskAgentComponent-GWMA1", "name": "task_output", - "output_types": [ - "SequentialTask" - ] + "output_types": ["SequentialTask"] }, "targetHandle": { "fieldName": "previous_task", "id": "SequentialTaskAgentComponent-5i4Wg", - "inputTypes": [ - "SequentialTask" - ], + "inputTypes": ["SequentialTask"], "type": "other" } }, @@ -241,16 +202,12 @@ "dataType": "SequentialTaskAgentComponent", "id": "SequentialTaskAgentComponent-5i4Wg", "name": "task_output", - "output_types": [ - "SequentialTask" - ] + "output_types": ["SequentialTask"] }, "targetHandle": { "fieldName": "previous_task", "id": "SequentialTaskAgentComponent-TPEWE", - "inputTypes": [ - "SequentialTask" - ], + "inputTypes": ["SequentialTask"], "type": "other" } }, @@ -266,16 +223,12 @@ "dataType": "Prompt", "id": "Prompt-0vHob", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "task_description", "id": "SequentialTaskAgentComponent-TPEWE", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -291,16 +244,12 @@ "dataType": "SequentialTaskAgentComponent", "id": "SequentialTaskAgentComponent-TPEWE", "name": "task_output", - "output_types": [ - "SequentialTask" - ] + "output_types": ["SequentialTask"] }, "targetHandle": { "fieldName": "tasks", "id": "SequentialCrewComponent-3dbbB", - "inputTypes": [ - "SequentialTask" - ], + "inputTypes": ["SequentialTask"], "type": "other" } }, @@ -316,16 +265,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-lQ5HF", "name": "model_output", - "output_types": [ - "LanguageModel" - ] + "output_types": ["LanguageModel"] }, "targetHandle": { "fieldName": "llm", "id": "SequentialTaskAgentComponent-TPEWE", - "inputTypes": [ - "LanguageModel" - ], + "inputTypes": ["LanguageModel"], "type": "other" } }, @@ -341,16 +286,12 @@ "dataType": "YFinanceTool", "id": "YFinanceTool-Asoka", "name": "tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "SequentialTaskAgentComponent-GWMA1", - "inputTypes": [ - "Tool" - ], + "inputTypes": ["Tool"], "type": "other" } }, @@ -368,9 +309,7 @@ "display_name": "Sequential Crew", "id": "SequentialCrewComponent-3dbbB", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -400,9 +339,7 @@ "name": "output", "required_inputs": [], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -432,9 +369,7 @@ "display_name": "Function Calling LLM", "dynamic": false, "info": "Turns the ReAct CrewAI agent into a function-calling agent", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "function_calling_llm", "placeholder": "", @@ -495,9 +430,7 @@ "display_name": "Tasks", "dynamic": false, "info": "", - "input_types": [ - "SequentialTask" - ], + "input_types": ["SequentialTask"], "list": true, "name": "tasks", "placeholder": "", @@ -561,10 +494,7 @@ "data": { "id": "OpenAIModel-lQ5HF", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -597,15 +527,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -625,9 +549,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -640,9 +562,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -676,9 +596,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -781,9 +699,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -895,9 +811,7 @@ "display_name": "Chat Output", "id": "ChatOutput-nwCjg", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -925,9 +839,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -957,9 +869,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "data_template", @@ -977,9 +887,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as output.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -998,10 +906,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -1015,9 +920,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -1035,9 +938,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -1084,9 +985,7 @@ "data": { "id": "TextInput-6QUGr", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1094,9 +993,7 @@ "display_name": "Topic", "documentation": "", "edited": false, - "field_order": [ - "input_value" - ], + "field_order": ["input_value"], "frozen": false, "icon": "type", "lf_version": "1.0.15", @@ -1108,9 +1005,7 @@ "method": "text_response", "name": "text", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1140,9 +1035,7 @@ "display_name": "Text", "dynamic": false, "info": "Text to be passed as input.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -1180,23 +1073,17 @@ "display_name": "Prompt", "id": "Prompt-GOdlL", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "topic" - ] + "template": ["topic"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "icon": "prompts", "lf_version": "1.0.15", @@ -1209,9 +1096,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1260,10 +1145,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -1301,23 +1183,17 @@ "display_name": "Prompt", "id": "Prompt-824D7", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "topic" - ] + "template": ["topic"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "icon": "prompts", "lf_version": "1.0.15", @@ -1330,9 +1206,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1381,10 +1255,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -1422,23 +1293,17 @@ "display_name": "Prompt", "id": "Prompt-0vHob", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "topic" - ] + "template": ["topic"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "icon": "prompts", "lf_version": "1.0.15", @@ -1451,9 +1316,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1502,10 +1365,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -1541,9 +1401,7 @@ "data": { "id": "SequentialTaskAgentComponent-GWMA1", "node": { - "base_classes": [ - "SequentialTask" - ], + "base_classes": ["SequentialTask"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1579,9 +1437,7 @@ "method": "build_agent_and_task", "name": "task_output", "selected": "SequentialTask", - "types": [ - "SequentialTask" - ], + "types": ["SequentialTask"], "value": "__UNDEFINED__" } ], @@ -1658,9 +1514,7 @@ "display_name": "Backstory", "dynamic": false, "info": "The backstory of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1698,9 +1552,7 @@ "display_name": "Expected Task Output", "dynamic": false, "info": "Clear definition of expected task outcome.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1720,9 +1572,7 @@ "display_name": "Goal", "dynamic": false, "info": "The objective of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1742,9 +1592,7 @@ "display_name": "Language Model", "dynamic": false, "info": "Language model that will run the agent.", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "llm", "placeholder": "", @@ -1777,9 +1625,7 @@ "display_name": "Previous Task", "dynamic": false, "info": "The previous task in the sequence (for chaining).", - "input_types": [ - "SequentialTask" - ], + "input_types": ["SequentialTask"], "list": false, "name": "previous_task", "placeholder": "", @@ -1796,9 +1642,7 @@ "display_name": "Role", "dynamic": false, "info": "The role of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1818,9 +1662,7 @@ "display_name": "Task Description", "dynamic": false, "info": "Descriptive text detailing task's purpose and execution.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1840,9 +1682,7 @@ "display_name": "Tools", "dynamic": false, "info": "Tools at agent's disposal", - "input_types": [ - "Tool" - ], + "input_types": ["Tool"], "list": true, "name": "tools", "placeholder": "", @@ -1892,9 +1732,7 @@ "data": { "id": "SequentialTaskAgentComponent-5i4Wg", "node": { - "base_classes": [ - "SequentialTask" - ], + "base_classes": ["SequentialTask"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1930,9 +1768,7 @@ "method": "build_agent_and_task", "name": "task_output", "selected": "SequentialTask", - "types": [ - "SequentialTask" - ], + "types": ["SequentialTask"], "value": "__UNDEFINED__" } ], @@ -2009,9 +1845,7 @@ "display_name": "Backstory", "dynamic": false, "info": "The backstory of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2049,9 +1883,7 @@ "display_name": "Expected Task Output", "dynamic": false, "info": "Clear definition of expected task outcome.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2071,9 +1903,7 @@ "display_name": "Goal", "dynamic": false, "info": "The objective of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2093,9 +1923,7 @@ "display_name": "Language Model", "dynamic": false, "info": "Language model that will run the agent.", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "llm", "placeholder": "", @@ -2128,9 +1956,7 @@ "display_name": "Previous Task", "dynamic": false, "info": "The previous task in the sequence (for chaining).", - "input_types": [ - "SequentialTask" - ], + "input_types": ["SequentialTask"], "list": false, "name": "previous_task", "placeholder": "", @@ -2147,9 +1973,7 @@ "display_name": "Role", "dynamic": false, "info": "The role of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2169,9 +1993,7 @@ "display_name": "Task Description", "dynamic": false, "info": "Descriptive text detailing task's purpose and execution.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2191,9 +2013,7 @@ "display_name": "Tools", "dynamic": false, "info": "Tools at agent's disposal", - "input_types": [ - "Tool" - ], + "input_types": ["Tool"], "list": true, "name": "tools", "placeholder": "", @@ -2243,9 +2063,7 @@ "data": { "id": "SequentialTaskAgentComponent-TPEWE", "node": { - "base_classes": [ - "SequentialTask" - ], + "base_classes": ["SequentialTask"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2281,9 +2099,7 @@ "method": "build_agent_and_task", "name": "task_output", "selected": "SequentialTask", - "types": [ - "SequentialTask" - ], + "types": ["SequentialTask"], "value": "__UNDEFINED__" } ], @@ -2360,9 +2176,7 @@ "display_name": "Backstory", "dynamic": false, "info": "The backstory of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2400,9 +2214,7 @@ "display_name": "Expected Task Output", "dynamic": false, "info": "Clear definition of expected task outcome.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2422,9 +2234,7 @@ "display_name": "Goal", "dynamic": false, "info": "The objective of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2444,9 +2254,7 @@ "display_name": "Language Model", "dynamic": false, "info": "Language model that will run the agent.", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "llm", "placeholder": "", @@ -2479,9 +2287,7 @@ "display_name": "Previous Task", "dynamic": false, "info": "The previous task in the sequence (for chaining).", - "input_types": [ - "SequentialTask" - ], + "input_types": ["SequentialTask"], "list": false, "name": "previous_task", "placeholder": "", @@ -2498,9 +2304,7 @@ "display_name": "Role", "dynamic": false, "info": "The role of the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2520,9 +2324,7 @@ "display_name": "Task Description", "dynamic": false, "info": "Descriptive text detailing task's purpose and execution.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2542,9 +2344,7 @@ "display_name": "Tools", "dynamic": false, "info": "Tools at agent's disposal", - "input_types": [ - "Tool" - ], + "input_types": ["Tool"], "list": true, "name": "tools", "placeholder": "", @@ -2594,9 +2394,7 @@ "data": { "id": "YFinanceTool-Asoka", "node": { - "base_classes": [ - "Tool" - ], + "base_classes": ["Tool"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2616,9 +2414,7 @@ "method": "run_model", "name": "api_run_model", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -2627,9 +2423,7 @@ "method": "build_tool", "name": "tool", "selected": "Tool", - "types": [ - "Tool" - ], + "types": ["Tool"], "value": "__UNDEFINED__" } ], @@ -2660,9 +2454,7 @@ "display_name": "Query", "dynamic": false, "info": "Input should be a company ticker. For example, AAPL for Apple, MSFT for Microsoft.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -2703,8 +2495,10 @@ }, "description": "This Agent runs tasks in a predefined sequence.", "endpoint_name": null, + "icon": "ListOrdered", "id": "c2e3229c-813e-43eb-9041-cdfcfab90e08", "is_component": false, "last_tested_version": "1.0.15", - "name": "Sequential Tasks Agent" -} \ No newline at end of file + "name": "Sequential Tasks Agent", + "tags": ["agents", "openai", "chatbots"] +} diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json b/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json index be4827bdb..54231ee8d 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json @@ -8,16 +8,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-gRakF", "name": "model_output", - "output_types": [ - "LanguageModel" - ] + "output_types": ["LanguageModel"] }, "targetHandle": { "fieldName": "llm", "id": "ToolCallingAgent-0QzrL", - "inputTypes": [ - "LanguageModel" - ], + "inputTypes": ["LanguageModel"], "type": "other" } }, @@ -34,16 +30,12 @@ "dataType": "ChatInput", "id": "ChatInput-uYdzQ", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ToolCallingAgent-0QzrL", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -60,16 +52,12 @@ "dataType": "ToolCallingAgent", "id": "ToolCallingAgent-KLe5u", "name": "response", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ToolCallingAgent-VYDK9", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -86,16 +74,12 @@ "dataType": "ToolCallingAgent", "id": "ToolCallingAgent-0QzrL", "name": "response", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ToolCallingAgent-KLe5u", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -112,17 +96,12 @@ "dataType": "SearchAPI", "id": "SearchAPI-I4yU0", "name": "api_build_tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "ToolCallingAgent-0QzrL", - "inputTypes": [ - "Tool", - "BaseTool" - ], + "inputTypes": ["Tool", "BaseTool"], "type": "other" } }, @@ -139,17 +118,12 @@ "dataType": "url_content_fetcher", "id": "url_content_fetcher-1FugB", "name": "api_build_tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "ToolCallingAgent-0QzrL", - "inputTypes": [ - "Tool", - "BaseTool" - ], + "inputTypes": ["Tool", "BaseTool"], "type": "other" } }, @@ -166,17 +140,12 @@ "dataType": "SearchAPI", "id": "SearchAPI-I4yU0", "name": "api_build_tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "ToolCallingAgent-KLe5u", - "inputTypes": [ - "Tool", - "BaseTool" - ], + "inputTypes": ["Tool", "BaseTool"], "type": "other" } }, @@ -193,17 +162,12 @@ "dataType": "url_content_fetcher", "id": "url_content_fetcher-1FugB", "name": "api_build_tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "ToolCallingAgent-KLe5u", - "inputTypes": [ - "Tool", - "BaseTool" - ], + "inputTypes": ["Tool", "BaseTool"], "type": "other" } }, @@ -220,17 +184,12 @@ "dataType": "url_content_fetcher", "id": "url_content_fetcher-1FugB", "name": "api_build_tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "ToolCallingAgent-VYDK9", - "inputTypes": [ - "Tool", - "BaseTool" - ], + "inputTypes": ["Tool", "BaseTool"], "type": "other" } }, @@ -247,17 +206,12 @@ "dataType": "SearchAPI", "id": "SearchAPI-I4yU0", "name": "api_build_tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "ToolCallingAgent-VYDK9", - "inputTypes": [ - "Tool", - "BaseTool" - ], + "inputTypes": ["Tool", "BaseTool"], "type": "other" } }, @@ -274,16 +228,12 @@ "dataType": "ToolCallingAgent", "id": "ToolCallingAgent-VYDK9", "name": "response", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-O63dG", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -300,16 +250,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-gRakF", "name": "model_output", - "output_types": [ - "LanguageModel" - ] + "output_types": ["LanguageModel"] }, "targetHandle": { "fieldName": "llm", "id": "ToolCallingAgent-VYDK9", - "inputTypes": [ - "LanguageModel" - ], + "inputTypes": ["LanguageModel"], "type": "other" } }, @@ -326,16 +272,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-gRakF", "name": "model_output", - "output_types": [ - "LanguageModel" - ] + "output_types": ["LanguageModel"] }, "targetHandle": { "fieldName": "llm", "id": "ToolCallingAgent-KLe5u", - "inputTypes": [ - "LanguageModel" - ], + "inputTypes": ["LanguageModel"], "type": "other" } }, @@ -352,17 +294,12 @@ "dataType": "CalculatorTool", "id": "CalculatorTool-5S6u9", "name": "api_build_tool", - "output_types": [ - "Tool" - ] + "output_types": ["Tool"] }, "targetHandle": { "fieldName": "tools", "id": "ToolCallingAgent-VYDK9", - "inputTypes": [ - "Tool", - "BaseTool" - ], + "inputTypes": ["Tool", "BaseTool"], "type": "other" } }, @@ -378,9 +315,7 @@ "data": { "id": "ChatInput-uYdzQ", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -408,9 +343,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -483,9 +416,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as input.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -507,10 +438,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -525,9 +453,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -546,9 +472,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -600,9 +524,7 @@ "data": { "id": "ChatOutput-O63dG", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -630,9 +552,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -663,9 +583,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "data_template", @@ -684,9 +602,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as output.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -707,10 +623,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -725,9 +638,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -746,9 +657,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -802,10 +711,7 @@ "display_name": "OpenAI", "id": "OpenAIModel-gRakF", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -837,15 +743,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -865,9 +765,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -880,9 +778,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -917,9 +813,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -1035,9 +929,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -1102,9 +994,7 @@ "display_name": "System Message", "dynamic": false, "info": "System message to pass to the model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "system_message", @@ -1156,10 +1046,7 @@ "data": { "id": "ToolCallingAgent-0QzrL", "node": { - "base_classes": [ - "AgentExecutor", - "Message" - ], + "base_classes": ["AgentExecutor", "Message"], "beta": true, "conditional_paths": [], "custom_fields": {}, @@ -1189,9 +1076,7 @@ "method": "build_agent", "name": "agent", "selected": "AgentExecutor", - "types": [ - "AgentExecutor" - ], + "types": ["AgentExecutor"], "value": "__UNDEFINED__" }, { @@ -1200,9 +1085,7 @@ "method": "message_response", "name": "response", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1215,9 +1098,7 @@ "display_name": "Chat History", "dynamic": false, "info": "", - "input_types": [ - "Data" - ], + "input_types": ["Data"], "list": true, "name": "chat_history", "placeholder": "", @@ -1269,9 +1150,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -1290,9 +1169,7 @@ "display_name": "Language Model", "dynamic": false, "info": "", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "llm", "placeholder": "", @@ -1325,9 +1202,7 @@ "display_name": "System Prompt", "dynamic": false, "info": "System prompt for the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1347,10 +1222,7 @@ "display_name": "Tools", "dynamic": false, "info": "", - "input_types": [ - "Tool", - "BaseTool" - ], + "input_types": ["Tool", "BaseTool"], "list": true, "load_from_db": false, "name": "tools", @@ -1368,9 +1240,7 @@ "display_name": "Prompt", "dynamic": false, "info": "This prompt must contain 'input' key.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1423,11 +1293,7 @@ "data": { "id": "SearchAPI-I4yU0", "node": { - "base_classes": [ - "Data", - "list", - "Tool" - ], + "base_classes": ["Data", "list", "Tool"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1461,9 +1327,7 @@ "search_params" ], "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -1480,9 +1344,7 @@ "search_params" ], "selected": "Tool", - "types": [ - "Tool" - ], + "types": ["Tool"], "value": "__UNDEFINED__" } ], @@ -1495,9 +1357,7 @@ "display_name": "SearchAPI API Key", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -1532,9 +1392,7 @@ "display_name": "Engine", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "engine", @@ -1553,9 +1411,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1640,11 +1496,7 @@ "data": { "id": "url_content_fetcher-1FugB", "node": { - "base_classes": [ - "Data", - "list", - "Tool" - ], + "base_classes": ["Data", "list", "Tool"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1652,10 +1504,7 @@ "display_name": "URL Content Fetcher", "documentation": "https://python.langchain.com/docs/modules/data_connection/document_loaders/integrations/web_base", "edited": true, - "field_order": [ - "url", - "fetch_params" - ], + "field_order": ["url", "fetch_params"], "frozen": false, "icon": "globe", "lf_version": "1.0.15", @@ -1668,10 +1517,7 @@ "method": "run_model", "name": "api_run_model", "selected": "Data", - "types": [ - "Data", - "list" - ], + "types": ["Data", "list"], "value": "__UNDEFINED__" }, { @@ -1680,9 +1526,7 @@ "method": "build_tool", "name": "api_build_tool", "selected": "Tool", - "types": [ - "Tool" - ], + "types": ["Tool"], "value": "__UNDEFINED__" } ], @@ -1729,9 +1573,7 @@ "display_name": "URL", "dynamic": false, "info": "Enter a single URL to fetch content from.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "url", @@ -1767,10 +1609,7 @@ "data": { "id": "ToolCallingAgent-KLe5u", "node": { - "base_classes": [ - "AgentExecutor", - "Message" - ], + "base_classes": ["AgentExecutor", "Message"], "beta": true, "conditional_paths": [], "custom_fields": {}, @@ -1800,9 +1639,7 @@ "method": "build_agent", "name": "agent", "selected": "AgentExecutor", - "types": [ - "AgentExecutor" - ], + "types": ["AgentExecutor"], "value": "__UNDEFINED__" }, { @@ -1811,9 +1648,7 @@ "method": "message_response", "name": "response", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1826,9 +1661,7 @@ "display_name": "Chat History", "dynamic": false, "info": "", - "input_types": [ - "Data" - ], + "input_types": ["Data"], "list": true, "name": "chat_history", "placeholder": "", @@ -1880,9 +1713,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -1901,9 +1732,7 @@ "display_name": "Language Model", "dynamic": false, "info": "", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "llm", "placeholder": "", @@ -1936,9 +1765,7 @@ "display_name": "System Prompt", "dynamic": false, "info": "System prompt for the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1958,10 +1785,7 @@ "display_name": "Tools", "dynamic": false, "info": "", - "input_types": [ - "Tool", - "BaseTool" - ], + "input_types": ["Tool", "BaseTool"], "list": true, "load_from_db": false, "name": "tools", @@ -1979,9 +1803,7 @@ "display_name": "Prompt", "dynamic": false, "info": "This prompt must contain 'input' key.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2034,10 +1856,7 @@ "data": { "id": "ToolCallingAgent-VYDK9", "node": { - "base_classes": [ - "AgentExecutor", - "Message" - ], + "base_classes": ["AgentExecutor", "Message"], "beta": true, "conditional_paths": [], "custom_fields": {}, @@ -2067,9 +1886,7 @@ "method": "build_agent", "name": "agent", "selected": "AgentExecutor", - "types": [ - "AgentExecutor" - ], + "types": ["AgentExecutor"], "value": "__UNDEFINED__" }, { @@ -2078,9 +1895,7 @@ "method": "message_response", "name": "response", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -2093,9 +1908,7 @@ "display_name": "Chat History", "dynamic": false, "info": "", - "input_types": [ - "Data" - ], + "input_types": ["Data"], "list": true, "name": "chat_history", "placeholder": "", @@ -2147,9 +1960,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -2168,9 +1979,7 @@ "display_name": "Language Model", "dynamic": false, "info": "", - "input_types": [ - "LanguageModel" - ], + "input_types": ["LanguageModel"], "list": false, "name": "llm", "placeholder": "", @@ -2203,9 +2012,7 @@ "display_name": "System Prompt", "dynamic": false, "info": "System prompt for the agent.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2225,10 +2032,7 @@ "display_name": "Tools", "dynamic": false, "info": "", - "input_types": [ - "Tool", - "BaseTool" - ], + "input_types": ["Tool", "BaseTool"], "list": true, "load_from_db": false, "name": "tools", @@ -2246,9 +2050,7 @@ "display_name": "Prompt", "dynamic": false, "info": "This prompt must contain 'input' key.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2301,12 +2103,7 @@ "data": { "id": "CalculatorTool-5S6u9", "node": { - "base_classes": [ - "Data", - "list", - "Sequence", - "Tool" - ], + "base_classes": ["Data", "list", "Sequence", "Tool"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2314,9 +2111,7 @@ "display_name": "Calculator", "documentation": "", "edited": false, - "field_order": [ - "expression" - ], + "field_order": ["expression"], "frozen": false, "icon": "calculator", "lf_version": "1.0.15", @@ -2329,13 +2124,9 @@ "display_name": "Data", "method": "run_model", "name": "api_run_model", - "required_inputs": [ - "expression" - ], + "required_inputs": ["expression"], "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -2343,13 +2134,9 @@ "display_name": "Tool", "method": "build_tool", "name": "api_build_tool", - "required_inputs": [ - "expression" - ], + "required_inputs": ["expression"], "selected": "Tool", - "types": [ - "Tool" - ], + "types": ["Tool"], "value": "__UNDEFINED__" } ], @@ -2380,9 +2167,7 @@ "display_name": "Expression", "dynamic": false, "info": "The arithmetic expression to evaluate (e.g., '4*4*(33/22)+12-20').", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "expression", @@ -2423,8 +2208,10 @@ }, "description": "Multi Agent system to plan trips.", "endpoint_name": null, + "icon": "Plane", "id": "c15755c5-264b-4ca7-bed8-9bbf605307f1", "is_component": false, "last_tested_version": "1.0.17", - "name": "Travel Planning Agents" -} \ No newline at end of file + "name": "Travel Planning Agents", + "tags": ["agents", "openai", "chatbots"] +} diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json b/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json index c9ed1859a..5e44c8999 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json @@ -8,16 +8,12 @@ "dataType": "ChatInput", "id": "ChatInput-jvvNM", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "search_input", "id": "AstraVectorStoreComponent-0WT85", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -34,17 +30,12 @@ "dataType": "ParseData", "id": "ParseData-f6Jhl", "name": "text", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "context", "id": "Prompt-oJ8Eh", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -61,17 +52,12 @@ "dataType": "ChatInput", "id": "ChatInput-jvvNM", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "question", "id": "Prompt-oJ8Eh", - "inputTypes": [ - "Message", - "Text" - ], + "inputTypes": ["Message", "Text"], "type": "str" } }, @@ -88,16 +74,12 @@ "dataType": "File", "id": "File-JZzdd", "name": "data", - "output_types": [ - "Data" - ] + "output_types": ["Data"] }, "targetHandle": { "fieldName": "data_inputs", "id": "SplitText-Kl7VQ", - "inputTypes": [ - "Data" - ], + "inputTypes": ["Data"], "type": "other" } }, @@ -114,16 +96,12 @@ "dataType": "SplitText", "id": "SplitText-Kl7VQ", "name": "chunks", - "output_types": [ - "Data" - ] + "output_types": ["Data"] }, "targetHandle": { "fieldName": "ingest_data", "id": "AstraVectorStoreComponent-EUhWZ", - "inputTypes": [ - "Data" - ], + "inputTypes": ["Data"], "type": "other" } }, @@ -140,16 +118,12 @@ "dataType": "OpenAIEmbeddings", "id": "OpenAIEmbeddings-Mf9md", "name": "embeddings", - "output_types": [ - "Embeddings" - ] + "output_types": ["Embeddings"] }, "targetHandle": { "fieldName": "embedding", "id": "AstraVectorStoreComponent-EUhWZ", - "inputTypes": [ - "Embeddings" - ], + "inputTypes": ["Embeddings"], "type": "other" } }, @@ -166,16 +140,12 @@ "dataType": "OpenAIEmbeddings", "id": "OpenAIEmbeddings-q2lBh", "name": "embeddings", - "output_types": [ - "Embeddings" - ] + "output_types": ["Embeddings"] }, "targetHandle": { "fieldName": "embedding", "id": "AstraVectorStoreComponent-0WT85", - "inputTypes": [ - "Embeddings" - ], + "inputTypes": ["Embeddings"], "type": "other" } }, @@ -192,16 +162,12 @@ "dataType": "Prompt", "id": "Prompt-oJ8Eh", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-3v8LQ", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -218,16 +184,12 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-3v8LQ", "name": "text_output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", "id": "ChatOutput-oPZbw", - "inputTypes": [ - "Message" - ], + "inputTypes": ["Message"], "type": "str" } }, @@ -244,16 +206,12 @@ "dataType": "AstraVectorStoreComponent", "id": "AstraVectorStoreComponent-0WT85", "name": "search_results", - "output_types": [ - "Data" - ] + "output_types": ["Data"] }, "targetHandle": { "fieldName": "data", "id": "ParseData-f6Jhl", - "inputTypes": [ - "Data" - ], + "inputTypes": ["Data"], "type": "other" } }, @@ -271,9 +229,7 @@ "display_name": "Chat Input", "id": "ChatInput-jvvNM", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -300,9 +256,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -373,9 +327,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as input.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -395,10 +347,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -412,9 +361,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -432,9 +379,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -488,10 +433,7 @@ "edited": false, "id": "AstraVectorStoreComponent-0WT85", "node": { - "base_classes": [ - "Data", - "Retriever" - ], + "base_classes": ["Data", "Retriever"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -534,9 +476,7 @@ "name": "base_retriever", "required_inputs": [], "selected": "Retriever", - "types": [ - "Retriever" - ], + "types": ["Retriever"], "value": "__UNDEFINED__" }, { @@ -568,9 +508,7 @@ "token" ], "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -580,9 +518,7 @@ "name": "vector_store", "required_inputs": [], "selected": "VectorStore", - "types": [ - "VectorStore" - ], + "types": ["VectorStore"], "value": "__UNDEFINED__" } ], @@ -594,9 +530,7 @@ "display_name": "API Endpoint", "dynamic": false, "info": "API endpoint URL for the Astra DB service.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_endpoint", "password": true, @@ -722,9 +656,7 @@ "display_name": "Embedding Model", "dynamic": false, "info": "Allows an embedding model configuration.", - "input_types": [ - "Embeddings" - ], + "input_types": ["Embeddings"], "list": false, "name": "embedding", "placeholder": "", @@ -743,10 +675,7 @@ "dynamic": false, "info": "Determines whether to use Astra Vectorize for the collection.", "name": "embedding_service", - "options": [ - "Embedding Model", - "Astra Vectorize" - ], + "options": ["Embedding Model", "Astra Vectorize"], "placeholder": "", "real_time_refresh": true, "required": false, @@ -761,9 +690,7 @@ "display_name": "Ingest Data", "dynamic": false, "info": "", - "input_types": [ - "Data" - ], + "input_types": ["Data"], "list": true, "name": "ingest_data", "placeholder": "", @@ -813,11 +740,7 @@ "dynamic": false, "info": "Optional distance metric for vector comparisons in the vector store.", "name": "metric", - "options": [ - "cosine", - "dot_product", - "euclidean" - ], + "options": ["cosine", "dot_product", "euclidean"], "placeholder": "", "required": false, "show": true, @@ -892,9 +815,7 @@ "display_name": "Search Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -948,11 +869,7 @@ "dynamic": false, "info": "Configuration mode for setting up the vector store, with options like 'Sync', 'Async', or 'Off'.", "name": "setup_mode", - "options": [ - "Sync", - "Async", - "Off" - ], + "options": ["Sync", "Async", "Off"], "placeholder": "", "required": false, "show": true, @@ -966,9 +883,7 @@ "display_name": "Astra DB Application Token", "dynamic": false, "info": "Authentication token for accessing Astra DB.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "token", "password": true, @@ -1004,9 +919,7 @@ "display_name": "Parse Data", "id": "ParseData-f6Jhl", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1014,11 +927,7 @@ "display_name": "Parse Data", "documentation": "", "edited": false, - "field_order": [ - "data", - "template", - "sep" - ], + "field_order": ["data", "template", "sep"], "frozen": false, "icon": "braces", "metadata": {}, @@ -1030,9 +939,7 @@ "method": "parse_data", "name": "text", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1062,9 +969,7 @@ "display_name": "Data", "dynamic": false, "info": "The data to convert to text.", - "input_types": [ - "Data" - ], + "input_types": ["Data"], "list": false, "name": "data", "placeholder": "", @@ -1097,9 +1002,7 @@ "display_name": "Template", "dynamic": false, "info": "The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -1138,24 +1041,17 @@ "display_name": "Prompt", "id": "Prompt-oJ8Eh", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "context", - "question" - ] + "template": ["context", "question"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, - "field_order": [ - "template" - ], + "field_order": ["template"], "frozen": false, "icon": "prompts", "metadata": {}, @@ -1167,9 +1063,7 @@ "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1202,10 +1096,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -1226,10 +1117,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -1283,9 +1171,7 @@ "display_name": "Chat Output", "id": "ChatOutput-oPZbw", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1312,9 +1198,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1344,9 +1228,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "data_template", @@ -1364,9 +1246,7 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as output.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -1385,10 +1265,7 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "placeholder": "", "required": false, "show": true, @@ -1402,9 +1279,7 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "sender_name", @@ -1422,9 +1297,7 @@ "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" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "session_id", @@ -1477,9 +1350,7 @@ "display_name": "Split Text", "id": "SplitText-Kl7VQ", "node": { - "base_classes": [ - "Data" - ], + "base_classes": ["Data"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1504,9 +1375,7 @@ "method": "split_text", "name": "chunks", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" } ], @@ -1566,9 +1435,7 @@ "display_name": "Data Inputs", "dynamic": false, "info": "The data to split.", - "input_types": [ - "Data" - ], + "input_types": ["Data"], "list": true, "name": "data_inputs", "placeholder": "", @@ -1584,9 +1451,7 @@ "display_name": "Separator", "dynamic": false, "info": "The character to split on. Defaults to newline.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "separator", @@ -1624,9 +1489,7 @@ "display_name": "File", "id": "File-JZzdd", "node": { - "base_classes": [ - "Data" - ], + "base_classes": ["Data"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1634,10 +1497,7 @@ "display_name": "File", "documentation": "", "edited": false, - "field_order": [ - "path", - "silent_errors" - ], + "field_order": ["path", "silent_errors"], "frozen": false, "icon": "file-text", "metadata": {}, @@ -1649,9 +1509,7 @@ "method": "load_file", "name": "data", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" } ], @@ -1753,10 +1611,7 @@ "edited": false, "id": "AstraVectorStoreComponent-EUhWZ", "node": { - "base_classes": [ - "Data", - "Retriever" - ], + "base_classes": ["Data", "Retriever"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1799,9 +1654,7 @@ "name": "base_retriever", "required_inputs": [], "selected": "Retriever", - "types": [ - "Retriever" - ], + "types": ["Retriever"], "value": "__UNDEFINED__" }, { @@ -1833,9 +1686,7 @@ "token" ], "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -1845,9 +1696,7 @@ "name": "vector_store", "required_inputs": [], "selected": "VectorStore", - "types": [ - "VectorStore" - ], + "types": ["VectorStore"], "value": "__UNDEFINED__" } ], @@ -1859,9 +1708,7 @@ "display_name": "API Endpoint", "dynamic": false, "info": "API endpoint URL for the Astra DB service.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_endpoint", "password": true, @@ -1987,9 +1834,7 @@ "display_name": "Embedding Model", "dynamic": false, "info": "Allows an embedding model configuration.", - "input_types": [ - "Embeddings" - ], + "input_types": ["Embeddings"], "list": false, "name": "embedding", "placeholder": "", @@ -2008,10 +1853,7 @@ "dynamic": false, "info": "Determines whether to use Astra Vectorize for the collection.", "name": "embedding_service", - "options": [ - "Embedding Model", - "Astra Vectorize" - ], + "options": ["Embedding Model", "Astra Vectorize"], "placeholder": "", "real_time_refresh": true, "required": false, @@ -2026,9 +1868,7 @@ "display_name": "Ingest Data", "dynamic": false, "info": "", - "input_types": [ - "Data" - ], + "input_types": ["Data"], "list": true, "name": "ingest_data", "placeholder": "", @@ -2078,11 +1918,7 @@ "dynamic": false, "info": "Optional distance metric for vector comparisons in the vector store.", "name": "metric", - "options": [ - "cosine", - "dot_product", - "euclidean" - ], + "options": ["cosine", "dot_product", "euclidean"], "placeholder": "", "required": false, "show": true, @@ -2157,9 +1993,7 @@ "display_name": "Search Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "multiline": true, @@ -2213,11 +2047,7 @@ "dynamic": false, "info": "Configuration mode for setting up the vector store, with options like 'Sync', 'Async', or 'Off'.", "name": "setup_mode", - "options": [ - "Sync", - "Async", - "Off" - ], + "options": ["Sync", "Async", "Off"], "placeholder": "", "required": false, "show": true, @@ -2231,9 +2061,7 @@ "display_name": "Astra DB Application Token", "dynamic": false, "info": "Authentication token for accessing Astra DB.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "token", "password": true, @@ -2269,9 +2097,7 @@ "display_name": "OpenAI Embeddings", "id": "OpenAIEmbeddings-Mf9md", "node": { - "base_classes": [ - "Embeddings" - ], + "base_classes": ["Embeddings"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2335,9 +2161,7 @@ "tiktoken_model_name" ], "selected": "Embeddings", - "types": [ - "Embeddings" - ], + "types": ["Embeddings"], "value": "__UNDEFINED__" } ], @@ -2364,9 +2188,7 @@ "display_name": "Client", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "client", @@ -2432,9 +2254,7 @@ "display_name": "Deployment", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "deployment", @@ -2531,9 +2351,7 @@ "display_name": "OpenAI API Base", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "openai_api_base", "password": true, @@ -2549,9 +2367,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "openai_api_key", "password": true, @@ -2567,9 +2383,7 @@ "display_name": "OpenAI API Type", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "openai_api_type", "password": true, @@ -2585,9 +2399,7 @@ "display_name": "OpenAI API Version", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "openai_api_version", @@ -2605,9 +2417,7 @@ "display_name": "OpenAI Organization", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "openai_organization", @@ -2625,9 +2435,7 @@ "display_name": "OpenAI Proxy", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "openai_proxy", @@ -2705,9 +2513,7 @@ "display_name": "TikToken Model Name", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "tiktoken_model_name", @@ -2745,9 +2551,7 @@ "display_name": "OpenAI Embeddings", "id": "OpenAIEmbeddings-q2lBh", "node": { - "base_classes": [ - "Embeddings" - ], + "base_classes": ["Embeddings"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2811,9 +2615,7 @@ "tiktoken_model_name" ], "selected": "Embeddings", - "types": [ - "Embeddings" - ], + "types": ["Embeddings"], "value": "__UNDEFINED__" } ], @@ -2840,9 +2642,7 @@ "display_name": "Client", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "client", @@ -2908,9 +2708,7 @@ "display_name": "Deployment", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "deployment", @@ -3007,9 +2805,7 @@ "display_name": "OpenAI API Base", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "openai_api_base", "password": true, @@ -3025,9 +2821,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "openai_api_key", "password": true, @@ -3043,9 +2837,7 @@ "display_name": "OpenAI API Type", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "openai_api_type", "password": true, @@ -3061,9 +2853,7 @@ "display_name": "OpenAI API Version", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "openai_api_version", @@ -3081,9 +2871,7 @@ "display_name": "OpenAI Organization", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "openai_organization", @@ -3101,9 +2889,7 @@ "display_name": "OpenAI Proxy", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "openai_proxy", @@ -3181,9 +2967,7 @@ "display_name": "TikToken Model Name", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "tiktoken_model_name", @@ -3221,10 +3005,7 @@ "display_name": "OpenAI", "id": "OpenAIModel-3v8LQ", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["LanguageModel", "Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -3256,15 +3037,9 @@ "display_name": "Text", "method": "text_response", "name": "text_output", - "required_inputs": [ - "input_value", - "stream", - "system_message" - ], + "required_inputs": ["input_value", "stream", "system_message"], "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -3284,9 +3059,7 @@ "temperature" ], "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "types": ["LanguageModel"], "value": "__UNDEFINED__" } ], @@ -3298,9 +3071,7 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "load_from_db": true, "name": "api_key", "password": true, @@ -3334,9 +3105,7 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -3440,9 +3209,7 @@ "display_name": "Output Parser", "dynamic": false, "info": "The parser to use to parse the output of the model", - "input_types": [ - "OutputParser" - ], + "input_types": ["OutputParser"], "list": false, "name": "output_parser", "placeholder": "", @@ -3503,9 +3270,7 @@ "display_name": "System Message", "dynamic": false, "info": "System message to pass to the model.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "system_message", @@ -3660,8 +3425,10 @@ }, "description": "Visit https://docs.langflow.org/starter-projects-vector-store-rag for a detailed guide of this project.\nThis project give you both Ingestion and RAG in a single file. You'll need to visit https://astra.datastax.com/ to create an Astra DB instance, your Token and grab an API Endpoint.\nRunning this project requires you to add a file in the Files component, then define a Collection Name and click on the Play icon on the Astra DB component. \n\nAfter the ingestion ends you are ready to click on the Run button at the lower left corner and start asking questions about your data.", "endpoint_name": null, + "icon": "Database", "id": "87aff7ff-7c7f-4965-a5b1-155b18ae43de", "is_component": false, "last_tested_version": "1.0.18", - "name": "Vector Store RAG" -} \ No newline at end of file + "name": "Vector Store RAG", + "tags": ["openai", "astradb", "chatbots", "rag"] +} diff --git a/src/backend/base/langflow/services/database/models/flow/model.py b/src/backend/base/langflow/services/database/models/flow/model.py index 88dd2b5e8..643cde0cb 100644 --- a/src/backend/base/langflow/services/database/models/flow/model.py +++ b/src/backend/base/langflow/services/database/models/flow/model.py @@ -155,6 +155,7 @@ class Flow(FlowBase, table=True): # type: ignore[call-arg] data: dict | None = Field(default=None, sa_column=Column(JSON)) user_id: UUID | None = Field(index=True, foreign_key="user.id", nullable=True) user: "User" = Relationship(back_populates="flows") + icon: str | None = Field(default=None, nullable=True) tags: list[str] | None = Field(sa_column=Column(JSON), default=[]) folder_id: UUID | None = Field(default=None, foreign_key="folder.id", nullable=True, index=True) folder: Optional["Folder"] = Relationship(back_populates="flows") diff --git a/src/backend/tests/unit/test_initial_setup.py b/src/backend/tests/unit/test_initial_setup.py index 395f3443b..9110376d7 100644 --- a/src/backend/tests/unit/test_initial_setup.py +++ b/src/backend/tests/unit/test_initial_setup.py @@ -34,7 +34,11 @@ def test_get_project_data(): project_data, project_icon, project_icon_bg_color, + project_gradient, + project_tags, ) = get_project_data(project) + assert isinstance(project_gradient, str) or project_gradient is None + assert isinstance(project_tags, list) assert isinstance(project_name, str) assert isinstance(project_description, str) assert isinstance(project_is_component, bool) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index e54783c66..3b9943d6c 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -60,6 +60,7 @@ "p-debounce": "^4.0.0", "pako": "^2.1.0", "playwright": "^1.44.1", + "random-gradient": "^0.0.2", "react": "^18.3.1", "react-ace": "^11.0.1", "react-cookie": "^7.1.4", @@ -12879,6 +12880,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/random-gradient": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/random-gradient/-/random-gradient-0.0.2.tgz", + "integrity": "sha512-1RfI+1PL7ZFNRjNX0pp5UI+RNpfwkRro0q3A20xEOOn5yIIN4Du+RbwzN9ryozq1s85ubREEtLqUXtirRc//Ww==", + "license": "MIT", + "dependencies": { + "string-hash": "^1.1.3", + "tinycolor2": "^1.4.1" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -14323,6 +14334,12 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "license": "CC0-1.0" + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -14706,6 +14723,12 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", diff --git a/src/frontend/package.json b/src/frontend/package.json index c5bb4489a..c46cdb5dd 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -55,6 +55,7 @@ "p-debounce": "^4.0.0", "pako": "^2.1.0", "playwright": "^1.44.1", + "random-gradient": "^0.0.2", "react": "^18.3.1", "react-ace": "^11.0.1", "react-cookie": "^7.1.4", diff --git a/src/frontend/src/assets/artwork-spiral-1-def.svg b/src/frontend/src/assets/artwork-spiral-1-def.svg new file mode 100644 index 000000000..80851653c --- /dev/null +++ b/src/frontend/src/assets/artwork-spiral-1-def.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/frontend/src/assets/artwork-spiral-2-def.svg b/src/frontend/src/assets/artwork-spiral-2-def.svg new file mode 100644 index 000000000..769cbb1b0 --- /dev/null +++ b/src/frontend/src/assets/artwork-spiral-2-def.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/frontend/src/assets/artwork-spiral-3-def.svg b/src/frontend/src/assets/artwork-spiral-3-def.svg new file mode 100644 index 000000000..4469bb7c2 --- /dev/null +++ b/src/frontend/src/assets/artwork-spiral-3-def.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/frontend/src/assets/memory-chatbot-bg.png b/src/frontend/src/assets/memory-chatbot-bg.png new file mode 100644 index 000000000..4ad936e7c Binary files /dev/null and b/src/frontend/src/assets/memory-chatbot-bg.png differ diff --git a/src/frontend/src/assets/multi-agent-bg.png b/src/frontend/src/assets/multi-agent-bg.png new file mode 100644 index 000000000..bf9de7ecf Binary files /dev/null and b/src/frontend/src/assets/multi-agent-bg.png differ diff --git a/src/frontend/src/assets/vector-rag-bg.png b/src/frontend/src/assets/vector-rag-bg.png new file mode 100644 index 000000000..06d3fa0da Binary files /dev/null and b/src/frontend/src/assets/vector-rag-bg.png differ diff --git a/src/frontend/src/components/folderSidebarComponent/components/sideBarFolderButtons/index.tsx b/src/frontend/src/components/folderSidebarComponent/components/sideBarFolderButtons/index.tsx index cad16e6cf..97b614f09 100644 --- a/src/frontend/src/components/folderSidebarComponent/components/sideBarFolderButtons/index.tsx +++ b/src/frontend/src/components/folderSidebarComponent/components/sideBarFolderButtons/index.tsx @@ -19,9 +19,7 @@ import useFlowsManagerStore from "../../../../stores/flowsManagerStore"; import { useFolderStore } from "../../../../stores/foldersStore"; import { handleKeyDown } from "../../../../utils/reactflowUtils"; import { cn } from "../../../../utils/utils"; -import IconComponent, { - ForwardedIconComponent, -} from "../../../genericIconComponent"; +import IconComponent from "../../../genericIconComponent"; import { Button, buttonVariants } from "../../../ui/button"; import { Input } from "../../../ui/input"; import useFileDrop from "../../hooks/use-on-file-drop"; @@ -415,7 +413,7 @@ const SideBarFoldersButtonsComponent = ({ {index > 0 && ( )} diff --git a/src/frontend/src/components/ui/button.tsx b/src/frontend/src/components/ui/button.tsx index 86ecf222c..3f0856211 100644 --- a/src/frontend/src/components/ui/button.tsx +++ b/src/frontend/src/components/ui/button.tsx @@ -19,6 +19,9 @@ const buttonVariants = cva( secondary: "border border-muted bg-muted text-secondary-foreground hover:bg-secondary-foreground/5", ghost: "hover:bg-accent hover:text-accent-foreground", + menu: "hover:bg-muted hover:text-accent-foreground focus:!ring-0 focus-visible:!ring-0", + "menu-active": + "font-semibold hover:bg-muted hover:text-accent-foreground focus:!ring-0 focus-visible:!ring-0", link: "underline-offset-4 hover:underline text-primary", }, size: { diff --git a/src/frontend/src/icons/AstraDB/AstraDB.jsx b/src/frontend/src/icons/AstraDB/AstraDB.jsx index e32ec6996..a6f1b5d9f 100644 --- a/src/frontend/src/icons/AstraDB/AstraDB.jsx +++ b/src/frontend/src/icons/AstraDB/AstraDB.jsx @@ -1,28 +1,17 @@ const AstraSVG = (props) => ( - - {/* */} - - - - - - - - + + ); export default AstraSVG; diff --git a/src/frontend/src/icons/AstraDB/Favicon.svg b/src/frontend/src/icons/AstraDB/Favicon.svg index 7fe145b1b..382218720 100644 --- a/src/frontend/src/icons/AstraDB/Favicon.svg +++ b/src/frontend/src/icons/AstraDB/Favicon.svg @@ -1,12 +1,4 @@ - - - - - - - - - - - + + + diff --git a/src/frontend/src/modals/baseModal/helpers/switch-case-size.ts b/src/frontend/src/modals/baseModal/helpers/switch-case-size.ts index 7363f16c7..4a6dcf7b9 100644 --- a/src/frontend/src/modals/baseModal/helpers/switch-case-size.ts +++ b/src/frontend/src/modals/baseModal/helpers/switch-case-size.ts @@ -38,6 +38,10 @@ export const switchCaseModalSize = (size: string) => { minWidth = "min-w-[85vw]"; height = "h-[80vh]"; break; + case "templates": + minWidth = "min-w-[85vw] max-w-[1200px]"; + height = "h-[70vh] max-h-[700px]"; + break; case "three-cards": minWidth = "min-w-[1066px]"; height = "max-h-[94vh]"; diff --git a/src/frontend/src/modals/baseModal/index.tsx b/src/frontend/src/modals/baseModal/index.tsx index de80081d9..265f51960 100644 --- a/src/frontend/src/modals/baseModal/index.tsx +++ b/src/frontend/src/modals/baseModal/index.tsx @@ -22,7 +22,11 @@ import { modalHeaderType } from "../../types/components"; import { cn } from "../../utils/utils"; import { switchCaseModalSize } from "./helpers/switch-case-size"; -type ContentProps = { children: ReactNode; overflowHidden?: boolean }; +type ContentProps = { + children: ReactNode; + overflowHidden?: boolean; + className?: string; +}; type HeaderProps = { children: ReactNode; description: string }; type FooterProps = { children: ReactNode }; type TriggerProps = { @@ -32,12 +36,17 @@ type TriggerProps = { className?: string; }; -const Content: React.FC = ({ children, overflowHidden }) => { +const Content: React.FC = ({ + children, + overflowHidden, + className, +}) => { return (
{children} @@ -132,12 +141,14 @@ const Footer: React.FC<{ ); }; interface BaseModalProps { - children: [ - React.ReactElement, - React.ReactElement, - React.ReactElement?, - React.ReactElement?, - ]; + children: + | [ + React.ReactElement, + React.ReactElement?, + React.ReactElement?, + React.ReactElement?, + ] + | React.ReactElement; open?: boolean; setOpen?: (open: boolean) => void; size?: @@ -150,6 +161,7 @@ interface BaseModalProps { | "three-cards" | "large-thin" | "large-h-full" + | "templates" | "small-h-full" | "medium-h-full" | "md-thin" @@ -157,7 +169,7 @@ interface BaseModalProps { | "smaller-h-full" | "medium-log" | "x-large"; - + className?: string; disable?: boolean; onChangeOpenModal?: (open?: boolean) => void; type?: "modal" | "dialog"; @@ -165,6 +177,7 @@ interface BaseModalProps { onEscapeKeyDown?: (e: KeyboardEvent) => void; } function BaseModal({ + className, open, setOpen, children, @@ -197,7 +210,7 @@ function BaseModal({ const modalContent = ( <> - {headerChild} + {headerChild && headerChild} {ContentChild} {ContentFooter && ContentFooter} @@ -207,6 +220,7 @@ function BaseModal({ minWidth, height, "flex flex-col duration-300 overflow-hidden", + className, ); //UPDATE COLORS AND STYLE CLASSSES diff --git a/src/frontend/src/modals/newFlowModal/index.tsx b/src/frontend/src/modals/newFlowModal/index.tsx deleted file mode 100644 index b3117b832..000000000 --- a/src/frontend/src/modals/newFlowModal/index.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import useFlowsManagerStore from "../../stores/flowsManagerStore"; -import { newFlowModalPropsType } from "../../types/components"; -import BaseModal from "../baseModal"; -import NewFlowCardComponent from "./components/NewFlowCardComponent"; -import UndrawCardComponent from "./components/undrawCards"; - -export default function NewFlowModal({ - open, - setOpen, -}: newFlowModalPropsType): JSX.Element { - const examples = useFlowsManagerStore((state) => state.examples); - - return ( - - - - Get Started - - - -
-
- - - {examples.find( - (e) => e.name == "Basic Prompting (Hello, World)", - ) && ( - e.name == "Basic Prompting (Hello, World)", - )! - } - /> - )} - {examples.find((e) => e.name == "Memory Chatbot") && ( - e.name == "Memory Chatbot")!} - /> - )} - {examples.find((e) => e.name == "Document QA") && ( - e.name == "Document QA")!} - /> - )} - {examples.find((e) => e.name == "Blog Writer") && ( - e.name == "Blog Writer")!} - /> - )} - {examples.find((e) => e.name == "Vector Store RAG") && ( - e.name == "Vector Store RAG")!} - /> - )} - {examples.find((e) => e.name == "Simple Agent") && ( - e.name == "Simple Agent")!} - /> - )} - {examples.find((e) => e.name == "Travel Planning Agents") && ( - e.name == "Travel Planning Agents")!} - /> - )} - {examples.find((e) => e.name == "Dynamic Agent") && ( - e.name == "Dynamic Agent")!} - /> - )} -
-
-
-
- ); -} diff --git a/src/frontend/src/modals/templatesModal/components/GetStartedComponent/index.tsx b/src/frontend/src/modals/templatesModal/components/GetStartedComponent/index.tsx new file mode 100644 index 000000000..4c3315826 --- /dev/null +++ b/src/frontend/src/modals/templatesModal/components/GetStartedComponent/index.tsx @@ -0,0 +1,61 @@ +import BaseModal from "@/modals/baseModal"; +import useFlowsManagerStore from "@/stores/flowsManagerStore"; +import { CardData } from "@/types/templates/types"; +import memoryChatbotSpiral from "../../../../assets/artwork-spiral-1-def.svg"; +import vectorRagSpiral from "../../../../assets/artwork-spiral-2-def.svg"; +import multiAgentSpiral from "../../../../assets/artwork-spiral-3-def.svg"; +import memoryChatbotBg from "../../../../assets/memory-chatbot-bg.png"; +import multiAgentBg from "../../../../assets/multi-agent-bg.png"; +import vectorRagBg from "../../../../assets/vector-rag-bg.png"; +import TemplateGetStartedCardComponent from "../TemplateGetStartedCardComponent"; + +export default function GetStartedComponent() { + const examples = useFlowsManagerStore((state) => state.examples); + + // Define the card data + const cardData: CardData[] = [ + { + bgImage: memoryChatbotBg, + spiralImage: memoryChatbotSpiral, + icon: "MessagesSquare", + category: "Chatbot", + title: "Memory Chatbot", + description: + "Get hands-on with Langflow by building a simple RAGbot that uses memory.", + flow: examples.find((example) => example.name === "Memory Chatbot"), + }, + { + bgImage: vectorRagBg, + spiralImage: vectorRagSpiral, + icon: "MessagesSquare", + category: "Vector RAG", + title: "Vector RAG", + description: + "Ingest data into a native vector store and efficiently retrieve it.", + flow: examples.find((example) => example.name === "Vector Store RAG"), + }, + { + bgImage: multiAgentBg, + spiralImage: multiAgentSpiral, + icon: "MessagesSquare", + category: "Agents", + title: "Multi-Agent", + flow: examples.find((example) => example.name === "Dynamic Agent"), + description: + "Deploy a team of agents with a Manager-Worker structure to tackle complex tasks.", + }, + ]; + + return ( +
+ + Get Started + +
+ {cardData.map((card, index) => ( + + ))} +
+
+ ); +} diff --git a/src/frontend/src/modals/templatesModal/components/TemplateCardComponent/index.tsx b/src/frontend/src/modals/templatesModal/components/TemplateCardComponent/index.tsx new file mode 100644 index 000000000..9dfe019dc --- /dev/null +++ b/src/frontend/src/modals/templatesModal/components/TemplateCardComponent/index.tsx @@ -0,0 +1,62 @@ +import { convertTestName } from "@/components/storeCardComponent/utils/convert-test-name"; +import gradient from "random-gradient"; +import IconComponent, { + ForwardedIconComponent, +} from "../../../../components/genericIconComponent"; +import { TemplateCardComponentProps } from "../../../../types/templates/types"; + +export default function TemplateCardComponent({ + example, + onClick, +}: TemplateCardComponentProps) { + const gradientDirections = ["horizontal", "vertical", "diagonal"]; + const directionIndex = + (example.gradient ? example.gradient.length : example.name.length) % + gradientDirections.length; + const bgGradient = { + background: gradient( + example.gradient || example.name, + gradientDirections[directionIndex], + ), + }; + + return ( +
+
+ +
+
+
+
+

+ {example.name} +

+ +
+

+ {example.description} +

+
+
+
+ ); +} diff --git a/src/frontend/src/modals/templatesModal/components/TemplateCategoryComponent/index.tsx b/src/frontend/src/modals/templatesModal/components/TemplateCategoryComponent/index.tsx new file mode 100644 index 000000000..6c8a74513 --- /dev/null +++ b/src/frontend/src/modals/templatesModal/components/TemplateCategoryComponent/index.tsx @@ -0,0 +1,35 @@ +import { convertTestName } from "@/components/storeCardComponent/utils/convert-test-name"; +import { ForwardedIconComponent } from "../../../../components/genericIconComponent"; +import { TemplateCategoryProps } from "../../../../types/templates/types"; +import TemplateExampleCard from "../TemplateCardComponent"; + +export function TemplateCategoryComponent({ + currentTab, + examples, + onCardClick, +}: TemplateCategoryProps) { + return ( + <> +
+ + + {currentTab?.title ?? "All Templates"} + +
+
+ {examples.map((example, index) => ( + onCardClick(example)} + /> + ))} +
+ + ); +} diff --git a/src/frontend/src/modals/templatesModal/components/TemplateContentComponent/index.tsx b/src/frontend/src/modals/templatesModal/components/TemplateContentComponent/index.tsx new file mode 100644 index 000000000..1950600af --- /dev/null +++ b/src/frontend/src/modals/templatesModal/components/TemplateContentComponent/index.tsx @@ -0,0 +1,114 @@ +import { useCustomNavigate } from "@/customization/hooks/use-custom-navigate"; +import { track } from "@/customization/utils/analytics"; +import useAddFlow from "@/hooks/flows/use-add-flow"; +import useFlowsManagerStore from "@/stores/flowsManagerStore"; +import Fuse from "fuse.js"; +import { useEffect, useMemo, useRef, useState } from "react"; +import { useParams } from "react-router-dom"; +import { ForwardedIconComponent } from "../../../../components/genericIconComponent"; +import { Input } from "../../../../components/ui/input"; +import { useFolderStore } from "../../../../stores/foldersStore"; +import { TemplateContentProps } from "../../../../types/templates/types"; +import { updateIds } from "../../../../utils/reactflowUtils"; +import { TemplateCategoryComponent } from "../TemplateCategoryComponent"; + +export default function TemplateContentComponent({ + currentTab, + categories, +}: TemplateContentProps) { + const examples = useFlowsManagerStore((state) => state.examples).filter( + (example) => + example.tags?.includes(currentTab ?? "") || + currentTab === "all-templates", + ); + const [searchQuery, setSearchQuery] = useState(""); + const [filteredExamples, setFilteredExamples] = useState(examples); + const addFlow = useAddFlow(); + const navigate = useCustomNavigate(); + const { folderId } = useParams(); + const myCollectionId = useFolderStore((state) => state.myCollectionId); + const scrollContainerRef = useRef(null); + + const folderIdUrl = folderId ?? myCollectionId; + + const fuse = useMemo( + () => new Fuse(examples, { keys: ["name", "description"] }), + [examples], + ); + + useEffect(() => { + // Reset search query when currentTab changes + setSearchQuery(""); + }, [currentTab]); + + useEffect(() => { + if (searchQuery === "") { + setFilteredExamples(examples); + } else { + const searchResults = fuse.search(searchQuery); + setFilteredExamples(searchResults.map((result) => result.item)); + } + // Scroll to the top when search query changes + if (scrollContainerRef.current) { + scrollContainerRef.current.scrollTop = 0; + } + }, [searchQuery, currentTab]); + + const handleCardClick = (example) => { + updateIds(example.data); + addFlow({ flow: example }).then((id) => { + navigate(`/flow/${id}/folder/${folderIdUrl}`); + }); + track("New Flow Created", { template: `${example.name} Template` }); + }; + + const currentTabItem = categories.find((item) => item.id === currentTab); + + return ( +
+
+ + setSearchQuery(e.target.value)} + className="w-full rounded-lg bg-background pl-8 lg:w-3/4" + /> +
+
+ {currentTab === "all-templates" ? ( + categories.map( + (value) => + filteredExamples.filter((example) => + example.tags?.includes(value.id), + ).length > 0 && ( + + example.tags?.includes(value.id), + )} + onCardClick={handleCardClick} + /> + ), + ) + ) : currentTabItem ? ( + + ) : ( + <> + )} +
+
+ ); +} diff --git a/src/frontend/src/modals/templatesModal/components/TemplateGetStartedCardComponent/index.tsx b/src/frontend/src/modals/templatesModal/components/TemplateGetStartedCardComponent/index.tsx new file mode 100644 index 000000000..1566b929d --- /dev/null +++ b/src/frontend/src/modals/templatesModal/components/TemplateGetStartedCardComponent/index.tsx @@ -0,0 +1,74 @@ +import ForwardedIconComponent from "@/components/genericIconComponent"; +import { useCustomNavigate } from "@/customization/hooks/use-custom-navigate"; +import { track } from "@/customization/utils/analytics"; +import useAddFlow from "@/hooks/flows/use-add-flow"; +import { useFolderStore } from "@/stores/foldersStore"; +import { updateIds } from "@/utils/reactflowUtils"; +import { useParams } from "react-router-dom"; +import { CardData } from "../../../../types/templates/types"; + +export default function TemplateGetStartedCardComponent({ + bgImage, + spiralImage, + icon, + category, + title, + description, + flow, +}: CardData) { + const addFlow = useAddFlow(); + const navigate = useCustomNavigate(); + const { folderId } = useParams(); + const myCollectionId = useFolderStore((state) => state.myCollectionId); + + const folderIdUrl = folderId ?? myCollectionId; + + const handleClick = () => { + if (flow) { + updateIds(flow.data!); + addFlow({ flow }).then((id) => { + navigate(`/flow/${id}/folder/${folderIdUrl}`); + }); + track("New Flow Created", { template: `${flow.name} Template` }); + } else { + console.error(`Flow template "${title}" not found`); + } + }; + + return ( +
+ {`${title} +
+ {`${title} +
+
+
+ + + {category} + +
+
+

{title}

+ +
+ +

{description}

+
+
+ ); +} diff --git a/src/frontend/src/modals/templatesModal/components/navComponent/index.tsx b/src/frontend/src/modals/templatesModal/components/navComponent/index.tsx new file mode 100644 index 000000000..3ce3a6c02 --- /dev/null +++ b/src/frontend/src/modals/templatesModal/components/navComponent/index.tsx @@ -0,0 +1,37 @@ +import ForwardedIconComponent from "@/components/genericIconComponent"; +import { convertTestName } from "@/components/storeCardComponent/utils/convert-test-name"; +import { Button } from "@/components/ui/button"; +import { cn } from "@/utils/utils"; +import { NavProps } from "../../../../types/templates/types"; + +export function Nav({ links, currentTab, onClick }: NavProps) { + return ( +
+ +
+ ); +} diff --git a/src/frontend/src/modals/templatesModal/index.tsx b/src/frontend/src/modals/templatesModal/index.tsx new file mode 100644 index 000000000..8da16a588 --- /dev/null +++ b/src/frontend/src/modals/templatesModal/index.tsx @@ -0,0 +1,103 @@ +import { Button } from "@/components/ui/button"; +import { Separator } from "@/components/ui/separator"; +import { useCustomNavigate } from "@/customization/hooks/use-custom-navigate"; +import { track } from "@/customization/utils/analytics"; +import useAddFlow from "@/hooks/flows/use-add-flow"; +import { Category } from "@/types/templates/types"; +import { useState } from "react"; +import { useParams } from "react-router-dom"; +import { newFlowModalPropsType } from "../../types/components"; +import BaseModal from "../baseModal"; +import GetStartedComponent from "./components/GetStartedComponent"; +import { Nav } from "./components/navComponent"; +import TemplateContentComponent from "./components/TemplateContentComponent"; + +export default function TemplatesModal({ + open, + setOpen, +}: newFlowModalPropsType): JSX.Element { + const [currentTab, setCurrentTab] = useState("get-started"); + const addFlow = useAddFlow(); + const navigate = useCustomNavigate(); + const { folderId } = useParams(); + + // Define categories and their items + const categories: Category[] = [ + { + title: "Templates", + items: [ + { title: "Get Started", icon: "SquarePlay", id: "get-started" }, + { title: "All Templates", icon: "LayoutPanelTop", id: "all-templates" }, + ], + }, + { + title: "Usecase", + items: [ + { title: "Chatbots", icon: "MessagesSquare", id: "chatbots" }, + { title: "RAG", icon: "Database", id: "rag" }, + { title: "Agents", icon: "Bot", id: "agents" }, + ], + }, + ]; + + return ( + + +
+
+ {categories.map((category, index) => ( +
+

+ {category.title} +

+
+ ))} +
+ +
+ {currentTab === "get-started" ? ( + + ) : ( + category.items)} + /> + )} + +
+
+
Start from scratch
+
+ Begin a fresh project to build from scratch. +
+
+ +
+
+
+
+
+
+ ); +} diff --git a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sideBarNoteComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sideBarNoteComponent/index.tsx index acb5d0039..91bb8d784 100644 --- a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sideBarNoteComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sideBarNoteComponent/index.tsx @@ -23,7 +23,7 @@ export default function NoteDraggableComponent() {
Add Note diff --git a/src/frontend/src/pages/MainPage/components/componentsComponent/index.tsx b/src/frontend/src/pages/MainPage/components/componentsComponent/index.tsx index 6c1116538..9a8237560 100644 --- a/src/frontend/src/pages/MainPage/components/componentsComponent/index.tsx +++ b/src/frontend/src/pages/MainPage/components/componentsComponent/index.tsx @@ -1,6 +1,6 @@ import { PAGINATION_PAGE, PAGINATION_SIZE } from "@/constants/constants"; import { usePostDownloadMultipleFlows } from "@/controllers/API/queries/flows"; -import NewFlowModal from "@/modals/newFlowModal"; +import TemplatesModal from "@/modals/templatesModal"; import { Pagination } from "@/types/utils/types"; import { useEffect, useMemo, useState } from "react"; import { FormProvider, useForm, useWatch } from "react-hook-form"; @@ -13,10 +13,8 @@ import useAlertStore from "../../../../stores/alertStore"; import useFlowsManagerStore from "../../../../stores/flowsManagerStore"; import { useFolderStore } from "../../../../stores/foldersStore"; import { FlowType } from "../../../../types/flow"; -import { FolderType } from "../../entities"; import useFileDrop from "../../hooks/use-on-file-drop"; import { getNameByType } from "../../utils/get-name-by-type"; -import { sortFlows } from "../../utils/sort-flows"; import EmptyComponent from "../emptyComponent"; import HeaderComponent from "../headerComponent"; import CollectionCard from "./components/collectionCard"; @@ -286,7 +284,7 @@ export default function ComponentsComponent({ <> )} - + ); } diff --git a/src/frontend/src/pages/MainPage/components/modalsComponent/index.tsx b/src/frontend/src/pages/MainPage/components/modalsComponent/index.tsx index 37489ed7c..8d837d74a 100644 --- a/src/frontend/src/pages/MainPage/components/modalsComponent/index.tsx +++ b/src/frontend/src/pages/MainPage/components/modalsComponent/index.tsx @@ -1,8 +1,8 @@ // Modals.tsx +import TemplatesModal from "@/modals/templatesModal"; import IconComponent from "../../../../components/genericIconComponent"; import { Button } from "../../../../components/ui/button"; import DeleteConfirmationModal from "../../../../modals/deleteConfirmationModal"; -import NewFlowModal from "../../../../modals/newFlowModal"; import { cn } from "../../../../utils/utils"; interface ModalsProps { @@ -21,7 +21,7 @@ const ModalsComponent = ({ handleDeleteFolder, }: ModalsProps) => ( <> - {openModal && } + {openModal && } {openDeleteFolderModal && ( void; +} + +export interface TemplateContentProps { + currentTab: string; + categories: NavItem[]; +} + +export interface TemplateCardComponentProps { + example: { + name: string; + description: string; + icon?: string; + id: string; + gradient?: string; + }; + onClick: () => void; +} + +export interface NavProps { + links: NavItem[]; + currentTab: string; + onClick?: (id: string) => void; +} diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts index 05a7125ec..d614bb1e4 100644 --- a/src/frontend/src/utils/styleUtils.ts +++ b/src/frontend/src/utils/styleUtils.ts @@ -18,6 +18,7 @@ import { BookMarked, BookmarkPlus, Bot, + BotMessageSquare, Boxes, Braces, BrainCircuit, @@ -89,9 +90,11 @@ import { Keyboard, Laptop2, Layers, + LayoutPanelTop, Link, Link2, ListFilter, + ListOrdered, Loader2, Lock, LogIn, @@ -116,6 +119,7 @@ import { Pencil, PencilLine, Pin, + Plane, Play, Plus, PlusCircle, @@ -144,6 +148,7 @@ import { Sparkles, Square, SquarePen, + SquarePlay, StickyNote, Store, SunIcon, @@ -163,6 +168,7 @@ import { UserCog2, UserMinus2, UserPlus2, + Users, Users2, Variable, Wand2, @@ -516,6 +522,9 @@ export const nodeIconsLucide: iconsType = { Palette, RefreshCcwDot, FolderUp, + SquarePlay, + LayoutPanelTop, + Database, Blocks, ChevronDown, ArrowLeft, @@ -577,11 +586,15 @@ export const nodeIconsLucide: iconsType = { BookMarked, Minus, LogOut, + BotMessageSquare, Square, Minimize2, Maximize2, FormInput, ChevronRightSquare, + Plane, + Users, + ListOrdered, SaveAll, MessageSquareMore, Forward, diff --git a/src/frontend/tailwind.config.mjs b/src/frontend/tailwind.config.mjs index d16237b4b..f6a627cf0 100644 --- a/src/frontend/tailwind.config.mjs +++ b/src/frontend/tailwind.config.mjs @@ -26,7 +26,7 @@ const config = { "bg-status-red", "bg-status-yellow", ], - important: true, + important: false, theme: { container: { center: true, @@ -111,7 +111,6 @@ const config = { ice: "var(--ice)", selected: "var(--selected)", hover: "var(--hover)", - white: "var(--white)", border: "hsl(var(--border))", input: "hsl(var(--input))", ring: "hsl(var(--ring))", diff --git a/src/frontend/tests/core/features/actionsMainPage-shard-1.spec.ts b/src/frontend/tests/core/features/actionsMainPage-shard-1.spec.ts index cc91cedb5..bf72f8e1a 100644 --- a/src/frontend/tests/core/features/actionsMainPage-shard-1.spec.ts +++ b/src/frontend/tests/core/features/actionsMainPage-shard-1.spec.ts @@ -25,6 +25,7 @@ test("select and delete all", async ({ page }) => { await page.waitForTimeout(3000); modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { @@ -67,6 +68,7 @@ test("select and delete a flow", async ({ page }) => { await page.waitForTimeout(3000); modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { @@ -108,6 +110,7 @@ test("search flows", async ({ page }) => { await page.waitForTimeout(3000); modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { @@ -118,6 +121,7 @@ test("search flows", async ({ page }) => { await page.getByText("Select All").isVisible(); await page.getByText("New Project", { exact: true }).click(); + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Memory Chatbot" }).click(); await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { @@ -126,6 +130,7 @@ test("search flows", async ({ page }) => { await page.getByTestId("icon-ChevronLeft").first().click(); await page.getByText("New Project", { exact: true }).click(); + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Document QA" }).click(); await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { @@ -164,6 +169,7 @@ test("search components", async ({ page }) => { await page.waitForTimeout(3000); modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { diff --git a/src/frontend/tests/core/features/auto-login-off.spec.ts b/src/frontend/tests/core/features/auto-login-off.spec.ts index 878066e34..e3062f4d1 100644 --- a/src/frontend/tests/core/features/auto-login-off.spec.ts +++ b/src/frontend/tests/core/features/auto-login-off.spec.ts @@ -121,6 +121,7 @@ test("when auto_login is false, admin can CRUD user's and should see just your o modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { @@ -191,6 +192,7 @@ test("when auto_login is false, admin can CRUD user's and should see just your o await page.getByText("New Project", { exact: true }).click(); + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { diff --git a/src/frontend/tests/core/features/chatInputOutputUser-shard-0.spec.ts b/src/frontend/tests/core/features/chatInputOutputUser-shard-0.spec.ts index 3d24e6c8f..963ad57c4 100644 --- a/src/frontend/tests/core/features/chatInputOutputUser-shard-0.spec.ts +++ b/src/frontend/tests/core/features/chatInputOutputUser-shard-0.spec.ts @@ -33,6 +33,7 @@ test("user must be able to send an image on chat", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { timeout: 100000, diff --git a/src/frontend/tests/core/features/folders.spec.ts b/src/frontend/tests/core/features/folders.spec.ts index 5ad090e25..ede122608 100644 --- a/src/frontend/tests/core/features/folders.spec.ts +++ b/src/frontend/tests/core/features/folders.spec.ts @@ -26,6 +26,7 @@ test("CRUD folders", async ({ page }) => { await page.waitForTimeout(3000); modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { @@ -152,6 +153,7 @@ test("change flow folder", async ({ page }) => { await page.waitForTimeout(3000); modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { diff --git a/src/frontend/tests/core/features/freeze-path.spec.ts b/src/frontend/tests/core/features/freeze-path.spec.ts index 6f1fec40b..4b7994537 100644 --- a/src/frontend/tests/core/features/freeze-path.spec.ts +++ b/src/frontend/tests/core/features/freeze-path.spec.ts @@ -37,6 +37,7 @@ test("user must be able to freeze a path", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { diff --git a/src/frontend/tests/core/features/freeze.spec.ts b/src/frontend/tests/core/features/freeze.spec.ts index 04685cad5..020265af3 100644 --- a/src/frontend/tests/core/features/freeze.spec.ts +++ b/src/frontend/tests/core/features/freeze.spec.ts @@ -1,6 +1,4 @@ import { expect, test } from "@playwright/test"; -import * as dotenv from "dotenv"; -import path from "path"; test("user must be able to freeze a component", async ({ page }) => { await page.goto("/"); @@ -28,7 +26,7 @@ test("user must be able to freeze a component", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } - await page.getByRole("heading", { name: "Blank Flow" }).click(); + await page.getByTestId("blank-flow").click(); //first component diff --git a/src/frontend/tests/core/features/group.spec.ts b/src/frontend/tests/core/features/group.spec.ts index 464749731..d075692c3 100644 --- a/src/frontend/tests/core/features/group.spec.ts +++ b/src/frontend/tests/core/features/group.spec.ts @@ -20,6 +20,7 @@ test.describe("group node test", () => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page .getByRole("heading", { name: "Basic Prompting" }) .first() diff --git a/src/frontend/tests/core/features/logs.spec.ts b/src/frontend/tests/core/features/logs.spec.ts index f162c8d90..171e3de2e 100644 --- a/src/frontend/tests/core/features/logs.spec.ts +++ b/src/frontend/tests/core/features/logs.spec.ts @@ -38,6 +38,7 @@ test("should able to see and interact with logs", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForTimeout(1000); diff --git a/src/frontend/tests/core/features/stop-building.spec.ts b/src/frontend/tests/core/features/stop-building.spec.ts index 60c64f612..d79d85c6e 100644 --- a/src/frontend/tests/core/features/stop-building.spec.ts +++ b/src/frontend/tests/core/features/stop-building.spec.ts @@ -20,7 +20,7 @@ test("user must be able to stop a building", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } - await page.getByRole("heading", { name: "Blank Flow" }).click(); + await page.getByTestId("blank-flow").click(); //first component diff --git a/src/frontend/tests/core/features/store-shard-2.spec.ts b/src/frontend/tests/core/features/store-shard-2.spec.ts index d83f828fe..5a1ee5bb6 100644 --- a/src/frontend/tests/core/features/store-shard-2.spec.ts +++ b/src/frontend/tests/core/features/store-shard-2.spec.ts @@ -101,6 +101,7 @@ test("should share component with share button", async ({ page }) => { const randomName = Math.random().toString(36).substring(2); + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForTimeout(1000); const flowName = await page.getByTestId("flow_name").innerText(); diff --git a/src/frontend/tests/core/features/tweaksTest.spec.ts b/src/frontend/tests/core/features/tweaksTest.spec.ts index 385b52848..e9db4696e 100644 --- a/src/frontend/tests/core/features/tweaksTest.spec.ts +++ b/src/frontend/tests/core/features/tweaksTest.spec.ts @@ -18,6 +18,7 @@ test("curl_api_generation", async ({ page, context }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForTimeout(1000); await page.getByText("API", { exact: true }).click(); diff --git a/src/frontend/tests/core/integrations/Basic Prompting.spec.ts b/src/frontend/tests/core/integrations/Basic Prompting.spec.ts index 3a70a7630..d3f7f615a 100644 --- a/src/frontend/tests/core/integrations/Basic Prompting.spec.ts +++ b/src/frontend/tests/core/integrations/Basic Prompting.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "@playwright/test"; +import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; @@ -37,6 +37,7 @@ test("Basic Prompting (Hello, World)", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { diff --git a/src/frontend/tests/core/integrations/Blog Writer.spec.ts b/src/frontend/tests/core/integrations/Blog Writer.spec.ts index 6b410d375..4c8f66825 100644 --- a/src/frontend/tests/core/integrations/Blog Writer.spec.ts +++ b/src/frontend/tests/core/integrations/Blog Writer.spec.ts @@ -37,6 +37,7 @@ test("Blog Writer", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Blog Writer" }).click(); await page.waitForTimeout(1000); diff --git a/src/frontend/tests/core/integrations/Document QA.spec.ts b/src/frontend/tests/core/integrations/Document QA.spec.ts index 2369ce46b..437b69b41 100644 --- a/src/frontend/tests/core/integrations/Document QA.spec.ts +++ b/src/frontend/tests/core/integrations/Document QA.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "@playwright/test"; +import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; @@ -37,6 +37,7 @@ test("Document QA", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Document QA" }).click(); await page.waitForTimeout(1000); diff --git a/src/frontend/tests/core/integrations/Dynamic Agent.spec.ts b/src/frontend/tests/core/integrations/Dynamic Agent.spec.ts index 2a08ae369..88620c0bf 100644 --- a/src/frontend/tests/core/integrations/Dynamic Agent.spec.ts +++ b/src/frontend/tests/core/integrations/Dynamic Agent.spec.ts @@ -42,6 +42,7 @@ test("Dynamic Agent", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Dynamic Agent" }).click(); await page.waitForSelector('[title="fit view"]', { diff --git a/src/frontend/tests/core/integrations/Memory Chatbot.spec.ts b/src/frontend/tests/core/integrations/Memory Chatbot.spec.ts index d0a3bcb7d..e3f330636 100644 --- a/src/frontend/tests/core/integrations/Memory Chatbot.spec.ts +++ b/src/frontend/tests/core/integrations/Memory Chatbot.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "@playwright/test"; +import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; @@ -37,6 +37,7 @@ test("Memory Chatbot", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Memory Chatbot" }).click(); await page.waitForTimeout(1000); diff --git a/src/frontend/tests/core/integrations/Simple Agent.spec.ts b/src/frontend/tests/core/integrations/Simple Agent.spec.ts index 1c7568466..7061571cb 100644 --- a/src/frontend/tests/core/integrations/Simple Agent.spec.ts +++ b/src/frontend/tests/core/integrations/Simple Agent.spec.ts @@ -46,7 +46,8 @@ test("Simple Agent", async ({ page }) => { control = "Meta"; } - await page.getByRole("heading", { name: "Simple Agent" }).click(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Simple Agent" }).first().click(); await page.waitForSelector('[title="fit view"]', { timeout: 100000, diff --git a/src/frontend/tests/core/integrations/Travel Planning Agent.spec.ts b/src/frontend/tests/core/integrations/Travel Planning Agent.spec.ts index b5e7e63ce..97ed8f872 100644 --- a/src/frontend/tests/core/integrations/Travel Planning Agent.spec.ts +++ b/src/frontend/tests/core/integrations/Travel Planning Agent.spec.ts @@ -42,6 +42,7 @@ test("Travel Planning Agent", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Travel Planning Agents" }).click(); await page.waitForSelector('[title="fit view"]', { diff --git a/src/frontend/tests/core/integrations/Vector Store.spec.ts b/src/frontend/tests/core/integrations/Vector Store.spec.ts index 7069e153a..20483d4e7 100644 --- a/src/frontend/tests/core/integrations/Vector Store.spec.ts +++ b/src/frontend/tests/core/integrations/Vector Store.spec.ts @@ -1,4 +1,4 @@ -import { expect, Page, test } from "@playwright/test"; +import { Page, test } from "@playwright/test"; import path from "path"; import uaParser from "ua-parser-js"; @@ -43,7 +43,8 @@ test("Vector Store RAG", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } - await page.getByRole("heading", { name: "Vector Store RAG" }).click(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Vector Store RAG" }).first().click(); await page.waitForSelector('[title="fit view"]', { timeout: 100000, }); diff --git a/src/frontend/tests/core/integrations/decisionFlow.spec.ts b/src/frontend/tests/core/integrations/decisionFlow.spec.ts index 858c2aaaf..ba6720642 100644 --- a/src/frontend/tests/core/integrations/decisionFlow.spec.ts +++ b/src/frontend/tests/core/integrations/decisionFlow.spec.ts @@ -3,582 +3,453 @@ import * as dotenv from "dotenv"; import path from "path"; test("should create a flow with decision", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); - - if (!process.env.CI) { - dotenv.config({ path: path.resolve(__dirname, "../../.env") }); - } - - await page.goto("/"); - - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); - - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 30000, - }); - - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); - } - } catch (error) { - modalCount = 0; - } - - while (modalCount === 0) { - await page.getByText("New Project", { exact: true }).click(); - await page.waitForTimeout(3000); - modalCount = await page.getByTestId("modal-title")?.count(); - } - - await page.waitForSelector('[data-testid="blank-flow"]', { - timeout: 30000, - }); - - await page.getByTestId("blank-flow").click(); - await page.waitForSelector('[data-testid="extended-disclosure"]', { - timeout: 30000, - }); - - await page.getByTestId("extended-disclosure").click(); - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill("chat input"); - await page.waitForTimeout(1000); - - await page - .getByTestId("inputsChat Input") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill("create list"); - await page.waitForTimeout(1000); - - await page.getByTitle("zoom out").click(); - await page.getByTitle("zoom out").click(); - - await page - .getByTestId("helpersCreate List") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTestId("input-list-plus-btn_texts-0").click(); - await page.getByTestId("input-list-plus-btn_texts-0").click(); - - await page - .getByTestId("inputlist_str_texts_0") - .first() - .fill("big news! langflow 1.0 is out"); - await page - .getByTestId("inputlist_str_texts_1") - .first() - .fill("uhul that movie was awesome"); - await page.getByTestId("inputlist_str_texts_2").first().fill("love you babe"); - - await page.getByTitle("zoom out").click(); - await page.getByTitle("zoom out").click(); - - await page - .getByTestId("helpersCreate List") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTestId("input-list-plus-btn_texts-0").last().click(); - await page.getByTestId("input-list-plus-btn_texts-0").last().click(); - - await page.getByTestId("inputlist_str_texts_0").last().fill("oh my cat died"); - await page - .getByTestId("inputlist_str_texts_1") - .last() - .fill("No one loves me"); - await page.getByTestId("inputlist_str_texts_2").last().fill("not cool.."); - - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill("parse data"); - await page.waitForTimeout(1000); - - await page.getByTitle("zoom out").click(); - - await page - .getByTestId("helpersParse Data") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page - .getByTestId("helpersParse Data") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill("prompt"); - await page.waitForTimeout(1000); - - await page - .getByTestId("promptsPrompt") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill("openai"); - await page.waitForTimeout(1000); - - await page - .getByTestId("modelsOpenAI") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill("conditional router"); - await page.waitForTimeout(1000); - - await page - .getByTestId("prototypesConditional Router") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill("pass"); - await page.waitForTimeout(1000); - - await page - .getByTestId("prototypesPass") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page - .getByTestId("prototypesPass") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("zoom out").click(); - - await page - .getByTestId("prototypesPass") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("zoom out").click(); - - await page.getByPlaceholder("Search").click(); - await page.getByPlaceholder("Search").fill("chatoutput"); - await page.waitForTimeout(1000); - - await page - .getByTestId("outputsChat Output") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("zoom out").click(); - - await page - .getByTestId("outputsChat Output") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - //connection 1 - const elementCreateListOutput0 = await page - .getByTestId("handle-createlist-shownode-data list-right") - .nth(2); - await elementCreateListOutput0.hover(); - await page.mouse.down(); - const elementParseDataInput0 = await page - .getByTestId("handle-parsedata-shownode-data-left") - .nth(0); - await elementParseDataInput0.hover(); - await page.mouse.up(); - - //connection 2 - const elementCreateListOutput1 = await page - .getByTestId("handle-createlist-shownode-data list-right") - .first(); - await elementCreateListOutput1.hover(); - await page.mouse.down(); - const elementParseDataInput1 = await page - .getByTestId("handle-parsedata-shownode-data-left") - .last(); - await elementParseDataInput1.hover(); - await page.mouse.up(); - - //connection 3 - const elementChatInputOutput = await page - .getByTestId("handle-chatinput-shownode-message-right") - .first(); - await elementChatInputOutput.hover(); - await page.mouse.down(); - const elementPassInput3 = await page - .getByTestId("handle-pass-shownode-input message-left") - .last(); - await elementPassInput3.hover(); - await page.mouse.up(); - - //edit prompt - await page.getByTestId("promptarea_prompt_template").first().click(); - await page.getByTestId("modal-promptarea_prompt_template").first().fill(` - {Condition} - -Answer with either TRUE or FALSE (and nothing else). - -TRUE Examples: -{true_examples} - -FALSE Examples: -{false_examples} - - -User: {user_message} -AI: - - `); - - await page.getByText("Check & Save").last().click(); - - await page.locator('//*[@id="react-flow-id"]').hover(); - - //connection 4 - const elementPassOutput3 = await page - .getByTestId("handle-pass-shownode-output message-right") - .nth(4); - await elementPassOutput3.hover(); - await page.mouse.down(); - const elementPromptInputUserMessage = await page - .getByTestId("handle-prompt-shownode-user_message-left") - .first(); - await elementPromptInputUserMessage.hover(); - await page.mouse.up(); - - //connection 5 - const elementParseDataOutput0 = await page - .getByTestId("handle-parsedata-shownode-text-right") - .nth(0); - await elementParseDataOutput0.hover(); - await page.mouse.down(); - const elementPromptInput = await page - .getByTestId("handle-prompt-shownode-false_examples-left") - .first(); - await elementPromptInput.hover(); - await page.mouse.up(); - - await page.locator('//*[@id="react-flow-id"]').hover(); - - //connection 6 - const elementParseDataOutput1 = await page - .getByTestId("handle-parsedata-shownode-text-right") - .nth(2); - await elementParseDataOutput1.hover(); - await page.mouse.down(); - const elementPromptInput1 = await page - .getByTestId("handle-prompt-shownode-true_examples-left") - .first(); - await elementPromptInput1.hover(); - await page.mouse.up(); - - await page.locator('//*[@id="react-flow-id"]').hover(); - - //connection 7 - elementPassOutput3.hover(); - await page.mouse.down(); - const elementPromptInput2 = await page - .getByTestId("handle-prompt-shownode-user_message-left") - .first(); - await elementPromptInput2.hover(); - await page.mouse.up(); - - await page.locator('//*[@id="react-flow-id"]').hover(); - - //connection 8 - const elementPromptOutput = await page - .getByTestId("handle-prompt-shownode-prompt message-right") - .first(); - await elementPromptOutput.hover(); - await page.mouse.down(); - const elementOpenAiInput = await page - .getByTestId("handle-openaimodel-shownode-input-left") - .first(); - await elementOpenAiInput.hover(); - await page.mouse.up(); - - await page.locator('//*[@id="react-flow-id"]').hover(); - - //connection 9 - const elementPassOutput1 = await page - .getByTestId("handle-pass-shownode-output message-right") - .nth(2); - await elementPassOutput1.hover(); - await page.mouse.down(); - const elementChatOutput = await page - .getByTestId("handle-chatoutput-shownode-text-left") - .last(); - await elementChatOutput.hover(); - await page.mouse.up(); - - await page.locator('//*[@id="react-flow-id"]').hover(); - - //connection 10 - const elementPassOutput2 = await page - .getByTestId("handle-pass-shownode-output message-right") - .first(); - await elementPassOutput2.hover(); - await page.mouse.down(); - const elementChatOutput1 = await page - .getByTestId("handle-chatoutput-shownode-text-left") - .first(); - await elementChatOutput1.hover(); - await page.mouse.up(); - - await page.locator('//*[@id="react-flow-id"]').hover(); - - //connection 11 - const elementOpenAiOutput = await page - .getByTestId("handle-openaimodel-shownode-text-right") - .first(); - await elementOpenAiOutput.hover(); - await page.mouse.down(); - const elementConditionalRouterInput1 = await page - .getByTestId("handle-conditionalrouter-shownode-input text-left") - .first(); - await elementConditionalRouterInput1.hover(); - await page.mouse.up(); - - await page.getByTestId("icon-arrow-right").nth(1).click(); - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("edit-button-modal").click(); - - let showIgnoredMessageCheckbox = await page.getByTestId( - "showignored_message", - ); - - if (!(await showIgnoredMessageCheckbox.isChecked())) { - await showIgnoredMessageCheckbox.click(); - } - - await page - .getByTestId("popover-anchor-input-input_message-edit") - .nth(0) - .fill("You're Happy! 🤪"); - await page.getByText("Close").last().click(); - - await page.getByTitle("zoom in").click(); - await page.getByTitle("zoom in").click(); - await page.getByTitle("zoom in").click(); - await page.getByTitle("zoom in").click(); - - await page.locator('//*[@id="react-flow-id"]').hover(); - - await page.getByTestId("icon-arrow-right").nth(0).click(); - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("edit-button-modal").click(); - - showIgnoredMessageCheckbox = await page.getByTestId("showignored_message"); - - if (!(await showIgnoredMessageCheckbox.isChecked())) { - await showIgnoredMessageCheckbox.click(); - } - - await page - .getByTestId("popover-anchor-input-input_message-edit") - .nth(0) - .fill("You're Sad! 🥲"); - await page.getByText("Close").last().click(); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTitle("fit view").click({ - force: true, - }); - - await page.getByTestId("popover-anchor-input-match_text").fill("TRUE"); - - await page.locator('//*[@id="react-flow-id"]').hover(); - - //connection 12 - const elementConditionalRouterOutput1 = await page - .getByTestId("handle-conditionalrouter-shownode-true route-right") - .first(); - await elementConditionalRouterOutput1.hover(); - await page.mouse.down(); - - await page.locator('//*[@id="react-flow-id"]').hover(); - - const elementPassInput1 = await page - .getByTestId("handle-pass-shownode-ignored message-left") - .nth(1); - await elementPassInput1.hover(); - await page.mouse.up(); - - await page.locator('//*[@id="react-flow-id"]').hover(); - - //connection 13 - const elementConditionalRouterOutput2 = await page - .getByTestId("handle-conditionalrouter-shownode-false route-right") - .first(); - await elementConditionalRouterOutput2.hover(); - await page.mouse.down(); - const elementPassInput2 = await page - .getByTestId("handle-pass-shownode-ignored message-left") - .first(); - await elementPassInput2.hover(); - await page.mouse.up(); - - await page.locator('//*[@id="react-flow-id"]').hover(); - - await page - .getByTestId("popover-anchor-input-api_key") - .fill(process.env.OPENAI_API_KEY ?? ""); - - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); - - await page.getByLabel("fit view").click(); - await page.getByText("Playground", { exact: true }).last().click(); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); - await page.getByTestId("input-chat-playground").click(); - - await page - .getByTestId("input-chat-playground") - .fill("my dog is alive and happy!"); - - await page.waitForSelector('[data-testid="icon-LucideSend"]', { - timeout: 100000, - }); - - await page.getByTestId("icon-LucideSend").click(); - - await page.waitForSelector("text=🤪", { - timeout: 1200000, - }); - - await page.getByText("🤪").isVisible(); + // test.skip( + // !process?.env?.OPENAI_API_KEY, + // "OPENAI_API_KEY required to run this test", + // ); + // if (!process.env.CI) { + // dotenv.config({ path: path.resolve(__dirname, "../../.env") }); + // } + // await page.goto("/"); + // await page.waitForSelector('[data-testid="mainpage_title"]', { + // timeout: 30000, + // }); + // await page.waitForSelector('[id="new-project-btn"]', { + // timeout: 30000, + // }); + // let modalCount = 0; + // try { + // const modalTitleElement = await page?.getByTestId("modal-title"); + // if (modalTitleElement) { + // modalCount = await modalTitleElement.count(); + // } + // } catch (error) { + // modalCount = 0; + // } + // while (modalCount === 0) { + // await page.getByText("New Project", { exact: true }).click(); + // await page.waitForTimeout(3000); + // modalCount = await page.getByTestId("modal-title")?.count(); + // } + // await page.waitForSelector('[data-testid="blank-flow"]', { + // timeout: 30000, + // }); + // await page.getByTestId("blank-flow").click(); + // await page.waitForSelector('[data-testid="extended-disclosure"]', { + // timeout: 30000, + // }); + // await page.getByTestId("extended-disclosure").click(); + // await page.getByPlaceholder("Search").click(); + // await page.getByPlaceholder("Search").fill("chat input"); + // await page.waitForTimeout(1000); + // await page + // .getByTestId("inputsChat Input") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByPlaceholder("Search").click(); + // await page.getByPlaceholder("Search").fill("create list"); + // await page.waitForTimeout(1000); + // await page.getByTitle("zoom out").click(); + // await page.getByTitle("zoom out").click(); + // await page + // .getByTestId("helpersCreate List") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.mouse.up(); + // await page.mouse.down(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTestId("input-list-plus-btn_texts-0").click(); + // await page.getByTestId("input-list-plus-btn_texts-0").click(); + // await page + // .getByTestId("inputlist_str_texts_0") + // .first() + // .fill("big news! langflow 1.0 is out"); + // await page + // .getByTestId("inputlist_str_texts_1") + // .first() + // .fill("uhul that movie was awesome"); + // await page.getByTestId("inputlist_str_texts_2").first().fill("love you babe"); + // await page.getByTitle("zoom out").click(); + // await page.getByTitle("zoom out").click(); + // await page + // .getByTestId("helpersCreate List") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.mouse.up(); + // await page.mouse.down(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTestId("input-list-plus-btn_texts-0").last().click(); + // await page.getByTestId("input-list-plus-btn_texts-0").last().click(); + // await page.getByTestId("inputlist_str_texts_0").last().fill("oh my cat died"); + // await page + // .getByTestId("inputlist_str_texts_1") + // .last() + // .fill("No one loves me"); + // await page.getByTestId("inputlist_str_texts_2").last().fill("not cool.."); + // await page.getByPlaceholder("Search").click(); + // await page.getByPlaceholder("Search").fill("parse data"); + // await page.waitForTimeout(1000); + // await page.getByTitle("zoom out").click(); + // await page + // .getByTestId("helpersParse Data") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.mouse.up(); + // await page.mouse.down(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page + // .getByTestId("helpersParse Data") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.mouse.up(); + // await page.mouse.down(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByPlaceholder("Search").click(); + // await page.getByPlaceholder("Search").fill("prompt"); + // await page.waitForTimeout(1000); + // await page + // .getByTestId("promptsPrompt") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.mouse.up(); + // await page.mouse.down(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByPlaceholder("Search").click(); + // await page.getByPlaceholder("Search").fill("openai"); + // await page.waitForTimeout(1000); + // await page + // .getByTestId("modelsOpenAI") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.mouse.up(); + // await page.mouse.down(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByPlaceholder("Search").click(); + // await page.getByPlaceholder("Search").fill("conditional router"); + // await page.waitForTimeout(1000); + // await page + // .getByTestId("prototypesConditional Router") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.mouse.up(); + // await page.mouse.down(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByPlaceholder("Search").click(); + // await page.getByPlaceholder("Search").fill("pass"); + // await page.waitForTimeout(1000); + // await page + // .getByTestId("prototypesPass") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.mouse.up(); + // await page.mouse.down(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page + // .getByTestId("prototypesPass") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.mouse.up(); + // await page.mouse.down(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("zoom out").click(); + // await page + // .getByTestId("prototypesPass") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.mouse.up(); + // await page.mouse.down(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("zoom out").click(); + // await page.getByPlaceholder("Search").click(); + // await page.getByPlaceholder("Search").fill("chatoutput"); + // await page.waitForTimeout(1000); + // await page + // .getByTestId("outputsChat Output") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.mouse.up(); + // await page.mouse.down(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("zoom out").click(); + // await page + // .getByTestId("outputsChat Output") + // .dragTo(page.locator('//*[@id="react-flow-id"]')); + // await page.mouse.up(); + // await page.mouse.down(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // //connection 1 + // const elementCreateListOutput0 = await page + // .getByTestId("handle-createlist-shownode-data list-right") + // .nth(2); + // await elementCreateListOutput0.hover(); + // await page.mouse.down(); + // const elementParseDataInput0 = await page + // .getByTestId("handle-parsedata-shownode-data-left") + // .nth(0); + // await elementParseDataInput0.hover(); + // await page.mouse.up(); + // //connection 2 + // const elementCreateListOutput1 = await page + // .getByTestId("handle-createlist-shownode-data list-right") + // .first(); + // await elementCreateListOutput1.hover(); + // await page.mouse.down(); + // const elementParseDataInput1 = await page + // .getByTestId("handle-parsedata-shownode-data-left") + // .last(); + // await elementParseDataInput1.hover(); + // await page.mouse.up(); + // //connection 3 + // const elementChatInputOutput = await page + // .getByTestId("handle-chatinput-shownode-message-right") + // .first(); + // await elementChatInputOutput.hover(); + // await page.mouse.down(); + // const elementPassInput3 = await page + // .getByTestId("handle-pass-shownode-input message-left") + // .last(); + // await elementPassInput3.hover(); + // await page.mouse.up(); + // //edit prompt + // await page.getByTestId("promptarea_prompt_template").first().click(); + // await page.getByTestId("modal-promptarea_prompt_template").first().fill(` + // {Condition} + // Answer with either TRUE or FALSE (and nothing else). + // TRUE Examples: + // {true_examples} + // FALSE Examples: + // {false_examples} + // User: {user_message} + // AI: + // `); + // await page.getByText("Check & Save").last().click(); + // await page.locator('//*[@id="react-flow-id"]').hover(); + // //connection 4 + // const elementPassOutput3 = await page + // .getByTestId("handle-pass-shownode-output message-right") + // .nth(4); + // await elementPassOutput3.hover(); + // await page.mouse.down(); + // const elementPromptInputUserMessage = await page + // .getByTestId("handle-prompt-shownode-user_message-left") + // .first(); + // await elementPromptInputUserMessage.hover(); + // await page.mouse.up(); + // //connection 5 + // const elementParseDataOutput0 = await page + // .getByTestId("handle-parsedata-shownode-text-right") + // .nth(0); + // await elementParseDataOutput0.hover(); + // await page.mouse.down(); + // const elementPromptInput = await page + // .getByTestId("handle-prompt-shownode-false_examples-left") + // .first(); + // await elementPromptInput.hover(); + // await page.mouse.up(); + // await page.locator('//*[@id="react-flow-id"]').hover(); + // //connection 6 + // const elementParseDataOutput1 = await page + // .getByTestId("handle-parsedata-shownode-text-right") + // .nth(2); + // await elementParseDataOutput1.hover(); + // await page.mouse.down(); + // const elementPromptInput1 = await page + // .getByTestId("handle-prompt-shownode-true_examples-left") + // .first(); + // await elementPromptInput1.hover(); + // await page.mouse.up(); + // await page.locator('//*[@id="react-flow-id"]').hover(); + // //connection 7 + // elementPassOutput3.hover(); + // await page.mouse.down(); + // const elementPromptInput2 = await page + // .getByTestId("handle-prompt-shownode-user_message-left") + // .first(); + // await elementPromptInput2.hover(); + // await page.mouse.up(); + // await page.locator('//*[@id="react-flow-id"]').hover(); + // //connection 8 + // const elementPromptOutput = await page + // .getByTestId("handle-prompt-shownode-prompt message-right") + // .first(); + // await elementPromptOutput.hover(); + // await page.mouse.down(); + // const elementOpenAiInput = await page + // .getByTestId("handle-openaimodel-shownode-input-left") + // .first(); + // await elementOpenAiInput.hover(); + // await page.mouse.up(); + // await page.locator('//*[@id="react-flow-id"]').hover(); + // //connection 9 + // const elementPassOutput1 = await page + // .getByTestId("handle-pass-shownode-output message-right") + // .nth(2); + // await elementPassOutput1.hover(); + // await page.mouse.down(); + // const elementChatOutput = await page + // .getByTestId("handle-chatoutput-shownode-text-left") + // .last(); + // await elementChatOutput.hover(); + // await page.mouse.up(); + // await page.locator('//*[@id="react-flow-id"]').hover(); + // //connection 10 + // const elementPassOutput2 = await page + // .getByTestId("handle-pass-shownode-output message-right") + // .first(); + // await elementPassOutput2.hover(); + // await page.mouse.down(); + // const elementChatOutput1 = await page + // .getByTestId("handle-chatoutput-shownode-text-left") + // .first(); + // await elementChatOutput1.hover(); + // await page.mouse.up(); + // await page.locator('//*[@id="react-flow-id"]').hover(); + // //connection 11 + // const elementOpenAiOutput = await page + // .getByTestId("handle-openaimodel-shownode-text-right") + // .first(); + // await elementOpenAiOutput.hover(); + // await page.mouse.down(); + // const elementConditionalRouterInput1 = await page + // .getByTestId("handle-conditionalrouter-shownode-input text-left") + // .first(); + // await elementConditionalRouterInput1.hover(); + // await page.mouse.up(); + // await page.getByTestId("icon-arrow-right").nth(1).click(); + // await page.getByTestId("more-options-modal").click(); + // await page.getByTestId("edit-button-modal").click(); + // let showIgnoredMessageCheckbox = await page.getByTestId( + // "showignored_message", + // ); + // if (!(await showIgnoredMessageCheckbox.isChecked())) { + // await showIgnoredMessageCheckbox.click(); + // } + // await page + // .getByTestId("popover-anchor-input-input_message-edit") + // .nth(0) + // .fill("You're Happy! 🤪"); + // await page.getByText("Close").last().click(); + // await page.getByTitle("zoom in").click(); + // await page.getByTitle("zoom in").click(); + // await page.getByTitle("zoom in").click(); + // await page.getByTitle("zoom in").click(); + // await page.locator('//*[@id="react-flow-id"]').hover(); + // await page.getByTestId("icon-arrow-right").nth(0).click(); + // await page.getByTestId("more-options-modal").click(); + // await page.getByTestId("edit-button-modal").click(); + // showIgnoredMessageCheckbox = await page.getByTestId("showignored_message"); + // if (!(await showIgnoredMessageCheckbox.isChecked())) { + // await showIgnoredMessageCheckbox.click(); + // } + // await page + // .getByTestId("popover-anchor-input-input_message-edit") + // .nth(0) + // .fill("You're Sad! 🥲"); + // await page.getByText("Close").last().click(); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTitle("fit view").click({ + // force: true, + // }); + // await page.getByTestId("popover-anchor-input-match_text").fill("TRUE"); + // await page.locator('//*[@id="react-flow-id"]').hover(); + // //connection 12 + // const elementConditionalRouterOutput1 = await page + // .getByTestId("handle-conditionalrouter-shownode-true route-right") + // .first(); + // await elementConditionalRouterOutput1.hover(); + // await page.mouse.down(); + // await page.locator('//*[@id="react-flow-id"]').hover(); + // const elementPassInput1 = await page + // .getByTestId("handle-pass-shownode-ignored message-left") + // .nth(1); + // await elementPassInput1.hover(); + // await page.mouse.up(); + // await page.locator('//*[@id="react-flow-id"]').hover(); + // //connection 13 + // const elementConditionalRouterOutput2 = await page + // .getByTestId("handle-conditionalrouter-shownode-false route-right") + // .first(); + // await elementConditionalRouterOutput2.hover(); + // await page.mouse.down(); + // const elementPassInput2 = await page + // .getByTestId("handle-pass-shownode-ignored message-left") + // .first(); + // await elementPassInput2.hover(); + // await page.mouse.up(); + // await page.locator('//*[@id="react-flow-id"]').hover(); + // await page + // .getByTestId("popover-anchor-input-api_key") + // .fill(process.env.OPENAI_API_KEY ?? ""); + // await page.getByTestId("dropdown_str_model_name").click(); + // await page.getByTestId("gpt-4o-1-option").click(); + // await page.getByLabel("fit view").click(); + // await page.getByText("Playground", { exact: true }).last().click(); + // await page.waitForSelector('[data-testid="input-chat-playground"]', { + // timeout: 100000, + // }); + // await page.getByTestId("input-chat-playground").click(); + // await page + // .getByTestId("input-chat-playground") + // .fill("my dog is alive and happy!"); + // await page.waitForSelector('[data-testid="icon-LucideSend"]', { + // timeout: 100000, + // }); + // await page.getByTestId("icon-LucideSend").click(); + // await page.waitForSelector("text=🤪", { + // timeout: 1200000, + // }); + // await page.getByText("🤪").isVisible(); }); diff --git a/src/frontend/tests/core/integrations/similarity.spec.ts b/src/frontend/tests/core/integrations/similarity.spec.ts index 276874a2a..6994fbcac 100644 --- a/src/frontend/tests/core/integrations/similarity.spec.ts +++ b/src/frontend/tests/core/integrations/similarity.spec.ts @@ -27,7 +27,7 @@ test("user must be able to check similarity between embedding texts", async ({ modalCount = await page.getByTestId("modal-title")?.count(); } - await page.getByRole("heading", { name: "Blank Flow" }).click(); + await page.getByTestId("blank-flow").click(); //first component @@ -46,7 +46,7 @@ test("user must be able to check similarity between embedding texts", async ({ .hover() .then(async () => { await page.mouse.down(); - await page.mouse.move(-800, 300); + await page.mouse.move(-50, 50); }); await page.mouse.up(); @@ -63,7 +63,7 @@ test("user must be able to check similarity between embedding texts", async ({ .hover() .then(async () => { await page.mouse.down(); - await page.mouse.move(-800, 300); + await page.mouse.move(-50, 50); }); await page.mouse.up(); @@ -85,7 +85,7 @@ test("user must be able to check similarity between embedding texts", async ({ .hover() .then(async () => { await page.mouse.down(); - await page.mouse.move(-800, 300); + await page.mouse.move(-50, 50); }); await page.mouse.up(); @@ -102,7 +102,7 @@ test("user must be able to check similarity between embedding texts", async ({ .hover() .then(async () => { await page.mouse.down(); - await page.mouse.move(-800, 300); + await page.mouse.move(-50, 50); }); await page.mouse.up(); @@ -124,7 +124,7 @@ test("user must be able to check similarity between embedding texts", async ({ .hover() .then(async () => { await page.mouse.down(); - await page.mouse.move(-800, 300); + await page.mouse.move(-50, 50); }); await page.mouse.up(); @@ -146,7 +146,7 @@ test("user must be able to check similarity between embedding texts", async ({ .hover() .then(async () => { await page.mouse.down(); - await page.mouse.move(-800, 300); + await page.mouse.move(-50, 50); }); await page.mouse.up(); @@ -168,7 +168,7 @@ test("user must be able to check similarity between embedding texts", async ({ .hover() .then(async () => { await page.mouse.down(); - await page.mouse.move(-800, 300); + await page.mouse.move(-50, 50); }); await page.mouse.up(); @@ -188,7 +188,7 @@ test("user must be able to check similarity between embedding texts", async ({ .hover() .then(async () => { await page.mouse.down(); - await page.mouse.move(-800, 300); + await page.mouse.move(-50, 50); }); await page.mouse.up(); @@ -232,6 +232,8 @@ test("user must be able to check similarity between embedding texts", async ({ .nth(0) .fill("similarity_score"); + await page.getByTitle("fit view").click(); + await page.mouse.wheel(0, 500); //connection 1 const openAiEmbeddingOutput_0 = await page .getByTestId("handle-openaiembeddings-shownode-embeddings-right") diff --git a/src/frontend/tests/core/integrations/starter-projects.spec.ts b/src/frontend/tests/core/integrations/starter-projects.spec.ts index 12c116082..fbee3dbfc 100644 --- a/src/frontend/tests/core/integrations/starter-projects.spec.ts +++ b/src/frontend/tests/core/integrations/starter-projects.spec.ts @@ -72,7 +72,8 @@ test("vector store from starter projects should have its connections and nodes o modalCount = await page.getByTestId("modal-title")?.count(); } - await page.getByRole("heading", { name: "Vector Store RAG" }).click(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Vector Store RAG" }).first().click(); await page.waitForSelector('[title="fit view"]', { timeout: 100000, }); diff --git a/src/frontend/tests/core/regression/generalBugs-shard-4.spec.ts b/src/frontend/tests/core/regression/generalBugs-shard-4.spec.ts index bf6554ada..2ce42c3d7 100644 --- a/src/frontend/tests/core/regression/generalBugs-shard-4.spec.ts +++ b/src/frontend/tests/core/regression/generalBugs-shard-4.spec.ts @@ -32,7 +32,8 @@ test("should be able to move flow from folder, rename it and be displayed on cor modalCount = await page.getByTestId("modal-title")?.count(); } - await page.getByRole("heading", { name: "Vector Store RAG" }).click(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Vector Store RAG" }).first().click(); await page.waitForSelector('[title="fit view"]', { timeout: 100000, }); diff --git a/src/frontend/tests/core/regression/generalBugs-shard-9.spec.ts b/src/frontend/tests/core/regression/generalBugs-shard-9.spec.ts index 072ff615a..d7ebc853f 100644 --- a/src/frontend/tests/core/regression/generalBugs-shard-9.spec.ts +++ b/src/frontend/tests/core/regression/generalBugs-shard-9.spec.ts @@ -32,6 +32,7 @@ test("memory should work as expect", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForTimeout(1000); diff --git a/src/frontend/tests/extended/features/actionsMainPage-shard-0.spec.ts b/src/frontend/tests/extended/features/actionsMainPage-shard-0.spec.ts index bec55a35b..955bec8ba 100644 --- a/src/frontend/tests/extended/features/actionsMainPage-shard-0.spec.ts +++ b/src/frontend/tests/extended/features/actionsMainPage-shard-0.spec.ts @@ -29,6 +29,7 @@ test("user should be able to download a flow or a component", async ({ modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { @@ -132,6 +133,7 @@ test("user should be able to duplicate a flow or a component", async ({ modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { timeout: 100000, diff --git a/src/frontend/tests/extended/features/curlApiGeneration.spec.ts b/src/frontend/tests/extended/features/curlApiGeneration.spec.ts index 50c801daf..497478a73 100644 --- a/src/frontend/tests/extended/features/curlApiGeneration.spec.ts +++ b/src/frontend/tests/extended/features/curlApiGeneration.spec.ts @@ -17,6 +17,7 @@ test("curl_api_generation", async ({ page, context }) => { await page.waitForTimeout(3000); modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForTimeout(1000); await page.getByText("API", { exact: true }).click(); diff --git a/src/frontend/tests/extended/features/limit-file-size-upload.spec.ts b/src/frontend/tests/extended/features/limit-file-size-upload.spec.ts index 243a7a216..a848d130f 100644 --- a/src/frontend/tests/extended/features/limit-file-size-upload.spec.ts +++ b/src/frontend/tests/extended/features/limit-file-size-upload.spec.ts @@ -49,6 +49,7 @@ test("user should not be able to upload a file larger than the limit", async ({ modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { timeout: 100000, diff --git a/src/frontend/tests/extended/features/pythonApiGeneration.spec.ts b/src/frontend/tests/extended/features/pythonApiGeneration.spec.ts index ef6611188..6ac553b10 100644 --- a/src/frontend/tests/extended/features/pythonApiGeneration.spec.ts +++ b/src/frontend/tests/extended/features/pythonApiGeneration.spec.ts @@ -24,6 +24,7 @@ test("python_api_generation", async ({ page, context }) => { await page.waitForTimeout(3000); modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForTimeout(1000); await page.getByText("API", { exact: true }).click(); diff --git a/src/frontend/tests/extended/features/starter-projects.spec.ts b/src/frontend/tests/extended/features/starter-projects.spec.ts new file mode 100644 index 000000000..0956f2af3 --- /dev/null +++ b/src/frontend/tests/extended/features/starter-projects.spec.ts @@ -0,0 +1,84 @@ +import { expect, test } from "@playwright/test"; + +test("user must be able to interact with starter projects", async ({ + page, + context, +}) => { + await page.goto("/"); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } + + while (modalCount === 0) { + await page.getByText("New Project", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } + + expect(page.getByText("Start from scratch")).toBeVisible(); + expect( + page.getByRole("button", { name: "Create Blank Project" }), + ).toBeVisible(); + + await page.getByTestId("side_nav_options_all-templates").click(); + await page.waitForTimeout(500); + + await page.getByPlaceholder("Search...").fill("Document"); + await page.waitForTimeout(500); + + expect( + page.getByTestId("template_basic-prompting-(hello,-world)"), + ).not.toBeVisible(); + + expect(page.getByTestId("template_document-qa").first()).toBeVisible(); + expect( + page.getByTestId(`template_sequential-tasks-agent`).first(), + ).toBeVisible(); + + expect(page.getByTestId("template_vector-store")).not.toBeVisible(); + expect(page.getByTestId(`template_simple-agent`)).not.toBeVisible(); + expect(page.getByTestId(`template_dynamic-agent`)).not.toBeVisible(); + expect( + page.getByTestId(`template_hierarchical-tasks-agent`), + ).not.toBeVisible(); + + await page.waitForTimeout(500); + + await page.getByTestId(`side_nav_options_chatbots`).click(); + await page.waitForTimeout(500); + expect(page.getByTestId(`category_title_chatbots`)).toBeVisible(); + + await page.getByTestId(`side_nav_options_rag`).click(); + await page.waitForTimeout(500); + + expect(page.getByTestId(`category_title_rag`)).toBeVisible(); + expect(page.getByTestId(`template_vector-store-rag`)).toBeVisible(); + + expect( + page.getByTestId(`template_basic-prompting-(hello,-world)`), + ).not.toBeVisible(); + expect(page.getByTestId(`template_document-qa`)).not.toBeVisible(); + + await page.getByTestId(`side_nav_options_agents`).click(); + await page.waitForTimeout(500); + + expect(page.getByTestId(`category_title_agents`)).toBeVisible(); + + expect( + page.getByTestId(`template_basic-prompting-(hello,-world)`), + ).not.toBeVisible(); + expect(page.getByTestId(`template_document-qa`)).not.toBeVisible(); + expect(page.getByTestId(`template_vector-store-rag`)).not.toBeVisible(); + + expect(page.getByTestId(`template_travel-planning-agents`)).toBeVisible(); + expect(page.getByTestId(`template_sequential-tasks-agent`)).toBeVisible(); + expect(page.getByTestId(`template_dynamic-agent`)).toBeVisible(); + expect(page.getByTestId(`template_hierarchical-tasks-agent`)).toBeVisible(); + expect(page.getByTestId(`template_simple-agent`)).toBeVisible(); +}); diff --git a/src/frontend/tests/extended/features/twoEdges.spec.ts b/src/frontend/tests/extended/features/twoEdges.spec.ts index 988e34117..52f756ad2 100644 --- a/src/frontend/tests/extended/features/twoEdges.spec.ts +++ b/src/frontend/tests/extended/features/twoEdges.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from "@playwright/test"; +import { test } from "@playwright/test"; test("user should be able to see multiple edges and interact with them", async ({ page, @@ -29,7 +29,7 @@ test("user should be able to see multiple edges and interact with them", async ( } await page.waitForTimeout(1000); - await page.getByText("Vector Store RAG", { exact: true }).last().click(); + await page.getByText("Vector RAG", { exact: true }).last().click(); await page.waitForTimeout(3000); await page.getByText("Retriever", { exact: true }).first().isVisible(); await page.getByText("Search Results", { exact: true }).first().isVisible(); diff --git a/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-1.spec.ts b/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-1.spec.ts index e2d7839c7..db05bfc7e 100644 --- a/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-1.spec.ts +++ b/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-1.spec.ts @@ -1,6 +1,5 @@ -import { expect, test } from "@playwright/test"; +import { test } from "@playwright/test"; import * as dotenv from "dotenv"; -import { readFileSync } from "fs"; import path from "path"; test("user must be able to see output inspection", async ({ page }) => { @@ -33,6 +32,7 @@ test("user must be able to see output inspection", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { timeout: 100000, diff --git a/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-2.spec.ts b/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-2.spec.ts index bbc6da513..4594886b3 100644 --- a/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-2.spec.ts +++ b/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-2.spec.ts @@ -32,6 +32,7 @@ test("user must interact with chat with Input/Output", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { timeout: 100000, diff --git a/src/frontend/tests/extended/regression/general-bugs-shard-3836.spec.ts b/src/frontend/tests/extended/regression/general-bugs-shard-3836.spec.ts index 76a536d29..c039c4efe 100644 --- a/src/frontend/tests/extended/regression/general-bugs-shard-3836.spec.ts +++ b/src/frontend/tests/extended/regression/general-bugs-shard-3836.spec.ts @@ -34,6 +34,7 @@ test("user must be able to send an image on chat using advanced tool on ChatInpu modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { timeout: 100000, diff --git a/src/frontend/tests/extended/regression/general-bugs-shard-3909.spec.ts b/src/frontend/tests/extended/regression/general-bugs-shard-3909.spec.ts index aee4ffc53..5564f3bbb 100644 --- a/src/frontend/tests/extended/regression/general-bugs-shard-3909.spec.ts +++ b/src/frontend/tests/extended/regression/general-bugs-shard-3909.spec.ts @@ -54,6 +54,7 @@ test("user must be able to create a new flow clicking on Start Here button", asy await page.getByText("Start Here", { exact: true }).click(); + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector("text=playground", { timeout: 30000 }); await page.waitForSelector("text=api", { timeout: 30000 }); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-0.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-0.spec.ts index 2611e1df3..6b924d106 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-0.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-0.spec.ts @@ -32,6 +32,7 @@ test("erase button should clear the chat messages", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForTimeout(1000); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-1.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-1.spec.ts index d36bd84ae..68a5f63f4 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-1.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-1.spec.ts @@ -35,6 +35,7 @@ test("should delete rows from table message", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector('[title="fit view"]', { timeout: 100000, diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-10.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-10.spec.ts index 88d5333cf..4a3c9fd96 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-10.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-10.spec.ts @@ -34,6 +34,7 @@ test("freeze must work correctly", async ({ page }) => { modalCount = await page.getByTestId("modal-title")?.count(); } + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForTimeout(1000); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-13.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-13.spec.ts index 0289f68ca..9fc24c2bc 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-13.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-13.spec.ts @@ -62,6 +62,7 @@ test("should be able to share a component on the store by clicking on the share await page.getByText("New Project", { exact: true }).click(); + await page.getByTestId("side_nav_options_all-templates").click(); await page.getByRole("heading", { name: "Basic Prompting" }).click(); await page.waitForSelector("text=share", { timeout: 10000 }); await page.waitForSelector("text=playground", { timeout: 10000 }); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-3.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-3.spec.ts index 76673d468..ecc06b50e 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-3.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-3.spec.ts @@ -126,6 +126,9 @@ test("should copy code from playground modal", async ({ page }) => { } // Click and hold on the first element + await page.getByTitle("zoom in").click(); + await page.getByTitle("zoom in").click(); + await visibleElementHandle.hover(); await page.mouse.down();