From d8c8f4db7a6cba4e3201e1cc401ee6fd02725ddd Mon Sep 17 00:00:00 2001 From: Mendon Kissling <59585235+mendonk@users.noreply.github.com> Date: Mon, 13 May 2024 15:06:26 -0400 Subject: [PATCH 01/27] initial-content --- docs/docs/administration/global-env.mdx | 43 ++++++++++++++++++++++++ docs/sidebars.js | 1 + docs/static/img/global-env.png | Bin 0 -> 87279 bytes 3 files changed, 44 insertions(+) create mode 100644 docs/docs/administration/global-env.mdx create mode 100644 docs/static/img/global-env.png diff --git a/docs/docs/administration/global-env.mdx b/docs/docs/administration/global-env.mdx new file mode 100644 index 000000000..4525707ae --- /dev/null +++ b/docs/docs/administration/global-env.mdx @@ -0,0 +1,43 @@ +import ZoomableImage from "/src/theme/ZoomableImage.js"; +import Admonition from "@theme/Admonition"; + +# Global environment variables + +Langflow 1.0 alpha includes the option to add **Global Environment Variables** for your application. + +## Example + +In this example, you'll add the `openai_api_key` credential as a global environment variable to the **Basic Prompting** starter project. + +For more information on the starter flow, see [Basic prompting ](../starter-projects/basic-prompting.mdx). + +1. From the Langflow dashboard, click **New Project**. +2. Select **Basic Prompting**. +3. The **Basic Prompting** flow is created. +4. To create an environment variable for the **OpenAI** component, in the **OpenAI API Key** field, click the **Globe** button, and then click **Add New Variable**. + + + You can also create global variables in **Settings** > **Variables and Secrets**. + + + 1. In the **Variable Name** field, enter `openai_api_key`. + 2. In the **Value** field, paste your OpenAI API Key (`sk-...`). + 3. For the variable **Type**, select **Credential**. + 4. In the **Apply to Fields** field, select **OpenAI API Key** to apply this variable to all fields named **OpenAI API Key**. + 5. Click **Save Variable**. + + + +You now have a `openai_api_key` global environment variable for your Langflow project. + +5. To view and manage your project's global environment variables, visit **Settings** > **Variables and Secrets**. + +For more on variables in HuggingFace Spaces, see [Managing Secrets](https://huggingface.co/docs/hub/spaces-overview#managing-secrets). + diff --git a/docs/sidebars.js b/docs/sidebars.js index 848400d18..cf66f270f 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -40,6 +40,7 @@ module.exports = { "administration/login", "administration/api", "administration/cli", + "administration/global-env", "administration/components", "administration/collection", "administration/prompt-customization", diff --git a/docs/static/img/global-env.png b/docs/static/img/global-env.png new file mode 100644 index 0000000000000000000000000000000000000000..763444dc4528fc68c817f9879162cb7b7407503b GIT binary patch literal 87279 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
$=H`@6M8ir+0$RBG*;;;P4&9Rs|;7vF^a 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 literal 0 HcmV?d00001 From 3af526734c4383b61e15ee4b74aa27b7b568adef Mon Sep 17 00:00:00 2001 From: Mendon Kissling <59585235+mendonk@users.noreply.github.com> Date: Mon, 13 May 2024 15:07:13 -0400 Subject: [PATCH 02/27] title --- docs/docs/administration/global-env.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/administration/global-env.mdx b/docs/docs/administration/global-env.mdx index 4525707ae..28dbff22f 100644 --- a/docs/docs/administration/global-env.mdx +++ b/docs/docs/administration/global-env.mdx @@ -5,7 +5,7 @@ import Admonition from "@theme/Admonition"; Langflow 1.0 alpha includes the option to add **Global Environment Variables** for your application. -## Example +## Add a global variable to a project In this example, you'll add the `openai_api_key` credential as a global environment variable to the **Basic Prompting** starter project. From f6a6241b66d69317ffa884ceb364a48db6773f43 Mon Sep 17 00:00:00 2001 From: Mendon Kissling <59585235+mendonk@users.noreply.github.com> Date: Mon, 13 May 2024 18:37:39 -0400 Subject: [PATCH 03/27] initial-content --- docs/docs/administration/playground.mdx | 28 ++++++++++++++++++++++++ docs/sidebars.js | 1 + docs/static/img/playground-chat.png | Bin 0 -> 134800 bytes 3 files changed, 29 insertions(+) create mode 100644 docs/docs/administration/playground.mdx create mode 100644 docs/static/img/playground-chat.png diff --git a/docs/docs/administration/playground.mdx b/docs/docs/administration/playground.mdx new file mode 100644 index 000000000..6fe14e73f --- /dev/null +++ b/docs/docs/administration/playground.mdx @@ -0,0 +1,28 @@ +import ThemedImage from "@theme/ThemedImage"; +import useBaseUrl from "@docusaurus/useBaseUrl"; +import ZoomableImage from "/src/theme/ZoomableImage.js"; +import ReactPlayer from "react-player"; +import Admonition from "@theme/Admonition"; + +# Playground + +In Langflow 1.0 alpha, the **Playground** replaces the **Integration Window**. + +The **Playground** offers an interface for interacting with chat flows. + +1. To use the **Playground**, from your **Collections** page, click **Playground** in one of your flows. +The **Playground** window opens. + + + +2. Chat with your bot as you normally would. + +The Playground allows you to run flows without opening them in the flow editor. +This applies to the Langflow store, too - as long as you have your global environment variables set, you can run flows by clicking the **Playground** button. diff --git a/docs/sidebars.js b/docs/sidebars.js index 848400d18..a0e2af3f1 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -40,6 +40,7 @@ module.exports = { "administration/login", "administration/api", "administration/cli", + "administration/playground", "administration/components", "administration/collection", "administration/prompt-customization", diff --git a/docs/static/img/playground-chat.png b/docs/static/img/playground-chat.png new file mode 100644 index 0000000000000000000000000000000000000000..d2625c28fe4e09afbae23ce7cfacb190cf2c30f2 GIT binary patch literal 134800 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

v%$fJD0heQo@Z%V6vz>|ZCYtbS+ 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 Date: Tue, 14 May 2024 10:50:11 -0400 Subject: [PATCH 04/27] cleanup --- docs/docs/administration/playground.mdx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/docs/administration/playground.mdx b/docs/docs/administration/playground.mdx index 6fe14e73f..a990ef2af 100644 --- a/docs/docs/administration/playground.mdx +++ b/docs/docs/administration/playground.mdx @@ -8,9 +8,13 @@ import Admonition from "@theme/Admonition"; In Langflow 1.0 alpha, the **Playground** replaces the **Integration Window**. -The **Playground** offers an interface for interacting with chat flows. +The **Playground** provides an interface for interacting with flows without opening them in the flow editor. -1. To use the **Playground**, from your **Collections** page, click **Playground** in one of your flows. +It even works for flows hosted on the Langflow store! + +As long as you have a flow's environment variables set, you can run it by clicking the **Playground** button. + +1. From your **Collections** page, click **Playground** in one of your flows. The **Playground** window opens. -2. Chat with your bot as you normally would. - -The Playground allows you to run flows without opening them in the flow editor. -This applies to the Langflow store, too - as long as you have your global environment variables set, you can run flows by clicking the **Playground** button. +2. Chat with your bot as you normally would, all without having to open the editor. From 53dc025b5ef8d977d46676e10dad2e7b6215cd7e Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 15 May 2024 20:41:01 -0300 Subject: [PATCH 05/27] Changes default location for the database and adds the option to use the previous behavior (#1907) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: Refactor loading of settings and handle missing keys * chore: Update .env.example file with new configuration options * Ignore database files in .gitignore * Refactor loading of settings and handle missing keys * Update DOWNLOAD_WEBHOOK_URL in base settings to use the correct URL for triggering flows in the Langflow store. * 🐛 (base.py): Fix condition to copy existing database to new location only if SAVE_DB_IN_CONFIG_DIR is true * 🐛 (base.py): update log message to accurately reflect the action being taken when creating a new database --- .env.example | 14 +- src/backend/.gitignore | 1 + .../base/langflow/services/settings/base.py | 37 ++-- .../langflow/services/settings/service.py | 5 +- tests/test_template.py | 168 +----------------- 5 files changed, 42 insertions(+), 183 deletions(-) diff --git a/.env.example b/.env.example index a63a9b4b1..2725e3b67 100644 --- a/.env.example +++ b/.env.example @@ -4,6 +4,19 @@ # Do not commit .env file to git # Do not change .env.example file +# Config directory +# Directory where files, logs and database will be stored +# Example: LANGFLOW_CONFIG_DIR=~/.langflow +LANGFLOW_CONFIG_DIR= + +# Save database in the config directory +# Values: true, false +# If false, the database will be saved in Langflow's root directory +# This means that the database will be deleted when Langflow is uninstalled +# and that the database will not be shared between different virtual environments +# Example: LANGFLOW_SAVE_DB_IN_CONFIG_DIR=true +LANGFLOW_SAVE_DB_IN_CONFIG_DIR= + # Database URL # Postgres example: LANGFLOW_DATABASE_URL=postgresql://postgres:postgres@localhost:5432/langflow # SQLite example: @@ -56,7 +69,6 @@ LANGFLOW_REMOVE_API_KEYS= # LANGFLOW_REDIS_CACHE_EXPIRE (default: 3600) LANGFLOW_CACHE_TYPE= - # Set AUTO_LOGIN to false if you want to disable auto login # and use the login form to login. LANGFLOW_SUPERUSER and LANGFLOW_SUPERUSER_PASSWORD # must be set if AUTO_LOGIN is set to false diff --git a/src/backend/.gitignore b/src/backend/.gitignore index 9af18a35f..ac0cc6c6d 100644 --- a/src/backend/.gitignore +++ b/src/backend/.gitignore @@ -131,3 +131,4 @@ dmypy.json # Pyre type checker .pyre/ +*.db \ No newline at end of file diff --git a/src/backend/base/langflow/services/settings/base.py b/src/backend/base/langflow/services/settings/base.py index 300bafd1d..19bfb3e12 100644 --- a/src/backend/base/langflow/services/settings/base.py +++ b/src/backend/base/langflow/services/settings/base.py @@ -7,13 +7,12 @@ from typing import Any, List, Optional, Tuple, Type import orjson import yaml +from langflow.services.settings.constants import VARIABLES_TO_GET_FROM_ENVIRONMENT from loguru import logger -from pydantic import field_validator, validator +from pydantic import field_validator from pydantic.fields import FieldInfo from pydantic_settings import BaseSettings, EnvSettingsSource, PydanticBaseSettingsSource, SettingsConfigDict -from langflow.services.settings.constants import VARIABLES_TO_GET_FROM_ENVIRONMENT - # BASE_COMPONENTS_PATH = str(Path(__file__).parent / "components") BASE_COMPONENTS_PATH = str(Path(__file__).parent.parent.parent / "components") @@ -76,6 +75,10 @@ class Settings(BaseSettings): # Define the default LANGFLOW_DIR CONFIG_DIR: Optional[str] = None + # Define if langflow db should be saved in config dir or + # in the langflow directory + SAVE_DB_IN_CONFIG_DIR: bool = False + """Define if langflow database should be saved in LANGFLOW_CONFIG_DIR or in the langflow directory (i.e. in the package directory).""" DEV: bool = False DATABASE_URL: Optional[str] = None @@ -113,7 +116,7 @@ class Settings(BaseSettings): variables_to_get_from_environment: list[str] = VARIABLES_TO_GET_FROM_ENVIRONMENT """List of environment variables to get from the environment and store in the database.""" - @validator("CONFIG_DIR", pre=True, allow_reuse=True) + @field_validator("CONFIG_DIR", mode="before") def set_langflow_dir(cls, value): if not value: from platformdirs import user_cache_dir @@ -136,8 +139,8 @@ class Settings(BaseSettings): return str(value) - @validator("DATABASE_URL", pre=True) - def set_database_url(cls, value, values): + @field_validator("DATABASE_URL", mode="before") + def set_database_url(cls, value, info): if not value: logger.debug("No database_url provided, trying LANGFLOW_DATABASE_URL env variable") if langflow_database_url := os.getenv("LANGFLOW_DATABASE_URL"): @@ -148,29 +151,36 @@ class Settings(BaseSettings): # Originally, we used sqlite:///./langflow.db # so we need to migrate to the new format # if there is a database in that location - if not values["CONFIG_DIR"]: + if not info.data["CONFIG_DIR"]: raise ValueError("CONFIG_DIR not set, please set it or provide a DATABASE_URL") from langflow.version import is_pre_release # type: ignore + if info.data["SAVE_DB_IN_CONFIG_DIR"]: + database_dir = info.data["CONFIG_DIR"] + logger.debug(f"Saving database to CONFIG_DIR: {database_dir}") + else: + database_dir = Path(__file__).parent.parent.parent.resolve() + logger.debug(f"Saving database to langflow directory: {database_dir}") + pre_db_file_name = "langflow-pre.db" db_file_name = "langflow.db" - new_pre_path = f"{values['CONFIG_DIR']}/{pre_db_file_name}" - new_path = f"{values['CONFIG_DIR']}/{db_file_name}" + new_pre_path = f"{database_dir}/{pre_db_file_name}" + new_path = f"{database_dir}/{db_file_name}" final_path = None if is_pre_release: if Path(new_pre_path).exists(): final_path = new_pre_path - elif Path(new_path).exists(): + elif Path(new_path).exists() and info.data["SAVE_DB_IN_CONFIG_DIR"]: # We need to copy the current db to the new location logger.debug("Copying existing database to new location") copy2(new_path, new_pre_path) logger.debug(f"Copied existing database to {new_pre_path}") - elif Path(f"./{db_file_name}").exists(): + elif Path(f"./{db_file_name}").exists() and info.data["SAVE_DB_IN_CONFIG_DIR"]: logger.debug("Copying existing database to new location") copy2(f"./{db_file_name}", new_pre_path) logger.debug(f"Copied existing database to {new_pre_path}") else: - logger.debug(f"Database already exists at {new_pre_path}, using it") + logger.debug(f"Creating new database at {new_pre_path}") final_path = new_pre_path else: if Path(new_path).exists(): @@ -311,3 +321,6 @@ def load_settings_from_yaml(file_path: str) -> Settings: logger.debug(f"Loading {len(settings_dict[key])} {key} from {file_path}") return Settings(**settings_dict) + return Settings(**settings_dict) + return Settings(**settings_dict) + return Settings(**settings_dict) diff --git a/src/backend/base/langflow/services/settings/service.py b/src/backend/base/langflow/services/settings/service.py index a66888924..160c266ec 100644 --- a/src/backend/base/langflow/services/settings/service.py +++ b/src/backend/base/langflow/services/settings/service.py @@ -1,11 +1,10 @@ import os import yaml -from loguru import logger - from langflow.services.base import Service from langflow.services.settings.auth import AuthSettings from langflow.services.settings.base import Settings +from loguru import logger class SettingsService(Service): @@ -31,7 +30,7 @@ class SettingsService(Service): for key in settings_dict: if key not in Settings.model_fields.keys(): - raise KeyError(f"Key {key} not found in settings") + logger.warning(f"Key {key} not found in settings") logger.debug(f"Loading {len(settings_dict[key])} {key} from {file_path}") settings = Settings(**settings_dict) diff --git a/tests/test_template.py b/tests/test_template.py index d1f75e75e..95ea4f528 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -3,8 +3,7 @@ from typing import Dict, List, Optional import pytest from langflow.interface.utils import build_template_from_class -from langflow.utils.constants import CHAT_OPENAI_MODELS, OPENAI_MODELS -from langflow.utils.util import build_template_from_function, format_dict, get_base_classes, get_default_factory +from langflow.utils.util import build_template_from_function, get_base_classes, get_default_factory from pydantic import BaseModel @@ -88,171 +87,6 @@ def test_build_template_from_class(): build_template_from_class("InvalidClass", type_to_cls_dict) -# Test format_dict -def test_format_dict(): - # Test 1: Optional type removal - input_dict = { - "field1": {"type": "Optional[str]", "required": False}, - } - expected_output = { - "field1": { - "type": "str", - "required": False, - "list": False, - "show": False, - "password": False, - "multiline": False, - }, - } - assert format_dict(input_dict) == expected_output - - # Test 2: List type processing - input_dict = { - "field1": {"type": "List[str]", "required": False}, - } - expected_output = { - "field1": { - "type": "str", - "required": False, - "list": True, - "show": False, - "password": False, - "multiline": False, - }, - } - assert format_dict(input_dict) == expected_output - - # Test 3: Mapping type replacement - input_dict = { - "field1": {"type": "Mapping[str, int]", "required": False}, - } - expected_output = { - "field1": { - "type": "dict[str, int]", # Mapping type is replaced with dict which is replaced with code - "required": False, - "list": False, - "show": False, - "password": False, - "multiline": False, - }, - } - assert format_dict(input_dict) == expected_output - - # Test 4: Replace default value with actual value - input_dict = { - "field1": {"type": "str", "required": False, "default": "test"}, - } - expected_output = { - "field1": { - "type": "str", - "required": False, - "list": False, - "show": False, - "password": False, - "multiline": False, - "value": "test", - }, - } - assert format_dict(input_dict) == expected_output - - # Test 5: Add password field - input_dict = { - "field1": {"type": "str", "required": False}, - "api_key": {"type": "str", "required": False}, - } - expected_output = { - "field1": { - "type": "str", - "required": False, - "list": False, - "show": False, - "password": False, - "multiline": False, - }, - "api_key": { - "type": "str", - "required": False, - "list": False, - "show": True, - "password": True, - "multiline": False, - }, - } - assert format_dict(input_dict) == expected_output - - # Test 6: Add multiline - input_dict = { - "field1": {"type": "str", "required": False}, - "prefix": {"type": "str", "required": False}, - } - expected_output = { - "field1": { - "type": "str", - "required": False, - "list": False, - "show": False, - "password": False, - "multiline": False, - }, - "prefix": { - "type": "str", - "required": False, - "list": False, - "show": True, - "password": False, - "multiline": True, - }, - } - assert format_dict(input_dict) == expected_output - - # Test 7: Check class name-specific cases (OpenAI, ChatOpenAI) - input_dict = { - "model_name": {"type": "str", "required": False}, - } - expected_output_openai = { - "model_name": { - "type": "str", - "required": False, - "list": True, - "show": True, - "password": False, - "multiline": False, - "options": OPENAI_MODELS, - "value": "text-davinci-003", - }, - } - expected_output_openai_chat = { - "model_name": { - "type": "str", - "required": False, - "list": True, - "show": True, - "password": False, - "multiline": False, - "options": CHAT_OPENAI_MODELS, - "value": "gpt-4-turbo-preview", - }, - } - assert format_dict(input_dict, "OpenAI") == expected_output_openai - assert format_dict(input_dict, "ChatOpenAI") == expected_output_openai_chat - - # Test 8: Replace dict type with str - input_dict = { - "field1": {"type": "Dict[str, int]", "required": False}, - } - expected_output = { - "field1": { - "type": "Dict[str, int]", - "required": False, - "list": False, - "show": False, - "password": False, - "multiline": False, - }, - } - assert format_dict(input_dict) == expected_output - - # Test get_base_classes def test_get_base_classes(): base_classes_parent = get_base_classes(Parent) From c4e60d71bc2190fa62be77ac3330adb79f402dda Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 16 May 2024 00:27:07 -0300 Subject: [PATCH 06/27] Upgrade Python base image to 3.12 and add gcc as dependency (#1908) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🔧 (build_and_push.Dockerfile): Upgrade Python base image from 3.10 to 3.12 for compatibility and updated dependencies 🔧 (build_and_push.Dockerfile): Add gcc to the list of dependencies for building Python dependencies 🔧 (build_and_push.Dockerfile): Update pip install command to specify the exact path for the .tar.gz file 🔧 (build_and_push_base.Dockerfile): Upgrade Python base image from 3.10 to 3.12 for compatibility and updated dependencies 🔧 (build_and_push_base.Dockerfile): Add gcc to the list of dependencies for building Python dependencies 🔧 (build_and_push_base.Dockerfile): Update pip install command to specify the exact path for the .tar.gz file * Merge remote-tracking branch 'origin/dev' into fix_docker_images --- build_and_push.Dockerfile | 18 ++++++++++-------- build_and_push_base.Dockerfile | 12 +++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/build_and_push.Dockerfile b/build_and_push.Dockerfile index f552dd695..e27599454 100644 --- a/build_and_push.Dockerfile +++ b/build_and_push.Dockerfile @@ -10,7 +10,7 @@ # PYTHON-BASE # Sets up all our shared environment variables ################################ -FROM python:3.10-slim as python-base +FROM python:3.12-slim as python-base # python ENV PYTHONUNBUFFERED=1 \ @@ -47,7 +47,7 @@ ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" # Used to build deps + create our virtual environment ################################ FROM python-base as builder-base -RUN + RUN apt-get update \ && apt-get install --no-install-recommends -y \ # deps for installing poetry @@ -55,7 +55,12 @@ RUN apt-get update \ # deps for building python deps build-essential \ # npm - npm + npm \ + # gcc + gcc \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + # Now we need to copy the entire project into the image @@ -70,15 +75,12 @@ RUN --mount=type=cache,target=/root/.cache \ RUN python -m pip install requests && cd ./scripts && python update_dependencies.py RUN $POETRY_HOME/bin/poetry lock RUN $POETRY_HOME/bin/poetry build -# Final stage for the application -FROM python-base as final # Copy virtual environment and built .tar.gz from builder base RUN useradd -m -u 1000 user -COPY --from=builder-base /app/dist/*.tar.gz ./ # Install the package from the .tar.gz -RUN python -m pip install *.tar.gz --user +RUN python -m pip install /app/dist/*.tar.gz --user + -WORKDIR /app ENTRYPOINT ["python", "-m", "langflow", "run"] CMD ["--host", "0.0.0.0", "--port", "7860"] \ No newline at end of file diff --git a/build_and_push_base.Dockerfile b/build_and_push_base.Dockerfile index db6d0cf58..cbcdbceee 100644 --- a/build_and_push_base.Dockerfile +++ b/build_and_push_base.Dockerfile @@ -10,7 +10,7 @@ # PYTHON-BASE # Sets up all our shared environment variables ################################ -FROM python:3.10-slim as python-base +FROM python:3.12-slim as python-base # python ENV PYTHONUNBUFFERED=1 \ @@ -55,6 +55,8 @@ RUN apt-get update \ build-essential \ # npm npm \ + # gcc + gcc \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* @@ -78,15 +80,11 @@ RUN cp -r src/frontend/build src/backend/base/langflow/frontend RUN rm -rf src/backend/base/dist RUN cd src/backend/base && $POETRY_HOME/bin/poetry build --format sdist -# Final stage for the application -FROM python-base as final - # Copy virtual environment and built .tar.gz from builder base RUN useradd -m -u 1000 user -COPY --from=builder-base /app/src/backend/base/dist/*.tar.gz ./ # Install the package from the .tar.gz -RUN pip install *.tar.gz --user +RUN python -m pip install /app/dist/*.tar.gz --user + -WORKDIR /app ENTRYPOINT ["python", "-m", "langflow", "run"] CMD ["--host", "0.0.0.0", "--port", "7860"] \ No newline at end of file From 8a4a346736e5e583f267a818164972f17d1f77f0 Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Thu, 16 May 2024 19:01:15 -0300 Subject: [PATCH 07/27] =?UTF-8?q?=E2=9C=A8=20(codeTabsComponent/index.tsx)?= =?UTF-8?q?:=20add=20support=20for=20exporting=20code=20as=20a=20file=20?= =?UTF-8?q?=E2=99=BB=EF=B8=8F=20(codeTabsComponent/index.tsx):=20refactor?= =?UTF-8?q?=20code=20to=20use=20a=20switch=20statement=20instead=20of=20mu?= =?UTF-8?q?ltiple=20if=20conditions=20for=20different=20template=20field?= =?UTF-8?q?=20types=20=F0=9F=94=A7=20(codeTabsComponent/index.tsx):=20fix?= =?UTF-8?q?=20import=20statements=20and=20remove=20unused=20imports=20?= =?UTF-8?q?=F0=9F=93=9D=20(codeTabsComponent/index.tsx):=20add=20comments?= =?UTF-8?q?=20to=20improve=20code=20readability?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 📝 (codeTabsComponent/index.tsx): refactor code to use a switch statement instead of multiple if-else conditions for better readability and maintainability ♻️ (codeTabsComponent/index.tsx): refactor code to use a Case component for each condition in the switch statement to improve code organization and readability ✨ (index.tsx): remove unused import of React from "react" to improve code cleanliness ♻️ (index.tsx): refactor code to remove unused imports and variables, improve code readability and organization 📝 (index.tsx): add missing import of Case component from "../../../../shared/components/caseComponent" 🔧 (index.tsx): add missing import of TooltipRenderComponent from "../tooltipRenderComponent" ✅ (index.tsx): add missing hooks and functions to improve code functionality and maintainability 📝 (index.tsx): Refactor code to improve readability and maintainability 📝 (index.tsx): refactor the rendering logic in the ParameterComponent to improve readability and maintainability 🔧 (index.tsx): fix access to nested properties in the data object by using optional chaining operator (?.) to prevent potential errors when accessing undefined properties ✨ (tooltipRenderComponent): add a new component for rendering tooltips in the genericNode component 📝 (use-fetch-data-on-mount): add a new hook for fetching data on component mount 📝 (use-handle-new-value): add a new hook for handling new values in the component 📝 (use-handle-node-class): add a new hook for handling node class in the component 📝 (use-handle-refresh-buttons): add a new hook for handling refresh button press in the component ✨ (editNodeModal/index.tsx): import Case component to handle conditional rendering of different input components based on template type 📝 (editNodeModal/index.tsx): add comments to explain the purpose of the code and provide context for future developers ♻️ (editNodeModal/index.tsx): refactor code to use the Case component for conditional rendering instead of multiple if statements 📝 (file.js): update code formatting and indentation for better readability 📝 (editNodeModal/index.tsx): update code to fix a bug related to accessing nested properties in myData.node object ♻️ (editNodeModal/index.tsx): refactor code to use conditional rendering with Case component for better readability and maintainability ✨ (caseComponent/index.tsx): add a new component called Case that conditionally renders its children based on a given condition 📝 (components/index.ts): add an optional display_name property to the groupedObjType interface ♻️ (components/index.ts): remove unnecessary commas and fix indentation in the codeTabsPropsType interface 🐛 (reactflowUtils.ts): remove unused parameter 'edges' in isValidConnection function ♻️ (reactflowUtils.ts): refactor scapeJSONParse and scapeJSONStringfy functions to remove unnecessary exclamation marks 🐛 (reactflowUtils.ts): fix bug in updateIds function where it doesn't update the sourceHandle and targetHandle correctly 🐛 (reactflowUtils.ts): fix bug in validateNode function where it doesn't handle empty keys correctly 🐛 (reactflowUtils.ts): fix bug in validateNode function where it doesn't handle duplicate keys correctly 🐛 (reactflowUtils.ts): fix bug in validateNode function where it doesn't handle dict type correctly 🐛 (reactflowUtils.ts): fix bug in validateNodes function where it doesn't handle empty nodes correctly 🐛 (reactflowUtils.ts): fix bug in updateEdges function where it doesn't update the className correctly 🐛 (reactflowUtils.ts): fix bug in handleKeyDown function where it doesn't handle control+backspace on Windows/Linux correctly 🐛 (reactflowUtils.ts): fix bug in handleOnlyIntegerInput function where it doesn't handle decimal point correctly 🐛 (reactflowUtils.ts): fix bug in getConnectedNodes function where it doesn't return the correct connected nodes 🐛 (reactflowUtils.ts): fix bug in convertObjToArray function where it doesn't handle non-dict type correctly 🐛 (reactflowUtils.ts): fix bug in generateFlow function where it doesn't filter out edges correctly 🐛 (reactflowUtils.ts): fix bug in reconnectEdges function where it doesn't update the sourceHandle correctly 🐛 (reactflowUtils.ts): fix bug in filterFlow function where it doesn't filter out nodes and edges correctly 🐛 (reactflowUtils.ts): fix bug in validateSelection function where it doesn't handle selection mode correctly 📝 (reactflowUtils.ts): remove trailing commas and unnecessary whitespace to improve code readability and consistency ♻️ (reactflowUtils.ts): refactor validateSelection function to remove duplicate code and improve readability ♻️ (reactflowUtils.ts): refactor generateNodeTemplate function to simplify code and improve readability ♻️ (reactflowUtils.ts): refactor isHandleConnected function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor generateNodeFromFlow function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor connectedInputNodesOnHandle function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor updateProxyIdsOnTemplate function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor updateEdgesIds function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor expandGroupNode function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor getGroupStatus function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor createFlowComponent function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor updateComponentNameAndType function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor removeFileNameFromComponents function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor extractFieldsFromComponenents function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor downloadFlow function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor downloadFlows function to remove unnecessary parentheses and improve readability ♻️ (reactflowUtils.ts): refactor createNewFlow function to remove unnecessary parentheses and improve readability --- .../components/codeTabsComponent/index.tsx | 347 ++++++++----- .../components/parameterComponent/index.tsx | 481 ++++++------------ .../tooltipRenderComponent/index.tsx | 91 ++++ .../hooks/use-fetch-data-on-mount.tsx | 54 ++ .../hooks/use-handle-new-value.tsx | 75 +++ .../hooks/use-handle-node-class.tsx | 40 ++ .../hooks/use-handle-refresh-buttons.tsx | 39 ++ .../src/modals/editNodeModal/index.tsx | 186 ++++--- .../shared/components/caseComponent/index.tsx | 15 + src/frontend/src/types/components/index.ts | 1 + src/frontend/src/utils/reactflowUtils.ts | 3 +- 11 files changed, 791 insertions(+), 541 deletions(-) create mode 100644 src/frontend/src/customNodes/genericNode/components/tooltipRenderComponent/index.tsx create mode 100644 src/frontend/src/customNodes/hooks/use-fetch-data-on-mount.tsx create mode 100644 src/frontend/src/customNodes/hooks/use-handle-new-value.tsx create mode 100644 src/frontend/src/customNodes/hooks/use-handle-node-class.tsx create mode 100644 src/frontend/src/customNodes/hooks/use-handle-refresh-buttons.tsx create mode 100644 src/frontend/src/shared/components/caseComponent/index.tsx diff --git a/src/frontend/src/components/codeTabsComponent/index.tsx b/src/frontend/src/components/codeTabsComponent/index.tsx index 0b08aaccd..eac1c784e 100644 --- a/src/frontend/src/components/codeTabsComponent/index.tsx +++ b/src/frontend/src/components/codeTabsComponent/index.tsx @@ -26,6 +26,8 @@ import { TabsTrigger, } from "../../components/ui/tabs"; import { LANGFLOW_SUPPORTED_TYPES } from "../../constants/constants"; +import ExportModal from "../../modals/exportModal"; +import { Case } from "../../shared/components/caseComponent"; import { useDarkStore } from "../../stores/darkStore"; import useFlowStore from "../../stores/flowStore"; import { codeTabsPropsType } from "../../types/components"; @@ -43,7 +45,6 @@ import KeypairListComponent from "../keypairListComponent"; import ShadTooltip from "../shadTooltipComponent"; import { Label } from "../ui/label"; import { Switch } from "../ui/switch"; -import ExportModal from "../../modals/exportModal"; export default function CodeTabsComponent({ flow, @@ -87,6 +88,10 @@ export default function CodeTabsComponent({ }); }; + const type = (node, templateParam) => { + return node.data.node.template[templateParam].type; + }; + const downloadAsFile = () => { const fileExtension = tabs[activeTab].language || ".txt"; const suggestedFileName = `${"generated-code."}${fileExtension}`; @@ -276,107 +281,71 @@ export default function CodeTabsComponent({

- {node.data.node.template[ - templateField - ].type === "str" && - !node.data.node.template[ - templateField - ].options ? ( -
- {node.data.node.template[ + { - setData((old) => { - let newInputList = - cloneDeep(old); - newInputList![ - i - ].data.node.template[ - templateField - ].value = target; - return newInputList; - }); - tweaks?.buildTweakObject!( - node["data"]["id"], - target, - node.data.node.template[ - templateField - ], - ); - }} - /> - ) : node.data.node.template[ + ].options + } + > + - + { - setData((old) => { - let newInputList = - cloneDeep(old); - newInputList![ - i - ].data.node.template[ - templateField - ].value = target; - return newInputList; - }); - tweaks?.buildTweakObject!( - node["data"]["id"], - target, - node.data.node - .template[ - templateField - ], - ); - }} - /> -
- ) : ( - { + setData((old) => { + let newInputList = + cloneDeep(old); + newInputList![ + i + ].data.node.template[ + templateField + ].value = target; + return newInputList; + }); + tweaks?.buildTweakObject!( + node["data"]["id"], + target, node.data.node.template[ templateField - ].password ?? false - } + ], + ); + }} + /> + + + +
+ - )} -
- ) : node.data.node.template[ - templateField - ].type === "bool" ? ( +
+ + + + { + setData((old) => { + let newInputList = + cloneDeep(old); + newInputList![ + i + ].data.node.template[ + templateField + ].value = target; + return newInputList; + }); + tweaks?.buildTweakObject!( + node["data"]["id"], + target, + node.data.node.template[ + templateField + ], + ); + }} + /> + + + +
{" "}
- ) : node.data.node.template[ - templateField - ].type === "file" ? ( +
+ +
- ) : node.data.node.template[ - templateField - ].type === "float" ? ( +
+ +
- ) : node.data.node.template[ - templateField - ].type === "str" && - node.data.node.template[ - templateField - ].options ? ( +
+ +
- ) : node.data.node.template[ - templateField - ].type === "int" ? ( +
+ +
- ) : node.data.node.template[ - templateField - ].type === "prompt" ? ( +
+ +
- ) : node.data.node.template[ - templateField - ].type === "code" ? ( +
+ +
- ) : node.data.node.template[ - templateField - ].type === "dict" ? ( +
+ +
- ) : node.data.node.template[ - templateField - ].type === "NestedDict" ? ( +
+ +
- ) : node.data.node.template[ - templateField - ].type === "Any" ? ( - "-" - ) : ( -
- )} +
+ + + <>- + diff --git a/src/frontend/src/customNodes/genericNode/components/parameterComponent/index.tsx b/src/frontend/src/customNodes/genericNode/components/parameterComponent/index.tsx index dbcb1e3dc..c87c97741 100644 --- a/src/frontend/src/customNodes/genericNode/components/parameterComponent/index.tsx +++ b/src/frontend/src/customNodes/genericNode/components/parameterComponent/index.tsx @@ -1,5 +1,5 @@ import { cloneDeep } from "lodash"; -import React, { ReactNode, useEffect, useRef, useState } from "react"; +import { ReactNode, useEffect, useRef, useState } from "react"; import { Handle, Position, useUpdateNodeInternals } from "reactflow"; import CodeAreaComponent from "../../../../components/codeAreaComponent"; import DictComponent from "../../../../components/dictComponent"; @@ -18,20 +18,15 @@ import ToggleShadComponent from "../../../../components/toggleShadComponent"; import { Button } from "../../../../components/ui/button"; import { RefreshButton } from "../../../../components/ui/refreshButton"; import { - INPUT_HANDLER_HOVER, LANGFLOW_SUPPORTED_TYPES, - OUTPUT_HANDLER_HOVER, TOOLTIP_EMPTY, } from "../../../../constants/constants"; +import { Case } from "../../../../shared/components/caseComponent"; import useAlertStore from "../../../../stores/alertStore"; import useFlowStore from "../../../../stores/flowStore"; import useFlowsManagerStore from "../../../../stores/flowsManagerStore"; import { useTypesStore } from "../../../../stores/typesStore"; -import { - APIClassType, - ResponseErrorDetailAPI, - ResponseErrorTypeAPI, -} from "../../../../types/api"; +import { APIClassType } from "../../../../types/api"; import { ParameterComponentType } from "../../../../types/components"; import { debouncedHandleUpdateValues, @@ -44,12 +39,13 @@ import { isValidConnection, scapedJSONStringfy, } from "../../../../utils/reactflowUtils"; -import { - nodeColors, - nodeIconsLucide, - nodeNames, -} from "../../../../utils/styleUtils"; +import { nodeColors } from "../../../../utils/styleUtils"; import { classNames, groupByFamily } from "../../../../utils/utils"; +import useFetchDataOnMount from "../../../hooks/use-fetch-data-on-mount"; +import useHandleOnNewValue from "../../../hooks/use-handle-new-value"; +import useHandleNodeClass from "../../../hooks/use-handle-node-class"; +import useHandleRefreshButtonPress from "../../../hooks/use-handle-refresh-buttons"; +import TooltipRenderComponent from "../tooltipRenderComponent"; export default function ParameterComponent({ left, @@ -75,175 +71,69 @@ export default function ParameterComponent({ const nodes = useFlowStore((state) => state.nodes); const edges = useFlowStore((state) => state.edges); const setNode = useFlowStore((state) => state.setNode); - + const myData = useTypesStore((state) => state.data); + const takeSnapshot = useFlowsManagerStore((state) => state.takeSnapshot); const [isLoading, setIsLoading] = useState(false); + const updateNodeInternals = useUpdateNodeInternals(); + const [errorDuplicateKey, setErrorDuplicateKey] = useState(false); const flow = currentFlow?.data?.nodes ?? null; - const groupedEdge = useRef(null); - const setFilterEdge = useFlowStore((state) => state.setFilterEdge); + const { handleOnNewValue: handleOnNewValueHook } = useHandleOnNewValue( + data, + name, + takeSnapshot, + handleUpdateValues, + debouncedHandleUpdateValues, + setNode, + renderTooltips, + isLoading, + setIsLoading, + ); + + const { handleNodeClass: handleNodeClassHook } = useHandleNodeClass( + data, + name, + takeSnapshot, + setNode, + updateNodeInternals, + renderTooltips, + ); + + const { handleRefreshButtonPress: handleRefreshButtonPressHook } = + useHandleRefreshButtonPress(setIsLoading, setNode, renderTooltips); + let disabled = edges.some( (edge) => edge.targetHandle === scapedJSONStringfy(proxy ? { ...id, proxy } : id), ) ?? false; - const myData = useTypesStore((state) => state.data); - - const takeSnapshot = useFlowsManagerStore((state) => state.takeSnapshot); - const handleRefreshButtonPress = async (name, data) => { - setIsLoading(true); - try { - let newTemplate = await handleUpdateValues(name, data); - - if (newTemplate) { - setNode(data.id, (oldNode) => { - let newNode = cloneDeep(oldNode); - newNode.data = { - ...newNode.data, - }; - newNode.data.node.template = newTemplate; - return newNode; - }); - } - } catch (error) { - let responseError = error as ResponseErrorDetailAPI; - - setErrorData({ - title: "Error while updating the Component", - list: [responseError.response.data.detail ?? "Unknown error"], - }); - } - setIsLoading(false); - renderTooltips(); + handleRefreshButtonPressHook(name, data); }; - useEffect(() => { - async function fetchData() { - if ( - (data.node?.template[name]?.real_time_refresh || - data.node?.template[name]?.refresh_button) && - // options can be undefined but not an empty array - (data.node?.template[name]?.options?.length ?? 0) === 0 - ) { - setIsLoading(true); - try { - let newTemplate = await handleUpdateValues(name, data); - - if (newTemplate) { - setNode(data.id, (oldNode) => { - let newNode = cloneDeep(oldNode); - newNode.data = { - ...newNode.data, - }; - newNode.data.node.template = newTemplate; - return newNode; - }); - } - } catch (error) { - let responseError = error as ResponseErrorDetailAPI; - - setErrorData({ - title: "Error while updating the Component", - list: [responseError.response.data.detail ?? "Unknown error"], - }); - } - setIsLoading(false); - renderTooltips(); - } - } - fetchData(); - }, []); + useFetchDataOnMount( + data, + name, + handleUpdateValues, + setNode, + renderTooltips, + setIsLoading, + ); const handleOnNewValue = async ( newValue: string | string[] | boolean | Object[], skipSnapshot: boolean | undefined = false, ): Promise => { - const nodeTemplate = data.node!.template[name]; - const currentValue = nodeTemplate.value; - - if (currentValue !== newValue && !skipSnapshot) { - takeSnapshot(); - } - - const shouldUpdate = - data.node?.template[name].real_time_refresh && - !data.node?.template[name].refresh_button && - currentValue !== newValue; - - const typeToDebounce = nodeTemplate.type; - - nodeTemplate.value = newValue; - - let newTemplate; - if (shouldUpdate) { - setIsLoading(true); - try { - if (["int"].includes(typeToDebounce)) { - newTemplate = await handleUpdateValues(name, data); - } else { - newTemplate = await debouncedHandleUpdateValues(name, data); - } - } catch (error) { - let responseError = error as ResponseErrorTypeAPI; - setErrorData({ - title: "Error while updating the Component", - list: [responseError.response.data.detail.error ?? "Unknown error"], - }); - } - setIsLoading(false); - } - - setNode(data.id, (oldNode) => { - const newNode = cloneDeep(oldNode); - newNode.data = { - ...newNode.data, - }; - - if (data.node?.template[name].real_time_refresh && newTemplate) { - newNode.data.node.template = newTemplate; - } else { - newNode.data.node.template[name].value = newValue; - } - - return newNode; - }); - - renderTooltips(); + handleOnNewValueHook(newValue, skipSnapshot); }; - const updateNodeInternals = useUpdateNodeInternals(); - const handleNodeClass = (newNodeClass: APIClassType, code?: string): void => { - if (!data.node) return; - if (data.node!.template[name].value !== code) { - takeSnapshot(); - } - - setNode(data.id, (oldNode) => { - let newNode = cloneDeep(oldNode); - - newNode.data = { - ...newNode.data, - node: newNodeClass, - description: newNodeClass.description ?? data.node!.description, - display_name: newNodeClass.display_name ?? data.node!.display_name, - }; - - newNode.data.node.template[name].value = code; - - return newNode; - }); - - updateNodeInternals(data.id); - - renderTooltips(); + handleNodeClassHook(newNodeClass, code); }; - const [errorDuplicateKey, setErrorDuplicateKey] = useState(false); - useEffect(() => { // @ts-ignore infoHtml.current = ( @@ -264,88 +154,7 @@ export default function ParameterComponent({ if (groupedObj && groupedObj.length > 0) { //@ts-ignore refHtml.current = groupedObj.map((item, index) => { - const Icon: any = - nodeIconsLucide[item.family] ?? nodeIconsLucide["unknown"]; - - return ( -
- {index === 0 && ( - {left ? INPUT_HANDLER_HOVER : OUTPUT_HANDLER_HOVER} - )} - 0 ? "mt-2 flex items-center" : "mt-3 flex items-center", - )} - > -
- -
- - {nodeNames[item.family] ?? "Other"}{" "} - {item?.display_name && item?.display_name?.length > 0 ? ( - - {" "} - {item.display_name === "" ? "" : " - "} - {item.display_name.split(", ").length > 2 - ? item.display_name.split(", ").map((el, index) => ( - - - {index === - item.display_name.split(", ").length - 1 - ? el - : (el += `, `)} - - - )) - : item.display_name} - - ) : ( - - {" "} - {item.type === "" ? "" : " - "} - {item.type.split(", ").length > 2 - ? item.type.split(", ").map((el, index) => ( - - - {index === item.type.split(", ").length - 1 - ? el - : (el += `, `)} - - - )) - : item.type} - - )} - -
-
- ); + return ; }); } else { //@ts-ignore @@ -354,6 +163,7 @@ export default function ParameterComponent({ ); } } + // If optionalHandle is an empty list, then it is not an optional handle if (optionalHandle && optionalHandle.length === 0) { optionalHandle = null; @@ -362,6 +172,9 @@ export default function ParameterComponent({ useEffect(() => { renderTooltips(); }, [tooltipTitle, flow]); + + console.log(left === true && type === "dict"); + return !showNode ? ( left && LANGFLOW_SUPPORTED_TYPES.has(type ?? "") && !optionalHandle ? ( <> @@ -427,11 +240,12 @@ export default function ParameterComponent({ (left ? "" : " justify-end") } > - {!left && data.node?.frozen && ( +
- )} +
+ {proxy ? ( {proxy.id}}> @@ -477,45 +291,37 @@ export default function ParameterComponent({ }`} type={left ? "target" : "source"} position={left ? Position.Left : Position.Right} - key={ - proxy - ? scapedJSONStringfy({ ...id, proxy }) - : scapedJSONStringfy(id) - } - id={ - proxy - ? scapedJSONStringfy({ ...id, proxy }) - : scapedJSONStringfy(id) - } + key={scapedJSONStringfy(proxy ? { ...id, proxy } : id)} + id={scapedJSONStringfy(proxy ? { ...id, proxy } : id)} isValidConnection={(connection) => isValidConnection(connection, nodes, edges) } className={classNames( - left ? "-ml-0.5 " : "-mr-0.5 ", + left ? "-ml-0.5" : "-mr-0.5", "h-3 w-3 rounded-full border-2 bg-background", )} - style={{ - borderColor: color ?? nodeColors.unknown, - }} - onClick={() => { - setFilterEdge(groupedEdge.current); - }} - > + style={{ borderColor: color ?? nodeColors.unknown }} + onClick={() => setFilterEdge(groupedEdge.current)} + /> )} - {left === true && - type === "str" && - !data.node?.template[name].options ? ( +
- {data.node?.template[name].list ? ( +
@@ -523,39 +329,27 @@ export default function ParameterComponent({ componentName={name} disabled={disabled} value={ - !data.node.template[name].value || - data.node.template[name].value === "" + !data.node!.template[name]?.value || + data.node!.template[name]?.value === "" ? [""] - : data.node.template[name].value + : data.node!.template[name]?.value } onChange={handleOnNewValue} /> - {/* {data.node?.template[name].refresh_button && ( -
- -
- )} */}
- ) : data.node?.template[name].multiline ? ( +
+
- {data.node?.template[name].refresh_button && ( + {data.node?.template[name]?.refresh_button && (
)}
- ) : ( + +
- {data.node?.template[name].refresh_button && ( + {data.node?.template[name]?.refresh_button && (
)}
- )} +
- ) : left === true && type === "bool" ? ( +
+ +
- ) : left === true && type === "float" ? ( +
+ +
- ) : left === true && - type === "str" && - (data.node?.template[name].options || - data.node?.template[name]?.real_time_refresh) ? ( - // TODO: Improve CSS +
+ +
- {data.node?.template[name].refresh_button && ( + {data.node?.template[name]?.refresh_button && (
)}
- ) : left === true && type === "code" ? ( + + +
- ) : left === true && type === "file" ? ( +
+ +
{ data.node!.template[name].file_path = filePath; }} >
- ) : left === true && type === "int" ? ( +
+ +
- ) : left === true && type === "prompt" ? ( +
+ +
- ) : left === true && type === "NestedDict" ? ( +
+ +
- ) : left === true && type === "dict" ? ( +
+ +
{ const valueToNumbers = convertValuesToNumbers(newValue); setErrorDuplicateKey(hasDuplicateKeys(valueToNumbers)); - // if data.node?.template[name].list is true, then the value is an array of objects + // if data.node?.template[name]?.list is true, then the value is an array of objects // else we need to get the first object of the array - if (data.node?.template[name].list) { + if (data.node?.template[name]?.list) { handleOnNewValue(valueToNumbers); } else handleOnNewValue(valueToNumbers[0]); }} - isList={data.node?.template[name].list ?? false} + isList={data.node?.template[name]?.list ?? false} />
- ) : ( - <> - )} +
); diff --git a/src/frontend/src/customNodes/genericNode/components/tooltipRenderComponent/index.tsx b/src/frontend/src/customNodes/genericNode/components/tooltipRenderComponent/index.tsx new file mode 100644 index 000000000..ed2760161 --- /dev/null +++ b/src/frontend/src/customNodes/genericNode/components/tooltipRenderComponent/index.tsx @@ -0,0 +1,91 @@ +import React from "react"; +import { + INPUT_HANDLER_HOVER, + OUTPUT_HANDLER_HOVER, +} from "../../../../constants/constants"; +import { + nodeColors, + nodeIconsLucide, + nodeNames, +} from "../../../../utils/styleUtils"; +import { classNames } from "../../../../utils/utils"; + +const TooltipRenderComponent = ({ item, index, left }) => { + const Icon = nodeIconsLucide[item.family] ?? nodeIconsLucide["unknown"]; + + return ( +
+ {index === 0 && ( + {left ? INPUT_HANDLER_HOVER : OUTPUT_HANDLER_HOVER} + )} + 0 ? "mt-2 flex items-center" : "mt-3 flex items-center", + )} + > +
+ +
+ + {nodeNames[item.family] ?? "Other"}{" "} + {item?.display_name && item?.display_name?.length > 0 ? ( + + {" "} + {item.display_name === "" ? "" : " - "} + {item.display_name.split(", ").length > 2 + ? item.display_name.split(", ").map((el, index) => ( + + + {index === item.display_name.split(", ").length - 1 + ? el + : (el += `, `)} + + + )) + : item.display_name} + + ) : ( + + {" "} + {item.type === "" ? "" : " - "} + {item.type.split(", ").length > 2 + ? item.type.split(", ").map((el, index) => ( + + + {index === item.type.split(", ").length - 1 + ? el + : (el += `, `)} + + + )) + : item.type} + + )} + +
+
+ ); +}; + +export default TooltipRenderComponent; diff --git a/src/frontend/src/customNodes/hooks/use-fetch-data-on-mount.tsx b/src/frontend/src/customNodes/hooks/use-fetch-data-on-mount.tsx new file mode 100644 index 000000000..3fc3fbe72 --- /dev/null +++ b/src/frontend/src/customNodes/hooks/use-fetch-data-on-mount.tsx @@ -0,0 +1,54 @@ +import { cloneDeep } from "lodash"; +import { useEffect } from "react"; +import useAlertStore from "../../stores/alertStore"; +import { ResponseErrorDetailAPI } from "../../types/api"; + +const useFetchDataOnMount = ( + data, + name, + handleUpdateValues, + setNode, + renderTooltips, + setIsLoading, +) => { + const setErrorData = useAlertStore((state) => state.setErrorData); + + useEffect(() => { + async function fetchData() { + if ( + (data.node?.template[name]?.real_time_refresh || + data.node?.template[name]?.refresh_button) && + // options can be undefined but not an empty array + (data.node?.template[name]?.options?.length ?? 0) === 0 + ) { + setIsLoading(true); + try { + let newTemplate = await handleUpdateValues(name, data); + + if (newTemplate) { + setNode(data.id, (oldNode) => { + let newNode = cloneDeep(oldNode); + newNode.data = { + ...newNode.data, + }; + newNode.data.node.template = newTemplate; + return newNode; + }); + } + } catch (error) { + let responseError = error as ResponseErrorDetailAPI; + + setErrorData({ + title: "Error while updating the Component", + list: [responseError.response.data.detail ?? "Unknown error"], + }); + } + setIsLoading(false); + renderTooltips(); + } + } + fetchData(); + }, []); // Empty dependency array ensures that this effect runs only once, on mount +}; + +export default useFetchDataOnMount; diff --git a/src/frontend/src/customNodes/hooks/use-handle-new-value.tsx b/src/frontend/src/customNodes/hooks/use-handle-new-value.tsx new file mode 100644 index 000000000..7de830eda --- /dev/null +++ b/src/frontend/src/customNodes/hooks/use-handle-new-value.tsx @@ -0,0 +1,75 @@ +import { cloneDeep } from "lodash"; +import useAlertStore from "../../stores/alertStore"; +import { ResponseErrorTypeAPI } from "../../types/api"; + +const useHandleOnNewValue = ( + data, + name, + takeSnapshot, + handleUpdateValues, + debouncedHandleUpdateValues, + setNode, + renderTooltips, + isLoading, + setIsLoading, +) => { + const setErrorData = useAlertStore((state) => state.setErrorData); + + const handleOnNewValue = async (newValue, skipSnapshot = false) => { + const nodeTemplate = data.node!.template[name]; + const currentValue = nodeTemplate.value; + + if (currentValue !== newValue && !skipSnapshot) { + takeSnapshot(); + } + + const shouldUpdate = + data.node?.template[name].real_time_refresh && + !data.node?.template[name].refresh_button && + currentValue !== newValue; + + const typeToDebounce = nodeTemplate.type; + + nodeTemplate.value = newValue; + + let newTemplate; + if (shouldUpdate) { + setIsLoading(true); + try { + if (["int"].includes(typeToDebounce)) { + newTemplate = await handleUpdateValues(name, data); + } else { + newTemplate = await debouncedHandleUpdateValues(name, data); + } + } catch (error) { + let responseError = error as ResponseErrorTypeAPI; + setErrorData({ + title: "Error while updating the Component", + list: [responseError.response.data.detail.error ?? "Unknown error"], + }); + } + setIsLoading(false); + } + + setNode(data.id, (oldNode) => { + const newNode = cloneDeep(oldNode); + newNode.data = { + ...newNode.data, + }; + + if (data.node?.template[name].real_time_refresh && newTemplate) { + newNode.data.node.template = newTemplate; + } else { + newNode.data.node.template[name].value = newValue; + } + + return newNode; + }); + + renderTooltips(); + }; + + return { handleOnNewValue }; +}; + +export default useHandleOnNewValue; diff --git a/src/frontend/src/customNodes/hooks/use-handle-node-class.tsx b/src/frontend/src/customNodes/hooks/use-handle-node-class.tsx new file mode 100644 index 000000000..412658d77 --- /dev/null +++ b/src/frontend/src/customNodes/hooks/use-handle-node-class.tsx @@ -0,0 +1,40 @@ +import { cloneDeep } from "lodash"; + +const useHandleNodeClass = ( + data, + name, + takeSnapshot, + setNode, + updateNodeInternals, + renderTooltips, +) => { + const handleNodeClass = (newNodeClass, code) => { + if (!data.node) return; + if (data.node!.template[name].value !== code) { + takeSnapshot(); + } + + setNode(data.id, (oldNode) => { + let newNode = cloneDeep(oldNode); + + newNode.data = { + ...newNode.data, + node: newNodeClass, + description: newNodeClass.description ?? data.node!.description, + display_name: newNodeClass.display_name ?? data.node!.display_name, + }; + + newNode.data.node.template[name].value = code; + + return newNode; + }); + + updateNodeInternals(data.id); + + renderTooltips(); + }; + + return { handleNodeClass }; +}; + +export default useHandleNodeClass; diff --git a/src/frontend/src/customNodes/hooks/use-handle-refresh-buttons.tsx b/src/frontend/src/customNodes/hooks/use-handle-refresh-buttons.tsx new file mode 100644 index 000000000..19f2a3c29 --- /dev/null +++ b/src/frontend/src/customNodes/hooks/use-handle-refresh-buttons.tsx @@ -0,0 +1,39 @@ +import { cloneDeep } from "lodash"; +import useAlertStore from "../../stores/alertStore"; +import { ResponseErrorDetailAPI } from "../../types/api"; +import { handleUpdateValues } from "../../utils/parameterUtils"; + +const useHandleRefreshButtonPress = (setIsLoading, setNode, renderTooltips) => { + const setErrorData = useAlertStore((state) => state.setErrorData); + + const handleRefreshButtonPress = async (name, data) => { + setIsLoading(true); + try { + let newTemplate = await handleUpdateValues(name, data); + + if (newTemplate) { + setNode(data.id, (oldNode) => { + let newNode = cloneDeep(oldNode); + newNode.data = { + ...newNode.data, + }; + newNode.data.node.template = newTemplate; + return newNode; + }); + } + } catch (error) { + let responseError = error as ResponseErrorDetailAPI; + + setErrorData({ + title: "Error while updating the Component", + list: [responseError.response.data.detail ?? "Unknown error"], + }); + } + setIsLoading(false); + renderTooltips(); + }; + + return { handleRefreshButtonPress }; +}; + +export default useHandleRefreshButtonPress; diff --git a/src/frontend/src/modals/editNodeModal/index.tsx b/src/frontend/src/modals/editNodeModal/index.tsx index b853ecfab..0db4bdcf5 100644 --- a/src/frontend/src/modals/editNodeModal/index.tsx +++ b/src/frontend/src/modals/editNodeModal/index.tsx @@ -28,6 +28,7 @@ import { LANGFLOW_SUPPORTED_TYPES, limitScrollFieldsModal, } from "../../constants/constants"; +import { Case } from "../../shared/components/caseComponent"; import useFlowStore from "../../stores/flowStore"; import { NodeDataType } from "../../types/flow"; import { @@ -52,7 +53,7 @@ const EditNodeModal = forwardRef( open: boolean; setOpen: (open: boolean) => void; }, - ref + ref, ) => { const [myData, setMyData] = useState(data); @@ -84,6 +85,10 @@ const EditNodeModal = forwardRef( const [errorDuplicateKey, setErrorDuplicateKey] = useState(false); + const type = (templateParam) => { + return myData.node?.template[templateParam].type; + }; + return ( limitScrollFieldsModal ? "overflow-scroll overflow-x-hidden custom-scroll" - : "" + : "", )} > {nodeLength > 0 && ( @@ -138,8 +143,8 @@ const EditNodeModal = forwardRef( templateParam.charAt(0) !== "_" && myData.node?.template[templateParam].show && LANGFLOW_SUPPORTED_TYPES.has( - myData.node.template[templateParam].type - ) + myData.node!.template[templateParam].type, + ), ) .map((templateParam, index) => { let id = { @@ -161,8 +166,8 @@ const EditNodeModal = forwardRef( myData.node?.template[templateParam] .proxy, } - : id - ) + : id, + ), ) ?? false; return (