refactor: improve output selection logic and edge updating in GenericNode (#8254)

* refactor: improve output selection logic and edge updating in GenericNode

* feat: enhance output rendering logic for loop and conditional components

* feat: add group_outputs flag to output components for enhanced display control

* feat: enhance output handling by adding support for hidden outputs in NodeOutputs component

* fix: update display output logic to handle tool mode correctly

* fix: improve output selection logic in NodeOutputs component

* refactor: simplify output selection logic in OutputComponent and GenericNode

* refactor: remove commented code and clean up unused memoization in various components

* refactor: clean up NodeOutputs component by removing commented code and simplifying output logic

* [autofix.ci] apply automated fixes

* feat: add group_outputs field to test_output in schema tests

* test: Skip grouped components output preview test and add wait times for stability

* fix: remove 'group_outputs' property from multiple starter project JSON files

* Revert starter_projects folder to main branch state

* Revert starter_projects folder to match origin/main exactly

* Re-sync starter_projects folder with main branch after merge conflict

* Add "group_outputs" property to various agent configurations

* test: skip progress tracking test for admin users

* test: enable progress tracking for admin users and improve component interaction

* test: remove redundant dropdown interaction and enhance multi-select functionality

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Gabriel Luiz Freitas Almeida <gabriel@langflow.org>
This commit is contained in:
Deon Sanchez 2025-06-02 12:03:26 -06:00 committed by GitHub
commit 5c40410f00
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
44 changed files with 372 additions and 176 deletions

View file

@ -34,6 +34,7 @@ def vector_store_connection(cls):
hidden=True,
name="vectorstoreconnection",
method="as_vector_store",
group_outputs=False,
)
]
)

View file

@ -65,8 +65,8 @@ class ConditionalRouterComponent(Component):
]
outputs = [
Output(display_name="True", name="true_result", method="true_response"),
Output(display_name="False", name="false_result", method="false_response"),
Output(display_name="True", name="true_result", method="true_response", group_outputs=True),
Output(display_name="False", name="false_result", method="false_response", group_outputs=True),
]
def _pre_run_setup(self):

View file

@ -21,8 +21,8 @@ class LoopComponent(Component):
]
outputs = [
Output(display_name="Item", name="item", method="item_output", allows_loop=True),
Output(display_name="Done", name="done", method="done_output"),
Output(display_name="Item", name="item", method="item_output", allows_loop=True, group_outputs=True),
Output(display_name="Done", name="done", method="done_output", group_outputs=True),
]
def initialize_data(self) -> None:

View file

