From 3b660c26a30f2da1cdc328c4cdfcdbbfcd7f41ff Mon Sep 17 00:00:00 2001 From: Lucas Oliveira <62335616+lucaseduoli@users.noreply.github.com> Date: Thu, 24 Apr 2025 13:01:43 -0300 Subject: [PATCH] fix: make dropdown not repeat values on update, update mcp component (#7779) Co-authored-by: cristhianzl --- .../base/langflow/components/tools/mcp_component.py | 5 +++++ .../src/components/core/dropdownComponent/index.tsx | 8 +++++--- src/frontend/tests/core/features/toolModeGroup.spec.ts | 2 +- .../tests/extended/features/edit-flow-name.spec.ts | 2 +- src/frontend/tests/extended/features/edit-tools.spec.ts | 2 +- src/frontend/tests/extended/features/mcp-server.spec.ts | 2 +- src/frontend/tests/extended/features/tool-mode.spec.ts | 2 +- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/backend/base/langflow/components/tools/mcp_component.py b/src/backend/base/langflow/components/tools/mcp_component.py index 77f69d453..f2f475aab 100644 --- a/src/backend/base/langflow/components/tools/mcp_component.py +++ b/src/backend/base/langflow/components/tools/mcp_component.py @@ -203,6 +203,10 @@ class MCPToolsComponent(Component): return processed_headers return {} + def _is_valid_key_value_item(self, item: Any) -> bool: + """Check if an item is a valid key-value dictionary.""" + return isinstance(item, dict) and "key" in item and "value" in item + async def _validate_schema_inputs(self, tool_obj) -> list[InputTypes]: """Validate and process schema inputs for a tool.""" try: @@ -234,6 +238,7 @@ class MCPToolsComponent(Component): try: if field_name == "mode": self.remove_non_default_keys(build_config) + build_config["tool"]["options"] = [] if field_value == "Stdio": build_config["command"]["show"] = True build_config["env"]["show"] = True diff --git a/src/frontend/src/components/core/dropdownComponent/index.tsx b/src/frontend/src/components/core/dropdownComponent/index.tsx index cf400b66d..956fa010e 100644 --- a/src/frontend/src/components/core/dropdownComponent/index.tsx +++ b/src/frontend/src/components/core/dropdownComponent/index.tsx @@ -68,7 +68,7 @@ export default function Dropdown({ const [customValue, setCustomValue] = useState(""); const [filteredOptions, setFilteredOptions] = useState(() => { // Include the current value in filteredOptions if it's a custom value not in validOptions - if (value && !validOptions.includes(value)) { + if (value && !validOptions.includes(value) && combobox) { return [...validOptions, value]; } return validOptions; @@ -221,12 +221,14 @@ export default function Dropdown({ ); // If there are custom values, preserve them when resetting filtered options - if (customValuesInFiltered.length > 0) { + if (customValuesInFiltered.length > 0 && combobox) { setFilteredOptions([...validOptions, ...customValuesInFiltered]); } else { setFilteredOptions(validOptions); } - setCustomValue(""); + } + if (!combobox && value && !validOptions.includes(value)) { + onSelect("", undefined, true); } }, [open, validOptions]); diff --git a/src/frontend/tests/core/features/toolModeGroup.spec.ts b/src/frontend/tests/core/features/toolModeGroup.spec.ts index 5d71983e9..32096f713 100644 --- a/src/frontend/tests/core/features/toolModeGroup.spec.ts +++ b/src/frontend/tests/core/features/toolModeGroup.spec.ts @@ -5,7 +5,7 @@ test.describe("group node test", () => { /// test( "group and ungroup updating values", - { tag: ["@release", "@workspace"] }, + { tag: ["@release", "@workspace", "@components"] }, async ({ page }) => { await awaitBootstrapTest(page); diff --git a/src/frontend/tests/extended/features/edit-flow-name.spec.ts b/src/frontend/tests/extended/features/edit-flow-name.spec.ts index a9732cd1f..73783478e 100644 --- a/src/frontend/tests/extended/features/edit-flow-name.spec.ts +++ b/src/frontend/tests/extended/features/edit-flow-name.spec.ts @@ -2,7 +2,7 @@ import { expect, test } from "@playwright/test"; import { awaitBootstrapTest } from "../../utils/await-bootstrap-test"; test( "user should be able to edit flow name by clicking on the header or on the main page", - { tag: ["@release"] }, + { tag: ["@release", "@workspace"] }, async ({ page }) => { const randomName = Math.random().toString(36).substring(2, 15); const randomName2 = Math.random().toString(36).substring(2, 15); diff --git a/src/frontend/tests/extended/features/edit-tools.spec.ts b/src/frontend/tests/extended/features/edit-tools.spec.ts index d137bcceb..a9354be3c 100644 --- a/src/frontend/tests/extended/features/edit-tools.spec.ts +++ b/src/frontend/tests/extended/features/edit-tools.spec.ts @@ -2,7 +2,7 @@ import { expect, test } from "@playwright/test"; import { awaitBootstrapTest } from "../../utils/await-bootstrap-test"; test( "user should be able to edit tools", - { tag: ["@release"] }, + { tag: ["@release", "@components"] }, async ({ page }) => { await awaitBootstrapTest(page); diff --git a/src/frontend/tests/extended/features/mcp-server.spec.ts b/src/frontend/tests/extended/features/mcp-server.spec.ts index 666335284..a5a64b30b 100644 --- a/src/frontend/tests/extended/features/mcp-server.spec.ts +++ b/src/frontend/tests/extended/features/mcp-server.spec.ts @@ -4,7 +4,7 @@ import { zoomOut } from "../../utils/zoom-out"; test( "user must be able to change mode of MCP server without any issues", - { tag: ["@release", "@workspace"] }, + { tag: ["@release", "@workspace", "@components"] }, async ({ page }) => { await awaitBootstrapTest(page); diff --git a/src/frontend/tests/extended/features/tool-mode.spec.ts b/src/frontend/tests/extended/features/tool-mode.spec.ts index 65f132ec3..efc22c633 100644 --- a/src/frontend/tests/extended/features/tool-mode.spec.ts +++ b/src/frontend/tests/extended/features/tool-mode.spec.ts @@ -4,7 +4,7 @@ import { zoomOut } from "../../utils/zoom-out"; test( "User should be able to use components as tool", - { tag: ["@release"] }, + { tag: ["@release", "@components"] }, async ({ page }) => { await awaitBootstrapTest(page); await page.getByTestId("blank-flow").click();