feat: Refactor langflow Components - Consolidate Imports, Remove Unused Components, and Update Astra Assistant Icons (#4460)

* fix lint

* fix lint

* [autofix.ci] apply automated fixes

* 📝 (message_to_data.py): refactor convert_message_to_data method to simplify code and improve readability
🔧 (conftest.py): update imports to organize them alphabetically for better code maintenance
🔧 (test_starter_projects.py): organize imports alphabetically for better code maintenance
🔧 (test_astra_component.py): organize imports alphabetically for better code maintenance
🔧 (test_parse_json_data.py): remove unnecessary whitespace for cleaner code
🔧 (test_chat_input.py): remove unnecessary whitespace for cleaner code
🔧 (test_text_input.py): remove unnecessary whitespace for cleaner code
🔧 (test_output_parser.py): remove unnecessary whitespace for cleaner code
🔧 (test_chat_output.py): remove unnecessary whitespace for cleaner code
🔧 (test_text_output.py): remove unnecessary whitespace for cleaner code
🔧 (test_prompt.py): remove unnecessary whitespace for cleaner code
🔧 (test_basic_prompting.py): remove unnecessary whitespace for cleaner code
🔧 (test_misc.py): remove unnecessary whitespace for cleaner code
🔧 (utils.py): remove unnecessary whitespace for cleaner code
🔧 (test_server_init.py): remove unnecessary whitespace for cleaner code
🔧 (test_endpoints.py): remove unnecessary whitespace for cleaner code
🔧 (test_component_toolkit.py): remove unnecessary whitespace for cleaner code
🔧 (test_agent_component.py): remove unnecessary whitespace for cleaner code
🔧 (test_agent_events.py): remove unnecessary whitespace for cleaner code
🔧 (test_tool_calling_agent.py): remove unnecessary whitespace for cleaner code
🔧 (test_structured_output_component.py): remove unnecessary whitespace for cleaner code
🔧 (test_chatollama_component.py): remove unnecessary whitespace for cleaner code

📝 (test_huggingface.py): Remove unnecessary import statement
📝 (test_create_data_component.py): Remove unnecessary import statement
📝 (test_update_data_component.py): Remove unnecessary import statement
📝 (test_componet_set_functionality.py): Remove unnecessary import statement
📝 (test_component.py): Remove unnecessary import statement
📝 (test_event_manager.py): Remove unnecessary import statement
📝 (test_edge_base.py): Remove unnecessary import statement
📝 (test_state_model.py): Remove unnecessary import statement
📝 (test_base.py): Remove unnecessary import statement
📝 (test_callback_graph.py): Remove unnecessary import statement
📝 (test_cycles.py): Remove unnecessary import statement
📝 (test_graph_state_model.py): Remove unnecessary import statement
📝 (test_runnable_vertices_manager.py): Remove unnecessary import statement
📝 (test_utils.py): Remove unnecessary import statement
📝 (test_graph.py): Remove unnecessary import statement
📝 (test_base_model_from_schema.py): Reorder import statements
📝 (test_memory_chatbot.py): Remove unnecessary import statement
📝 (test_vector_store_rag.py): Remove unnecessary import statement
📝 (test_inputs.py): Reorder import statements
📝 (test_io_schema.py): Remove unnecessary import statement
📝 (test_table_schema.py): Remove unnecessary import statement
📝 (test_schema_message.py): Remove unnecessary import statement
📝 (test_service.py): Reorder import statements
📝 (test_api_key.py): Remove unnecessary import statement
📝 (test_chat_endpoint.py): Remove unnecessary import statement
📝 (test_cli.py): Remove unnecessary import statement

📝 (test_custom_component.py): Add missing import statement in test_custom_component.py
📝 (test_custom_component_with_client.py): Add missing import statement in test_custom_component_with_client.py
📝 (test_data_class.py): Add missing import statement in test_data_class.py
📝 (test_data_components.py): Add missing import statement in test_data_components.py
📝 (test_database.py): Add missing import statement in test_database.py
📝 (test_endpoints.py): Add missing import statement in test_endpoints.py
📝 (test_files.py): Add missing import statement in test_files.py
📝 (test_frontend_nodes.py): Add missing import statement in test_frontend_nodes.py
📝 (test_initial_setup.py): Add missing import statement in test_initial_setup.py
📝 (test_kubernetes_secrets.py): Add missing import statement in test_kubernetes_secrets.py
📝 (test_logger.py): Add missing import statement in test_logger.py
📝 (test_login.py): Add missing import statement in test_login.py
📝 (test_messages.py): Add missing import statement in test_messages.py
📝 (test_messages_endpoints.py): Add missing import statement in test_messages_endpoints.py
📝 (test_schema.py): Add missing import statement in test_schema.py
📝 (test_telemetry.py): Add missing import statement in test_telemetry.py
📝 (test_template.py): Add missing import statement in test_template.py
📝 (test_user.py): Add missing import statement in test_user.py
📝 (test_validate_code.py): Add missing import statement in test_validate_code.py
📝 (test_connection_string_parser.py): Add missing import statement in test_connection_string_parser.py
📝 (test_format_directory_path.py): Add missing import statement in test_format_directory_path.py
📝 (test_rewrite_file_path.py): Add missing import statement in test_rewrite_file_path.py
📝 (test_truncate_long_strings.py): Add missing import statement in test_truncate_long_strings.py
📝 (test_truncate_long_strings_on_objects.py): Add missing import statement in test_truncate_long_strings_on_objects.py

* [autofix.ci] apply automated fixes

* formatting

* Update import paths for MemoryComponent and HuggingFaceEndpointsComponent

* fix tests

* ✨ (decisionFlow.spec.ts): update test selectors to match changes in the application's UI for better test accuracy and reliability

* [autofix.ci] apply automated fixes

* ♻️ (test_output_parser.py): refactor import statements to improve code readability and maintainability

* fix tests

* ✅ (Simple Agent.spec.ts): enable test for "Simple Agent" by removing the skip flag to ensure it runs properly

* [autofix.ci] apply automated fixes

* Remove optional type from 'num_news' field in YahooFinanceSchema

* Refactor JSON formatting for improved readability and maintainability across starter projects.

* adding icon to flows

* [autofix.ci] apply automated fixes

* ✅ (similarity.spec.ts): update test selectors for filtering and connection nodes to match changes in the frontend implementation

* [autofix.ci] apply automated fixes

* removing init uncessary

* ⬆️ (pyproject.toml): upgrade crewai dependency to version 0.76.9 to include the latest features and bug fixes

* ✅ (Simple Agent.spec.ts): update test assertion to check if the count of "print(" is greater than or equal to 1 for better test coverage.

* [autofix.ci] apply automated fixes

* proposed changes

* [autofix.ci] apply automated fixes

* add zep icon

* [autofix.ci] apply automated fixes

* 🔧 (model.py): remove unused import and method 'cast_vector_store' from LCVectorStoreComponent
🔧 (openai_tools.py): remove beta flag from OpenAIToolsAgentComponent
🔧 (tool_calling.py): remove beta flag from ToolCallingAgentComponent
🔧 (Vector Store RAG.json): remove 'cast_vector_store' method from starter projects
🔧 (styleUtils.ts): add missing icon 'WolframAlphaAPI' to nodeIconsLucide in styleUtils module

* add langwatch and mem0 icon

* change mem0 name to mem0ai

* ✨ (filterSidebar.spec.ts): update test to use first() method to select the first element with the specified test ID
♻️ (filterSidebar.spec.ts): remove unnecessary code related to checking the checkbox state in the test
🔧 (generalBugs-shard-2.spec.ts): update test to select the correct element with the test ID "dataWebhook" instead of "dataWebhook Input"

* ♻️ (test_vector_store_rag.py): remove redundant code setting "vector_store" value in both ingestion_graph and rag_graph functions to improve code readability and maintainability

* [autofix.ci] apply automated fixes

* updating json test

* [autofix.ci] apply automated fixes

* ⬆️ (pyproject.toml): downgrade crewai dependency version from 0.76.9 to 0.74.2 to resolve compatibility issues

* 🐛 (generalBugs-shard-5.spec.ts): fix typo in test case for component name
🐛 (generalBugs-shard-9.spec.ts): update endX calculation to move 600 pixels to the right instead of 300
🐛 (generalBugs-shard-9.spec.ts): fix typo in test case for component name and update test steps to click "fit_view" button twice

---------

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:
Cristhian Zanforlin Lousa 2024-11-11 16:30:05 -03:00 • committed by GitHub
commit 29e484465c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
182 changed files with 7279 additions and 516 deletions

View file

@ -34,7 +34,7 @@ test("user must see on handle hover a tooltip with possibility connections", asy
await page.waitForTimeout(1000);
await page
.getByTestId("chainsRetrieval QA")
.getByTestId("langchain_utilitiesRetrieval QA")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
await page.mouse.up();
await page.mouse.down();

View file

@ -51,7 +51,7 @@ test("user must see on handle click the possibility connections - LLMChain", asy
await page.waitForTimeout(500);
expect(await page.getByTestId("icon-ListFilter")).toBeVisible();
expect(await page.getByTestId("icon-ListFilter").first()).toBeVisible();
await page
.getByTestId("icon-X")
@ -72,25 +72,23 @@ test("user must see on handle click the possibility connections - LLMChain", asy
await expect(page.getByTestId("disclosure-models")).toBeVisible();
await expect(page.getByTestId("disclosure-helpers")).toBeVisible();
await expect(page.getByTestId("disclosure-agents")).toBeVisible();
await expect(page.getByTestId("disclosure-chains")).not.toBeVisible();
await page.getByTestId("sidebar-options-trigger").click();
await page.getByTestId("sidebar-legacy-switch").isVisible({ timeout: 5000 });
await page.getByTestId("sidebar-legacy-switch").click();
await expect(page.getByTestId("sidebar-legacy-switch")).toBeChecked();
await page.getByTestId("sidebar-options-trigger").click();
await expect(page.getByTestId("disclosure-chains")).toBeVisible();
await expect(page.getByTestId("disclosure-prototypes")).toBeVisible();
await expect(page.getByTestId("inputsChat Input")).toBeVisible();
await expect(page.getByTestId("outputsChat Output")).toBeVisible();
await expect(page.getByTestId("promptsPrompt")).toBeVisible();
await expect(page.getByTestId("modelsAmazon Bedrock")).toBeVisible();
await expect(page.getByTestId("helpersChat Memory")).toBeVisible();
await expect(page.getByTestId("agentsCSVAgent")).toBeVisible();
await expect(page.getByTestId("chainsConversationChain")).toBeVisible();
await expect(page.getByTestId("prototypesConditional Router")).toBeVisible();
await expect(page.getByTestId("memoriesChat Memory")).toBeVisible();
await expect(page.getByTestId("langchain_utilitiesCSVAgent")).toBeVisible();
await expect(
page.getByTestId("langchain_utilitiesConversationChain"),
).toBeVisible();
await expect(page.getByTestId("helpersCurrent Date")).toBeVisible();
@ -108,12 +106,12 @@ test("user must see on handle click the possibility connections - LLMChain", asy
await expect(page.getByTestId("outputsChat Output")).not.toBeVisible();
await expect(page.getByTestId("promptsPrompt")).not.toBeVisible();
await expect(page.getByTestId("modelsAmazon Bedrock")).not.toBeVisible();
await expect(page.getByTestId("helpersChat Memory")).not.toBeVisible();
await expect(page.getByTestId("memoriesChat Memory")).not.toBeVisible();
await expect(page.getByTestId("agentsTool Calling Agent")).not.toBeVisible();
await expect(page.getByTestId("chainsConversationChain")).not.toBeVisible();
await expect(
page.getByTestId("prototypesConditional Router"),
page.getByTestId("langchain_utilitiesConversationChain"),
).not.toBeVisible();
await expect(page.getByTestId("logicCondition")).not.toBeVisible();
await page.getByTestId("handle-apirequest-shownode-headers-left").click();
@ -121,15 +119,14 @@ test("user must see on handle click the possibility connections - LLMChain", asy
await expect(page.getByTestId("disclosure-helpers")).toBeVisible();
await expect(page.getByTestId("disclosure-vector stores")).toBeVisible();
await expect(page.getByTestId("disclosure-prototypes")).toBeVisible();
await expect(page.getByTestId("disclosure-retrievers")).toBeVisible();
await expect(page.getByTestId("disclosure-embeddings")).toBeVisible();
await expect(page.getByTestId("disclosure-tools")).toBeVisible();
await expect(page.getByTestId("dataAPI Request")).toBeVisible();
await expect(page.getByTestId("helpersChat Memory")).toBeVisible();
await expect(page.getByTestId("memoriesChat Memory")).toBeVisible();
await expect(page.getByTestId("vectorstoresAstra DB")).toBeVisible();
await expect(page.getByTestId("toolsSearch API")).toBeVisible();
await expect(page.getByTestId("prototypesSub Flow")).not.toBeVisible();
await expect(page.getByTestId("logicSub Flow")).not.toBeVisible();
await page.getByTestId("sidebar-options-trigger").click();
await page.getByTestId("sidebar-beta-switch").isVisible({ timeout: 5000 });
@ -137,24 +134,19 @@ test("user must see on handle click the possibility connections - LLMChain", asy
await expect(page.getByTestId("sidebar-beta-switch")).toBeChecked();
await page.getByTestId("sidebar-options-trigger").click();
await expect(page.getByTestId("prototypesSub Flow")).toBeVisible();
await expect(page.getByTestId("logicSub Flow")).toBeVisible();
await expect(
page.getByTestId("retrieversSelf Query Retriever"),
).toBeVisible();
await expect(page.getByTestId("helpersSplit Text")).toBeVisible();
await expect(page.getByTestId("toolsSearch API")).toBeVisible();
await page.getByTestId("icon-X").first().click();
await expect(page.getByTestId("dataAPI Request")).not.toBeVisible();
await expect(page.getByTestId("helpersChat Memory")).not.toBeVisible();
await expect(page.getByTestId("memoriesChat Memory")).not.toBeVisible();
await expect(page.getByTestId("vectorstoresAstra DB")).not.toBeVisible();
await expect(page.getByTestId("toolsSearch API")).not.toBeVisible();
await expect(page.getByTestId("prototypesSub Flow")).not.toBeVisible();
await expect(
page.getByTestId("retrieversSelf Query Retriever"),
).not.toBeVisible();
await expect(page.getByTestId("logicSub Flow")).not.toBeVisible();
await expect(page.getByTestId("helpersSplit Text")).not.toBeVisible();
await expect(page.getByTestId("toolsSearch API")).not.toBeVisible();
});

View file

@ -98,7 +98,7 @@ test("user must be able to freeze a component", async ({ page }) => {
await page.waitForTimeout(1000);
await page
.getByTestId("helpersParse Data")
.getByTestId("processingParse Data")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
await page.getByTestId("zoom_out").click();

View file

@ -103,7 +103,7 @@ test("user must be able to stop a building", async ({ page }) => {
// await page.waitForTimeout(1000);
await page
.getByTestId("helpersParse Data")
.getByTestId("processingParse Data")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
await page.getByTestId("zoom_out").click();

View file

@ -3,7 +3,7 @@ import * as dotenv from "dotenv";
import path from "path";
import uaParser from "ua-parser-js";
test.skip("Simple Agent", async ({ page }) => {
test("Simple Agent", async ({ page }) => {
test.skip(
!process?.env?.OPENAI_API_KEY,
"OPENAI_API_KEY required to run this test",
@ -148,5 +148,5 @@ test.skip("Simple Agent", async ({ page }) => {
pythonWords = await page.getByText("print(").count();
expect(pythonWords).toBe(1);
expect(pythonWords).toBeGreaterThanOrEqual(1);
});

View file

@ -191,6 +191,11 @@ test("should create a flow with decision", async ({ page }) => {
timeout: 30000,
});
await page.getByTestId("blank-flow").click();
await page.getByTestId("sidebar-options-trigger").click();
await page.getByTestId("sidebar-legacy-switch").isVisible({ timeout: 5000 });
await page.getByTestId("sidebar-legacy-switch").click();
//---------------------------------- CHAT INPUT
await page.getByTestId("sidebar-search-input").click();
await page.getByTestId("sidebar-search-input").fill("chat input");
@ -234,25 +239,25 @@ test("should create a flow with decision", async ({ page }) => {
await page.getByTestId("sidebar-search-input").fill("parse data");
await page.waitForTimeout(500);
await page
.getByTestId("helpersParse Data")
.getByTestId("processingParse Data")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
await page
.getByTestId("helpersParse Data")
.getByTestId("processingParse Data")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
//---------------------------------- PASS
await page.getByTestId("sidebar-search-input").click();
await page.getByTestId("sidebar-search-input").fill("pass");
await page.waitForTimeout(500);
await page
.getByTestId("prototypesPass")
.getByTestId("logicPass")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
await page.waitForTimeout(500);
await page
.getByTestId("prototypesPass")
.getByTestId("logicPass")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
await page.waitForTimeout(500);
await page
.getByTestId("prototypesPass")
.getByTestId("logicPass")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
//---------------------------------- PROMPT
await page.getByTestId("sidebar-search-input").click();
@ -273,7 +278,7 @@ test("should create a flow with decision", async ({ page }) => {
await page.getByTestId("sidebar-search-input").fill("conditional router");
await page.waitForTimeout(500);
await page
.getByTestId("prototypesConditional Router")
.getByTestId("logicIf-Else")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
//---------------------------------- CHAT OUTPUT
await page.getByTestId("sidebar-search-input").click();
@ -293,7 +298,7 @@ test("should create a flow with decision", async ({ page }) => {
await page.waitForTimeout(500);
await moveElementByX(page, "Chat Output", 700, 0);
await page.waitForTimeout(500);
await moveElementByX(page, "Conditional Router", 1100, 0);
await moveElementByX(page, "If-Else", 1100, 0);
await page.waitForTimeout(500);
await page.getByTestId("fit_view").click();
await moveElementByX(page, "OpenAI", 980, 0);
@ -384,7 +389,7 @@ test("should create a flow with decision", async ({ page }) => {
.nth(0)
.click();
await page
.getByTestId("handle-conditionalrouter-shownode-input text-left")
.getByTestId("handle-conditionalrouter-shownode-text input-left")
.nth(0)
.click();
await page.getByTestId("popover-anchor-input-match_text").fill("TRUE");
@ -405,7 +410,7 @@ test("should create a flow with decision", async ({ page }) => {
await page.getByTestId("showignored_message").last().click();
await page.getByText("Close").last().click();
await page
.getByTestId("handle-conditionalrouter-shownode-true route-right")
.getByTestId("handle-conditionalrouter-shownode-true-right")
.nth(0)
.click();
await page
@ -413,7 +418,7 @@ test("should create a flow with decision", async ({ page }) => {
.nth(1)
.click();
await page
.getByTestId("handle-conditionalrouter-shownode-false route-right")
.getByTestId("handle-conditionalrouter-shownode-false-right")
.nth(0)
.click();
await page

View file

@ -133,7 +133,7 @@ test("user must be able to check similarity between embedding texts", async ({
// await page.waitForTimeout(1000);
await page
.getByTestId("helpersParse Data")
.getByTestId("processingParse Data")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
await page.getByTestId("zoom_out").click();
@ -173,7 +173,7 @@ test("user must be able to check similarity between embedding texts", async ({
// await page.waitForTimeout(1000);
await page
.getByTestId("helpersFilter Data")
.getByTestId("processingFilter Data")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
await page.getByTestId("zoom_out").click();
@ -249,7 +249,7 @@ test("user must be able to check similarity between embedding texts", async ({
//connection 1
const openAiEmbeddingOutput_0 = await page
.getByTestId("handle-openaiembeddings-shownode-embeddings-right")
.nth(2);
.nth(0);
await openAiEmbeddingOutput_0.hover();
await page.mouse.down();

View file

@ -73,7 +73,7 @@ test("should be able to see output preview from grouped components and connect c
await page.mouse.up();
await page
.getByTestId("helpersCombine Text")
.getByTestId("processingCombine Text")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
await page
@ -88,7 +88,7 @@ test("should be able to see output preview from grouped components and connect c
await page.mouse.up();
await page
.getByTestId("helpersCombine Text")
.getByTestId("processingCombine Text")
.dragTo(page.locator('//*[@id="react-flow-id"]'));
await page

View file

@ -41,6 +41,10 @@ test("memory should work as expect", async ({ page }) => {
await page.getByTestId("sidebar-search-input").click();
await page.getByTestId("sidebar-search-input").fill("chat memory");
await page.getByTestId("sidebar-options-trigger").click();
await page.getByTestId("sidebar-legacy-switch").isVisible({ timeout: 5000 });
await page.getByTestId("sidebar-legacy-switch").click();
// Locate the canvas element
const canvas = page.locator("#react-flow-id"); // Update the selector if needed
@ -54,8 +58,8 @@ test("memory should work as expect", async ({ page }) => {
const startX = canvasBox.x + canvasBox.width / 2;
const startY = canvasBox.y + canvasBox.height / 2;
// End point (move 300 pixels to the right)
const endX = startX + 300;
// End point (move 600 pixels to the right)
const endX = startX + 600;
const endY = startY;
// Hover over the canvas to focus it
@ -72,7 +76,7 @@ test("memory should work as expect", async ({ page }) => {
await page.mouse.up();
await page
.getByTestId("helpersChat Memory")
.getByTestId("memoriesChat Memory")
.first()
.dragTo(page.locator('//*[@id="react-flow-id"]'));
@ -123,9 +127,12 @@ AI:
await page.getByText("Edit Prompt", { exact: true }).click();
await page.getByText("Check & Save").last().click();
await page.getByTestId("fit_view").click();
await page.getByTestId("fit_view").click();
//connection 1
const elementChatMemoryOutput = await page
.getByTestId("handle-memory-shownode-messages (text)-right")
.getByTestId("handle-memory-shownode-text-right")
.first();
await elementChatMemoryOutput.hover();
await page.mouse.down();

View file

@ -36,6 +36,10 @@ test("CodeAreaModalComponent", async ({ page }) => {
await page.waitForTimeout(1000);
await page.getByTestId("sidebar-options-trigger").click();
await page.getByTestId("sidebar-legacy-switch").isVisible({ timeout: 5000 });
await page.getByTestId("sidebar-legacy-switch").click();
await page
.getByTestId("prototypesPython Function")
.dragTo(page.locator('//*[@id="react-flow-id"]'));

View file

@ -71,7 +71,7 @@ test.skip("should be able to upload a file", async ({ page }) => {
await page.getByTestId("sidebar-search-input").click();
await page.getByTestId("sidebar-search-input").fill("parse data");
await page
.getByTestId("helpersParse Data")
.getByTestId("processingParse Data")
.first()
.dragTo(page.locator('//*[@id="react-flow-id"]'));