@ -226,6 +226,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -359,6 +360,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -655,6 +657,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -952,6 +955,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1079,6 +1083,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1296,6 +1301,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -1310,6 +1316,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -1687,6 +1694,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -1701,6 +1709,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -2078,6 +2087,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -2092,6 +2102,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [

View file

@ -118,6 +118,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -401,6 +402,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -604,6 +606,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -917,6 +920,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -931,6 +935,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [

View file

@ -183,6 +183,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -353,6 +354,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text",
"selected": "Message",
@ -464,6 +466,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -799,6 +802,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -813,6 +817,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -1176,6 +1181,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Parsed Text",
"group_outputs": false,
"method": "parse_combined_text",
"name": "parsed_text",
"selected": "Message",
@ -1358,6 +1364,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Result",
"group_outputs": false,
"method": "fetch_content",
"name": "page_results",
"selected": "DataFrame",
@ -1371,6 +1378,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Raw Result",
"group_outputs": false,
"method": "as_message",
"name": "raw_results",
"selected": "Message",

View file

@ -240,6 +240,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Data",
"group_outputs": false,
"method": "retrieve_messages",
"name": "messages",
"selected": "Data",
@ -253,6 +254,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "retrieve_messages_as_text",
"name": "messages_text",
"selected": "Message",
@ -266,6 +268,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "as_dataframe",
"name": "dataframe",
"selected": "DataFrame",
@ -504,6 +507,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1414,6 +1418,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -1428,6 +1433,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -1744,6 +1750,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -2056,6 +2063,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -126,6 +126,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -436,6 +437,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -574,6 +576,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -588,6 +591,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [],
@ -939,6 +943,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -180,6 +180,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -470,6 +471,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -801,6 +803,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Loaded Files",
"group_outputs": false,
"method": "load_dataframe",
"name": "dataframe",
"required_inputs": [],
@ -1074,6 +1077,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1238,6 +1242,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -1252,6 +1257,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [

View file

@ -349,6 +349,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -1373,6 +1374,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -1974,6 +1976,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -1988,6 +1991,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -3699,6 +3703,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -3875,6 +3880,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",

View file

@ -165,6 +165,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -179,6 +180,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -547,6 +549,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -858,6 +861,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -1218,6 +1222,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Structured Output",
"group_outputs": false,
"method": "build_structured_output",
"name": "structured_output",
"selected": "Data",
@ -1231,6 +1236,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "as_dataframe",
"name": "structured_output_dataframe",
"selected": "DataFrame",

View file

@ -797,6 +797,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -1109,6 +1110,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -268,6 +268,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -578,6 +579,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Structured Output",
"group_outputs": false,
"method": "build_structured_output",
"name": "structured_output",
"selected": "Data",
@ -591,6 +593,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "as_dataframe",
"name": "structured_output_dataframe",
"selected": "DataFrame",
@ -900,6 +903,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -914,6 +918,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -1296,6 +1301,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Search Results",
"group_outputs": false,
"method": "search_documents",
"name": "search_results",
"required_inputs": [
@ -1314,6 +1320,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "as_dataframe",
"name": "dataframe",
"required_inputs": [],
@ -1328,6 +1335,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Vector Store Connection",
"group_outputs": false,
"hidden": true,
"method": "as_vector_store",
"name": "vectorstoreconnection",
@ -2056,6 +2064,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Parsed Text",
"group_outputs": false,
"method": "parse_combined_text",
"name": "parsed_text",
"selected": "Message",
@ -2234,6 +2243,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -2535,6 +2545,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Parsed Text",
"group_outputs": false,
"method": "parse_combined_text",
"name": "parsed_text",
"selected": "Message",

View file

@ -212,6 +212,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -516,6 +517,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -848,6 +850,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -992,6 +995,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -1006,6 +1010,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -1372,6 +1377,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Structured Output",
"group_outputs": false,
"method": "build_structured_output",
"name": "structured_output",
"selected": "Data",
@ -1385,6 +1391,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "as_dataframe",
"name": "structured_output_dataframe",
"selected": "DataFrame",

View file

@ -326,6 +326,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -619,6 +620,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -788,6 +790,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text",
"selected": "Message",
@ -898,6 +901,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1053,6 +1057,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -1372,6 +1377,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Response",
"group_outputs": false,
"method": "message_response",
"name": "response",
"selected": "Message",
@ -1974,6 +1980,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -2793,6 +2800,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -2807,6 +2815,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -3184,6 +3193,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -3198,6 +3208,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [

View file

@ -183,6 +183,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -311,6 +312,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -874,6 +876,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -208,6 +208,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -504,6 +505,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -843,6 +845,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Structured Output",
"group_outputs": false,
"method": "build_structured_output",
"name": "structured_output",
"selected": "Data",
@ -856,6 +859,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "as_dataframe",
"name": "structured_output_dataframe",
"selected": "DataFrame",
@ -1223,6 +1227,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Response",
"group_outputs": false,
"method": "message_response",
"name": "response",
"selected": "Message",
@ -2302,6 +2307,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -2316,6 +2322,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [

View file

@ -317,6 +317,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Transcription Result",
"group_outputs": false,
"method": "poll_transcription_job",
"name": "transcription_result",
"selected": "Data",
@ -478,6 +479,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -492,6 +494,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -859,6 +862,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1009,6 +1013,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -1310,6 +1315,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -1621,6 +1627,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -1635,6 +1642,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -2001,6 +2009,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -2304,6 +2313,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -2474,6 +2484,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Data",
"group_outputs": false,
"method": "retrieve_messages",
"name": "messages",
"selected": "Data",
@ -2487,6 +2498,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "retrieve_messages_as_text",
"name": "messages_text",
"selected": "Message",
@ -2500,6 +2512,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "as_dataframe",
"name": "dataframe",
"selected": "DataFrame",
@ -2741,6 +2754,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -3154,6 +3168,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Transcript ID",
"group_outputs": false,
"method": "create_transcription_job",
"name": "transcript_id",
"selected": "Data",

View file

@ -150,6 +150,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -454,6 +455,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -821,6 +823,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Data",
"group_outputs": false,
"method": "retrieve_messages",
"name": "messages",
"selected": "Data",
@ -834,6 +837,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "retrieve_messages_as_text",
"name": "messages_text",
"selected": "Message",
@ -847,6 +851,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "as_dataframe",
"name": "dataframe",
"selected": "DataFrame",
@ -1085,6 +1090,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1250,6 +1256,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -1264,6 +1271,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [

View file

@ -616,6 +616,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -943,6 +944,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Response",
"group_outputs": false,
"method": "message_response",
"name": "response",
"selected": "Message",
@ -1642,6 +1644,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Confirmation",
"group_outputs": false,
"method": "save_to_file",
"name": "confirmation",
"selected": "Text",
@ -1800,6 +1803,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -125,6 +125,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -437,6 +438,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -234,6 +234,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text",
"selected": "Message",
@ -357,6 +358,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -371,6 +373,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -697,6 +700,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -711,6 +715,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -1028,6 +1033,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -1479,6 +1485,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Structured Output",
"group_outputs": false,
"method": "build_structured_output",
"name": "structured_output",
"selected": "Data",
@ -1492,6 +1499,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "as_dataframe",
"name": "structured_output_dataframe",
"selected": "DataFrame",
@ -1848,6 +1856,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Loaded Files",
"group_outputs": false,
"method": "load_dataframe",
"name": "dataframe",
"required_inputs": [],
@ -2126,6 +2135,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Parsed Text",
"group_outputs": false,
"method": "parse_combined_text",
"name": "parsed_text",
"selected": "Message",

View file

@ -156,6 +156,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -467,6 +468,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -1652,6 +1654,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Response",
"group_outputs": false,
"method": "message_response",
"name": "response",
"selected": "Message",

View file

@ -322,6 +322,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -478,6 +479,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -771,6 +773,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1004,6 +1007,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Response",
"group_outputs": false,
"method": "message_response",
"name": "response",
"selected": "Message",
@ -1603,6 +1607,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1730,6 +1735,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -2369,6 +2375,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -2383,6 +2390,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -2760,6 +2768,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -2774,6 +2783,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -3142,6 +3152,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -234,6 +234,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "search_papers_dataframe",
"name": "dataframe",
"selected": "DataFrame",
@ -399,6 +400,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -413,6 +415,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -722,6 +725,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Data",
"group_outputs": false,
"method": "convert_message_to_data",
"name": "data",
"selected": "Data",
@ -833,6 +837,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -1142,6 +1147,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -1503,6 +1509,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Parsed Text",
"group_outputs": false,
"method": "parse_combined_text",
"name": "parsed_text",
"selected": "Message",
@ -1676,6 +1683,7 @@
"allows_loop": true,
"cache": true,
"display_name": "Item",
"group_outputs": true,
"method": "item_output",
"name": "item",
"selected": "Data",
@ -1689,6 +1697,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Done",
"group_outputs": true,
"method": "done_output",
"name": "done",
"selected": "DataFrame",
@ -1719,7 +1728,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.custom import Component\nfrom langflow.io import HandleInput, Output\nfrom langflow.schema import Data\nfrom langflow.schema.dataframe import DataFrame\n\n\nclass LoopComponent(Component):\n display_name = \"Loop\"\n description = (\n \"Iterates over a list of Data objects, outputting one item at a time and aggregating results from loop inputs.\"\n )\n icon = \"infinity\"\n\n inputs = [\n HandleInput(\n name=\"data\",\n display_name=\"Data or DataFrame\",\n info=\"The initial list of Data objects or DataFrame to iterate over.\",\n input_types=[\"Data\", \"DataFrame\"],\n ),\n ]\n\n outputs = [\n Output(display_name=\"Item\", name=\"item\", method=\"item_output\", allows_loop=True),\n Output(display_name=\"Done\", name=\"done\", method=\"done_output\"),\n ]\n\n def initialize_data(self) -> None:\n \"\"\"Initialize the data list, context index, and aggregated list.\"\"\"\n if self.ctx.get(f\"{self._id}_initialized\", False):\n return\n\n # Ensure data is a list of Data objects\n data_list = self._validate_data(self.data)\n\n # Store the initial data and context variables\n self.update_ctx(\n {\n f\"{self._id}_data\": data_list,\n f\"{self._id}_index\": 0,\n f\"{self._id}_aggregated\": [],\n f\"{self._id}_initialized\": True,\n }\n )\n\n def _validate_data(self, data):\n \"\"\"Validate and return a list of Data objects.\"\"\"\n if isinstance(data, DataFrame):\n return data.to_data_list()\n if isinstance(data, Data):\n return [data]\n if isinstance(data, list) and all(isinstance(item, Data) for item in data):\n return data\n msg = \"The 'data' input must be a DataFrame, a list of Data objects, or a single Data object.\"\n raise TypeError(msg)\n\n def evaluate_stop_loop(self) -> bool:\n \"\"\"Evaluate whether to stop item or done output.\"\"\"\n current_index = self.ctx.get(f\"{self._id}_index\", 0)\n data_length = len(self.ctx.get(f\"{self._id}_data\", []))\n return current_index > data_length\n\n def item_output(self) -> Data:\n \"\"\"Output the next item in the list or stop if done.\"\"\"\n self.initialize_data()\n current_item = Data(text=\"\")\n\n if self.evaluate_stop_loop():\n self.stop(\"item\")\n return Data(text=\"\")\n\n # Get data list and current index\n data_list, current_index = self.loop_variables()\n if current_index < len(data_list):\n # Output current item and increment index\n try:\n current_item = data_list[current_index]\n except IndexError:\n current_item = Data(text=\"\")\n self.aggregated_output()\n self.update_ctx({f\"{self._id}_index\": current_index + 1})\n return current_item\n\n def done_output(self) -> DataFrame:\n \"\"\"Trigger the done output when iteration is complete.\"\"\"\n self.initialize_data()\n\n if self.evaluate_stop_loop():\n self.stop(\"item\")\n self.start(\"done\")\n\n aggregated = self.ctx.get(f\"{self._id}_aggregated\", [])\n\n return DataFrame(aggregated)\n self.stop(\"done\")\n return DataFrame([])\n\n def loop_variables(self):\n \"\"\"Retrieve loop variables from context.\"\"\"\n return (\n self.ctx.get(f\"{self._id}_data\", []),\n self.ctx.get(f\"{self._id}_index\", 0),\n )\n\n def aggregated_output(self) -> list[Data]:\n \"\"\"Return the aggregated list once all items are processed.\"\"\"\n self.initialize_data()\n\n # Get data list and aggregated list\n data_list = self.ctx.get(f\"{self._id}_data\", [])\n aggregated = self.ctx.get(f\"{self._id}_aggregated\", [])\n loop_input = self.item\n if loop_input is not None and not isinstance(loop_input, str) and len(aggregated) <= len(data_list):\n aggregated.append(loop_input)\n self.update_ctx({f\"{self._id}_aggregated\": aggregated})\n return aggregated\n"
"value": "from langflow.custom import Component\nfrom langflow.io import HandleInput, Output\nfrom langflow.schema import Data\nfrom langflow.schema.dataframe import DataFrame\n\n\nclass LoopComponent(Component):\n display_name = \"Loop\"\n description = (\n \"Iterates over a list of Data objects, outputting one item at a time and aggregating results from loop inputs.\"\n )\n icon = \"infinity\"\n\n inputs = [\n HandleInput(\n name=\"data\",\n display_name=\"Data or DataFrame\",\n info=\"The initial list of Data objects or DataFrame to iterate over.\",\n input_types=[\"Data\", \"DataFrame\"],\n ),\n ]\n\n outputs = [\n Output(display_name=\"Item\", name=\"item\", method=\"item_output\", allows_loop=True, group_outputs=True),\n Output(display_name=\"Done\", name=\"done\", method=\"done_output\", group_outputs=True),\n ]\n\n def initialize_data(self) -> None:\n \"\"\"Initialize the data list, context index, and aggregated list.\"\"\"\n if self.ctx.get(f\"{self._id}_initialized\", False):\n return\n\n # Ensure data is a list of Data objects\n data_list = self._validate_data(self.data)\n\n # Store the initial data and context variables\n self.update_ctx(\n {\n f\"{self._id}_data\": data_list,\n f\"{self._id}_index\": 0,\n f\"{self._id}_aggregated\": [],\n f\"{self._id}_initialized\": True,\n }\n )\n\n def _validate_data(self, data):\n \"\"\"Validate and return a list of Data objects.\"\"\"\n if isinstance(data, DataFrame):\n return data.to_data_list()\n if isinstance(data, Data):\n return [data]\n if isinstance(data, list) and all(isinstance(item, Data) for item in data):\n return data\n msg = \"The 'data' input must be a DataFrame, a list of Data objects, or a single Data object.\"\n raise TypeError(msg)\n\n def evaluate_stop_loop(self) -> bool:\n \"\"\"Evaluate whether to stop item or done output.\"\"\"\n current_index = self.ctx.get(f\"{self._id}_index\", 0)\n data_length = len(self.ctx.get(f\"{self._id}_data\", []))\n return current_index > data_length\n\n def item_output(self) -> Data:\n \"\"\"Output the next item in the list or stop if done.\"\"\"\n self.initialize_data()\n current_item = Data(text=\"\")\n\n if self.evaluate_stop_loop():\n self.stop(\"item\")\n return Data(text=\"\")\n\n # Get data list and current index\n data_list, current_index = self.loop_variables()\n if current_index < len(data_list):\n # Output current item and increment index\n try:\n current_item = data_list[current_index]\n except IndexError:\n current_item = Data(text=\"\")\n self.aggregated_output()\n self.update_ctx({f\"{self._id}_index\": current_index + 1})\n return current_item\n\n def done_output(self) -> DataFrame:\n \"\"\"Trigger the done output when iteration is complete.\"\"\"\n self.initialize_data()\n\n if self.evaluate_stop_loop():\n self.stop(\"item\")\n self.start(\"done\")\n\n aggregated = self.ctx.get(f\"{self._id}_aggregated\", [])\n\n return DataFrame(aggregated)\n self.stop(\"done\")\n return DataFrame([])\n\n def loop_variables(self):\n \"\"\"Retrieve loop variables from context.\"\"\"\n return (\n self.ctx.get(f\"{self._id}_data\", []),\n self.ctx.get(f\"{self._id}_index\", 0),\n )\n\n def aggregated_output(self) -> list[Data]:\n \"\"\"Return the aggregated list once all items are processed.\"\"\"\n self.initialize_data()\n\n # Get data list and aggregated list\n data_list = self.ctx.get(f\"{self._id}_data\", [])\n aggregated = self.ctx.get(f\"{self._id}_aggregated\", [])\n loop_input = self.item\n if loop_input is not None and not isinstance(loop_input, str) and len(aggregated) <= len(data_list):\n aggregated.append(loop_input)\n self.update_ctx({f\"{self._id}_aggregated\": aggregated})\n return aggregated\n"
},
"data": {
"_input_type": "HandleInput",

View file

@ -128,6 +128,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -428,6 +429,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -561,6 +563,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -904,6 +907,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -918,6 +922,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [

View file

@ -123,6 +123,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -371,6 +372,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -726,6 +728,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Response",
"group_outputs": false,
"method": "message_response",
"name": "response",
"selected": "Message",

View file

@ -343,6 +343,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -652,6 +653,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -370,6 +370,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Response",
"group_outputs": false,
"method": "message_response",
"name": "response",
"selected": "Message",
@ -992,6 +993,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Response",
"group_outputs": false,
"method": "message_response",
"name": "response",
"selected": "Message",
@ -1597,6 +1599,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1730,6 +1733,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1866,6 +1870,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -2043,6 +2048,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -2436,6 +2442,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Response",
"group_outputs": false,
"method": "message_response",
"name": "response",
"selected": "Message",
@ -4064,6 +4071,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -602,6 +602,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -915,6 +916,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -642,6 +642,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -952,6 +953,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -265,6 +265,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Loaded Files",
"group_outputs": false,
"method": "load_dataframe",
"name": "dataframe",
"required_inputs": [],
@ -549,6 +550,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -702,6 +704,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -864,6 +867,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -878,6 +882,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -1255,6 +1260,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -1269,6 +1275,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -1635,6 +1642,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1775,6 +1783,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -1789,6 +1798,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -2182,6 +2192,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -2489,6 +2500,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -232,6 +232,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -528,6 +529,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",

View file

@ -296,6 +296,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -582,6 +583,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text",
"selected": "Message",
@ -696,6 +698,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -989,6 +992,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text",
"selected": "Message",
@ -1093,6 +1097,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text",
"selected": "Message",
@ -1197,6 +1202,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text",
"selected": "Message",
@ -1301,6 +1307,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text",
"selected": "Message",
@ -1405,6 +1412,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text",
"selected": "Message",
@ -1557,6 +1565,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -1838,6 +1847,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -1852,6 +1862,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [

View file

@ -325,6 +325,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -617,6 +618,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Prompt",
"group_outputs": false,
"method": "build_prompt",
"name": "prompt",
"selected": "Message",
@ -789,6 +791,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Chunks",
"group_outputs": false,
"method": "split_text",
"name": "chunks",
"selected": "Data",
@ -802,6 +805,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "as_dataframe",
"name": "dataframe",
"selected": "DataFrame",
@ -1085,6 +1089,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "message_response",
"name": "message",
"selected": "Message",
@ -1398,6 +1403,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Embeddings",
"group_outputs": false,
"method": "build_embeddings",
"name": "embeddings",
"required_inputs": [
@ -1932,6 +1938,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Embeddings",
"group_outputs": false,
"method": "build_embeddings",
"name": "embeddings",
"required_inputs": [
@ -2412,6 +2419,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Loaded Files",
"group_outputs": false,
"method": "load_dataframe",
"name": "dataframe",
"required_inputs": [],
@ -2790,6 +2798,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Message",
"group_outputs": false,
"method": "text_response",
"name": "text_output",
"required_inputs": [],
@ -2804,6 +2813,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Language Model",
"group_outputs": false,
"method": "build_model",
"name": "model_output",
"required_inputs": [
@ -3359,6 +3369,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Search Results",
"group_outputs": false,
"method": "search_documents",
"name": "search_results",
"required_inputs": [
@ -3377,6 +3388,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "as_dataframe",
"name": "dataframe",
"required_inputs": [],
@ -3391,6 +3403,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Vector Store Connection",
"group_outputs": false,
"hidden": true,
"method": "as_vector_store",
"name": "vectorstoreconnection",
@ -4118,6 +4131,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Search Results",
"group_outputs": false,
"method": "search_documents",
"name": "search_results",
"required_inputs": [
@ -4136,6 +4150,7 @@
"allows_loop": false,
"cache": true,
"display_name": "DataFrame",
"group_outputs": false,
"method": "as_dataframe",
"name": "dataframe",
"required_inputs": [],
@ -4150,6 +4165,7 @@
"allows_loop": false,
"cache": true,
"display_name": "Vector Store Connection",
"group_outputs": false,
"hidden": true,
"method": "as_vector_store",
"name": "vectorstoreconnection",

File diff suppressed because one or more lines are too long

View file

@ -208,6 +208,9 @@ class Output(BaseModel):
allows_loop: bool = Field(default=False)
"""Specifies if the output allows looping."""
group_outputs: bool = Field(default=False)
"""Specifies if all outputs should be grouped and shown without dropdowns."""
options: OutputOptions | None = Field(default=None)
"""Options for the output."""

View file

@ -139,6 +139,7 @@ class TestOutput:
"types": [],
"name": "test_output",
"display_name": "test_output",
"group_outputs": False,
"cache": True,
"value": "__UNDEFINED__",
"tool_mode": True,

View file

@ -1,4 +1,3 @@
// NodeOutputs.tsx
import { NodeDataType } from "@/types/flow";
import { OutputParameter } from ".";
@ -25,80 +24,86 @@ export default function NodeOutputs({
selectedOutput: any;
handleSelectOutput: any;
}) {
const output = selectedOutput
? outputs.find((output) => output.name === selectedOutput.name)
: outputs[0];
const hasLoopOutput = outputs.some((output) => output.allows_loop);
const hasGroupOutputs = outputs.some((output) => output.group_outputs);
const isConditionalRouter = data.type === "ConditionalRouter";
const hasHiddenOutputs = outputs.some((output) => output.hidden);
if (!output) return null;
const shouldShowAllOutputs =
hasLoopOutput || hasGroupOutputs || isConditionalRouter || hasHiddenOutputs;
const idx =
data.node!.outputs?.findIndex((out) => out.name === output.name) ?? 0;
if (shouldShowAllOutputs) {
const outputsToRender =
keyPrefix === "hidden"
? outputs.filter((output) => output.hidden)
: outputs.filter((output) => !output.hidden);
const isLoop = output?.allows_loop ?? false;
return (
<>
{outputsToRender?.map((output, idx) => (
<OutputParameter
key={`${keyPrefix}-${output.name}-${idx}`}
output={output}
outputs={outputs}
idx={
data.node!.outputs?.findIndex(
(out) => out.name === output.name,
) ?? idx
}
lastOutput={idx === outputsToRender.length - 1}
data={data}
types={types}
selected={selected}
showNode={showNode}
isToolMode={isToolMode}
showHiddenOutputs={showHiddenOutputs}
handleSelectOutput={handleSelectOutput}
hidden={
keyPrefix === "hidden"
? showHiddenOutputs
? output.hidden
: true
: false
}
/>
))}
</>
);
}
const hiddenOutputs = outputs.filter((output) => output.hidden);
const getDisplayOutput = () => {
const filteredOutputs =
keyPrefix === "hidden"
? outputs.filter((output) => output.hidden)
: outputs.filter((output) => !output.hidden);
return isLoop ? (
keyPrefix === "hidden" ? (
hiddenOutputs?.map((output, idx) => (
<OutputParameter
key={`${keyPrefix}-${output.name}-${idx}`}
output={output}
idx={
data.node!.outputs?.findIndex((out) => out.name === output.name) ??
idx
}
lastOutput={idx === outputs.length - 1}
data={data}
types={types}
selected={selected}
showNode={showNode}
isToolMode={isToolMode}
showHiddenOutputs={showHiddenOutputs}
handleSelectOutput={handleSelectOutput}
hidden={
keyPrefix === "hidden"
? showHiddenOutputs
? output.hidden
: true
: false
}
/>
))
) : (
outputs?.map((output, idx) => (
<OutputParameter
key={`${keyPrefix}-${output.name}-${idx}`}
output={output}
idx={
data.node!.outputs?.findIndex((out) => out.name === output.name) ??
idx
}
lastOutput={idx === outputs.length - 1}
data={data}
types={types}
selected={selected}
showNode={showNode}
isToolMode={isToolMode}
showHiddenOutputs={showHiddenOutputs}
handleSelectOutput={handleSelectOutput}
hidden={
keyPrefix === "hidden"
? showHiddenOutputs
? output.hidden
: true
: false
}
/>
))
)
) : (
if (selectedOutput) {
return (
filteredOutputs.find((output) => output.name === selectedOutput.name) ||
filteredOutputs[0]
);
}
const outputWithSelection = filteredOutputs.find(
(output) => output.selected,
);
return outputWithSelection || filteredOutputs[0];
};
const displayOutput = getDisplayOutput();
if (!displayOutput) return null;
return (
<OutputParameter
key={`${keyPrefix}-${output.name}-${idx}`}
output={output}
key={`${keyPrefix}-${displayOutput.name}`}
output={displayOutput}
outputs={outputs}
idx={
data.node!.outputs?.findIndex((out) => out.name === output.name) ?? idx
data.node!.outputs?.findIndex(
(out) => out.name === displayOutput.name,
) ?? 0
}
lastOutput={true}
data={data}
@ -111,7 +116,7 @@ export default function NodeOutputs({
hidden={
keyPrefix === "hidden"
? showHiddenOutputs
? output.hidden
? displayOutput.hidden
: true
: false
}

View file

@ -38,7 +38,6 @@ import OutputComponent from "../OutputComponent";
import HandleRenderComponent from "../handleRenderComponent";
import OutputModal from "../outputModal";
// Memoize IconComponent instances
const EyeIcon = memo(
({ hidden, className }: { hidden: boolean; className: string }) => (
<IconComponent
@ -53,7 +52,6 @@ const SnowflakeIcon = memo(() => (
<IconComponent className="h-5 w-5 text-ice" name="Snowflake" />
));
// Memoize Button components
const HideShowButton = memo(
({
disabled,
@ -178,14 +176,12 @@ function NodeOutputField({
const ref = useRef<HTMLDivElement>(null);
const updateNodeInternals = useUpdateNodeInternals();
// Use selective store subscriptions
const edges = useFlowStore((state) => state.edges);
const setNode = useFlowStore((state) => state.setNode);
const setFilterEdge = useFlowStore((state) => state.setFilterEdge);
const flowPool = useFlowStore((state) => state.flowPool);
const myData = useTypesStore((state) => state.data);
// Memoize computed values
const { flowPoolId, internalOutputName } = useMemo(() => {
if (data.node?.flow && outputProxy) {
const realOutput = getGroupOutputNodeId(
@ -450,9 +446,7 @@ function NodeOutputField({
errorOutput={errorOutput ?? false}
isToolMode={isToolMode}
title={title}
onClick={() => {
//just to trigger the memoization
}}
onClick={() => {}}
id={data?.type}
/>
</OutputModal>

View file

@ -6,6 +6,7 @@ import {
DropdownMenuItem,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import useFlowStore from "@/stores/flowStore";
import ShadTooltip from "../../../../components/common/shadTooltipComponent";
import { outputComponentType } from "../../../../types/components";
import { cn } from "../../../../utils/utils";
@ -23,6 +24,10 @@ export default function OutputComponent({
handleSelectOutput,
outputName,
}: outputComponentType) {
const nodeType = useFlowStore(
(state) => state.nodes.find((node) => node.id === nodeId)?.data?.type,
);
const displayProxy = (children) => {
if (proxy) {
return (
@ -47,9 +52,17 @@ export default function OutputComponent({
</span>,
);
const hasLoopOutput = outputs?.some?.((output) => output.allows_loop);
const hasGroupOutputs = outputs?.some?.((output) => output.group_outputs);
const isConditionalRouter = nodeType === "ConditionalRouter";
const hasOutputs = outputs.length > 1;
const shouldShowDropdown =
hasOutputs && !hasLoopOutput && !hasGroupOutputs && !isConditionalRouter;
return (
<div>
{outputs.length > 1 ? (
{shouldShowDropdown ? (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
@ -86,51 +99,4 @@ export default function OutputComponent({
)}
</div>
);
// ! DEACTIVATED UNTIL BETTER IMPLEMENTATION
// return (
// <div className="noflow nopan nodelete nodrag flex items-center gap-2">
// <DropdownMenu>
// <DropdownMenuTrigger asChild>
// <Button
// disabled={frozen}
// variant="primary"
// size="xs"
// className={cn(
// frozen ? "text-ice" : "",
// "items-center gap-1 pl-2 pr-1.5 align-middle text-xs font-normal",
// )}
// >
// <span className="pb-px">{selected}</span>
// <ForwardedIconComponent name="ChevronDown" className="h-3 w-3" />
// </Button>
// </DropdownMenuTrigger>
// <DropdownMenuContent>
// {types.map((type) => (
// <DropdownMenuItem
// onSelect={() => {
// // TODO: UDPDATE SET NODE TO NEW NODE FORM
// setNode(nodeId, (node) => {
// const newNode = cloneDeep(node);
// (newNode.data as NodeDataType).node!.outputs![idx].selected =
// type;
// return newNode;
// });
// updateNodeInternals(nodeId);
// }}
// >
// {type}
// </DropdownMenuItem>
// ))}
// </DropdownMenuContent>
// </DropdownMenu>
// {proxy ? (
// <ShadTooltip content={<span>{proxy.nodeDisplayName}</span>}>
// <span>{name}</span>
// </ShadTooltip>
// ) : (
// <span>{name}</span>
// )}
// </div>
// );
}

View file

@ -54,13 +54,12 @@ const HiddenOutputsButton = memo(
}) => (
<Button
unstyled
className="group flex h-[1.75rem] w-[1.75rem] items-center justify-center rounded-full border bg-muted hover:text-foreground"
className="group flex h-[1.25rem] w-[1.25rem] items-center justify-center rounded-full border bg-muted hover:text-foreground"
onClick={onClick}
>
<ForwardedIconComponent
name={showHiddenOutputs ? "ChevronsDownUp" : "ChevronsUpDown"}
strokeWidth={ICON_STROKE_WIDTH}
className="icon-size text-placeholder-foreground group-hover:text-foreground"
className="h-3 w-3 text-placeholder-foreground group-hover:text-foreground"
/>
</Button>
),
@ -219,7 +218,6 @@ function GenericNode({
const update = useShortcutsStore((state) => state.update);
useHotkeys(update, handleUpdateCodeWShortcut, { preventDefault: true });
// Memoized values
const isToolMode = useMemo(
() =>
data.node?.outputs?.some(
@ -261,35 +259,47 @@ function GenericNode({
}, [data.node?.outputs]);
const [selectedOutput, setSelectedOutput] = useState<OutputFieldType | null>(
null,
() => data.node?.outputs?.find((output) => output.selected) || null,
);
const handleSelectOutput = useCallback(
(output) => {
setSelectedOutput(output);
// Remove any edges connected to this output handle
const sourceHandleId = scapedJSONStringfy({
output_types: [output.selected ?? output.types[0]],
id: data.id,
dataType: data.type,
name: output.name,
});
setEdges((eds) =>
eds.filter((edge) => edge.sourceHandle !== sourceHandleId),
);
setEdges((eds) => {
return eds.map((edge) => {
if (edge.source === data.id && edge.data?.sourceHandle) {
const sourceHandle = edge.data.sourceHandle;
if (sourceHandle.name === output.name) {
const newSourceHandle = {
...sourceHandle,
output_types: [output.selected ?? output.types[0]],
};
const newSourceHandleId = scapedJSONStringfy(newSourceHandle);
return {
...edge,
sourceHandle: newSourceHandleId,
data: {
...edge.data,
sourceHandle: newSourceHandle,
},
};
}
}
return edge;
});
});
setNode(data.id, (oldNode) => {
const newNode = cloneDeep(oldNode);
if (newNode.data.node?.outputs) {
// First, clear any previous selections
newNode.data.node.outputs.forEach((out) => {
if (out.selected) {
out.selected = undefined;
}
});
// Then set the new selection
const outputIndex = newNode.data.node.outputs.findIndex(
(o) => o.name === output.name,
);
@ -566,38 +576,32 @@ function GenericNode({
>
{" "}
</div>
{!showHiddenOutputs && shownOutputs && (
<MemoizedNodeOutputs
outputs={shownOutputs}
keyPrefix={"shown"}
data={data}
types={types}
selected={selected ?? false}
showNode={showNode}
isToolMode={isToolMode}
showHiddenOutputs={showHiddenOutputs}
selectedOutput={selectedOutput}
handleSelectOutput={handleSelectOutput}
/>
{showHiddenOutputs && (
<MemoizedNodeOutputs
outputs={showHiddenOutputs ? hiddenOutputs : shownOutputs}
keyPrefix="shown"
outputs={hiddenOutputs}
keyPrefix="hidden"
data={data}
types={types}
selected={selected ?? false}
showNode={showNode}
isToolMode={isToolMode}
showHiddenOutputs={showHiddenOutputs}
showHiddenOutputs={true}
selectedOutput={selectedOutput}
handleSelectOutput={handleSelectOutput}
/>
)}
<div
className={cn(showHiddenOutputs ? "" : "h-0 overflow-hidden")}
>
<div className="block">
<MemoizedNodeOutputs
outputs={data.node!.outputs}
keyPrefix="hidden"
data={data}
types={types}
selected={selected ?? false}
showNode={showNode}
isToolMode={isToolMode}
showHiddenOutputs={showHiddenOutputs}
selectedOutput={selectedOutput}
handleSelectOutput={handleSelectOutput}
/>
</div>
</div>
{hiddenOutputs && hiddenOutputs.length > 0 && (
<ShadTooltip
content={

View file

@ -113,8 +113,6 @@ const NodeToolbarComponent = memo(
[data.node],
);
// Check if any of the data.node.template fields have tool_mode as True
// if so we can show the tool mode button
const hasToolMode = useMemo(
() => checkHasToolMode(data.node?.template ?? {}) && !isGroup,
[data.node?.template, isGroup],

View file

@ -322,12 +322,6 @@ test(
.getByTestId("handle-pass-shownode-ignored message-left")
.nth(1)
.click();
await page.getByTestId("dropdown-output-conditionalrouter").click();
await page
.getByTestId("dropdown-item-output-conditionalrouter-false")
.click();
await page
.getByTestId("handle-conditionalrouter-shownode-false-right")
.nth(0)