diff --git a/src/backend/base/langflow/base/data/base_file.py b/src/backend/base/langflow/base/data/base_file.py index 721355ef2..e74dfe29c 100644 --- a/src/backend/base/langflow/base/data/base_file.py +++ b/src/backend/base/langflow/base/data/base_file.py @@ -174,7 +174,7 @@ class BaseFileComponent(Component, ABC): ] _base_outputs = [ - Output(display_name="Loaded Files", name="dataframe", method="load_dataframe"), + Output(display_name="Loaded Files", name="dataframe", method="load_files"), ] @abstractmethod @@ -225,7 +225,7 @@ class BaseFileComponent(Component, ABC): else: file.path.unlink() - def load_files(self) -> list[Data]: + def load_files_core(self) -> list[Data]: """Load files and return as Data objects. Returns: @@ -236,13 +236,13 @@ class BaseFileComponent(Component, ABC): return [Data()] return data_list - def load_dataframe(self) -> DataFrame: + def load_files(self) -> DataFrame: """Load files and return as DataFrame. Returns: DataFrame: DataFrame containing all file data """ - data_list = self.load_files() + data_list = self.load_files_core() if not data_list: return DataFrame() diff --git a/src/backend/base/langflow/components/helpers/__init__.py b/src/backend/base/langflow/components/helpers/__init__.py index 8d1b3ea59..773ce8576 100644 --- a/src/backend/base/langflow/components/helpers/__init__.py +++ b/src/backend/base/langflow/components/helpers/__init__.py @@ -5,10 +5,8 @@ from .id_generator import IDGeneratorComponent from .memory import MemoryComponent from .output_parser import OutputParserComponent from .store_message import MessageStoreComponent -from .structured_output import StructuredOutputComponent __all__ = [ - "BatchRunComponent", "CalculatorComponent", "CreateListComponent", "CurrentDateComponent", @@ -16,5 +14,4 @@ __all__ = [ "MemoryComponent", "MessageStoreComponent", "OutputParserComponent", - "StructuredOutputComponent", ] diff --git a/src/backend/base/langflow/components/processing/__init__.py b/src/backend/base/langflow/components/processing/__init__.py index 440da9431..506f24162 100644 --- a/src/backend/base/langflow/components/processing/__init__.py +++ b/src/backend/base/langflow/components/processing/__init__.py @@ -1,4 +1,5 @@ from .alter_metadata import AlterMetadataComponent +from .batch_run import BatchRunComponent from .combine_text import CombineTextComponent from .converter import TypeConverterComponent from .create_data import CreateDataComponent @@ -17,10 +18,12 @@ from .python_repl_core import PythonREPLComponent from .regex import RegexExtractorComponent from .select_data import SelectDataComponent from .split_text import SplitTextComponent +from .structured_output import StructuredOutputComponent from .update_data import UpdateDataComponent __all__ = [ "AlterMetadataComponent", + "BatchRunComponent", "CombineTextComponent", "CreateDataComponent", "DataFilterComponent", @@ -39,6 +42,7 @@ __all__ = [ "RegexExtractorComponent", "SelectDataComponent", "SplitTextComponent", + "StructuredOutputComponent", "TypeConverterComponent", "UpdateDataComponent", ] diff --git a/src/backend/base/langflow/components/helpers/batch_run.py b/src/backend/base/langflow/components/processing/batch_run.py similarity index 100% rename from src/backend/base/langflow/components/helpers/batch_run.py rename to src/backend/base/langflow/components/processing/batch_run.py diff --git a/src/backend/base/langflow/components/processing/save_file.py b/src/backend/base/langflow/components/processing/save_file.py index d2e4d99c8..4ece19fb4 100644 --- a/src/backend/base/langflow/components/processing/save_file.py +++ b/src/backend/base/langflow/components/processing/save_file.py @@ -9,7 +9,7 @@ from fastapi.encoders import jsonable_encoder from langflow.api.v2.files import upload_user_file from langflow.custom import Component -from langflow.io import DropdownInput, HandleInput, Output, StrInput +from langflow.io import DropdownInput, HandleInput, StrInput from langflow.schema import Data, DataFrame, Message from langflow.services.auth.utils import create_user_longterm_token from langflow.services.database.models.user.crud import get_user_by_id @@ -51,14 +51,6 @@ class SaveToFileComponent(Component): ), ] - outputs = [ - Output( - name="confirmation", - display_name="Confirmation", - method="save_to_file", - ), - ] - async def save_to_file(self) -> str: """Save the input to a file and upload it, returning a confirmation message.""" # Validate inputs diff --git a/src/backend/base/langflow/components/helpers/structured_output.py b/src/backend/base/langflow/components/processing/structured_output.py similarity index 100% rename from src/backend/base/langflow/components/helpers/structured_output.py rename to src/backend/base/langflow/components/processing/structured_output.py diff --git a/src/backend/base/langflow/components/twelvelabs/video_file.py b/src/backend/base/langflow/components/twelvelabs/video_file.py index ffe0a8f72..f81e5a07f 100644 --- a/src/backend/base/langflow/components/twelvelabs/video_file.py +++ b/src/backend/base/langflow/components/twelvelabs/video_file.py @@ -2,7 +2,7 @@ from pathlib import Path from langflow.base.data import BaseFileComponent from langflow.io import FileInput -from langflow.schema import Data +from langflow.schema import Data, DataFrame class VideoFileComponent(BaseFileComponent): @@ -135,13 +135,13 @@ class VideoFileComponent(BaseFileComponent): return processed_files - def load_files(self) -> list[Data]: + def load_files(self) -> DataFrame: """Load video files and return a list of Data objects.""" try: self.log("DEBUG: Starting video file load") if not hasattr(self, "file_path") or not self.file_path: self.log("DEBUG: No video file path provided") - return [] + return DataFrame() self.log(f"DEBUG: Loading video from path: {self.file_path}") @@ -149,7 +149,7 @@ class VideoFileComponent(BaseFileComponent): file_path_obj = Path(self.file_path) if not file_path_obj.exists(): self.log(f"DEBUG: Video file not found at path: {self.file_path}") - return [] + return DataFrame() # Verify file size file_size = file_path_obj.stat().st_size @@ -162,18 +162,18 @@ class VideoFileComponent(BaseFileComponent): } self.log(f"DEBUG: Created video data: {video_data}") - result = [Data(data=video_data)] + result = DataFrame(data=[video_data]) # Log the result to verify it's a proper Data object self.log("DEBUG: Returning list with Data objects") except (FileNotFoundError, PermissionError, OSError) as e: self.log(f"DEBUG: File error in video load_files: {e!s}", "ERROR") - return [] + return DataFrame() except ImportError as e: self.log(f"DEBUG: Import error in video load_files: {e!s}", "ERROR") - return [] + return DataFrame() except (ValueError, TypeError) as e: self.log(f"DEBUG: Value or type error in video load_files: {e!s}", "ERROR") - return [] + return DataFrame() else: return result diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Document Q&A.json b/src/backend/base/langflow/initial_setup/starter_projects/Document Q&A.json index 4730e6816..45a4a1efa 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Document Q&A.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Document Q&A.json @@ -804,7 +804,7 @@ "cache": true, "display_name": "Loaded Files", "group_outputs": false, - "method": "load_dataframe", + "method": "load_files", "name": "dataframe", "required_inputs": [], "selected": "DataFrame", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/News Aggregator.json b/src/backend/base/langflow/initial_setup/starter_projects/News Aggregator.json index a630681c9..aa98bb9a4 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/News Aggregator.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/News Aggregator.json @@ -1639,22 +1639,7 @@ "metadata": {}, "minimized": false, "output_types": [], - "outputs": [ - { - "allows_loop": false, - "cache": true, - "display_name": "Confirmation", - "group_outputs": false, - "method": "save_to_file", - "name": "confirmation", - "selected": "Text", - "tool_mode": true, - "types": [ - "Text" - ], - "value": "__UNDEFINED__" - } - ], + "outputs": [], "pinned": false, "template": { "_type": "Component", @@ -1674,7 +1659,7 @@ "show": true, "title_case": false, "type": "code", - "value": "import json\nfrom collections.abc import AsyncIterator, Iterator\nfrom pathlib import Path\n\nimport orjson\nimport pandas as pd\nfrom fastapi import UploadFile\nfrom fastapi.encoders import jsonable_encoder\n\nfrom langflow.api.v2.files import upload_user_file\nfrom langflow.custom import Component\nfrom langflow.io import DropdownInput, HandleInput, Output, StrInput\nfrom langflow.schema import Data, DataFrame, Message\nfrom langflow.services.auth.utils import create_user_longterm_token\nfrom langflow.services.database.models.user.crud import get_user_by_id\nfrom langflow.services.deps import get_session, get_settings_service, get_storage_service\n\n\nclass SaveToFileComponent(Component):\n display_name = \"Save File\"\n description = \"Save data to a local file in the selected format.\"\n icon = \"save\"\n name = \"SaveToFile\"\n\n # File format options for different types\n DATA_FORMAT_CHOICES = [\"csv\", \"excel\", \"json\", \"markdown\"]\n MESSAGE_FORMAT_CHOICES = [\"txt\", \"json\", \"markdown\"]\n\n inputs = [\n HandleInput(\n name=\"input\",\n display_name=\"Input\",\n info=\"The input to save.\",\n dynamic=True,\n input_types=[\"Data\", \"DataFrame\", \"Message\"],\n required=True,\n ),\n StrInput(\n name=\"file_name\",\n display_name=\"File Name\",\n info=\"Name file will be saved as (without extension).\",\n required=True,\n ),\n DropdownInput(\n name=\"file_format\",\n display_name=\"File Format\",\n options=DATA_FORMAT_CHOICES + MESSAGE_FORMAT_CHOICES,\n info=\"Select the file format to save the input. If not provided, the default format will be used.\",\n value=\"\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(\n name=\"confirmation\",\n display_name=\"Confirmation\",\n method=\"save_to_file\",\n ),\n ]\n\n async def save_to_file(self) -> str:\n \"\"\"Save the input to a file and upload it, returning a confirmation message.\"\"\"\n # Validate inputs\n if not self.file_name:\n msg = \"File name must be provided.\"\n raise ValueError(msg)\n if not self._get_input_type():\n msg = \"Input type is not set.\"\n raise ValueError(msg)\n\n # Validate file format based on input type\n file_format = self.file_format or self._get_default_format()\n allowed_formats = (\n self.MESSAGE_FORMAT_CHOICES if self._get_input_type() == \"Message\" else self.DATA_FORMAT_CHOICES\n )\n if file_format not in allowed_formats:\n msg = f\"Invalid file format '{file_format}' for {self._get_input_type()}. Allowed: {allowed_formats}\"\n raise ValueError(msg)\n\n # Prepare file path\n file_path = Path(self.file_name).expanduser()\n if not file_path.parent.exists():\n file_path.parent.mkdir(parents=True, exist_ok=True)\n file_path = self._adjust_file_path_with_format(file_path, file_format)\n\n # Save the input to file based on type\n if self._get_input_type() == \"DataFrame\":\n confirmation = self._save_dataframe(self.input, file_path, file_format)\n elif self._get_input_type() == \"Data\":\n confirmation = self._save_data(self.input, file_path, file_format)\n elif self._get_input_type() == \"Message\":\n confirmation = await self._save_message(self.input, file_path, file_format)\n else:\n msg = f\"Unsupported input type: {self._get_input_type()}\"\n raise ValueError(msg)\n\n # Upload the saved file\n await self._upload_file(file_path)\n\n return confirmation\n\n def _get_input_type(self) -> str:\n \"\"\"Determine the input type based on the provided input.\"\"\"\n if isinstance(self.input, DataFrame):\n return \"DataFrame\"\n if isinstance(self.input, Data):\n return \"Data\"\n if isinstance(self.input, Message):\n return \"Message\"\n\n msg = f\"Unsupported input type: {type(self.input)}\"\n raise ValueError(msg)\n\n def _get_default_format(self) -> str:\n \"\"\"Return the default file format based on input type.\"\"\"\n if self._get_input_type() == \"DataFrame\":\n return \"csv\"\n if self._get_input_type() == \"Data\":\n return \"json\"\n if self._get_input_type() == \"Message\":\n return \"markdown\"\n return \"json\" # Fallback\n\n def _adjust_file_path_with_format(self, path: Path, fmt: str) -> Path:\n \"\"\"Adjust the file path to include the correct extension.\"\"\"\n file_extension = path.suffix.lower().lstrip(\".\")\n if fmt == \"excel\":\n return Path(f\"{path}.xlsx\").expanduser() if file_extension not in [\"xlsx\", \"xls\"] else path\n return Path(f\"{path}.{fmt}\").expanduser() if file_extension != fmt else path\n\n async def _upload_file(self, file_path: Path) -> None:\n \"\"\"Upload the saved file using the upload_user_file service.\"\"\"\n if not file_path.exists():\n msg = f\"File not found: {file_path}\"\n raise FileNotFoundError(msg)\n\n with file_path.open(\"rb\") as f:\n async for db in get_session():\n user_id, _ = await create_user_longterm_token(db)\n current_user = await get_user_by_id(db, user_id)\n\n await upload_user_file(\n file=UploadFile(filename=file_path.name, file=f, size=file_path.stat().st_size),\n session=db,\n current_user=current_user,\n storage_service=get_storage_service(),\n settings_service=get_settings_service(),\n )\n\n def _save_dataframe(self, dataframe: DataFrame, path: Path, fmt: str) -> str:\n \"\"\"Save a DataFrame to the specified file format.\"\"\"\n if fmt == \"csv\":\n dataframe.to_csv(path, index=False)\n elif fmt == \"excel\":\n dataframe.to_excel(path, index=False, engine=\"openpyxl\")\n elif fmt == \"json\":\n dataframe.to_json(path, orient=\"records\", indent=2)\n elif fmt == \"markdown\":\n path.write_text(dataframe.to_markdown(index=False), encoding=\"utf-8\")\n else:\n msg = f\"Unsupported DataFrame format: {fmt}\"\n raise ValueError(msg)\n return f\"DataFrame saved successfully as '{path}'\"\n\n def _save_data(self, data: Data, path: Path, fmt: str) -> str:\n \"\"\"Save a Data object to the specified file format.\"\"\"\n if fmt == \"csv\":\n pd.DataFrame(data.data).to_csv(path, index=False)\n elif fmt == \"excel\":\n pd.DataFrame(data.data).to_excel(path, index=False, engine=\"openpyxl\")\n elif fmt == \"json\":\n path.write_text(\n orjson.dumps(jsonable_encoder(data.data), option=orjson.OPT_INDENT_2).decode(\"utf-8\"), encoding=\"utf-8\"\n )\n elif fmt == \"markdown\":\n path.write_text(pd.DataFrame(data.data).to_markdown(index=False), encoding=\"utf-8\")\n else:\n msg = f\"Unsupported Data format: {fmt}\"\n raise ValueError(msg)\n return f\"Data saved successfully as '{path}'\"\n\n async def _save_message(self, message: Message, path: Path, fmt: str) -> str:\n \"\"\"Save a Message to the specified file format, handling async iterators.\"\"\"\n content = \"\"\n if message.text is None:\n content = \"\"\n elif isinstance(message.text, AsyncIterator):\n async for item in message.text:\n content += str(item) + \" \"\n content = content.strip()\n elif isinstance(message.text, Iterator):\n content = \" \".join(str(item) for item in message.text)\n else:\n content = str(message.text)\n\n if fmt == \"txt\":\n path.write_text(content, encoding=\"utf-8\")\n elif fmt == \"json\":\n path.write_text(json.dumps({\"message\": content}, indent=2), encoding=\"utf-8\")\n elif fmt == \"markdown\":\n path.write_text(f\"**Message:**\\n\\n{content}\", encoding=\"utf-8\")\n else:\n msg = f\"Unsupported Message format: {fmt}\"\n raise ValueError(msg)\n return f\"Message saved successfully as '{path}'\"\n" + "value": "import json\nfrom collections.abc import AsyncIterator, Iterator\nfrom pathlib import Path\n\nimport orjson\nimport pandas as pd\nfrom fastapi import UploadFile\nfrom fastapi.encoders import jsonable_encoder\n\nfrom langflow.api.v2.files import upload_user_file\nfrom langflow.custom import Component\nfrom langflow.io import DropdownInput, HandleInput, StrInput\nfrom langflow.schema import Data, DataFrame, Message\nfrom langflow.services.auth.utils import create_user_longterm_token\nfrom langflow.services.database.models.user.crud import get_user_by_id\nfrom langflow.services.deps import get_session, get_settings_service, get_storage_service\n\n\nclass SaveToFileComponent(Component):\n display_name = \"Save File\"\n description = \"Save data to a local file in the selected format.\"\n icon = \"save\"\n name = \"SaveToFile\"\n\n # File format options for different types\n DATA_FORMAT_CHOICES = [\"csv\", \"excel\", \"json\", \"markdown\"]\n MESSAGE_FORMAT_CHOICES = [\"txt\", \"json\", \"markdown\"]\n\n inputs = [\n HandleInput(\n name=\"input\",\n display_name=\"Input\",\n info=\"The input to save.\",\n dynamic=True,\n input_types=[\"Data\", \"DataFrame\", \"Message\"],\n required=True,\n ),\n StrInput(\n name=\"file_name\",\n display_name=\"File Name\",\n info=\"Name file will be saved as (without extension).\",\n required=True,\n ),\n DropdownInput(\n name=\"file_format\",\n display_name=\"File Format\",\n options=DATA_FORMAT_CHOICES + MESSAGE_FORMAT_CHOICES,\n info=\"Select the file format to save the input. If not provided, the default format will be used.\",\n value=\"\",\n advanced=True,\n ),\n ]\n\n async def save_to_file(self) -> str:\n \"\"\"Save the input to a file and upload it, returning a confirmation message.\"\"\"\n # Validate inputs\n if not self.file_name:\n msg = \"File name must be provided.\"\n raise ValueError(msg)\n if not self._get_input_type():\n msg = \"Input type is not set.\"\n raise ValueError(msg)\n\n # Validate file format based on input type\n file_format = self.file_format or self._get_default_format()\n allowed_formats = (\n self.MESSAGE_FORMAT_CHOICES if self._get_input_type() == \"Message\" else self.DATA_FORMAT_CHOICES\n )\n if file_format not in allowed_formats:\n msg = f\"Invalid file format '{file_format}' for {self._get_input_type()}. Allowed: {allowed_formats}\"\n raise ValueError(msg)\n\n # Prepare file path\n file_path = Path(self.file_name).expanduser()\n if not file_path.parent.exists():\n file_path.parent.mkdir(parents=True, exist_ok=True)\n file_path = self._adjust_file_path_with_format(file_path, file_format)\n\n # Save the input to file based on type\n if self._get_input_type() == \"DataFrame\":\n confirmation = self._save_dataframe(self.input, file_path, file_format)\n elif self._get_input_type() == \"Data\":\n confirmation = self._save_data(self.input, file_path, file_format)\n elif self._get_input_type() == \"Message\":\n confirmation = await self._save_message(self.input, file_path, file_format)\n else:\n msg = f\"Unsupported input type: {self._get_input_type()}\"\n raise ValueError(msg)\n\n # Upload the saved file\n await self._upload_file(file_path)\n\n return confirmation\n\n def _get_input_type(self) -> str:\n \"\"\"Determine the input type based on the provided input.\"\"\"\n if isinstance(self.input, DataFrame):\n return \"DataFrame\"\n if isinstance(self.input, Data):\n return \"Data\"\n if isinstance(self.input, Message):\n return \"Message\"\n\n msg = f\"Unsupported input type: {type(self.input)}\"\n raise ValueError(msg)\n\n def _get_default_format(self) -> str:\n \"\"\"Return the default file format based on input type.\"\"\"\n if self._get_input_type() == \"DataFrame\":\n return \"csv\"\n if self._get_input_type() == \"Data\":\n return \"json\"\n if self._get_input_type() == \"Message\":\n return \"markdown\"\n return \"json\" # Fallback\n\n def _adjust_file_path_with_format(self, path: Path, fmt: str) -> Path:\n \"\"\"Adjust the file path to include the correct extension.\"\"\"\n file_extension = path.suffix.lower().lstrip(\".\")\n if fmt == \"excel\":\n return Path(f\"{path}.xlsx\").expanduser() if file_extension not in [\"xlsx\", \"xls\"] else path\n return Path(f\"{path}.{fmt}\").expanduser() if file_extension != fmt else path\n\n async def _upload_file(self, file_path: Path) -> None:\n \"\"\"Upload the saved file using the upload_user_file service.\"\"\"\n if not file_path.exists():\n msg = f\"File not found: {file_path}\"\n raise FileNotFoundError(msg)\n\n with file_path.open(\"rb\") as f:\n async for db in get_session():\n user_id, _ = await create_user_longterm_token(db)\n current_user = await get_user_by_id(db, user_id)\n\n await upload_user_file(\n file=UploadFile(filename=file_path.name, file=f, size=file_path.stat().st_size),\n session=db,\n current_user=current_user,\n storage_service=get_storage_service(),\n settings_service=get_settings_service(),\n )\n\n def _save_dataframe(self, dataframe: DataFrame, path: Path, fmt: str) -> str:\n \"\"\"Save a DataFrame to the specified file format.\"\"\"\n if fmt == \"csv\":\n dataframe.to_csv(path, index=False)\n elif fmt == \"excel\":\n dataframe.to_excel(path, index=False, engine=\"openpyxl\")\n elif fmt == \"json\":\n dataframe.to_json(path, orient=\"records\", indent=2)\n elif fmt == \"markdown\":\n path.write_text(dataframe.to_markdown(index=False), encoding=\"utf-8\")\n else:\n msg = f\"Unsupported DataFrame format: {fmt}\"\n raise ValueError(msg)\n return f\"DataFrame saved successfully as '{path}'\"\n\n def _save_data(self, data: Data, path: Path, fmt: str) -> str:\n \"\"\"Save a Data object to the specified file format.\"\"\"\n if fmt == \"csv\":\n pd.DataFrame(data.data).to_csv(path, index=False)\n elif fmt == \"excel\":\n pd.DataFrame(data.data).to_excel(path, index=False, engine=\"openpyxl\")\n elif fmt == \"json\":\n path.write_text(\n orjson.dumps(jsonable_encoder(data.data), option=orjson.OPT_INDENT_2).decode(\"utf-8\"), encoding=\"utf-8\"\n )\n elif fmt == \"markdown\":\n path.write_text(pd.DataFrame(data.data).to_markdown(index=False), encoding=\"utf-8\")\n else:\n msg = f\"Unsupported Data format: {fmt}\"\n raise ValueError(msg)\n return f\"Data saved successfully as '{path}'\"\n\n async def _save_message(self, message: Message, path: Path, fmt: str) -> str:\n \"\"\"Save a Message to the specified file format, handling async iterators.\"\"\"\n content = \"\"\n if message.text is None:\n content = \"\"\n elif isinstance(message.text, AsyncIterator):\n async for item in message.text:\n content += str(item) + \" \"\n content = content.strip()\n elif isinstance(message.text, Iterator):\n content = \" \".join(str(item) for item in message.text)\n else:\n content = str(message.text)\n\n if fmt == \"txt\":\n path.write_text(content, encoding=\"utf-8\")\n elif fmt == \"json\":\n path.write_text(json.dumps({\"message\": content}, indent=2), encoding=\"utf-8\")\n elif fmt == \"markdown\":\n path.write_text(f\"**Message:**\\n\\n{content}\", encoding=\"utf-8\")\n else:\n msg = f\"Unsupported Message format: {fmt}\"\n raise ValueError(msg)\n return f\"Message saved successfully as '{path}'\"\n" }, "file_format": { "_input_type": "DropdownInput", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json b/src/backend/base/langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json index be370529c..a2a1fc6d1 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json @@ -1857,7 +1857,7 @@ "cache": true, "display_name": "Loaded Files", "group_outputs": false, - "method": "load_dataframe", + "method": "load_files", "name": "dataframe", "required_inputs": [], "selected": "DataFrame", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Text Sentiment Analysis.json b/src/backend/base/langflow/initial_setup/starter_projects/Text Sentiment Analysis.json index daf5d50f8..f7e5d508e 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Text Sentiment Analysis.json @@ -266,7 +266,7 @@ "cache": true, "display_name": "Loaded Files", "group_outputs": false, - "method": "load_dataframe", + "method": "load_files", "name": "dataframe", "required_inputs": [], "selected": "DataFrame", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json b/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json index fd395d681..a252a4d55 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json @@ -2447,7 +2447,7 @@ "cache": true, "display_name": "Loaded Files", "group_outputs": false, - "method": "load_dataframe", + "method": "load_files", "name": "dataframe", "required_inputs": [], "selected": "DataFrame", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/document_qa.py b/src/backend/base/langflow/initial_setup/starter_projects/document_qa.py index 5cc0bc8d4..c73271536 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/document_qa.py +++ b/src/backend/base/langflow/initial_setup/starter_projects/document_qa.py @@ -23,7 +23,7 @@ Answer: """ file_component = FileComponent() parse_data_component = ParserComponent() - parse_data_component.set(input_data=file_component.load_dataframe) + parse_data_component.set(input_data=file_component.load_files) chat_input = ChatInput() prompt_component = PromptComponent() diff --git a/src/backend/base/langflow/initial_setup/starter_projects/vector_store_rag.py b/src/backend/base/langflow/initial_setup/starter_projects/vector_store_rag.py index 978d735c0..437dbee6f 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/vector_store_rag.py +++ b/src/backend/base/langflow/initial_setup/starter_projects/vector_store_rag.py @@ -15,7 +15,7 @@ def ingestion_graph(): # Ingestion Graph file_component = FileComponent() text_splitter = SplitTextComponent() - text_splitter.set(data_inputs=file_component.load_dataframe) + text_splitter.set(data_inputs=file_component.load_files) openai_embeddings = OpenAIEmbeddingsComponent() vector_store = AstraDBVectorStoreComponent() vector_store.set( diff --git a/src/backend/tests/unit/components/helpers/__init__.py b/src/backend/tests/unit/components/helpers/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/backend/tests/unit/components/helpers/test_batch_run_component.py b/src/backend/tests/unit/components/processing/test_batch_run_component.py similarity index 99% rename from src/backend/tests/unit/components/helpers/test_batch_run_component.py rename to src/backend/tests/unit/components/processing/test_batch_run_component.py index 8e5c78d2b..bcb7b075c 100644 --- a/src/backend/tests/unit/components/helpers/test_batch_run_component.py +++ b/src/backend/tests/unit/components/processing/test_batch_run_component.py @@ -1,7 +1,7 @@ import re import pytest -from langflow.components.helpers.batch_run import BatchRunComponent +from langflow.components.processing.batch_run import BatchRunComponent from langflow.schema import DataFrame from tests.base import ComponentTestBaseWithoutClient diff --git a/src/backend/tests/unit/components/helpers/test_structured_output_component.py b/src/backend/tests/unit/components/processing/test_structured_output_component.py similarity index 97% rename from src/backend/tests/unit/components/helpers/test_structured_output_component.py rename to src/backend/tests/unit/components/processing/test_structured_output_component.py index 535d2f5a4..207d1988f 100644 --- a/src/backend/tests/unit/components/helpers/test_structured_output_component.py +++ b/src/backend/tests/unit/components/processing/test_structured_output_component.py @@ -5,7 +5,7 @@ from unittest.mock import patch import openai import pytest from langchain_openai import ChatOpenAI -from langflow.components.helpers.structured_output import StructuredOutputComponent +from langflow.components.processing.structured_output import StructuredOutputComponent from langflow.helpers.base_model import build_model_from_schema from langflow.inputs.inputs import TableInput from pydantic import BaseModel @@ -53,7 +53,7 @@ class TestStructuredOutputComponent(ComponentTestBaseWithoutClient): system_prompt="Test system prompt", ) - with patch("langflow.components.helpers.structured_output.get_chat_result", mock_get_chat_result): + with patch("langflow.components.processing.structured_output.get_chat_result", mock_get_chat_result): result = component.build_structured_output_base() assert isinstance(result, list) assert result == [{"field": "value"}] @@ -174,7 +174,7 @@ class TestStructuredOutputComponent(ComponentTestBaseWithoutClient): with pytest.raises(ValueError, match="Invalid type: invalid_type"): component.build_structured_output() - @patch("langflow.components.helpers.structured_output.get_chat_result") + @patch("langflow.components.processing.structured_output.get_chat_result") def test_nested_output_schema(self, mock_get_chat_result): class ChildModel(BaseModel): child: str = "value" @@ -208,7 +208,7 @@ class TestStructuredOutputComponent(ComponentTestBaseWithoutClient): assert isinstance(result, list) assert result == [{"parent": {"child": "value"}}] - @patch("langflow.components.helpers.structured_output.get_chat_result") + @patch("langflow.components.processing.structured_output.get_chat_result") def test_large_input_value(self, mock_get_chat_result): large_input = "Test input " * 1000 diff --git a/src/backend/tests/unit/initial_setup/starter_projects/test_vector_store_rag.py b/src/backend/tests/unit/initial_setup/starter_projects/test_vector_store_rag.py index 60ab98795..54193c0f0 100644 --- a/src/backend/tests/unit/initial_setup/starter_projects/test_vector_store_rag.py +++ b/src/backend/tests/unit/initial_setup/starter_projects/test_vector_store_rag.py @@ -24,7 +24,7 @@ def ingestion_graph(): file_component.set(path="test.txt") file_component.set_on_output(name="dataframe", value=Data(text="This is a test file."), cache=True) text_splitter = SplitTextComponent(_id="text-splitter-123") - text_splitter.set(data_inputs=file_component.load_dataframe) + text_splitter.set(data_inputs=file_component.load_files) openai_embeddings = OpenAIEmbeddingsComponent(_id="openai-embeddings-123") openai_embeddings.set( openai_api_key="sk-123", openai_api_base="https://api.openai.com/v1", openai_api_type="openai"