diff --git a/.secrets.baseline b/.secrets.baseline index 5519f77262..577aae138c 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -6041,56 +6041,21 @@ "filename": "src/lfx/src/lfx/base/models/unified_models.py", "hashed_secret": "665b1e3851eefefa3fb878654292f16597d25155", "is_verified": false, - "line_number": 69 + "line_number": 1171 }, { "type": "Secret Keyword", "filename": "src/lfx/src/lfx/base/models/unified_models.py", "hashed_secret": "3f2df46921dd8e2c36e2ce85238705ac0774c74a", "is_verified": false, - "line_number": 87 - }, - { - "type": "Secret Keyword", - "filename": "src/lfx/src/lfx/base/models/unified_models.py", - "hashed_secret": "d3d6fe3f7d33d0f4aa28c49544a865982a48a00a", - "is_verified": false, - "line_number": 96 + "line_number": 1182 }, { "type": "Secret Keyword", "filename": "src/lfx/src/lfx/base/models/unified_models.py", "hashed_secret": "d4c3d66fd0c38547a3c7a4c6bdc29c36911bc030", "is_verified": false, - "line_number": 106 - }, - { - "type": "Secret Keyword", - "filename": "src/lfx/src/lfx/base/models/unified_models.py", - "hashed_secret": "a19ee5a9fdc191092796cd9bfa97c55fe5631695", - "is_verified": false, - "line_number": 380 - }, - { - "type": "Secret Keyword", - "filename": "src/lfx/src/lfx/base/models/unified_models.py", - "hashed_secret": "b780a23b530ef6bb5c3b722a0c9c5e3abf222e8b", - "is_verified": false, - "line_number": 381 - }, - { - "type": "Secret Keyword", - "filename": "src/lfx/src/lfx/base/models/unified_models.py", - "hashed_secret": "ed96761b106155514463a9f82d02b14042e75b61", - "is_verified": false, - "line_number": 382 - }, - { - "type": "Secret Keyword", - "filename": "src/lfx/src/lfx/base/models/unified_models.py", - "hashed_secret": "ac579e82cacca3f9c1a8b18bdfdad78e8b6140f8", - "is_verified": false, - "line_number": 383 + "line_number": 1196 } ], "src/lfx/src/lfx/cli/serve_app.py": [ @@ -6373,5 +6338,5 @@ } ] }, - "generated_at": "2026-03-04T23:52:18Z" + "generated_at": "2026-03-25T17:32:51Z" } diff --git a/pyproject.toml b/pyproject.toml index 0d6a52c46c..c03ee8e1f4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "langflow" -version = "1.8.2" +version = "1.8.3" description = "A Python package with a built-in web application" requires-python = ">=3.10,<3.14" license = "MIT" @@ -17,7 +17,7 @@ maintainers = [ ] # Define your main dependencies here dependencies = [ - "langflow-base[complete]~=0.8.2", + "langflow-base[complete]~=0.8.3", ] diff --git a/src/backend/base/langflow/api/v2/files.py b/src/backend/base/langflow/api/v2/files.py index 0c8607f117..864675e5bf 100644 --- a/src/backend/base/langflow/api/v2/files.py +++ b/src/backend/base/langflow/api/v2/files.py @@ -137,6 +137,7 @@ async def upload_user_file( settings_service: Annotated[SettingsService, Depends(get_settings_service)], *, append: bool = False, + ephemeral: bool = False, ) -> UploadFileResponse: """Upload a file for the current user and track it in the database.""" # Get the max allowed file size from settings (in MB) @@ -232,6 +233,12 @@ async def upload_user_file( # General error saving file or getting file size raise HTTPException(status_code=500, detail=f"Error accessing file: {e}") from e + if ephemeral: + # Ephemeral uploads: file is saved to storage (servable for chat history) + # but no UserFile record is created (won't appear in "My Files") + file_path = f"{current_user.id}/{stored_file_name}" + return UploadFileResponse(id=file_id, name=root_filename, path=file_path, size=file_size) + if append and existing_file: existing_file.size = file_size session.add(existing_file) diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Nvidia Remix.json b/src/backend/base/langflow/initial_setup/starter_projects/Nvidia Remix.json index a8b09759bc..a1f381ac59 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Nvidia Remix.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Nvidia Remix.json @@ -2123,7 +2123,7 @@ "legacy": false, "lf_version": "1.4.2", "metadata": { - "code_hash": "2bd7a064d724", + "code_hash": "3e55e36d0692", "dependencies": { "dependencies": [ { @@ -2167,7 +2167,7 @@ "advanced": true, "display_name": "Allow Dangerous Deserialization", "dynamic": false, - "info": "Set to True to allow loading pickle files from untrusted sources. Only enable this if you trust the source of the data.", + "info": "Set to True to allow loading pickle files. WARNING: Only enable this if you trust the source of the data. Malicious pickle files can execute arbitrary code on your system.", "list": false, "list_add_label": "Add More", "name": "allow_dangerous_deserialization", @@ -2178,7 +2178,7 @@ "tool_mode": false, "trace_as_metadata": true, "type": "bool", - "value": true + "value": false }, "code": { "advanced": true, @@ -2196,7 +2196,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from pathlib import Path\n\nfrom langchain_community.vectorstores import FAISS\n\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.helpers.data import docs_to_data\nfrom lfx.io import BoolInput, HandleInput, IntInput, StrInput\nfrom lfx.schema.data import Data\n\n\nclass FaissVectorStoreComponent(LCVectorStoreComponent):\n \"\"\"FAISS Vector Store with search capabilities.\"\"\"\n\n display_name: str = \"FAISS\"\n description: str = \"FAISS Vector Store with search capabilities\"\n name = \"FAISS\"\n icon = \"FAISS\"\n\n inputs = [\n StrInput(\n name=\"index_name\",\n display_name=\"Index Name\",\n value=\"langflow_index\",\n ),\n StrInput(\n name=\"persist_directory\",\n display_name=\"Persist Directory\",\n info=\"Path to save the FAISS index. It will be relative to where Langflow is running.\",\n ),\n *LCVectorStoreComponent.inputs,\n BoolInput(\n name=\"allow_dangerous_deserialization\",\n display_name=\"Allow Dangerous Deserialization\",\n info=\"Set to True to allow loading pickle files from untrusted sources. \"\n \"Only enable this if you trust the source of the data.\",\n advanced=True,\n value=True,\n ),\n HandleInput(name=\"embedding\", display_name=\"Embedding\", input_types=[\"Embeddings\"]),\n IntInput(\n name=\"number_of_results\",\n display_name=\"Number of Results\",\n info=\"Number of results to return.\",\n advanced=True,\n value=4,\n ),\n ]\n\n @staticmethod\n def resolve_path(path: str) -> str:\n \"\"\"Resolve the path relative to the Langflow root.\n\n Args:\n path: The path to resolve\n Returns:\n str: The resolved path as a string\n \"\"\"\n return str(Path(path).resolve())\n\n def get_persist_directory(self) -> Path:\n \"\"\"Returns the resolved persist directory path or the current directory if not set.\"\"\"\n if self.persist_directory:\n return Path(self.resolve_path(self.persist_directory))\n return Path()\n\n @check_cached_vector_store\n def build_vector_store(self) -> FAISS:\n \"\"\"Builds the FAISS object.\"\"\"\n path = self.get_persist_directory()\n path.mkdir(parents=True, exist_ok=True)\n\n # Convert DataFrame to Data if needed using parent's method\n self.ingest_data = self._prepare_ingest_data()\n\n documents = []\n for _input in self.ingest_data or []:\n if isinstance(_input, Data):\n documents.append(_input.to_lc_document())\n else:\n documents.append(_input)\n\n faiss = FAISS.from_documents(documents=documents, embedding=self.embedding)\n faiss.save_local(str(path), self.index_name)\n return faiss\n\n def search_documents(self) -> list[Data]:\n \"\"\"Search for documents in the FAISS vector store.\"\"\"\n path = self.get_persist_directory()\n index_path = path / f\"{self.index_name}.faiss\"\n\n if not index_path.exists():\n vector_store = self.build_vector_store()\n else:\n vector_store = FAISS.load_local(\n folder_path=str(path),\n embeddings=self.embedding,\n index_name=self.index_name,\n allow_dangerous_deserialization=self.allow_dangerous_deserialization,\n )\n\n if not vector_store:\n msg = \"Failed to load the FAISS index.\"\n raise ValueError(msg)\n\n if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():\n docs = vector_store.similarity_search(\n query=self.search_query,\n k=self.number_of_results,\n )\n return docs_to_data(docs)\n return []\n" + "value": "from pathlib import Path\n\nfrom langchain_community.vectorstores import FAISS\n\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.helpers.data import docs_to_data\nfrom lfx.io import BoolInput, HandleInput, IntInput, StrInput\nfrom lfx.schema.data import Data\n\n\nclass FaissVectorStoreComponent(LCVectorStoreComponent):\n \"\"\"FAISS Vector Store with search capabilities.\"\"\"\n\n display_name: str = \"FAISS\"\n description: str = \"FAISS Vector Store with search capabilities\"\n name = \"FAISS\"\n icon = \"FAISS\"\n\n inputs = [\n StrInput(\n name=\"index_name\",\n display_name=\"Index Name\",\n value=\"langflow_index\",\n ),\n StrInput(\n name=\"persist_directory\",\n display_name=\"Persist Directory\",\n info=\"Path to save the FAISS index. It will be relative to where Langflow is running.\",\n ),\n *LCVectorStoreComponent.inputs,\n BoolInput(\n name=\"allow_dangerous_deserialization\",\n display_name=\"Allow Dangerous Deserialization\",\n info=\"Set to True to allow loading pickle files. WARNING: Only enable this if you trust the source \"\n \"of the data. Malicious pickle files can execute arbitrary code on your system.\",\n advanced=True,\n value=False,\n ),\n HandleInput(name=\"embedding\", display_name=\"Embedding\", input_types=[\"Embeddings\"]),\n IntInput(\n name=\"number_of_results\",\n display_name=\"Number of Results\",\n info=\"Number of results to return.\",\n advanced=True,\n value=4,\n ),\n ]\n\n @staticmethod\n def resolve_path(path: str) -> str:\n \"\"\"Resolve the path relative to the Langflow root.\n\n Args:\n path: The path to resolve\n Returns:\n str: The resolved path as a string\n \"\"\"\n return str(Path(path).resolve())\n\n def get_persist_directory(self) -> Path:\n \"\"\"Returns the resolved persist directory path or the current directory if not set.\"\"\"\n if self.persist_directory:\n return Path(self.resolve_path(self.persist_directory))\n return Path()\n\n @check_cached_vector_store\n def build_vector_store(self) -> FAISS:\n \"\"\"Builds the FAISS object.\"\"\"\n path = self.get_persist_directory()\n path.mkdir(parents=True, exist_ok=True)\n\n # Convert DataFrame to Data if needed using parent's method\n self.ingest_data = self._prepare_ingest_data()\n\n documents = []\n for _input in self.ingest_data or []:\n if isinstance(_input, Data):\n documents.append(_input.to_lc_document())\n else:\n documents.append(_input)\n\n faiss = FAISS.from_documents(documents=documents, embedding=self.embedding)\n faiss.save_local(str(path), self.index_name)\n return faiss\n\n def search_documents(self) -> list[Data]:\n \"\"\"Search for documents in the FAISS vector store.\"\"\"\n path = self.get_persist_directory()\n index_path = path / f\"{self.index_name}.faiss\"\n\n if not index_path.exists():\n vector_store = self.build_vector_store()\n else:\n vector_store = FAISS.load_local(\n folder_path=str(path),\n embeddings=self.embedding,\n index_name=self.index_name,\n allow_dangerous_deserialization=self.allow_dangerous_deserialization,\n )\n\n if not vector_store:\n msg = \"Failed to load the FAISS index.\"\n raise ValueError(msg)\n\n if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():\n docs = vector_store.similarity_search(\n query=self.search_query,\n k=self.number_of_results,\n )\n return docs_to_data(docs)\n return []\n" }, "embedding": { "_input_type": "HandleInput", diff --git a/src/backend/base/pyproject.toml b/src/backend/base/pyproject.toml index 8b346ea38e..d5fb38001a 100644 --- a/src/backend/base/pyproject.toml +++ b/src/backend/base/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "langflow-base" -version = "0.8.2" +version = "0.8.3" description = "A Python package with a built-in web application" requires-python = ">=3.10,<3.14" license = "MIT" @@ -17,7 +17,7 @@ maintainers = [ ] dependencies = [ - "lfx~=0.3.2", + "lfx~=0.3.3", "fastapi>=0.135.0,<1.0.0", "httpx[http2]>=0.27,<1.0.0", "aiofile>=3.9.0,<4.0.0", diff --git a/src/backend/tests/unit/api/v2/test_files.py b/src/backend/tests/unit/api/v2/test_files.py index 78c47b4f32..2da22d0639 100644 --- a/src/backend/tests/unit/api/v2/test_files.py +++ b/src/backend/tests/unit/api/v2/test_files.py @@ -149,6 +149,77 @@ async def test_upload_file(files_client, files_created_api_key): assert "id" in response_json +async def test_should_not_persist_in_my_files_when_upload_is_ephemeral(files_client, files_created_api_key): + """Ephemeral uploads save the file to storage but do NOT create a UserFile DB record. + + This is the expected behavior for chat playground uploads in Desktop, + where the file must be servable (for chat history) but should not + appear in the user's 'My Files' list. + """ + headers = {"x-api-key": files_created_api_key.api_key} + + # Upload with ephemeral=true + response = await files_client.post( + "api/v2/files", + files={"file": ("playground_image.png", b"fake image content")}, + params={"ephemeral": "true"}, + headers=headers, + ) + assert response.status_code == 201, f"Expected 201, got {response.status_code}: {response.text}" + + upload_response = response.json() + assert "path" in upload_response + + # The file must NOT appear in the user's file list + list_response = await files_client.get("api/v2/files", headers=headers) + assert list_response.status_code == 200 + file_names = [f["name"] for f in list_response.json()] + assert "playground_image" not in file_names, ( + f"Ephemeral file should not appear in My Files, but found: {file_names}" + ) + + # The file is saved in storage and the response includes a valid path + file_path = upload_response["path"] + assert file_path, "Ephemeral upload should return a non-empty path" + # Path format: {user_id}/{stored_file_name} + parts = file_path.split("/") + assert len(parts) == 2, f"Expected path format 'user_id/filename', got: {file_path}" + + +async def test_should_return_path_with_forward_slashes_when_uploading_file(files_client, files_created_api_key): + """Upload response path must use forward slashes on all platforms. + + On Windows, pathlib.Path serializes with backslashes, but the GET list + endpoint returns the raw DB string with forward slashes. If the POST + response uses backslashes, the frontend cannot match them with + selectedFiles.includes(file.path), leaving checkboxes unchecked. + """ + headers = {"x-api-key": files_created_api_key.api_key} + + response = await files_client.post( + "api/v2/files", + files={"file": ("test_path.txt", b"path test content")}, + headers=headers, + ) + assert response.status_code == 201 + + upload_path = response.json()["path"] + assert "\\" not in upload_path, ( + f"Upload response path contains backslashes: '{upload_path}'. " + "Path must use forward slashes on all platforms for frontend compatibility." + ) + + # Verify the upload path matches what GET /files returns + list_response = await files_client.get("api/v2/files", headers=headers) + assert list_response.status_code == 200 + + listed_paths = [f["path"] for f in list_response.json()] + assert upload_path in listed_paths, ( + f"Upload path '{upload_path}' not found in listed paths {listed_paths}. " + "POST and GET must return identical path strings." + ) + + async def test_download_file(files_client, files_created_api_key): headers = {"x-api-key": files_created_api_key.api_key} diff --git a/src/backend/tests/unit/test_credential_resolution.py b/src/backend/tests/unit/test_credential_resolution.py new file mode 100644 index 0000000000..4ad36493e7 --- /dev/null +++ b/src/backend/tests/unit/test_credential_resolution.py @@ -0,0 +1,102 @@ +"""Tests for credential resolution in the unified models system. + +Bug: Desktop Global Variable OPENAI_API_KEY not injected at runtime. +When api_key parameter is None (Agent component default), get_api_key_for_provider +only attempts DB lookup but has no os.getenv() fallback and no error handling +for ValueError from get_variable(). This causes failures in Desktop where the +env var is not set and the DB lookup is the only path. +""" + +from unittest.mock import patch +from uuid import uuid4 + + +class TestGetApiKeyForProviderDbFallback: + """Tests for get_api_key_for_provider when api_key param is None (second path).""" + + @patch("lfx.base.models.unified_models.get_model_provider_variable_mapping") + @patch("lfx.base.models.unified_models.run_until_complete") + def test_should_fallback_to_env_when_db_lookup_raises_value_error(self, mock_run, mock_mapping, monkeypatch): + """When variable_service.get_variable raises ValueError (variable not found in DB). + + get_api_key_for_provider should fall back to os.getenv() instead of returning None. + """ + from lfx.base.models.unified_models import get_api_key_for_provider + + user_id = str(uuid4()) + mock_mapping.return_value = {"OpenAI": "OPENAI_API_KEY"} + mock_run.side_effect = ValueError("OPENAI_API_KEY variable not found.") + + monkeypatch.setenv("OPENAI_API_KEY", "sk-test-env-key") + + result = get_api_key_for_provider(user_id, "OpenAI", None) + + assert result == "sk-test-env-key" + + @patch("lfx.base.models.unified_models.get_model_provider_variable_mapping") + @patch("lfx.base.models.unified_models.run_until_complete") + def test_should_fallback_to_env_when_db_lookup_returns_empty_string(self, mock_run, mock_mapping, monkeypatch): + """When decryption fails, get_variable returns empty string. + + get_api_key_for_provider should fall back to os.getenv(). + """ + from lfx.base.models.unified_models import get_api_key_for_provider + + user_id = str(uuid4()) + mock_mapping.return_value = {"OpenAI": "OPENAI_API_KEY"} + mock_run.return_value = "" + + monkeypatch.setenv("OPENAI_API_KEY", "sk-test-env-key") + + result = get_api_key_for_provider(user_id, "OpenAI", None) + + assert result == "sk-test-env-key" + + @patch("lfx.base.models.unified_models.get_model_provider_variable_mapping") + @patch("lfx.base.models.unified_models.run_until_complete") + def test_should_fallback_to_env_when_variable_service_is_none(self, mock_run, mock_mapping, monkeypatch): + """When variable_service is None (service not available in thread context). + + get_api_key_for_provider should fall back to os.getenv(). + """ + from lfx.base.models.unified_models import get_api_key_for_provider + + user_id = str(uuid4()) + mock_mapping.return_value = {"OpenAI": "OPENAI_API_KEY"} + mock_run.return_value = None + + monkeypatch.setenv("OPENAI_API_KEY", "sk-test-env-key") + + result = get_api_key_for_provider(user_id, "OpenAI", None) + + assert result == "sk-test-env-key" + + @patch("lfx.base.models.unified_models.get_model_provider_variable_mapping") + @patch("lfx.base.models.unified_models.run_until_complete") + def test_should_return_none_when_both_db_and_env_unavailable(self, mock_run, mock_mapping, monkeypatch): + """When both DB lookup and env var are unavailable, should return None.""" + from lfx.base.models.unified_models import get_api_key_for_provider + + user_id = str(uuid4()) + mock_mapping.return_value = {"OpenAI": "OPENAI_API_KEY"} + mock_run.return_value = None + + monkeypatch.delenv("OPENAI_API_KEY", raising=False) + + result = get_api_key_for_provider(user_id, "OpenAI", None) + + assert result is None + + @patch("lfx.base.models.unified_models.get_model_provider_variable_mapping") + @patch("lfx.base.models.unified_models.run_until_complete") + def test_should_return_db_value_when_db_lookup_succeeds(self, mock_run, mock_mapping): + """When DB lookup succeeds, should return the DB value (no env fallback needed).""" + from lfx.base.models.unified_models import get_api_key_for_provider + + user_id = str(uuid4()) + mock_mapping.return_value = {"OpenAI": "OPENAI_API_KEY"} + mock_run.return_value = "sk-from-database" + + result = get_api_key_for_provider(user_id, "OpenAI", None) + + assert result == "sk-from-database" diff --git a/src/backend/tests/unit/test_unified_models.py b/src/backend/tests/unit/test_unified_models.py index 06d0a70bf0..ec401d2e6a 100644 --- a/src/backend/tests/unit/test_unified_models.py +++ b/src/backend/tests/unit/test_unified_models.py @@ -1,6 +1,11 @@ -from unittest.mock import MagicMock +import os +from unittest.mock import MagicMock, patch -from lfx.base.models.unified_models import get_unified_models_detailed, update_model_options_in_build_config +from lfx.base.models.unified_models import ( + apply_provider_variable_config_to_build_config, + get_unified_models_detailed, + update_model_options_in_build_config, +) def _flatten_models(result): @@ -81,16 +86,16 @@ def test_filter_by_model_type_embeddings(): def test_update_model_options_with_custom_field_name(): - """Test that update_model_options_in_build_config works with custom field names.""" + """Test that update_model_options_in_build_config populates the 'model' field with embedding options.""" # Create mock component mock_component = MagicMock() mock_component.user_id = "test-user-123" mock_component.cache = {} mock_component.log = MagicMock() - # Create build_config with custom field name + # Create build_config using the standard 'model' field (used for embeddings too) build_config = { - "embedding_model": { + "model": { "options": [], "value": "", "input_types": ["Embeddings"], @@ -104,25 +109,24 @@ def test_update_model_options_with_custom_field_name(): {"name": "embed-english-v3.0", "provider": "Cohere"}, ] - # Call with custom field name + # Call with embedding cache key prefix result = update_model_options_in_build_config( component=mock_component, build_config=build_config, - cache_key_prefix="test_embedding_options", + cache_key_prefix="embedding_model_options", get_options_func=mock_get_options, field_name=None, field_value="", - model_field_name="embedding_model", ) - # Verify options were populated in the custom field - assert "embedding_model" in result - assert len(result["embedding_model"]["options"]) == 2 - assert result["embedding_model"]["options"][0]["name"] == "text-embedding-ada-002" - assert result["embedding_model"]["options"][1]["provider"] == "Cohere" + # Verify options were populated in the model field + assert "model" in result + assert len(result["model"]["options"]) == 2 + assert result["model"]["options"][0]["name"] == "text-embedding-ada-002" + assert result["model"]["options"][1]["provider"] == "Cohere" # Verify default value was set - assert result["embedding_model"]["value"] == [result["embedding_model"]["options"][0]] + assert result["model"]["value"] == [result["model"]["options"][0]] def test_update_model_options_default_field_name(): @@ -160,3 +164,227 @@ def test_update_model_options_default_field_name(): assert "model" in result assert len(result["model"]["options"]) == 1 assert result["model"]["options"][0]["name"] == "gpt-4" + + +# Tests for apply_provider_variable_config_to_build_config + + +def test_apply_provider_config_auto_sets_env_var_for_empty_field(): + """Test that env var is auto-set when field is empty.""" + mock_provider_vars = [ + { + "variable_key": "OPENAI_API_KEY", + "component_metadata": { + "mapping_field": "openai_api_key", + "required": True, + "advanced": False, + "info": "OpenAI API Key", + }, + } + ] + + build_config = { + "openai_api_key": { + "value": "", + "show": False, + "required": False, + "advanced": False, + "load_from_db": False, + } + } + + with ( + patch("lfx.base.models.unified_models.get_provider_all_variables", return_value=mock_provider_vars), + patch("lfx.base.models.unified_models._get_all_provider_specific_field_names", return_value=["openai_api_key"]), + patch.dict(os.environ, {"OPENAI_API_KEY": "test-key-123"}), # pragma: allowlist secret + ): + result = apply_provider_variable_config_to_build_config(build_config, "OpenAI") + + # Should auto-set the env var key for empty field + assert result["openai_api_key"]["value"] == "OPENAI_API_KEY" + assert result["openai_api_key"]["load_from_db"] is True + assert result["openai_api_key"]["show"] is True + assert result["openai_api_key"]["required"] is True + + +def test_apply_provider_config_preserves_user_selected_value(): + """Test that user-selected values are NOT overwritten.""" + mock_provider_vars = [ + { + "variable_key": "OPENAI_API_KEY", + "component_metadata": { + "mapping_field": "openai_api_key", + "required": True, + }, + } + ] + + # User has already selected a different global variable + build_config = { + "openai_api_key": { + "value": "MY_CUSTOM_API_KEY", + "load_from_db": True, + "show": False, + "required": False, + } + } + + with ( + patch("lfx.base.models.unified_models.get_provider_all_variables", return_value=mock_provider_vars), + patch("lfx.base.models.unified_models._get_all_provider_specific_field_names", return_value=["openai_api_key"]), + patch.dict(os.environ, {"OPENAI_API_KEY": "test-key-123"}), # pragma: allowlist secret + ): + result = apply_provider_variable_config_to_build_config(build_config, "OpenAI") + + # Should preserve user's selection + assert result["openai_api_key"]["value"] == "MY_CUSTOM_API_KEY" + assert result["openai_api_key"]["load_from_db"] is True + + +def test_apply_provider_config_replaces_hardcoded_with_env_var(): + """Test that hardcoded values are replaced with env var key for global variable usage. + + Expected behavior: When load_from_db=False (hardcoded value), the function + replaces it with the env var key and sets load_from_db=True to enable + global variable functionality. + """ + mock_provider_vars = [ + { + "variable_key": "OPENAI_API_KEY", + "component_metadata": { + "mapping_field": "openai_api_key", + "required": True, + }, + } + ] + + # User has hardcoded a value (not loading from db) + build_config = { + "openai_api_key": { + "value": "sk-hardcoded-key", + "load_from_db": False, + "show": False, + "required": False, + } + } + + with ( + patch("lfx.base.models.unified_models.get_provider_all_variables", return_value=mock_provider_vars), + patch("lfx.base.models.unified_models._get_all_provider_specific_field_names", return_value=["openai_api_key"]), + patch.dict(os.environ, {"OPENAI_API_KEY": "test-key-123"}), # pragma: allowlist secret + ): + result = apply_provider_variable_config_to_build_config(build_config, "OpenAI") + + # Should overwrite with env var key since load_from_db was False + assert result["openai_api_key"]["value"] == "OPENAI_API_KEY" + assert result["openai_api_key"]["load_from_db"] is True + + +def test_apply_provider_config_skips_when_env_var_not_set(): + """Test that nothing is set when env var doesn't exist.""" + mock_provider_vars = [ + { + "variable_key": "OPENAI_API_KEY", + "component_metadata": { + "mapping_field": "openai_api_key", + "required": True, + }, + } + ] + + build_config = { + "openai_api_key": { + "value": "", + "show": False, + "required": False, + "load_from_db": False, + } + } + + with ( + patch("lfx.base.models.unified_models.get_provider_all_variables", return_value=mock_provider_vars), + patch("lfx.base.models.unified_models._get_all_provider_specific_field_names", return_value=["openai_api_key"]), + patch.dict(os.environ, {}, clear=True), + ): + result = apply_provider_variable_config_to_build_config(build_config, "OpenAI") + + # Should not set anything when env var doesn't exist + assert result["openai_api_key"]["value"] == "" + assert result["openai_api_key"]["load_from_db"] is False + + +def test_apply_provider_config_applies_component_metadata(): + """Test that component metadata (required, advanced, info) is applied.""" + mock_provider_vars = [ + { + "variable_key": "OPENAI_API_KEY", + "component_metadata": { + "mapping_field": "openai_api_key", + "required": True, + "advanced": False, + "info": "OpenAI API Key", + }, + } + ] + + build_config = { + "openai_api_key": { + "value": "", + "show": False, + "required": False, + "advanced": False, + "load_from_db": False, + } + } + + with ( + patch("lfx.base.models.unified_models.get_provider_all_variables", return_value=mock_provider_vars), + patch("lfx.base.models.unified_models._get_all_provider_specific_field_names", return_value=["openai_api_key"]), + patch.dict(os.environ, {"OPENAI_API_KEY": "test-key"}), # pragma: allowlist secret + ): + result = apply_provider_variable_config_to_build_config(build_config, "OpenAI") + + # Check metadata was applied + assert result["openai_api_key"]["required"] is True + assert result["openai_api_key"]["advanced"] is False + assert result["openai_api_key"]["info"] == "OpenAI API Key" + assert result["openai_api_key"]["show"] is True + + +def test_apply_provider_config_idempotent_when_already_set(): + """Test idempotent behavior when value already matches env var key. + + When a field already has the env var key as its value and load_from_db=True, + the function should be a no-op (no changes made). This documents the + idempotent behavior of the function. + """ + mock_provider_vars = [ + { + "variable_key": "OPENAI_API_KEY", + "component_metadata": { + "mapping_field": "openai_api_key", + "required": True, + }, + } + ] + + # Field already configured with env var key + build_config = { + "openai_api_key": { + "value": "OPENAI_API_KEY", + "load_from_db": True, + "show": False, + "required": False, + } + } + + with ( + patch("lfx.base.models.unified_models.get_provider_all_variables", return_value=mock_provider_vars), + patch("lfx.base.models.unified_models._get_all_provider_specific_field_names", return_value=["openai_api_key"]), + patch.dict(os.environ, {"OPENAI_API_KEY": "test-key-123"}), # pragma: allowlist secret + ): + result = apply_provider_variable_config_to_build_config(build_config, "OpenAI") + + # Should remain unchanged (idempotent) + assert result["openai_api_key"]["value"] == "OPENAI_API_KEY" + assert result["openai_api_key"]["load_from_db"] is True diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 7d8ac03caf..e82dce8b22 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "langflow", - "version": "1.8.2", + "version": "1.8.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "langflow", - "version": "1.8.2", + "version": "1.8.3", "dependencies": { "@chakra-ui/number-input": "^2.1.2", "@chakra-ui/system": "^2.6.2", diff --git a/src/frontend/package.json b/src/frontend/package.json index c720b1a383..d22a5d4a7f 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -1,6 +1,6 @@ { "name": "langflow", - "version": "1.8.2", + "version": "1.8.3", "private": true, "engines": { "node": ">=20.19.0" diff --git a/src/lfx/pyproject.toml b/src/lfx/pyproject.toml index 8d658fb723..f885fc529a 100644 --- a/src/lfx/pyproject.toml +++ b/src/lfx/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lfx" -version = "0.3.2" +version = "0.3.3" description = "Langflow Executor - A lightweight CLI tool for executing and serving Langflow AI flows" readme = "README.md" authors = [ diff --git a/src/lfx/src/lfx/_assets/component_index.json b/src/lfx/src/lfx/_assets/component_index.json index 18339de0e0..905522e9a1 100644 --- a/src/lfx/src/lfx/_assets/component_index.json +++ b/src/lfx/src/lfx/_assets/component_index.json @@ -29,7 +29,7 @@ "icon": "FAISS", "legacy": false, "metadata": { - "code_hash": "2bd7a064d724", + "code_hash": "3e55e36d0692", "dependencies": { "dependencies": [ { @@ -85,7 +85,7 @@ "advanced": true, "display_name": "Allow Dangerous Deserialization", "dynamic": false, - "info": "Set to True to allow loading pickle files from untrusted sources. Only enable this if you trust the source of the data.", + "info": "Set to True to allow loading pickle files. WARNING: Only enable this if you trust the source of the data. Malicious pickle files can execute arbitrary code on your system.", "list": false, "list_add_label": "Add More", "name": "allow_dangerous_deserialization", @@ -98,7 +98,7 @@ "trace_as_metadata": true, "track_in_telemetry": true, "type": "bool", - "value": true + "value": false }, "code": { "advanced": true, @@ -116,7 +116,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from pathlib import Path\n\nfrom langchain_community.vectorstores import FAISS\n\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.helpers.data import docs_to_data\nfrom lfx.io import BoolInput, HandleInput, IntInput, StrInput\nfrom lfx.schema.data import Data\n\n\nclass FaissVectorStoreComponent(LCVectorStoreComponent):\n \"\"\"FAISS Vector Store with search capabilities.\"\"\"\n\n display_name: str = \"FAISS\"\n description: str = \"FAISS Vector Store with search capabilities\"\n name = \"FAISS\"\n icon = \"FAISS\"\n\n inputs = [\n StrInput(\n name=\"index_name\",\n display_name=\"Index Name\",\n value=\"langflow_index\",\n ),\n StrInput(\n name=\"persist_directory\",\n display_name=\"Persist Directory\",\n info=\"Path to save the FAISS index. It will be relative to where Langflow is running.\",\n ),\n *LCVectorStoreComponent.inputs,\n BoolInput(\n name=\"allow_dangerous_deserialization\",\n display_name=\"Allow Dangerous Deserialization\",\n info=\"Set to True to allow loading pickle files from untrusted sources. \"\n \"Only enable this if you trust the source of the data.\",\n advanced=True,\n value=True,\n ),\n HandleInput(name=\"embedding\", display_name=\"Embedding\", input_types=[\"Embeddings\"]),\n IntInput(\n name=\"number_of_results\",\n display_name=\"Number of Results\",\n info=\"Number of results to return.\",\n advanced=True,\n value=4,\n ),\n ]\n\n @staticmethod\n def resolve_path(path: str) -> str:\n \"\"\"Resolve the path relative to the Langflow root.\n\n Args:\n path: The path to resolve\n Returns:\n str: The resolved path as a string\n \"\"\"\n return str(Path(path).resolve())\n\n def get_persist_directory(self) -> Path:\n \"\"\"Returns the resolved persist directory path or the current directory if not set.\"\"\"\n if self.persist_directory:\n return Path(self.resolve_path(self.persist_directory))\n return Path()\n\n @check_cached_vector_store\n def build_vector_store(self) -> FAISS:\n \"\"\"Builds the FAISS object.\"\"\"\n path = self.get_persist_directory()\n path.mkdir(parents=True, exist_ok=True)\n\n # Convert DataFrame to Data if needed using parent's method\n self.ingest_data = self._prepare_ingest_data()\n\n documents = []\n for _input in self.ingest_data or []:\n if isinstance(_input, Data):\n documents.append(_input.to_lc_document())\n else:\n documents.append(_input)\n\n faiss = FAISS.from_documents(documents=documents, embedding=self.embedding)\n faiss.save_local(str(path), self.index_name)\n return faiss\n\n def search_documents(self) -> list[Data]:\n \"\"\"Search for documents in the FAISS vector store.\"\"\"\n path = self.get_persist_directory()\n index_path = path / f\"{self.index_name}.faiss\"\n\n if not index_path.exists():\n vector_store = self.build_vector_store()\n else:\n vector_store = FAISS.load_local(\n folder_path=str(path),\n embeddings=self.embedding,\n index_name=self.index_name,\n allow_dangerous_deserialization=self.allow_dangerous_deserialization,\n )\n\n if not vector_store:\n msg = \"Failed to load the FAISS index.\"\n raise ValueError(msg)\n\n if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():\n docs = vector_store.similarity_search(\n query=self.search_query,\n k=self.number_of_results,\n )\n return docs_to_data(docs)\n return []\n" + "value": "from pathlib import Path\n\nfrom langchain_community.vectorstores import FAISS\n\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.helpers.data import docs_to_data\nfrom lfx.io import BoolInput, HandleInput, IntInput, StrInput\nfrom lfx.schema.data import Data\n\n\nclass FaissVectorStoreComponent(LCVectorStoreComponent):\n \"\"\"FAISS Vector Store with search capabilities.\"\"\"\n\n display_name: str = \"FAISS\"\n description: str = \"FAISS Vector Store with search capabilities\"\n name = \"FAISS\"\n icon = \"FAISS\"\n\n inputs = [\n StrInput(\n name=\"index_name\",\n display_name=\"Index Name\",\n value=\"langflow_index\",\n ),\n StrInput(\n name=\"persist_directory\",\n display_name=\"Persist Directory\",\n info=\"Path to save the FAISS index. It will be relative to where Langflow is running.\",\n ),\n *LCVectorStoreComponent.inputs,\n BoolInput(\n name=\"allow_dangerous_deserialization\",\n display_name=\"Allow Dangerous Deserialization\",\n info=\"Set to True to allow loading pickle files. WARNING: Only enable this if you trust the source \"\n \"of the data. Malicious pickle files can execute arbitrary code on your system.\",\n advanced=True,\n value=False,\n ),\n HandleInput(name=\"embedding\", display_name=\"Embedding\", input_types=[\"Embeddings\"]),\n IntInput(\n name=\"number_of_results\",\n display_name=\"Number of Results\",\n info=\"Number of results to return.\",\n advanced=True,\n value=4,\n ),\n ]\n\n @staticmethod\n def resolve_path(path: str) -> str:\n \"\"\"Resolve the path relative to the Langflow root.\n\n Args:\n path: The path to resolve\n Returns:\n str: The resolved path as a string\n \"\"\"\n return str(Path(path).resolve())\n\n def get_persist_directory(self) -> Path:\n \"\"\"Returns the resolved persist directory path or the current directory if not set.\"\"\"\n if self.persist_directory:\n return Path(self.resolve_path(self.persist_directory))\n return Path()\n\n @check_cached_vector_store\n def build_vector_store(self) -> FAISS:\n \"\"\"Builds the FAISS object.\"\"\"\n path = self.get_persist_directory()\n path.mkdir(parents=True, exist_ok=True)\n\n # Convert DataFrame to Data if needed using parent's method\n self.ingest_data = self._prepare_ingest_data()\n\n documents = []\n for _input in self.ingest_data or []:\n if isinstance(_input, Data):\n documents.append(_input.to_lc_document())\n else:\n documents.append(_input)\n\n faiss = FAISS.from_documents(documents=documents, embedding=self.embedding)\n faiss.save_local(str(path), self.index_name)\n return faiss\n\n def search_documents(self) -> list[Data]:\n \"\"\"Search for documents in the FAISS vector store.\"\"\"\n path = self.get_persist_directory()\n index_path = path / f\"{self.index_name}.faiss\"\n\n if not index_path.exists():\n vector_store = self.build_vector_store()\n else:\n vector_store = FAISS.load_local(\n folder_path=str(path),\n embeddings=self.embedding,\n index_name=self.index_name,\n allow_dangerous_deserialization=self.allow_dangerous_deserialization,\n )\n\n if not vector_store:\n msg = \"Failed to load the FAISS index.\"\n raise ValueError(msg)\n\n if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():\n docs = vector_store.similarity_search(\n query=self.search_query,\n k=self.number_of_results,\n )\n return docs_to_data(docs)\n return []\n" }, "embedding": { "_input_type": "HandleInput", @@ -118191,6 +118191,6 @@ "num_components": 359, "num_modules": 97 }, - "sha256": "c2c714d9bec52ae89ed53341db3be1653da036cb8259013f204df4707bdbf757", - "version": "0.3.1" + "sha256": "8fc3c7cb1bdf0873d2374de24e6e6e9a0bed598adbd0ef95964db455b2c937b6", + "version": "0.3.3" } \ No newline at end of file diff --git a/src/lfx/src/lfx/_assets/stable_hash_history.json b/src/lfx/src/lfx/_assets/stable_hash_history.json index 93f8fd8e81..a90f3999ce 100644 --- a/src/lfx/src/lfx/_assets/stable_hash_history.json +++ b/src/lfx/src/lfx/_assets/stable_hash_history.json @@ -2,925 +2,1233 @@ "FAISS": { "versions": { "0.3.0": "2bd7a064d724", - "0.3.1": "2bd7a064d724" + "0.3.1": "2bd7a064d724", + "0.3.2": "2bd7a064d724", + "0.3.3": "3e55e36d0692" } }, "AddContentToPage": { "versions": { "0.3.0": "ffcd44201c09", - "0.3.1": "ffcd44201c09" + "0.3.1": "ffcd44201c09", + "0.3.2": "ffcd44201c09", + "0.3.3": "ffcd44201c09" } }, "NotionPageCreator": { "versions": { "0.3.0": "640438ed3d7b", - "0.3.1": "640438ed3d7b" + "0.3.1": "640438ed3d7b", + "0.3.2": "640438ed3d7b", + "0.3.3": "640438ed3d7b" } }, "NotionDatabaseProperties": { "versions": { "0.3.0": "adce99660f9e", - "0.3.1": "adce99660f9e" + "0.3.1": "adce99660f9e", + "0.3.2": "adce99660f9e", + "0.3.3": "adce99660f9e" } }, "NotionListPages": { "versions": { "0.3.0": "373f9ad32937", - "0.3.1": "373f9ad32937" + "0.3.1": "373f9ad32937", + "0.3.2": "373f9ad32937", + "0.3.3": "373f9ad32937" } }, "NotionUserList": { "versions": { "0.3.0": "8966397da1d5", - "0.3.1": "8966397da1d5" + "0.3.1": "8966397da1d5", + "0.3.2": "8966397da1d5", + "0.3.3": "8966397da1d5" } }, "NotionPageContent": { "versions": { "0.3.0": "ba15d6a01d04", - "0.3.1": "ba15d6a01d04" + "0.3.1": "ba15d6a01d04", + "0.3.2": "ba15d6a01d04", + "0.3.3": "ba15d6a01d04" } }, "NotionSearch": { "versions": { "0.3.0": "793b8818a3b4", - "0.3.1": "793b8818a3b4" + "0.3.1": "793b8818a3b4", + "0.3.2": "793b8818a3b4", + "0.3.3": "793b8818a3b4" } }, "NotionPageUpdate": { "versions": { "0.3.0": "32ccdf34df73", - "0.3.1": "32ccdf34df73" + "0.3.1": "32ccdf34df73", + "0.3.2": "32ccdf34df73", + "0.3.3": "32ccdf34df73" } }, "AgentQL": { "versions": { "0.3.0": "37de3210aed9", - "0.3.1": "37de3210aed9" + "0.3.1": "37de3210aed9", + "0.3.2": "37de3210aed9", + "0.3.3": "37de3210aed9" } }, "AIMLModel": { "versions": { "0.3.0": "db72277a0d5a", - "0.3.1": "db72277a0d5a" + "0.3.1": "db72277a0d5a", + "0.3.2": "db72277a0d5a", + "0.3.3": "db72277a0d5a" } }, "AIMLEmbeddings": { "versions": { "0.3.0": "dae370391ba3", - "0.3.1": "dae370391ba3" + "0.3.1": "dae370391ba3", + "0.3.2": "dae370391ba3", + "0.3.3": "dae370391ba3" } }, "ALTK Agent": { "versions": { "0.3.0": "d1caf0d1db88", - "0.3.1": "d1caf0d1db88" + "0.3.1": "d1caf0d1db88", + "0.3.2": "d1caf0d1db88", + "0.3.3": "d1caf0d1db88" } }, "AmazonBedrockConverseModel": { "versions": { "0.3.0": "54c335f8699f", - "0.3.1": "54c335f8699f" + "0.3.1": "54c335f8699f", + "0.3.2": "54c335f8699f", + "0.3.3": "54c335f8699f" } }, "AmazonBedrockEmbeddings": { "versions": { "0.3.0": "70d039ff79f0", - "0.3.1": "70d039ff79f0" + "0.3.1": "70d039ff79f0", + "0.3.2": "70d039ff79f0", + "0.3.3": "70d039ff79f0" } }, "AmazonBedrockModel": { "versions": { "0.3.0": "922093a831b6", - "0.3.1": "922093a831b6" + "0.3.1": "922093a831b6", + "0.3.2": "922093a831b6", + "0.3.3": "922093a831b6" } }, "s3bucketuploader": { "versions": { "0.3.0": "6e4ba2dafc3c", - "0.3.1": "6e4ba2dafc3c" + "0.3.1": "6e4ba2dafc3c", + "0.3.2": "6e4ba2dafc3c", + "0.3.3": "6e4ba2dafc3c" } }, "AnthropicModel": { "versions": { "0.3.0": "7c894c5a66ba", - "0.3.1": "7c894c5a66ba" + "0.3.1": "7c894c5a66ba", + "0.3.2": "7c894c5a66ba", + "0.3.3": "7c894c5a66ba" } }, "ApifyActors": { "versions": { "0.3.0": "e84290d462c2", - "0.3.1": "e84290d462c2" + "0.3.1": "e84290d462c2", + "0.3.2": "e84290d462c2", + "0.3.3": "e84290d462c2" } }, "ArXivComponent": { "versions": { "0.3.0": "219239ee2b48", - "0.3.1": "219239ee2b48" + "0.3.1": "219239ee2b48", + "0.3.2": "219239ee2b48", + "0.3.3": "219239ee2b48" } }, "AssemblyAIGetSubtitles": { "versions": { "0.3.0": "533d1fcf7c7a", - "0.3.1": "533d1fcf7c7a" + "0.3.1": "533d1fcf7c7a", + "0.3.2": "533d1fcf7c7a", + "0.3.3": "533d1fcf7c7a" } }, "AssemblyAILeMUR": { "versions": { "0.3.0": "8c96738ab967", - "0.3.1": "8c96738ab967" + "0.3.1": "8c96738ab967", + "0.3.2": "8c96738ab967", + "0.3.3": "8c96738ab967" } }, "AssemblyAIListTranscripts": { "versions": { "0.3.0": "267dcda48ad4", - "0.3.1": "267dcda48ad4" + "0.3.1": "267dcda48ad4", + "0.3.2": "267dcda48ad4", + "0.3.3": "267dcda48ad4" } }, "AssemblyAITranscriptionJobPoller": { "versions": { "0.3.0": "935c9296b149", - "0.3.1": "935c9296b149" + "0.3.1": "935c9296b149", + "0.3.2": "935c9296b149", + "0.3.3": "935c9296b149" } }, "AssemblyAITranscriptionJobCreator": { "versions": { "0.3.0": "7ff7b3f90298", - "0.3.1": "7ff7b3f90298" + "0.3.1": "7ff7b3f90298", + "0.3.2": "7ff7b3f90298", + "0.3.3": "7ff7b3f90298" } }, "AzureOpenAIModel": { "versions": { "0.3.0": "2ba26202203e", - "0.3.1": "2ba26202203e" + "0.3.1": "2ba26202203e", + "0.3.2": "2ba26202203e", + "0.3.3": "2ba26202203e" } }, "AzureOpenAIEmbeddings": { "versions": { "0.3.0": "6b54f3243a6a", - "0.3.1": "6b54f3243a6a" + "0.3.1": "6b54f3243a6a", + "0.3.2": "6b54f3243a6a", + "0.3.3": "6b54f3243a6a" } }, "BaiduQianfanChatModel": { "versions": { "0.3.0": "a5fdfdb5757f", - "0.3.1": "a5fdfdb5757f" + "0.3.1": "a5fdfdb5757f", + "0.3.2": "a5fdfdb5757f", + "0.3.3": "a5fdfdb5757f" } }, "BingSearchAPI": { "versions": { "0.3.0": "84334607b325", - "0.3.1": "84334607b325" + "0.3.1": "84334607b325", + "0.3.2": "84334607b325", + "0.3.3": "84334607b325" } }, "Cassandra": { "versions": { "0.3.0": "833f277daab7", - "0.3.1": "833f277daab7" + "0.3.1": "833f277daab7", + "0.3.2": "833f277daab7", + "0.3.3": "833f277daab7" } }, "CassandraChatMemory": { "versions": { "0.3.0": "f6497182984e", - "0.3.1": "f6497182984e" + "0.3.1": "f6497182984e", + "0.3.2": "f6497182984e", + "0.3.3": "f6497182984e" } }, "CassandraGraph": { "versions": { "0.3.0": "26c63f80745e", - "0.3.1": "26c63f80745e" + "0.3.1": "26c63f80745e", + "0.3.2": "26c63f80745e", + "0.3.3": "26c63f80745e" } }, "Chroma": { "versions": { "0.3.0": "82d38624f19a", - "0.3.1": "82d38624f19a" + "0.3.1": "82d38624f19a", + "0.3.2": "82d38624f19a", + "0.3.3": "82d38624f19a" } }, "CleanlabEvaluator": { "versions": { "0.3.0": "06963c804ffe", - "0.3.1": "06963c804ffe" + "0.3.1": "06963c804ffe", + "0.3.2": "06963c804ffe", + "0.3.3": "06963c804ffe" } }, "CleanlabRAGEvaluator": { "versions": { "0.3.0": "f48b57ff7ca3", - "0.3.1": "f48b57ff7ca3" + "0.3.1": "f48b57ff7ca3", + "0.3.2": "f48b57ff7ca3", + "0.3.3": "f48b57ff7ca3" } }, "CleanlabRemediator": { "versions": { "0.3.0": "a5b19d338991", - "0.3.1": "a5b19d338991" + "0.3.1": "a5b19d338991", + "0.3.2": "a5b19d338991", + "0.3.3": "a5b19d338991" } }, "Clickhouse": { "versions": { "0.3.0": "ab991e83da44", - "0.3.1": "ab991e83da44" + "0.3.1": "ab991e83da44", + "0.3.2": "ab991e83da44", + "0.3.3": "ab991e83da44" } }, "CloudflareWorkersAIEmbeddings": { "versions": { "0.3.0": "1ea6e4857c14", - "0.3.1": "1ea6e4857c14" + "0.3.1": "1ea6e4857c14", + "0.3.2": "1ea6e4857c14", + "0.3.3": "1ea6e4857c14" } }, "CohereEmbeddings": { "versions": { "0.3.0": "9c0f413a2c64", - "0.3.1": "9c0f413a2c64" + "0.3.1": "9c0f413a2c64", + "0.3.2": "9c0f413a2c64", + "0.3.3": "9c0f413a2c64" } }, "CohereModel": { "versions": { "0.3.0": "594852e1d706", - "0.3.1": "594852e1d706" + "0.3.1": "594852e1d706", + "0.3.2": "594852e1d706", + "0.3.3": "594852e1d706" } }, "CohereRerank": { "versions": { "0.3.0": "a94a0d11eeac", - "0.3.1": "a94a0d11eeac" + "0.3.1": "a94a0d11eeac", + "0.3.2": "a94a0d11eeac", + "0.3.3": "a94a0d11eeac" } }, "CometAPIModel": { "versions": { "0.3.0": "4ec4a8852e9c", - "0.3.1": "4ec4a8852e9c" + "0.3.1": "4ec4a8852e9c", + "0.3.2": "4ec4a8852e9c", + "0.3.3": "4ec4a8852e9c" } }, "ComposioAgentQLAPIComponent": { "versions": { "0.3.0": "cca708a10ab6", - "0.3.1": "cca708a10ab6" + "0.3.1": "cca708a10ab6", + "0.3.2": "cca708a10ab6", + "0.3.3": "cca708a10ab6" } }, "ComposioAgiledAPIComponent": { "versions": { "0.3.0": "3294a951a1a8", - "0.3.1": "3294a951a1a8" + "0.3.1": "3294a951a1a8", + "0.3.2": "3294a951a1a8", + "0.3.3": "3294a951a1a8" } }, "ComposioAirtableAPIComponent": { "versions": { "0.3.0": "e47ad011c33c", - "0.3.1": "e47ad011c33c" + "0.3.1": "e47ad011c33c", + "0.3.2": "e47ad011c33c", + "0.3.3": "e47ad011c33c" } }, "ComposioApolloAPIComponent": { "versions": { "0.3.0": "3af16f5d6ceb", - "0.3.1": "3af16f5d6ceb" + "0.3.1": "3af16f5d6ceb", + "0.3.2": "3af16f5d6ceb", + "0.3.3": "3af16f5d6ceb" } }, "ComposioAsanaAPIComponent": { "versions": { "0.3.0": "290d6d61d049", - "0.3.1": "290d6d61d049" + "0.3.1": "290d6d61d049", + "0.3.2": "290d6d61d049", + "0.3.3": "290d6d61d049" } }, "ComposioAttioAPIComponent": { "versions": { "0.3.0": "de43b3cf5671", - "0.3.1": "de43b3cf5671" + "0.3.1": "de43b3cf5671", + "0.3.2": "de43b3cf5671", + "0.3.3": "de43b3cf5671" } }, "ComposioBitbucketAPIComponent": { "versions": { "0.3.0": "7528a8928646", - "0.3.1": "7528a8928646" + "0.3.1": "7528a8928646", + "0.3.2": "7528a8928646", + "0.3.3": "7528a8928646" } }, "ComposioBolnaAPIComponent": { "versions": { "0.3.0": "dde7d2ee80a2", - "0.3.1": "dde7d2ee80a2" + "0.3.1": "dde7d2ee80a2", + "0.3.2": "dde7d2ee80a2", + "0.3.3": "dde7d2ee80a2" } }, "ComposioBrightdataAPIComponent": { "versions": { "0.3.0": "49a04c5a23cb", - "0.3.1": "49a04c5a23cb" + "0.3.1": "49a04c5a23cb", + "0.3.2": "49a04c5a23cb", + "0.3.3": "49a04c5a23cb" } }, "ComposioCalendlyAPIComponent": { "versions": { "0.3.0": "4a282e413d55", - "0.3.1": "4a282e413d55" + "0.3.1": "4a282e413d55", + "0.3.2": "4a282e413d55", + "0.3.3": "4a282e413d55" } }, "ComposioCanvaAPIComponent": { "versions": { "0.3.0": "d149aa178e80", - "0.3.1": "d149aa178e80" + "0.3.1": "d149aa178e80", + "0.3.2": "d149aa178e80", + "0.3.3": "d149aa178e80" } }, "ComposioCanvasAPIComponent": { "versions": { "0.3.0": "6510d212a720", - "0.3.1": "6510d212a720" + "0.3.1": "6510d212a720", + "0.3.2": "6510d212a720", + "0.3.3": "6510d212a720" } }, "ComposioCodaAPIComponent": { "versions": { "0.3.0": "f7693920313f", - "0.3.1": "f7693920313f" + "0.3.1": "f7693920313f", + "0.3.2": "f7693920313f", + "0.3.3": "f7693920313f" } }, "ComposioAPI": { "versions": { "0.3.0": "764255821307", - "0.3.1": "764255821307" + "0.3.1": "764255821307", + "0.3.2": "764255821307", + "0.3.3": "764255821307" } }, "ComposioContentfulAPIComponent": { "versions": { "0.3.0": "36befb1ec8fc", - "0.3.1": "36befb1ec8fc" + "0.3.1": "36befb1ec8fc", + "0.3.2": "36befb1ec8fc", + "0.3.3": "36befb1ec8fc" } }, "ComposioDigicertAPIComponent": { "versions": { "0.3.0": "0fcbc1b899f8", - "0.3.1": "0fcbc1b899f8" + "0.3.1": "0fcbc1b899f8", + "0.3.2": "0fcbc1b899f8", + "0.3.3": "0fcbc1b899f8" } }, "ComposioDiscordAPIComponent": { "versions": { "0.3.0": "2ec988f25784", - "0.3.1": "2ec988f25784" + "0.3.1": "2ec988f25784", + "0.3.2": "2ec988f25784", + "0.3.3": "2ec988f25784" } }, "ComposioDropboxAPIComponent": { "versions": { "0.3.0": "d05825599def", - "0.3.1": "d05825599def" + "0.3.1": "d05825599def", + "0.3.2": "d05825599def", + "0.3.3": "d05825599def" } }, "ComposioElevenLabsAPIComponent": { "versions": { "0.3.0": "e0c91533558b", - "0.3.1": "e0c91533558b" + "0.3.1": "e0c91533558b", + "0.3.2": "e0c91533558b", + "0.3.3": "e0c91533558b" } }, "ComposioExaAPIComponent": { "versions": { "0.3.0": "3b5cecdefab8", - "0.3.1": "3b5cecdefab8" + "0.3.1": "3b5cecdefab8", + "0.3.2": "3b5cecdefab8", + "0.3.3": "3b5cecdefab8" } }, "ComposioFigmaAPIComponent": { "versions": { "0.3.0": "7443d213546b", - "0.3.1": "7443d213546b" + "0.3.1": "7443d213546b", + "0.3.2": "7443d213546b", + "0.3.3": "7443d213546b" } }, "ComposioFinageAPIComponent": { "versions": { "0.3.0": "50a2bdee4cd1", - "0.3.1": "50a2bdee4cd1" + "0.3.1": "50a2bdee4cd1", + "0.3.2": "50a2bdee4cd1", + "0.3.3": "50a2bdee4cd1" } }, "ComposioFirecrawlAPIComponent": { "versions": { "0.3.0": "2ab1c4b00071", - "0.3.1": "2ab1c4b00071" + "0.3.1": "2ab1c4b00071", + "0.3.2": "2ab1c4b00071", + "0.3.3": "2ab1c4b00071" } }, "ComposioFirefliesAPIComponent": { "versions": { "0.3.0": "233cd91dbdad", - "0.3.1": "233cd91dbdad" + "0.3.1": "233cd91dbdad", + "0.3.2": "233cd91dbdad", + "0.3.3": "233cd91dbdad" } }, "ComposioFixerAPIComponent": { "versions": { "0.3.0": "9e4c00f9dcd8", - "0.3.1": "9e4c00f9dcd8" + "0.3.1": "9e4c00f9dcd8", + "0.3.2": "9e4c00f9dcd8", + "0.3.3": "9e4c00f9dcd8" } }, "ComposioFlexisignAPIComponent": { "versions": { "0.3.0": "c69bbee0005d", - "0.3.1": "c69bbee0005d" + "0.3.1": "c69bbee0005d", + "0.3.2": "c69bbee0005d", + "0.3.3": "c69bbee0005d" } }, "ComposioFreshdeskAPIComponent": { "versions": { "0.3.0": "1dde03d615ca", - "0.3.1": "1dde03d615ca" + "0.3.1": "1dde03d615ca", + "0.3.2": "1dde03d615ca", + "0.3.3": "1dde03d615ca" } }, "ComposioGitHubAPIComponent": { "versions": { "0.3.0": "ee201105d924", - "0.3.1": "ee201105d924" + "0.3.1": "ee201105d924", + "0.3.2": "ee201105d924", + "0.3.3": "ee201105d924" } }, "ComposioGmailAPIComponent": { "versions": { "0.3.0": "d4b13ac8a3a1", - "0.3.1": "d4b13ac8a3a1" + "0.3.1": "d4b13ac8a3a1", + "0.3.2": "d4b13ac8a3a1", + "0.3.3": "d4b13ac8a3a1" } }, "ComposioGoogleBigQueryAPIComponent": { "versions": { "0.3.0": "f7d84aaae78f", - "0.3.1": "f7d84aaae78f" + "0.3.1": "f7d84aaae78f", + "0.3.2": "f7d84aaae78f", + "0.3.3": "f7d84aaae78f" } }, "ComposioGoogleCalendarAPIComponent": { "versions": { "0.3.0": "28adb6fff093", - "0.3.1": "28adb6fff093" + "0.3.1": "28adb6fff093", + "0.3.2": "28adb6fff093", + "0.3.3": "28adb6fff093" } }, "ComposioGoogleclassroomAPIComponent": { "versions": { "0.3.0": "85a5c37c13f6", - "0.3.1": "85a5c37c13f6" + "0.3.1": "85a5c37c13f6", + "0.3.2": "85a5c37c13f6", + "0.3.3": "85a5c37c13f6" } }, "ComposioGoogleDocsAPIComponent": { "versions": { "0.3.0": "ac2e88b6f706", - "0.3.1": "ac2e88b6f706" + "0.3.1": "ac2e88b6f706", + "0.3.2": "ac2e88b6f706", + "0.3.3": "ac2e88b6f706" } }, "ComposioGooglemeetAPIComponent": { "versions": { "0.3.0": "cdbf16c4b42f", - "0.3.1": "cdbf16c4b42f" + "0.3.1": "cdbf16c4b42f", + "0.3.2": "cdbf16c4b42f", + "0.3.3": "cdbf16c4b42f" } }, "ComposioGoogleSheetsAPIComponent": { "versions": { "0.3.0": "b0db7a3abe1f", - "0.3.1": "b0db7a3abe1f" + "0.3.1": "b0db7a3abe1f", + "0.3.2": "b0db7a3abe1f", + "0.3.3": "b0db7a3abe1f" } }, "ComposioGoogleTasksAPIComponent": { "versions": { "0.3.0": "2ba9c1661f41", - "0.3.1": "2ba9c1661f41" + "0.3.1": "2ba9c1661f41", + "0.3.2": "2ba9c1661f41", + "0.3.3": "2ba9c1661f41" } }, "ComposioHeygenAPIComponent": { "versions": { "0.3.0": "c72fd5d0350f", - "0.3.1": "c72fd5d0350f" + "0.3.1": "c72fd5d0350f", + "0.3.2": "c72fd5d0350f", + "0.3.3": "c72fd5d0350f" } }, "ComposioInstagramAPIComponent": { "versions": { "0.3.0": "a6691c905833", - "0.3.1": "a6691c905833" + "0.3.1": "a6691c905833", + "0.3.2": "a6691c905833", + "0.3.3": "a6691c905833" } }, "ComposioJiraAPIComponent": { "versions": { "0.3.0": "3e62396f3868", - "0.3.1": "3e62396f3868" + "0.3.1": "3e62396f3868", + "0.3.2": "3e62396f3868", + "0.3.3": "3e62396f3868" } }, "ComposioJotformAPIComponent": { "versions": { "0.3.0": "7c1c6a676814", - "0.3.1": "7c1c6a676814" + "0.3.1": "7c1c6a676814", + "0.3.2": "7c1c6a676814", + "0.3.3": "7c1c6a676814" } }, "ComposioKlaviyoAPIComponent": { "versions": { "0.3.0": "3be7e8a5e3fe", - "0.3.1": "3be7e8a5e3fe" + "0.3.1": "3be7e8a5e3fe", + "0.3.2": "3be7e8a5e3fe", + "0.3.3": "3be7e8a5e3fe" } }, "ComposioLinearAPIComponent": { "versions": { "0.3.0": "be2b2ebbeea7", - "0.3.1": "be2b2ebbeea7" + "0.3.1": "be2b2ebbeea7", + "0.3.2": "be2b2ebbeea7", + "0.3.3": "be2b2ebbeea7" } }, "ComposioListennotesAPIComponent": { "versions": { "0.3.0": "b85f2fe51906", - "0.3.1": "b85f2fe51906" + "0.3.1": "b85f2fe51906", + "0.3.2": "b85f2fe51906", + "0.3.3": "b85f2fe51906" } }, "ComposioMem0APIComponent": { "versions": { "0.3.0": "68871a483786", - "0.3.1": "68871a483786" + "0.3.1": "68871a483786", + "0.3.2": "68871a483786", + "0.3.3": "68871a483786" } }, "ComposioMiroAPIComponent": { "versions": { "0.3.0": "1e9c421e1ac4", - "0.3.1": "1e9c421e1ac4" + "0.3.1": "1e9c421e1ac4", + "0.3.2": "1e9c421e1ac4", + "0.3.3": "1e9c421e1ac4" } }, "ComposioMissiveAPIComponent": { "versions": { "0.3.0": "6def944a7739", - "0.3.1": "6def944a7739" + "0.3.1": "6def944a7739", + "0.3.2": "6def944a7739", + "0.3.3": "6def944a7739" } }, "ComposioNotionAPIComponent": { "versions": { "0.3.0": "590aa6ff30d1", - "0.3.1": "590aa6ff30d1" + "0.3.1": "590aa6ff30d1", + "0.3.2": "590aa6ff30d1", + "0.3.3": "590aa6ff30d1" } }, "ComposioOneDriveAPIComponent": { "versions": { "0.3.0": "497cc4625121", - "0.3.1": "497cc4625121" + "0.3.1": "497cc4625121", + "0.3.2": "497cc4625121", + "0.3.3": "497cc4625121" } }, "ComposioOutlookAPIComponent": { "versions": { "0.3.0": "bf6998d60b63", - "0.3.1": "bf6998d60b63" + "0.3.1": "bf6998d60b63", + "0.3.2": "bf6998d60b63", + "0.3.3": "bf6998d60b63" } }, "ComposioPandadocAPIComponent": { "versions": { "0.3.0": "21d92aabc1bf", - "0.3.1": "21d92aabc1bf" + "0.3.1": "21d92aabc1bf", + "0.3.2": "21d92aabc1bf", + "0.3.3": "21d92aabc1bf" } }, "ComposioPeopleDataLabsAPIComponent": { "versions": { "0.3.0": "bd05ce58f55c", - "0.3.1": "bd05ce58f55c" + "0.3.1": "bd05ce58f55c", + "0.3.2": "bd05ce58f55c", + "0.3.3": "bd05ce58f55c" } }, "ComposioPerplexityAIAPIComponent": { "versions": { "0.3.0": "e40b0651344f", - "0.3.1": "e40b0651344f" + "0.3.1": "e40b0651344f", + "0.3.2": "e40b0651344f", + "0.3.3": "e40b0651344f" } }, "ComposioRedditAPIComponent": { "versions": { "0.3.0": "a86794073c22", - "0.3.1": "a86794073c22" + "0.3.1": "a86794073c22", + "0.3.2": "a86794073c22", + "0.3.3": "a86794073c22" } }, "ComposioSerpAPIComponent": { "versions": { "0.3.0": "74b0a07ee54b", - "0.3.1": "74b0a07ee54b" + "0.3.1": "74b0a07ee54b", + "0.3.2": "74b0a07ee54b", + "0.3.3": "74b0a07ee54b" } }, "ComposioSlackAPIComponent": { "versions": { "0.3.0": "fa340cae1330", - "0.3.1": "fa340cae1330" + "0.3.1": "fa340cae1330", + "0.3.2": "fa340cae1330", + "0.3.3": "fa340cae1330" } }, "ComposioSlackbotAPIComponent": { "versions": { "0.3.0": "ddeb26bc04e6", - "0.3.1": "ddeb26bc04e6" + "0.3.1": "ddeb26bc04e6", + "0.3.2": "ddeb26bc04e6", + "0.3.3": "ddeb26bc04e6" } }, "ComposioSnowflakeAPIComponent": { "versions": { "0.3.0": "d0d1af5686d2", - "0.3.1": "d0d1af5686d2" + "0.3.1": "d0d1af5686d2", + "0.3.2": "d0d1af5686d2", + "0.3.3": "d0d1af5686d2" } }, "ComposioSupabaseAPIComponent": { "versions": { "0.3.0": "7ad58ce34cc0", - "0.3.1": "7ad58ce34cc0" + "0.3.1": "7ad58ce34cc0", + "0.3.2": "7ad58ce34cc0", + "0.3.3": "7ad58ce34cc0" } }, "ComposioTavilyAPIComponent": { "versions": { "0.3.0": "97af05e37911", - "0.3.1": "97af05e37911" + "0.3.1": "97af05e37911", + "0.3.2": "97af05e37911", + "0.3.3": "97af05e37911" } }, "ComposioTimelinesAIAPIComponent": { "versions": { "0.3.0": "76e70e2de4d3", - "0.3.1": "76e70e2de4d3" + "0.3.1": "76e70e2de4d3", + "0.3.2": "76e70e2de4d3", + "0.3.3": "76e70e2de4d3" } }, "ComposioTodoistAPIComponent": { "versions": { "0.3.0": "4dd9852f2058", - "0.3.1": "4dd9852f2058" + "0.3.1": "4dd9852f2058", + "0.3.2": "4dd9852f2058", + "0.3.3": "4dd9852f2058" } }, "ComposioWrikeAPIComponent": { "versions": { "0.3.0": "a5f2cf00ca08", - "0.3.1": "a5f2cf00ca08" + "0.3.1": "a5f2cf00ca08", + "0.3.2": "a5f2cf00ca08", + "0.3.3": "a5f2cf00ca08" } }, "ComposioYoutubeAPIComponent": { "versions": { "0.3.0": "d1af2ea00e8b", - "0.3.1": "d1af2ea00e8b" + "0.3.1": "d1af2ea00e8b", + "0.3.2": "d1af2ea00e8b", + "0.3.3": "d1af2ea00e8b" } }, "Confluence": { "versions": { "0.3.0": "8a7ef34b66e4", - "0.3.1": "8a7ef34b66e4" + "0.3.1": "8a7ef34b66e4", + "0.3.2": "8a7ef34b66e4", + "0.3.3": "8a7ef34b66e4" } }, "Couchbase": { "versions": { "0.3.0": "70ed475a6f48", - "0.3.1": "70ed475a6f48" + "0.3.1": "70ed475a6f48", + "0.3.2": "70ed475a6f48", + "0.3.3": "70ed475a6f48" } }, "CrewAIAgentComponent": { "versions": { "0.3.0": "a23f0923049d", - "0.3.1": "a23f0923049d" + "0.3.1": "a23f0923049d", + "0.3.2": "a23f0923049d", + "0.3.3": "a23f0923049d" } }, "HierarchicalCrewComponent": { "versions": { "0.3.0": "144be482cfb0", - "0.3.1": "144be482cfb0" + "0.3.1": "144be482cfb0", + "0.3.2": "144be482cfb0", + "0.3.3": "144be482cfb0" } }, "HierarchicalTaskComponent": { "versions": { "0.3.0": "25071652dc20", - "0.3.1": "25071652dc20" + "0.3.1": "25071652dc20", + "0.3.2": "25071652dc20", + "0.3.3": "25071652dc20" } }, "SequentialCrewComponent": { "versions": { "0.3.0": "42e59f6d6572", - "0.3.1": "42e59f6d6572" + "0.3.1": "42e59f6d6572", + "0.3.2": "42e59f6d6572", + "0.3.3": "42e59f6d6572" } }, "SequentialTaskComponent": { "versions": { "0.3.0": "b1f17b8fcc5c", - "0.3.1": "b1f17b8fcc5c" + "0.3.1": "b1f17b8fcc5c", + "0.3.2": "b1f17b8fcc5c", + "0.3.3": "b1f17b8fcc5c" } }, "SequentialTaskAgentComponent": { "versions": { "0.3.0": "0a5483ef82c3", - "0.3.1": "0a5483ef82c3" + "0.3.1": "0a5483ef82c3", + "0.3.2": "0a5483ef82c3", + "0.3.3": "0a5483ef82c3" } }, "Cuga": { "versions": { "0.3.0": "35e838f89d13", - "0.3.1": "35e838f89d13" + "0.3.1": "35e838f89d13", + "0.3.2": "35e838f89d13", + "0.3.3": "35e838f89d13" } }, "CustomComponent": { "versions": { "0.3.0": "d50a68a6fa57", - "0.3.1": "d50a68a6fa57" + "0.3.1": "d50a68a6fa57", + "0.3.2": "d50a68a6fa57", + "0.3.3": "d50a68a6fa57" } }, "APIRequest": { "versions": { "0.3.0": "f102aadfb328", - "0.3.1": "f102aadfb328" + "0.3.1": "f102aadfb328", + "0.3.2": "f102aadfb328", + "0.3.3": "f102aadfb328" } }, "CSVtoData": { "versions": { "0.3.0": "85c7d6df7473", - "0.3.1": "85c7d6df7473" + "0.3.1": "85c7d6df7473", + "0.3.2": "85c7d6df7473", + "0.3.3": "85c7d6df7473" } }, "JSONtoData": { "versions": { "0.3.0": "0d9d78d496a2", - "0.3.1": "0d9d78d496a2" + "0.3.1": "0d9d78d496a2", + "0.3.2": "0d9d78d496a2", + "0.3.3": "0d9d78d496a2" } }, "MockDataGenerator": { "versions": { "0.3.0": "d21dce7b329b", - "0.3.1": "d21dce7b329b" + "0.3.1": "d21dce7b329b", + "0.3.2": "d21dce7b329b", + "0.3.3": "d21dce7b329b" } }, "NewsSearch": { "versions": { "0.3.0": "b8cb11f78518", - "0.3.1": "b8cb11f78518" + "0.3.1": "b8cb11f78518", + "0.3.2": "b8cb11f78518", + "0.3.3": "b8cb11f78518" } }, "RSSReaderSimple": { "versions": { "0.3.0": "6eb8fb48c9b5", - "0.3.1": "6eb8fb48c9b5" + "0.3.1": "6eb8fb48c9b5", + "0.3.2": "6eb8fb48c9b5", + "0.3.3": "6eb8fb48c9b5" } }, "SQLComponent": { "versions": { "0.3.0": "a8dd79af50b8", - "0.3.1": "a8dd79af50b8" + "0.3.1": "a8dd79af50b8", + "0.3.2": "a8dd79af50b8", + "0.3.3": "a8dd79af50b8" } }, "URLComponent": { "versions": { "0.3.0": "f773f55e3820", - "0.3.1": "f773f55e3820" + "0.3.1": "f773f55e3820", + "0.3.2": "f773f55e3820", + "0.3.3": "f773f55e3820" } }, "UnifiedWebSearch": { "versions": { "0.3.0": "cbeeaef8889a", - "0.3.1": "cbeeaef8889a" + "0.3.1": "cbeeaef8889a", + "0.3.2": "cbeeaef8889a", + "0.3.3": "cbeeaef8889a" } }, "Astra Assistant Agent": { "versions": { "0.3.0": "4716d3b7c350", - "0.3.1": "4716d3b7c350" + "0.3.1": "4716d3b7c350", + "0.3.2": "4716d3b7c350", + "0.3.3": "4716d3b7c350" } }, "AstraDBChatMemory": { "versions": { "0.3.0": "bafc81f78c76", - "0.3.1": "bafc81f78c76" + "0.3.1": "bafc81f78c76", + "0.3.2": "bafc81f78c76", + "0.3.3": "bafc81f78c76" } }, "AstraDBCQLToolComponent": { "versions": { "0.3.0": "70c4523f841d", - "0.3.1": "70c4523f841d" + "0.3.1": "70c4523f841d", + "0.3.2": "70c4523f841d", + "0.3.3": "70c4523f841d" } }, "AstraDBGraph": { "versions": { "0.3.0": "9f5d576b30ca", - "0.3.1": "9f5d576b30ca" + "0.3.1": "9f5d576b30ca", + "0.3.2": "9f5d576b30ca", + "0.3.3": "9f5d576b30ca" } }, "AstraDBTool": { "versions": { "0.3.0": "44719b6ed1a3", - "0.3.1": "44719b6ed1a3" + "0.3.1": "44719b6ed1a3", + "0.3.2": "44719b6ed1a3", + "0.3.3": "44719b6ed1a3" } }, "AstraVectorize": { "versions": { "0.3.0": "3d976690c262", - "0.3.1": "3d976690c262" + "0.3.1": "3d976690c262", + "0.3.2": "3d976690c262", + "0.3.3": "3d976690c262" } }, "AstraDB": { "versions": { "0.3.0": "d52094e54e96", - "0.3.1": "d52094e54e96" + "0.3.1": "d52094e54e96", + "0.3.2": "d52094e54e96", + "0.3.3": "d52094e54e96" } }, "AssistantsCreateAssistant": { "versions": { "0.3.0": "8d9869d9a89d", - "0.3.1": "8d9869d9a89d" + "0.3.1": "8d9869d9a89d", + "0.3.2": "8d9869d9a89d", + "0.3.3": "8d9869d9a89d" } }, "AssistantsCreateThread": { "versions": { "0.3.0": "5d40a73accfd", - "0.3.1": "5d40a73accfd" + "0.3.1": "5d40a73accfd", + "0.3.2": "5d40a73accfd", + "0.3.3": "5d40a73accfd" } }, "Dotenv": { "versions": { "0.3.0": "343ea9aaca1b", - "0.3.1": "343ea9aaca1b" + "0.3.1": "343ea9aaca1b", + "0.3.2": "343ea9aaca1b", + "0.3.3": "343ea9aaca1b" } }, "AssistantsGetAssistantName": { "versions": { "0.3.0": "1f60da161fd3", - "0.3.1": "1f60da161fd3" + "0.3.1": "1f60da161fd3", + "0.3.2": "1f60da161fd3", + "0.3.3": "1f60da161fd3" } }, "GetEnvVar": { "versions": { "0.3.0": "083f0a94f380", - "0.3.1": "083f0a94f380" + "0.3.1": "083f0a94f380", + "0.3.2": "083f0a94f380", + "0.3.3": "083f0a94f380" } }, "GraphRAG": { "versions": { "0.3.0": "4d83709a5f5f", - "0.3.1": "4d83709a5f5f" + "0.3.1": "4d83709a5f5f", + "0.3.2": "4d83709a5f5f", + "0.3.3": "4d83709a5f5f" } }, "HCD": { "versions": { "0.3.0": "25f009b9e171", - "0.3.1": "25f009b9e171" + "0.3.1": "25f009b9e171", + "0.3.2": "25f009b9e171", + "0.3.3": "25f009b9e171" } }, "AssistantsListAssistants": { "versions": { "0.3.0": "17e9c5c78a6e", - "0.3.1": "17e9c5c78a6e" + "0.3.1": "17e9c5c78a6e", + "0.3.2": "17e9c5c78a6e", + "0.3.3": "17e9c5c78a6e" } }, "AssistantsRun": { "versions": { "0.3.0": "5e219cd290d3", - "0.3.1": "5e219cd290d3" + "0.3.1": "5e219cd290d3", + "0.3.2": "5e219cd290d3", + "0.3.3": "5e219cd290d3" } }, "DeepSeekModelComponent": { "versions": { "0.3.0": "c8dac7a258d7", - "0.3.1": "c8dac7a258d7" + "0.3.1": "c8dac7a258d7", + "0.3.2": "c8dac7a258d7", + "0.3.3": "c8dac7a258d7" } }, "ChunkDoclingDocument": { "versions": { "0.3.0": "49d762d97039", - "0.3.1": "49d762d97039" + "0.3.1": "49d762d97039", + "0.3.2": "49d762d97039", + "0.3.3": "49d762d97039" } }, "DoclingInline": { "versions": { "0.3.0": "519d12bd6451", - "0.3.1": "519d12bd6451" + "0.3.1": "519d12bd6451", + "0.3.2": "519d12bd6451", + "0.3.3": "519d12bd6451" } }, "DoclingRemote": { "versions": { "0.3.0": "409d771a961e", - "0.3.1": "409d771a961e" + "0.3.1": "409d771a961e", + "0.3.2": "409d771a961e", + "0.3.3": "409d771a961e" } }, "ExportDoclingDocument": { "versions": { "0.3.0": "32577a7e396b", - "0.3.1": "32577a7e396b" + "0.3.1": "32577a7e396b", + "0.3.2": "32577a7e396b", + "0.3.3": "32577a7e396b" } }, "DuckDuckGoSearchComponent": { "versions": { "0.3.0": "2e522a5a4389", - "0.3.1": "2e522a5a4389" + "0.3.1": "2e522a5a4389", + "0.3.2": "2e522a5a4389", + "0.3.3": "2e522a5a4389" } }, "Elasticsearch": { "versions": { "0.3.0": "23ea4383039e", - "0.3.1": "23ea4383039e" + "0.3.1": "23ea4383039e", + "0.3.2": "23ea4383039e", + "0.3.3": "23ea4383039e" } }, "OpenSearchVectorStoreComponent": { "versions": { "0.3.0": "4968b4d34fad", - "0.3.1": "4968b4d34fad" + "0.3.1": "4968b4d34fad", + "0.3.2": "4968b4d34fad", + "0.3.3": "4968b4d34fad" } }, "OpenSearchVectorStoreComponentMultimodalMultiEmbedding": { "versions": { "0.3.0": "6a3df45b55c5", - "0.3.1": "6a3df45b55c5" + "0.3.1": "6a3df45b55c5", + "0.3.2": "6a3df45b55c5", + "0.3.3": "6a3df45b55c5" } }, "EmbeddingSimilarityComponent": { "versions": { "0.3.0": "d94c7d791f69", - "0.3.1": "d94c7d791f69" + "0.3.1": "d94c7d791f69", + "0.3.2": "d94c7d791f69", + "0.3.3": "d94c7d791f69" } }, "TextEmbedderComponent": { "versions": { "0.3.0": "541a2fb78066", - "0.3.1": "541a2fb78066" + "0.3.1": "541a2fb78066", + "0.3.2": "541a2fb78066", + "0.3.3": "541a2fb78066" } }, "ExaSearch": { "versions": { "0.3.0": "26039e2a8b78", - "0.3.1": "26039e2a8b78" + "0.3.1": "26039e2a8b78", + "0.3.2": "26039e2a8b78", + "0.3.3": "26039e2a8b78" } }, "Directory": { "versions": { "0.3.0": "328e6f996926", - "0.3.1": "328e6f996926" + "0.3.1": "328e6f996926", + "0.3.2": "328e6f996926", + "0.3.3": "328e6f996926" } }, "File": { "versions": { "0.3.0": "12a5841f1a03", - "0.3.1": "12a5841f1a03" + "0.3.1": "12a5841f1a03", + "0.3.2": "12a5841f1a03", + "0.3.3": "12a5841f1a03" } }, "KnowledgeIngestion": { @@ -936,1231 +1244,1641 @@ "SaveToFile": { "versions": { "0.3.0": "6d0e4842271e", - "0.3.1": "6d0e4842271e" + "0.3.1": "6d0e4842271e", + "0.3.2": "6d0e4842271e", + "0.3.3": "6d0e4842271e" } }, "FirecrawlCrawlApi": { "versions": { "0.3.0": "22fd75efce27", - "0.3.1": "22fd75efce27" + "0.3.1": "22fd75efce27", + "0.3.2": "22fd75efce27", + "0.3.3": "22fd75efce27" } }, "FirecrawlExtractApi": { "versions": { "0.3.0": "8083782c2c28", - "0.3.1": "8083782c2c28" + "0.3.1": "8083782c2c28", + "0.3.2": "8083782c2c28", + "0.3.3": "8083782c2c28" } }, "FirecrawlMapApi": { "versions": { "0.3.0": "e326e840049b", - "0.3.1": "e326e840049b" + "0.3.1": "e326e840049b", + "0.3.2": "e326e840049b", + "0.3.3": "e326e840049b" } }, "FirecrawlScrapeApi": { "versions": { "0.3.0": "857b7da04207", - "0.3.1": "857b7da04207" + "0.3.1": "857b7da04207", + "0.3.2": "857b7da04207", + "0.3.3": "857b7da04207" } }, "ConditionalRouter": { "versions": { "0.3.0": "e92b1b243e5f", - "0.3.1": "e92b1b243e5f" + "0.3.1": "e92b1b243e5f", + "0.3.2": "e92b1b243e5f", + "0.3.3": "e92b1b243e5f" } }, "DataConditionalRouter": { "versions": { "0.3.0": "6fa1bf4166a3", - "0.3.1": "6fa1bf4166a3" + "0.3.1": "6fa1bf4166a3", + "0.3.2": "6fa1bf4166a3", + "0.3.3": "6fa1bf4166a3" } }, "FlowTool": { "versions": { "0.3.0": "9348d79d19f4", - "0.3.1": "9348d79d19f4" + "0.3.1": "9348d79d19f4", + "0.3.2": "9348d79d19f4", + "0.3.3": "9348d79d19f4" } }, "Listen": { "versions": { "0.3.0": "93fc11377c96", - "0.3.1": "93fc11377c96" + "0.3.1": "93fc11377c96", + "0.3.2": "93fc11377c96", + "0.3.3": "93fc11377c96" } }, "LoopComponent": { "versions": { "0.3.0": "e516ea99611c", - "0.3.1": "e516ea99611c" + "0.3.1": "e516ea99611c", + "0.3.2": "e516ea99611c", + "0.3.3": "e516ea99611c" } }, "Notify": { "versions": { "0.3.0": "03d68ba28530", - "0.3.1": "03d68ba28530" + "0.3.1": "03d68ba28530", + "0.3.2": "03d68ba28530", + "0.3.3": "03d68ba28530" } }, "Pass": { "versions": { "0.3.0": "04d3e1ed3390", - "0.3.1": "04d3e1ed3390" + "0.3.1": "04d3e1ed3390", + "0.3.2": "04d3e1ed3390", + "0.3.3": "04d3e1ed3390" } }, "RunFlow": { "versions": { "0.3.0": "9e5eefa14766", - "0.3.1": "9e5eefa14766" + "0.3.1": "9e5eefa14766", + "0.3.2": "9e5eefa14766", + "0.3.3": "9e5eefa14766" } }, "SubFlow": { "versions": { "0.3.0": "8ba6fbc5ca3a", - "0.3.1": "8ba6fbc5ca3a" + "0.3.1": "8ba6fbc5ca3a", + "0.3.2": "8ba6fbc5ca3a", + "0.3.3": "8ba6fbc5ca3a" } }, "GitLoaderComponent": { "versions": { "0.3.0": "ac5de0564a4f", - "0.3.1": "ac5de0564a4f" + "0.3.1": "ac5de0564a4f", + "0.3.2": "ac5de0564a4f", + "0.3.3": "ac5de0564a4f" } }, "GitExtractorComponent": { "versions": { "0.3.0": "79f338765b69", - "0.3.1": "79f338765b69" + "0.3.1": "79f338765b69", + "0.3.2": "79f338765b69", + "0.3.3": "79f338765b69" } }, "GleanSearchAPIComponent": { "versions": { "0.3.0": "493ca281d420", - "0.3.1": "493ca281d420" + "0.3.1": "493ca281d420", + "0.3.2": "493ca281d420", + "0.3.3": "493ca281d420" } }, "GmailLoaderComponent": { "versions": { "0.3.0": "b973c5a1987b", - "0.3.1": "b973c5a1987b" + "0.3.1": "b973c5a1987b", + "0.3.2": "b973c5a1987b", + "0.3.3": "b973c5a1987b" } }, "BigQueryExecutor": { "versions": { "0.3.0": "7f61159743ec", - "0.3.1": "7f61159743ec" + "0.3.1": "7f61159743ec", + "0.3.2": "7f61159743ec", + "0.3.3": "7f61159743ec" } }, "GoogleDriveComponent": { "versions": { "0.3.0": "1727f517e814", - "0.3.1": "1727f517e814" + "0.3.1": "1727f517e814", + "0.3.2": "1727f517e814", + "0.3.3": "1727f517e814" } }, "GoogleDriveSearchComponent": { "versions": { "0.3.0": "8f8dbdf04aaf", - "0.3.1": "8f8dbdf04aaf" + "0.3.1": "8f8dbdf04aaf", + "0.3.2": "8f8dbdf04aaf", + "0.3.3": "8f8dbdf04aaf" } }, "GoogleGenerativeAIModel": { "versions": { "0.3.0": "049f38001189", - "0.3.1": "049f38001189" + "0.3.1": "049f38001189", + "0.3.2": "049f38001189", + "0.3.3": "049f38001189" } }, "Google Generative AI Embeddings": { "versions": { "0.3.0": "7756ad70a221", - "0.3.1": "7756ad70a221" + "0.3.1": "7756ad70a221", + "0.3.2": "7756ad70a221", + "0.3.3": "7756ad70a221" } }, "GoogleOAuthToken": { "versions": { "0.3.0": "151778572099", - "0.3.1": "151778572099" + "0.3.1": "151778572099", + "0.3.2": "151778572099", + "0.3.3": "151778572099" } }, "GoogleSearchAPICore": { "versions": { "0.3.0": "853c193aa41c", - "0.3.1": "853c193aa41c" + "0.3.1": "853c193aa41c", + "0.3.2": "853c193aa41c", + "0.3.3": "853c193aa41c" } }, "GoogleSerperAPICore": { "versions": { "0.3.0": "527183dcb201", - "0.3.1": "527183dcb201" + "0.3.1": "527183dcb201", + "0.3.2": "527183dcb201", + "0.3.3": "527183dcb201" } }, "GroqModel": { "versions": { "0.3.0": "2aee7de6ee88", - "0.3.1": "2aee7de6ee88" + "0.3.1": "2aee7de6ee88", + "0.3.2": "2aee7de6ee88", + "0.3.3": "2aee7de6ee88" } }, "HomeAssistantControl": { "versions": { "0.3.0": "32b34baf3c7d", - "0.3.1": "32b34baf3c7d" + "0.3.1": "32b34baf3c7d", + "0.3.2": "32b34baf3c7d", + "0.3.3": "32b34baf3c7d" } }, "ListHomeAssistantStates": { "versions": { "0.3.0": "c7bb91632474", - "0.3.1": "c7bb91632474" + "0.3.1": "c7bb91632474", + "0.3.2": "c7bb91632474", + "0.3.3": "c7bb91632474" } }, "HuggingFaceModel": { "versions": { "0.3.0": "ba9d7c28859d", - "0.3.1": "ba9d7c28859d" + "0.3.1": "ba9d7c28859d", + "0.3.2": "ba9d7c28859d", + "0.3.3": "ba9d7c28859d" } }, "HuggingFaceInferenceAPIEmbeddings": { "versions": { "0.3.0": "af0546658974", - "0.3.1": "af0546658974" + "0.3.1": "af0546658974", + "0.3.2": "af0546658974", + "0.3.3": "af0546658974" } }, "IBMwatsonxModel": { "versions": { "0.3.0": "689a87ecc73a", - "0.3.1": "689a87ecc73a" + "0.3.1": "689a87ecc73a", + "0.3.2": "689a87ecc73a", + "0.3.3": "689a87ecc73a" } }, "WatsonxEmbeddingsComponent": { "versions": { "0.3.0": "011bcac795de", - "0.3.1": "011bcac795de" + "0.3.1": "011bcac795de", + "0.3.2": "011bcac795de", + "0.3.3": "011bcac795de" } }, "Combinatorial Reasoner": { "versions": { "0.3.0": "48557047ff23", - "0.3.1": "48557047ff23" + "0.3.1": "48557047ff23", + "0.3.2": "48557047ff23", + "0.3.3": "48557047ff23" } }, "ChatInput": { "versions": { "0.3.0": "7a26c54d89ed", - "0.3.1": "7a26c54d89ed" + "0.3.1": "7a26c54d89ed", + "0.3.2": "7a26c54d89ed", + "0.3.3": "7a26c54d89ed" } }, "ChatOutput": { "versions": { "0.3.0": "8c87e536cca4", - "0.3.1": "8c87e536cca4" + "0.3.1": "8c87e536cca4", + "0.3.2": "8c87e536cca4", + "0.3.3": "8c87e536cca4" } }, "TextInput": { "versions": { "0.3.0": "518f16485886", - "0.3.1": "518f16485886" + "0.3.1": "518f16485886", + "0.3.2": "518f16485886", + "0.3.3": "518f16485886" } }, "TextOutput": { "versions": { "0.3.0": "6aba888f4632", - "0.3.1": "6aba888f4632" + "0.3.1": "6aba888f4632", + "0.3.2": "6aba888f4632", + "0.3.3": "6aba888f4632" } }, "Webhook": { "versions": { "0.3.0": "eb561ef21f3d", - "0.3.1": "eb561ef21f3d" + "0.3.1": "eb561ef21f3d", + "0.3.2": "eb561ef21f3d", + "0.3.3": "eb561ef21f3d" } }, "JigsawStackAIScraper": { "versions": { "0.3.0": "08a0063e2564", - "0.3.1": "08a0063e2564" + "0.3.1": "08a0063e2564", + "0.3.2": "08a0063e2564", + "0.3.3": "08a0063e2564" } }, "JigsawStackAISearch": { "versions": { "0.3.0": "5e821ee44040", - "0.3.1": "5e821ee44040" + "0.3.1": "5e821ee44040", + "0.3.2": "5e821ee44040", + "0.3.3": "5e821ee44040" } }, "JigsawStackFileRead": { "versions": { "0.3.0": "84d122f46fb1", - "0.3.1": "84d122f46fb1" + "0.3.1": "84d122f46fb1", + "0.3.2": "84d122f46fb1", + "0.3.3": "84d122f46fb1" } }, "JigsawStackFileUpload": { "versions": { "0.3.0": "8261dc72a655", - "0.3.1": "8261dc72a655" + "0.3.1": "8261dc72a655", + "0.3.2": "8261dc72a655", + "0.3.3": "8261dc72a655" } }, "JigsawStackImageGeneration": { "versions": { "0.3.0": "463f8efbaa18", - "0.3.1": "463f8efbaa18" + "0.3.1": "463f8efbaa18", + "0.3.2": "463f8efbaa18", + "0.3.3": "463f8efbaa18" } }, "JigsawStackNSFW": { "versions": { "0.3.0": "88b5eee38906", - "0.3.1": "88b5eee38906" + "0.3.1": "88b5eee38906", + "0.3.2": "88b5eee38906", + "0.3.3": "88b5eee38906" } }, "JigsawStackObjectDetection": { "versions": { "0.3.0": "fceaf0286f20", - "0.3.1": "fceaf0286f20" + "0.3.1": "fceaf0286f20", + "0.3.2": "fceaf0286f20", + "0.3.3": "fceaf0286f20" } }, "JigsawStackSentiment": { "versions": { "0.3.0": "00d0377e5c2e", - "0.3.1": "00d0377e5c2e" + "0.3.1": "00d0377e5c2e", + "0.3.2": "00d0377e5c2e", + "0.3.3": "00d0377e5c2e" } }, "JigsawStackTextToSQL": { "versions": { "0.3.0": "30aa0cc15fb8", - "0.3.1": "30aa0cc15fb8" + "0.3.1": "30aa0cc15fb8", + "0.3.2": "30aa0cc15fb8", + "0.3.3": "30aa0cc15fb8" } }, "JigsawStackTextTranslate": { "versions": { "0.3.0": "46233e19961f", - "0.3.1": "46233e19961f" + "0.3.1": "46233e19961f", + "0.3.2": "46233e19961f", + "0.3.3": "46233e19961f" } }, "JigsawStackVOCR": { "versions": { "0.3.0": "a44491947ba7", - "0.3.1": "a44491947ba7" + "0.3.1": "a44491947ba7", + "0.3.2": "a44491947ba7", + "0.3.3": "a44491947ba7" } }, "CharacterTextSplitter": { "versions": { "0.3.0": "995b35c5296c", - "0.3.1": "995b35c5296c" + "0.3.1": "995b35c5296c", + "0.3.2": "995b35c5296c", + "0.3.3": "995b35c5296c" } }, "ConversationChain": { "versions": { "0.3.0": "b0e4044d3f08", - "0.3.1": "b0e4044d3f08" + "0.3.1": "b0e4044d3f08", + "0.3.2": "b0e4044d3f08", + "0.3.3": "b0e4044d3f08" } }, "CSVAgent": { "versions": { "0.3.0": "1888a727f9dd", - "0.3.1": "1888a727f9dd" + "0.3.1": "1888a727f9dd", + "0.3.2": "1888a727f9dd", + "0.3.3": "1888a727f9dd" } }, "LangChainFakeEmbeddings": { "versions": { "0.3.0": "faaa1be642a1", - "0.3.1": "faaa1be642a1" + "0.3.1": "faaa1be642a1", + "0.3.2": "faaa1be642a1", + "0.3.3": "faaa1be642a1" } }, "HtmlLinkExtractor": { "versions": { "0.3.0": "13cc6457f84c", - "0.3.1": "13cc6457f84c" + "0.3.1": "13cc6457f84c", + "0.3.2": "13cc6457f84c", + "0.3.3": "13cc6457f84c" } }, "JsonAgent": { "versions": { "0.3.0": "117a41e142c6", - "0.3.1": "117a41e142c6" + "0.3.1": "117a41e142c6", + "0.3.2": "117a41e142c6", + "0.3.3": "117a41e142c6" } }, "LangChain Hub Prompt": { "versions": { "0.3.0": "9f59bf236231", - "0.3.1": "9f59bf236231" + "0.3.1": "9f59bf236231", + "0.3.2": "9f59bf236231", + "0.3.3": "9f59bf236231" } }, "LanguageRecursiveTextSplitter": { "versions": { "0.3.0": "207a88b20a7e", - "0.3.1": "207a88b20a7e" + "0.3.1": "207a88b20a7e", + "0.3.2": "207a88b20a7e", + "0.3.3": "207a88b20a7e" } }, "SemanticTextSplitter": { "versions": { "0.3.0": "e9178757dea0", - "0.3.1": "e9178757dea0" + "0.3.1": "e9178757dea0", + "0.3.2": "e9178757dea0", + "0.3.3": "e9178757dea0" } }, "LLMCheckerChain": { "versions": { "0.3.0": "81aa2c9910db", - "0.3.1": "81aa2c9910db" + "0.3.1": "81aa2c9910db", + "0.3.2": "81aa2c9910db", + "0.3.3": "81aa2c9910db" } }, "LLMMathChain": { "versions": { "0.3.0": "422d8e0d4614", - "0.3.1": "422d8e0d4614" + "0.3.1": "422d8e0d4614", + "0.3.2": "422d8e0d4614", + "0.3.3": "422d8e0d4614" } }, "NaturalLanguageTextSplitter": { "versions": { "0.3.0": "aed1e0bb411e", - "0.3.1": "aed1e0bb411e" + "0.3.1": "aed1e0bb411e", + "0.3.2": "aed1e0bb411e", + "0.3.3": "aed1e0bb411e" } }, "OpenAIToolsAgent": { "versions": { "0.3.0": "21bfd16796e5", - "0.3.1": "21bfd16796e5" + "0.3.1": "21bfd16796e5", + "0.3.2": "21bfd16796e5", + "0.3.3": "21bfd16796e5" } }, "OpenAPIAgent": { "versions": { "0.3.0": "a4a7564100da", - "0.3.1": "a4a7564100da" + "0.3.1": "a4a7564100da", + "0.3.2": "a4a7564100da", + "0.3.3": "a4a7564100da" } }, "RecursiveCharacterTextSplitter": { "versions": { "0.3.0": "9ed58a212804", - "0.3.1": "9ed58a212804" + "0.3.1": "9ed58a212804", + "0.3.2": "9ed58a212804", + "0.3.3": "9ed58a212804" } }, "RetrievalQA": { "versions": { "0.3.0": "16c80b234abf", - "0.3.1": "16c80b234abf" + "0.3.1": "16c80b234abf", + "0.3.2": "16c80b234abf", + "0.3.3": "16c80b234abf" } }, "RunnableExecutor": { "versions": { "0.3.0": "32135f41efe5", - "0.3.1": "32135f41efe5" + "0.3.1": "32135f41efe5", + "0.3.2": "32135f41efe5", + "0.3.3": "32135f41efe5" } }, "SelfQueryRetriever": { "versions": { "0.3.0": "a18169f36371", - "0.3.1": "a18169f36371" + "0.3.1": "a18169f36371", + "0.3.2": "a18169f36371", + "0.3.3": "a18169f36371" } }, "SpiderTool": { "versions": { "0.3.0": "08c823a20237", - "0.3.1": "08c823a20237" + "0.3.1": "08c823a20237", + "0.3.2": "08c823a20237", + "0.3.3": "08c823a20237" } }, "SQLAgent": { "versions": { "0.3.0": "550c16461236", - "0.3.1": "550c16461236" + "0.3.1": "550c16461236", + "0.3.2": "550c16461236", + "0.3.3": "550c16461236" } }, "SQLDatabase": { "versions": { "0.3.0": "7d07b7faa341", - "0.3.1": "7d07b7faa341" + "0.3.1": "7d07b7faa341", + "0.3.2": "7d07b7faa341", + "0.3.3": "7d07b7faa341" } }, "SQLGenerator": { "versions": { "0.3.0": "971a82407ec6", - "0.3.1": "971a82407ec6" + "0.3.1": "971a82407ec6", + "0.3.2": "971a82407ec6", + "0.3.3": "971a82407ec6" } }, "ToolCallingAgent": { "versions": { "0.3.0": "cdeb13ac7430", - "0.3.1": "cdeb13ac7430" + "0.3.1": "cdeb13ac7430", + "0.3.2": "cdeb13ac7430", + "0.3.3": "cdeb13ac7430" } }, "VectorStoreInfo": { "versions": { "0.3.0": "62f06efeec2c", - "0.3.1": "62f06efeec2c" + "0.3.1": "62f06efeec2c", + "0.3.2": "62f06efeec2c", + "0.3.3": "62f06efeec2c" } }, "VectorStoreRouterAgent": { "versions": { "0.3.0": "b16515f6e722", - "0.3.1": "b16515f6e722" + "0.3.1": "b16515f6e722", + "0.3.2": "b16515f6e722", + "0.3.3": "b16515f6e722" } }, "XMLAgent": { "versions": { "0.3.0": "17a0cb4c48a8", - "0.3.1": "17a0cb4c48a8" + "0.3.1": "17a0cb4c48a8", + "0.3.2": "17a0cb4c48a8", + "0.3.3": "17a0cb4c48a8" } }, "LangWatchEvaluator": { "versions": { "0.3.0": "6db3bccd5945", - "0.3.1": "6db3bccd5945" + "0.3.1": "6db3bccd5945", + "0.3.2": "6db3bccd5945", + "0.3.3": "6db3bccd5945" } }, "BatchRunComponent": { "versions": { "0.3.0": "8b1ec3b03475", - "0.3.1": "8b1ec3b03475" + "0.3.1": "8b1ec3b03475", + "0.3.2": "8b1ec3b03475", + "0.3.3": "8b1ec3b03475" } }, "Smart Transform": { "versions": { "0.3.0": "0d3667d6d687", - "0.3.1": "0d3667d6d687" + "0.3.1": "0d3667d6d687", + "0.3.2": "0d3667d6d687", + "0.3.3": "0d3667d6d687" } }, "SmartRouter": { "versions": { "0.3.0": "86404d4beb95", - "0.3.1": "86404d4beb95" + "0.3.1": "86404d4beb95", + "0.3.2": "86404d4beb95", + "0.3.3": "86404d4beb95" } }, "LLMSelectorComponent": { "versions": { "0.3.0": "59de3f4015ff", - "0.3.1": "59de3f4015ff" + "0.3.1": "59de3f4015ff", + "0.3.2": "59de3f4015ff", + "0.3.3": "59de3f4015ff" } }, "StructuredOutput": { "versions": { "0.3.0": "058ca1f51e9f", - "0.3.1": "058ca1f51e9f" + "0.3.1": "058ca1f51e9f", + "0.3.2": "058ca1f51e9f", + "0.3.3": "058ca1f51e9f" } }, "LMStudioEmbeddingsComponent": { "versions": { "0.3.0": "ecd584b7a486", - "0.3.1": "ecd584b7a486" + "0.3.1": "ecd584b7a486", + "0.3.2": "ecd584b7a486", + "0.3.3": "ecd584b7a486" } }, "LMStudioModel": { "versions": { "0.3.0": "da4b3b155dc4", - "0.3.1": "da4b3b155dc4" + "0.3.1": "da4b3b155dc4", + "0.3.2": "da4b3b155dc4", + "0.3.3": "da4b3b155dc4" } }, "Maritalk": { "versions": { "0.3.0": "25c5da31181e", - "0.3.1": "25c5da31181e" + "0.3.1": "25c5da31181e", + "0.3.2": "25c5da31181e", + "0.3.3": "25c5da31181e" } }, "mem0_chat_memory": { "versions": { "0.3.0": "b6addbcccf9a", - "0.3.1": "b6addbcccf9a" + "0.3.1": "b6addbcccf9a", + "0.3.2": "b6addbcccf9a", + "0.3.3": "b6addbcccf9a" } }, "Milvus": { "versions": { "0.3.0": "2b5efe313b31", - "0.3.1": "2b5efe313b31" + "0.3.1": "2b5efe313b31", + "0.3.2": "2b5efe313b31", + "0.3.3": "2b5efe313b31" } }, "MistralModel": { "versions": { "0.3.0": "e21780948144", - "0.3.1": "e21780948144" + "0.3.1": "e21780948144", + "0.3.2": "e21780948144", + "0.3.3": "e21780948144" } }, "MistalAIEmbeddings": { "versions": { "0.3.0": "42ea92fd2df2", - "0.3.1": "42ea92fd2df2" + "0.3.1": "42ea92fd2df2", + "0.3.2": "42ea92fd2df2", + "0.3.3": "42ea92fd2df2" } }, "Agent": { "versions": { "0.3.0": "40d1976f4718", - "0.3.1": "40d1976f4718" + "0.3.1": "40d1976f4718", + "0.3.2": "40d1976f4718", + "0.3.3": "40d1976f4718" } }, "EmbeddingModel": { "versions": { "0.3.0": "b5cf1a06bba8", - "0.3.1": "b5cf1a06bba8" + "0.3.1": "b5cf1a06bba8", + "0.3.2": "b5cf1a06bba8", + "0.3.3": "b5cf1a06bba8" } }, "LanguageModelComponent": { "versions": { "0.3.0": "e9233312b063", - "0.3.1": "e9233312b063" + "0.3.1": "e9233312b063", + "0.3.2": "e9233312b063", + "0.3.3": "e9233312b063" } }, "MCPTools": { "versions": { "0.3.0": "a3700ab467a1", - "0.3.1": "a3700ab467a1" + "0.3.1": "a3700ab467a1", + "0.3.2": "a3700ab467a1", + "0.3.3": "a3700ab467a1" } }, "Memory": { "versions": { "0.3.0": "efd064ef48ff", - "0.3.1": "efd064ef48ff" + "0.3.1": "efd064ef48ff", + "0.3.2": "efd064ef48ff", + "0.3.3": "efd064ef48ff" } }, "Prompt Template": { "versions": { "0.3.0": "5b3e6730923e", - "0.3.1": "5b3e6730923e" + "0.3.1": "5b3e6730923e", + "0.3.2": "5b3e6730923e", + "0.3.3": "5b3e6730923e" } }, "MongoDBAtlasVector": { "versions": { "0.3.0": "3a502cb4d313", - "0.3.1": "3a502cb4d313" + "0.3.1": "3a502cb4d313", + "0.3.2": "3a502cb4d313", + "0.3.3": "3a502cb4d313" } }, "needle": { "versions": { "0.3.0": "5f6cedaa0217", - "0.3.1": "5f6cedaa0217" + "0.3.1": "5f6cedaa0217", + "0.3.2": "5f6cedaa0217", + "0.3.3": "5f6cedaa0217" } }, "NotDiamond": { "versions": { "0.3.0": "a26ebf501f67", - "0.3.1": "a26ebf501f67" + "0.3.1": "a26ebf501f67", + "0.3.2": "a26ebf501f67", + "0.3.3": "a26ebf501f67" } }, "NovitaModel": { "versions": { "0.3.0": "2142c4dd2b64", - "0.3.1": "2142c4dd2b64" + "0.3.1": "2142c4dd2b64", + "0.3.2": "2142c4dd2b64", + "0.3.3": "2142c4dd2b64" } }, "NVIDIAModelComponent": { "versions": { "0.3.0": "fd6cae31c2a0", - "0.3.1": "fd6cae31c2a0" + "0.3.1": "fd6cae31c2a0", + "0.3.2": "fd6cae31c2a0", + "0.3.3": "fd6cae31c2a0" } }, "NVIDIAEmbeddingsComponent": { "versions": { "0.3.0": "0fded038082d", - "0.3.1": "0fded038082d" + "0.3.1": "0fded038082d", + "0.3.2": "0fded038082d", + "0.3.3": "0fded038082d" } }, "NvidiaIngestComponent": { "versions": { "0.3.0": "ff0c6660d991", - "0.3.1": "ff0c6660d991" + "0.3.1": "ff0c6660d991", + "0.3.2": "ff0c6660d991", + "0.3.3": "ff0c6660d991" } }, "NvidiaRerankComponent": { "versions": { "0.3.0": "cf3976b241f1", - "0.3.1": "cf3976b241f1" + "0.3.1": "cf3976b241f1", + "0.3.2": "cf3976b241f1", + "0.3.3": "cf3976b241f1" } }, "NvidiaSystemAssistComponent": { "versions": { "0.3.0": "1affc5dcebe1", - "0.3.1": "1affc5dcebe1" + "0.3.1": "1affc5dcebe1", + "0.3.2": "1affc5dcebe1", + "0.3.3": "1affc5dcebe1" } }, "OlivyaComponent": { "versions": { "0.3.0": "b5a5c201c4e0", - "0.3.1": "b5a5c201c4e0" + "0.3.1": "b5a5c201c4e0", + "0.3.2": "b5a5c201c4e0", + "0.3.3": "b5a5c201c4e0" } }, "OllamaModel": { "versions": { "0.3.0": "cd3dc38272a7", - "0.3.1": "cd3dc38272a7" + "0.3.1": "cd3dc38272a7", + "0.3.2": "cd3dc38272a7", + "0.3.3": "cd3dc38272a7" } }, "OllamaEmbeddings": { "versions": { "0.3.0": "a8c56d0835de", - "0.3.1": "a8c56d0835de" + "0.3.1": "a8c56d0835de", + "0.3.2": "a8c56d0835de", + "0.3.3": "a8c56d0835de" } }, "OpenAIEmbeddings": { "versions": { "0.3.0": "8a658ed6d4c9", - "0.3.1": "8a658ed6d4c9" + "0.3.1": "8a658ed6d4c9", + "0.3.2": "8a658ed6d4c9", + "0.3.3": "8a658ed6d4c9" } }, "OpenAIModel": { "versions": { "0.3.0": "128d8ef661d4", - "0.3.1": "128d8ef661d4" + "0.3.1": "128d8ef661d4", + "0.3.2": "128d8ef661d4", + "0.3.3": "128d8ef661d4" } }, "OpenRouterComponent": { "versions": { "0.3.0": "83c3c312a7a2", - "0.3.1": "83c3c312a7a2" + "0.3.1": "83c3c312a7a2", + "0.3.2": "83c3c312a7a2", + "0.3.3": "83c3c312a7a2" } }, "PerplexityModel": { "versions": { "0.3.0": "b970844e376e", - "0.3.1": "b970844e376e" + "0.3.1": "b970844e376e", + "0.3.2": "b970844e376e", + "0.3.3": "b970844e376e" } }, "pgvector": { "versions": { "0.3.0": "50117607bf5e", - "0.3.1": "50117607bf5e" + "0.3.1": "50117607bf5e", + "0.3.2": "50117607bf5e", + "0.3.3": "50117607bf5e" } }, "Pinecone": { "versions": { "0.3.0": "564ca0a0e9ab", - "0.3.1": "564ca0a0e9ab" + "0.3.1": "564ca0a0e9ab", + "0.3.2": "564ca0a0e9ab", + "0.3.3": "564ca0a0e9ab" } }, "AlterMetadata": { "versions": { "0.3.0": "0b2fe62eaec4", - "0.3.1": "0b2fe62eaec4" + "0.3.1": "0b2fe62eaec4", + "0.3.2": "0b2fe62eaec4", + "0.3.3": "0b2fe62eaec4" } }, "CombineText": { "versions": { "0.3.0": "10ffb6543dd9", - "0.3.1": "10ffb6543dd9" + "0.3.1": "10ffb6543dd9", + "0.3.2": "10ffb6543dd9", + "0.3.3": "10ffb6543dd9" } }, "TypeConverterComponent": { "versions": { "0.3.0": "be7797f8df1c", - "0.3.1": "be7797f8df1c" + "0.3.1": "be7797f8df1c", + "0.3.2": "be7797f8df1c", + "0.3.3": "be7797f8df1c" } }, "CreateData": { "versions": { "0.3.0": "3e313525090d", - "0.3.1": "3e313525090d" + "0.3.1": "3e313525090d", + "0.3.2": "3e313525090d", + "0.3.3": "3e313525090d" } }, "CreateList": { "versions": { "0.3.0": "9ec770d03310", - "0.3.1": "9ec770d03310" + "0.3.1": "9ec770d03310", + "0.3.2": "9ec770d03310", + "0.3.3": "9ec770d03310" } }, "DataOperations": { "versions": { "0.3.0": "1e5bfda1706b", - "0.3.1": "1e5bfda1706b" + "0.3.1": "1e5bfda1706b", + "0.3.2": "1e5bfda1706b", + "0.3.3": "1e5bfda1706b" } }, "DataToDataFrame": { "versions": { "0.3.0": "57b9f79028e9", - "0.3.1": "57b9f79028e9" + "0.3.1": "57b9f79028e9", + "0.3.2": "57b9f79028e9", + "0.3.3": "57b9f79028e9" } }, "DataFrameOperations": { "versions": { "0.3.0": "904f4eaebccd", - "0.3.1": "904f4eaebccd" + "0.3.1": "904f4eaebccd", + "0.3.2": "904f4eaebccd", + "0.3.3": "904f4eaebccd" } }, "DynamicCreateData": { "versions": { "0.3.0": "0457c4acdf45", - "0.3.1": "0457c4acdf45" + "0.3.1": "0457c4acdf45", + "0.3.2": "0457c4acdf45", + "0.3.3": "0457c4acdf45" } }, "ExtractaKey": { "versions": { "0.3.0": "eded3f4e1533", - "0.3.1": "eded3f4e1533" + "0.3.1": "eded3f4e1533", + "0.3.2": "eded3f4e1533", + "0.3.3": "eded3f4e1533" } }, "FilterData": { "versions": { "0.3.0": "04c50937216d", - "0.3.1": "04c50937216d" + "0.3.1": "04c50937216d", + "0.3.2": "04c50937216d", + "0.3.3": "04c50937216d" } }, "FilterDataValues": { "versions": { "0.3.0": "847522549c67", - "0.3.1": "847522549c67" + "0.3.1": "847522549c67", + "0.3.2": "847522549c67", + "0.3.3": "847522549c67" } }, "JSONCleaner": { "versions": { "0.3.0": "5c150997aec4", - "0.3.1": "5c150997aec4" + "0.3.1": "5c150997aec4", + "0.3.2": "5c150997aec4", + "0.3.3": "5c150997aec4" } }, "MergeDataComponent": { "versions": { "0.3.0": "a2ecb813aac5", - "0.3.1": "a2ecb813aac5" + "0.3.1": "a2ecb813aac5", + "0.3.2": "a2ecb813aac5", + "0.3.3": "a2ecb813aac5" } }, "MessagetoData": { "versions": { "0.3.0": "d0af1222aeaf", - "0.3.1": "d0af1222aeaf" + "0.3.1": "d0af1222aeaf", + "0.3.2": "d0af1222aeaf", + "0.3.3": "d0af1222aeaf" } }, "OutputParser": { "versions": { "0.3.0": "9beb62a3e8fb", - "0.3.1": "9beb62a3e8fb" + "0.3.1": "9beb62a3e8fb", + "0.3.2": "9beb62a3e8fb", + "0.3.3": "9beb62a3e8fb" } }, "ParseData": { "versions": { "0.3.0": "3fac44a9bb37", - "0.3.1": "3fac44a9bb37" + "0.3.1": "3fac44a9bb37", + "0.3.2": "3fac44a9bb37", + "0.3.3": "3fac44a9bb37" } }, "ParseDataFrame": { "versions": { "0.3.0": "9d4b05cf1564", - "0.3.1": "9d4b05cf1564" + "0.3.1": "9d4b05cf1564", + "0.3.2": "9d4b05cf1564", + "0.3.3": "9d4b05cf1564" } }, "ParseJSONData": { "versions": { "0.3.0": "5268ca4c42d6", - "0.3.1": "5268ca4c42d6" + "0.3.1": "5268ca4c42d6", + "0.3.2": "5268ca4c42d6", + "0.3.3": "5268ca4c42d6" } }, "ParserComponent": { "versions": { "0.3.0": "3cda25c3f7b5", - "0.3.1": "3cda25c3f7b5" + "0.3.1": "3cda25c3f7b5", + "0.3.2": "3cda25c3f7b5", + "0.3.3": "3cda25c3f7b5" } }, "RegexExtractorComponent": { "versions": { "0.3.0": "f67d7bd7f65e", - "0.3.1": "f67d7bd7f65e" + "0.3.1": "f67d7bd7f65e", + "0.3.2": "f67d7bd7f65e", + "0.3.3": "f67d7bd7f65e" } }, "SelectData": { "versions": { "0.3.0": "0512bd98ce4d", - "0.3.1": "0512bd98ce4d" + "0.3.1": "0512bd98ce4d", + "0.3.2": "0512bd98ce4d", + "0.3.3": "0512bd98ce4d" } }, "SplitText": { "versions": { "0.3.0": "29ae597d2d86", - "0.3.1": "29ae597d2d86" + "0.3.1": "29ae597d2d86", + "0.3.2": "29ae597d2d86", + "0.3.3": "29ae597d2d86" } }, "StoreMessage": { "versions": { "0.3.0": "9ad1aa08b597", - "0.3.1": "9ad1aa08b597" + "0.3.1": "9ad1aa08b597", + "0.3.2": "9ad1aa08b597", + "0.3.3": "9ad1aa08b597" } }, "TextOperations": { "versions": { "0.3.0": "2c2991ef0a37", - "0.3.1": "2c2991ef0a37" + "0.3.1": "2c2991ef0a37", + "0.3.2": "2c2991ef0a37", + "0.3.3": "2c2991ef0a37" } }, "UpdateData": { "versions": { "0.3.0": "d0790af3ac9b", - "0.3.1": "d0790af3ac9b" + "0.3.1": "d0790af3ac9b", + "0.3.2": "d0790af3ac9b", + "0.3.3": "d0790af3ac9b" } }, "PythonFunction": { "versions": { "0.3.0": "7da7d856a545", - "0.3.1": "7da7d856a545" + "0.3.1": "7da7d856a545", + "0.3.2": "7da7d856a545", + "0.3.3": "7da7d856a545" } }, "QdrantVectorStoreComponent": { "versions": { "0.3.0": "bcfc1728e7b1", - "0.3.1": "bcfc1728e7b1" + "0.3.1": "bcfc1728e7b1", + "0.3.2": "bcfc1728e7b1", + "0.3.3": "bcfc1728e7b1" } }, "Redis": { "versions": { "0.3.0": "fec4041f4017", - "0.3.1": "fec4041f4017" + "0.3.1": "fec4041f4017", + "0.3.2": "fec4041f4017", + "0.3.3": "fec4041f4017" } }, "RedisChatMemory": { "versions": { "0.3.0": "01ec6e1e34a8", - "0.3.1": "01ec6e1e34a8" + "0.3.1": "01ec6e1e34a8", + "0.3.2": "01ec6e1e34a8", + "0.3.3": "01ec6e1e34a8" } }, "SambaNovaModel": { "versions": { "0.3.0": "f12728900b8d", - "0.3.1": "f12728900b8d" + "0.3.1": "f12728900b8d", + "0.3.2": "f12728900b8d", + "0.3.3": "f12728900b8d" } }, "ScrapeGraphMarkdownifyApi": { "versions": { "0.3.0": "0f5f12091af6", - "0.3.1": "0f5f12091af6" + "0.3.1": "0f5f12091af6", + "0.3.2": "0f5f12091af6", + "0.3.3": "0f5f12091af6" } }, "ScrapeGraphSearchApi": { "versions": { "0.3.0": "002d2af653ef", - "0.3.1": "002d2af653ef" + "0.3.1": "002d2af653ef", + "0.3.2": "002d2af653ef", + "0.3.3": "002d2af653ef" } }, "ScrapeGraphSmartScraperApi": { "versions": { "0.3.0": "cb419bec02ed", - "0.3.1": "cb419bec02ed" + "0.3.1": "cb419bec02ed", + "0.3.2": "cb419bec02ed", + "0.3.3": "cb419bec02ed" } }, "SearchComponent": { "versions": { "0.3.0": "625d1f5b3290", - "0.3.1": "625d1f5b3290" + "0.3.1": "625d1f5b3290", + "0.3.2": "625d1f5b3290", + "0.3.3": "625d1f5b3290" } }, "Serp": { "versions": { "0.3.0": "dcc2ecb44ff6", - "0.3.1": "dcc2ecb44ff6" + "0.3.1": "dcc2ecb44ff6", + "0.3.2": "dcc2ecb44ff6", + "0.3.3": "dcc2ecb44ff6" } }, "SupabaseVectorStore": { "versions": { "0.3.0": "5045b81c340b", - "0.3.1": "5045b81c340b" + "0.3.1": "5045b81c340b", + "0.3.2": "5045b81c340b", + "0.3.3": "5045b81c340b" } }, "TavilyExtractComponent": { "versions": { "0.3.0": "fec95e2181d8", - "0.3.1": "fec95e2181d8" + "0.3.1": "fec95e2181d8", + "0.3.2": "fec95e2181d8", + "0.3.3": "fec95e2181d8" } }, "TavilySearchComponent": { "versions": { "0.3.0": "e602eaec8316", - "0.3.1": "e602eaec8316" + "0.3.1": "e602eaec8316", + "0.3.2": "e602eaec8316", + "0.3.3": "e602eaec8316" } }, "CalculatorTool": { "versions": { "0.3.0": "30008a17eb27", - "0.3.1": "30008a17eb27" + "0.3.1": "30008a17eb27", + "0.3.2": "30008a17eb27", + "0.3.3": "30008a17eb27" } }, "GoogleSearchAPI": { "versions": { "0.3.0": "5f47bcd2163c", - "0.3.1": "5f47bcd2163c" + "0.3.1": "5f47bcd2163c", + "0.3.2": "5f47bcd2163c", + "0.3.3": "5f47bcd2163c" } }, "GoogleSerperAPI": { "versions": { "0.3.0": "f51b15d26440", - "0.3.1": "f51b15d26440" + "0.3.1": "f51b15d26440", + "0.3.2": "f51b15d26440", + "0.3.3": "f51b15d26440" } }, "PythonCodeStructuredTool": { "versions": { "0.3.0": "99f294af525b", - "0.3.1": "99f294af525b" + "0.3.1": "99f294af525b", + "0.3.2": "99f294af525b", + "0.3.3": "99f294af525b" } }, "PythonREPLTool": { "versions": { "0.3.0": "695ab612478d", - "0.3.1": "695ab612478d" + "0.3.1": "695ab612478d", + "0.3.2": "695ab612478d", + "0.3.3": "695ab612478d" } }, "SearchAPI": { "versions": { "0.3.0": "4a9c8b914b68", - "0.3.1": "4a9c8b914b68" + "0.3.1": "4a9c8b914b68", + "0.3.2": "4a9c8b914b68", + "0.3.3": "4a9c8b914b68" } }, "SearXNGTool": { "versions": { "0.3.0": "154e292dad2b", - "0.3.1": "154e292dad2b" + "0.3.1": "154e292dad2b", + "0.3.2": "154e292dad2b", + "0.3.3": "154e292dad2b" } }, "SerpAPI": { "versions": { "0.3.0": "882d7b35a9d7", - "0.3.1": "882d7b35a9d7" + "0.3.1": "882d7b35a9d7", + "0.3.2": "882d7b35a9d7", + "0.3.3": "882d7b35a9d7" } }, "TavilyAISearch": { "versions": { "0.3.0": "70b5611e8fd6", - "0.3.1": "70b5611e8fd6" + "0.3.1": "70b5611e8fd6", + "0.3.2": "70b5611e8fd6", + "0.3.3": "70b5611e8fd6" } }, "WikidataAPI": { "versions": { "0.3.0": "4752066f8971", - "0.3.1": "4752066f8971" + "0.3.1": "4752066f8971", + "0.3.2": "4752066f8971", + "0.3.3": "4752066f8971" } }, "WikipediaAPI": { "versions": { "0.3.0": "d7ae953444c9", - "0.3.1": "d7ae953444c9" + "0.3.1": "d7ae953444c9", + "0.3.2": "d7ae953444c9", + "0.3.3": "d7ae953444c9" } }, "YahooFinanceTool": { "versions": { "0.3.0": "fda358f6395e", - "0.3.1": "fda358f6395e" + "0.3.1": "fda358f6395e", + "0.3.2": "fda358f6395e", + "0.3.3": "fda358f6395e" } }, "ConvertAstraToTwelveLabs": { "versions": { "0.3.0": "90ad7b9b59eb", - "0.3.1": "90ad7b9b59eb" + "0.3.1": "90ad7b9b59eb", + "0.3.2": "90ad7b9b59eb", + "0.3.3": "90ad7b9b59eb" } }, "TwelveLabsPegasusIndexVideo": { "versions": { "0.3.0": "a2c0865be096", - "0.3.1": "a2c0865be096" + "0.3.1": "a2c0865be096", + "0.3.2": "a2c0865be096", + "0.3.3": "a2c0865be096" } }, "SplitVideo": { "versions": { "0.3.0": "4d3a4a724aa5", - "0.3.1": "4d3a4a724aa5" + "0.3.1": "4d3a4a724aa5", + "0.3.2": "4d3a4a724aa5", + "0.3.3": "4d3a4a724aa5" } }, "TwelveLabsTextEmbeddings": { "versions": { "0.3.0": "5c7501f5088c", - "0.3.1": "5c7501f5088c" + "0.3.1": "5c7501f5088c", + "0.3.2": "5c7501f5088c", + "0.3.3": "5c7501f5088c" } }, "TwelveLabsPegasus": { "versions": { "0.3.0": "92cc032822a6", - "0.3.1": "92cc032822a6" + "0.3.1": "92cc032822a6", + "0.3.2": "92cc032822a6", + "0.3.3": "92cc032822a6" } }, "TwelveLabsVideoEmbeddings": { "versions": { "0.3.0": "294e3539629c", - "0.3.1": "294e3539629c" + "0.3.1": "294e3539629c", + "0.3.2": "294e3539629c", + "0.3.3": "294e3539629c" } }, "VideoFile": { "versions": { "0.3.0": "8dc827e42377", - "0.3.1": "8dc827e42377" + "0.3.1": "8dc827e42377", + "0.3.2": "8dc827e42377", + "0.3.3": "8dc827e42377" } }, "Unstructured": { "versions": { "0.3.0": "bbb4e71aee8e", - "0.3.1": "bbb4e71aee8e" + "0.3.1": "bbb4e71aee8e", + "0.3.2": "bbb4e71aee8e", + "0.3.3": "bbb4e71aee8e" } }, "Upstash": { "versions": { "0.3.0": "b5b2d78e8c44", - "0.3.1": "b5b2d78e8c44" + "0.3.1": "b5b2d78e8c44", + "0.3.2": "b5b2d78e8c44", + "0.3.3": "b5b2d78e8c44" } }, "CalculatorComponent": { "versions": { "0.3.0": "acbe2603b034", - "0.3.1": "acbe2603b034" + "0.3.1": "acbe2603b034", + "0.3.2": "acbe2603b034", + "0.3.3": "acbe2603b034" } }, "CurrentDate": { "versions": { "0.3.0": "4a93d7b489e6", - "0.3.1": "4a93d7b489e6" + "0.3.1": "4a93d7b489e6", + "0.3.2": "4a93d7b489e6", + "0.3.3": "4a93d7b489e6" } }, "IDGenerator": { "versions": { "0.3.0": "cddb8b4edbc3", - "0.3.1": "cddb8b4edbc3" + "0.3.1": "cddb8b4edbc3", + "0.3.2": "cddb8b4edbc3", + "0.3.3": "cddb8b4edbc3" } }, "PythonREPLComponent": { "versions": { "0.3.0": "80eeaf032b83", - "0.3.1": "80eeaf032b83" + "0.3.1": "80eeaf032b83", + "0.3.2": "80eeaf032b83", + "0.3.3": "80eeaf032b83" } }, "Vectara": { "versions": { "0.3.0": "a2309e046c06", - "0.3.1": "a2309e046c06" + "0.3.1": "a2309e046c06", + "0.3.2": "a2309e046c06", + "0.3.3": "a2309e046c06" } }, "VectaraRAG": { "versions": { "0.3.0": "123c9eef9191", - "0.3.1": "123c9eef9191" + "0.3.1": "123c9eef9191", + "0.3.2": "123c9eef9191", + "0.3.3": "123c9eef9191" } }, "LocalDB": { "versions": { "0.3.0": "767988a11f4a", - "0.3.1": "767988a11f4a" + "0.3.1": "767988a11f4a", + "0.3.2": "767988a11f4a", + "0.3.3": "767988a11f4a" } }, "VertexAiModel": { "versions": { "0.3.0": "d9f75281d3fa", - "0.3.1": "d9f75281d3fa" + "0.3.1": "d9f75281d3fa", + "0.3.2": "d9f75281d3fa", + "0.3.3": "d9f75281d3fa" } }, "VertexAIEmbeddings": { "versions": { "0.3.0": "3abd5c15264a", - "0.3.1": "3abd5c15264a" + "0.3.1": "3abd5c15264a", + "0.3.2": "3abd5c15264a", + "0.3.3": "3abd5c15264a" } }, "vLLMModel": { "versions": { "0.3.0": "ed6c1aa73200", - "0.3.1": "ed6c1aa73200" + "0.3.1": "ed6c1aa73200", + "0.3.2": "ed6c1aa73200", + "0.3.3": "ed6c1aa73200" } }, "vLLMEmbeddings": { "versions": { "0.3.0": "079b6a2dd397", - "0.3.1": "079b6a2dd397" + "0.3.1": "079b6a2dd397", + "0.3.2": "079b6a2dd397", + "0.3.3": "079b6a2dd397" } }, "VLMRunTranscription": { "versions": { "0.3.0": "c91e2349a3df", - "0.3.1": "c91e2349a3df" + "0.3.1": "c91e2349a3df", + "0.3.2": "c91e2349a3df", + "0.3.3": "c91e2349a3df" } }, "Weaviate": { "versions": { "0.3.0": "ccc9f1e0149d", - "0.3.1": "ccc9f1e0149d" + "0.3.1": "ccc9f1e0149d", + "0.3.2": "ccc9f1e0149d", + "0.3.3": "ccc9f1e0149d" } }, "WikidataComponent": { "versions": { "0.3.0": "59df9d399440", - "0.3.1": "59df9d399440" + "0.3.1": "59df9d399440", + "0.3.2": "59df9d399440", + "0.3.3": "59df9d399440" } }, "WikipediaComponent": { "versions": { "0.3.0": "cc13e26c79c4", - "0.3.1": "cc13e26c79c4" + "0.3.1": "cc13e26c79c4", + "0.3.2": "cc13e26c79c4", + "0.3.3": "cc13e26c79c4" } }, "WolframAlphaAPI": { "versions": { "0.3.0": "86caf22224ad", - "0.3.1": "86caf22224ad" + "0.3.1": "86caf22224ad", + "0.3.2": "86caf22224ad", + "0.3.3": "86caf22224ad" } }, "xAIModel": { "versions": { "0.3.0": "ef0eb1cfadeb", - "0.3.1": "ef0eb1cfadeb" + "0.3.1": "ef0eb1cfadeb", + "0.3.2": "ef0eb1cfadeb", + "0.3.3": "ef0eb1cfadeb" } }, "YfinanceComponent": { "versions": { "0.3.0": "d6bf628ab821", - "0.3.1": "d6bf628ab821" + "0.3.1": "d6bf628ab821", + "0.3.2": "d6bf628ab821", + "0.3.3": "d6bf628ab821" } }, "YouTubeChannelComponent": { "versions": { "0.3.0": "c889afb883fa", - "0.3.1": "c889afb883fa" + "0.3.1": "c889afb883fa", + "0.3.2": "c889afb883fa", + "0.3.3": "c889afb883fa" } }, "YouTubeCommentsComponent": { "versions": { "0.3.0": "20398e0d18df", - "0.3.1": "20398e0d18df" + "0.3.1": "20398e0d18df", + "0.3.2": "20398e0d18df", + "0.3.3": "20398e0d18df" } }, "YouTubePlaylistComponent": { "versions": { "0.3.0": "2d6ac9665d53", - "0.3.1": "2d6ac9665d53" + "0.3.1": "2d6ac9665d53", + "0.3.2": "2d6ac9665d53", + "0.3.3": "2d6ac9665d53" } }, "YouTubeSearchComponent": { "versions": { "0.3.0": "1c4a94a094e2", - "0.3.1": "1c4a94a094e2" + "0.3.1": "1c4a94a094e2", + "0.3.2": "1c4a94a094e2", + "0.3.3": "1c4a94a094e2" } }, "YouTubeTrendingComponent": { "versions": { "0.3.0": "1450a5529486", - "0.3.1": "1450a5529486" + "0.3.1": "1450a5529486", + "0.3.2": "1450a5529486", + "0.3.3": "1450a5529486" } }, "YouTubeVideoDetailsComponent": { "versions": { "0.3.0": "6c2be0d5450b", - "0.3.1": "6c2be0d5450b" + "0.3.1": "6c2be0d5450b", + "0.3.2": "6c2be0d5450b", + "0.3.3": "6c2be0d5450b" } }, "YouTubeTranscripts": { "versions": { "0.3.0": "0ed75539d58d", - "0.3.1": "0ed75539d58d" + "0.3.1": "0ed75539d58d", + "0.3.2": "0ed75539d58d", + "0.3.3": "0ed75539d58d" } }, "ZepChatMemory": { "versions": { "0.3.0": "ec825c33caf6", - "0.3.1": "ec825c33caf6" + "0.3.1": "ec825c33caf6", + "0.3.2": "ec825c33caf6", + "0.3.3": "ec825c33caf6" } }, "GuardrailValidator": { "versions": { "0.3.0": "70918cbb8522", - "0.3.1": "70918cbb8522" + "0.3.1": "70918cbb8522", + "0.3.2": "70918cbb8522", + "0.3.3": "70918cbb8522" } }, "LiteLLMProxyModel": { "versions": { "0.3.0": "386ae52865b5", - "0.3.1": "386ae52865b5" + "0.3.1": "386ae52865b5", + "0.3.2": "386ae52865b5", + "0.3.3": "386ae52865b5" } }, "SemanticAggregator": { "versions": { "0.3.0": "4e631c501d33", - "0.3.1": "4e631c501d33" + "0.3.1": "4e631c501d33", + "0.3.2": "4e631c501d33", + "0.3.3": "4e631c501d33" } }, "SemanticMap": { "versions": { "0.3.0": "9fe34c926467", - "0.3.1": "9fe34c926467" + "0.3.1": "9fe34c926467", + "0.3.2": "9fe34c926467", + "0.3.3": "9fe34c926467" } }, "SyntheticDataGenerator": { "versions": { "0.3.0": "efd180878996", - "0.3.1": "efd180878996" + "0.3.1": "efd180878996", + "0.3.2": "efd180878996", + "0.3.3": "efd180878996" } }, "KnowledgeBase": { "versions": { "0.3.0": "8b5ca1f38f6e", - "0.3.1": "8b5ca1f38f6e" + "0.3.1": "8b5ca1f38f6e", + "0.3.2": "8b5ca1f38f6e", + "0.3.3": "8b5ca1f38f6e" } } } \ No newline at end of file diff --git a/src/lfx/src/lfx/base/models/unified_models.py b/src/lfx/src/lfx/base/models/unified_models.py index ca4c8ad73d..d0570da984 100644 --- a/src/lfx/src/lfx/base/models/unified_models.py +++ b/src/lfx/src/lfx/base/models/unified_models.py @@ -280,14 +280,26 @@ def apply_provider_variable_config_to_build_config( env_var_key = var_info.get("variable_key") if env_var_key: env_value = os.environ.get(env_var_key) + # Only set the value if the field is currently empty or not already set to load from db + # This prevents overwriting user-selected global variables + current_value = field_config.get("value") + current_load_from_db = field_config.get("load_from_db", False) + if env_value and str(env_value).strip(): - field_config["value"] = env_var_key - field_config["load_from_db"] = True - logger.debug( - "Set field %s to env var name %s (value resolved at runtime)", - field_name, - env_var_key, - ) + # Only auto-set if field is empty or not already loading from db + if not current_value or (not current_load_from_db): + field_config["value"] = env_var_key + field_config["load_from_db"] = True + logger.debug( + "Set field %s to env var name %s (value resolved at runtime)", + field_name, + env_var_key, + ) + else: + logger.debug( + "Skipping auto-set for field %s - user has already selected a value (load_from_db=True)", + field_name, + ) return build_config @@ -503,20 +515,31 @@ def get_api_key_for_provider(user_id: UUID | str | None, provider: str, api_key: if not variable_name: return None - # Try to get from global variables + # Try to get from global variables, fall back to environment async def _get_variable(): async with session_scope() as session: variable_service = get_variable_service() if variable_service is None: return None - return await variable_service.get_variable( - user_id=UUID(user_id) if isinstance(user_id, str) else user_id, - name=variable_name, - field="", - session=session, - ) + try: + return await variable_service.get_variable( + user_id=UUID(user_id) if isinstance(user_id, str) else user_id, + name=variable_name, + field="", + session=session, + ) + except ValueError: + return None - return run_until_complete(_get_variable()) + try: + api_key = run_until_complete(_get_variable()) + except (ValueError, Exception): # noqa: BLE001 + api_key = None + + if api_key: + return api_key + + return os.getenv(variable_name) def get_all_variables_for_provider(user_id: UUID | str | None, provider: str) -> dict[str, str]: diff --git a/src/lfx/src/lfx/components/FAISS/faiss.py b/src/lfx/src/lfx/components/FAISS/faiss.py index 7d4fd6f1c3..b7f0cca05b 100644 --- a/src/lfx/src/lfx/components/FAISS/faiss.py +++ b/src/lfx/src/lfx/components/FAISS/faiss.py @@ -31,10 +31,10 @@ class FaissVectorStoreComponent(LCVectorStoreComponent): BoolInput( name="allow_dangerous_deserialization", display_name="Allow Dangerous Deserialization", - info="Set to True to allow loading pickle files from untrusted sources. " - "Only enable this if you trust the source of the data.", + info="Set to True to allow loading pickle files. WARNING: Only enable this if you trust the source " + "of the data. Malicious pickle files can execute arbitrary code on your system.", advanced=True, - value=True, + value=False, ), HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]), IntInput( diff --git a/src/lfx/tests/unit/components/test_faiss_vector_store_component.py b/src/lfx/tests/unit/components/test_faiss_vector_store_component.py new file mode 100644 index 0000000000..2a95069413 --- /dev/null +++ b/src/lfx/tests/unit/components/test_faiss_vector_store_component.py @@ -0,0 +1,37 @@ +"""Regression tests for FaissVectorStoreComponent security defaults.""" + +import pytest + +pytest.importorskip("langchain_community") + +from lfx.components.FAISS.faiss import FaissVectorStoreComponent +from lfx.io import BoolInput + + +class TestFaissVectorStoreComponentDefaults: + """Regression tests ensuring FAISS component security defaults do not regress.""" + + def test_allow_dangerous_deserialization_defaults_to_false(self): + """Regression test: allow_dangerous_deserialization must default to False. + + This guards against accidentally re-enabling unsafe pickle deserialization + (RCE vulnerability PVR0699083). Do not change this default to True. + """ + input_def = next( + inp + for inp in FaissVectorStoreComponent.inputs + if isinstance(inp, BoolInput) and inp.name == "allow_dangerous_deserialization" + ) + assert input_def.value is False, ( + "allow_dangerous_deserialization must default to False to prevent RCE via malicious pickle files. " + "See security issue PVR0699083." + ) + + def test_allow_dangerous_deserialization_is_advanced(self): + """allow_dangerous_deserialization should be an advanced field to reduce accidental enabling.""" + input_def = next( + inp + for inp in FaissVectorStoreComponent.inputs + if isinstance(inp, BoolInput) and inp.name == "allow_dangerous_deserialization" + ) + assert input_def.advanced is True diff --git a/uv.lock b/uv.lock index 671de4a15d..5865ff6b7d 100644 --- a/uv.lock +++ b/uv.lock @@ -3945,6 +3945,7 @@ dependencies = [ { name = "griffecli" }, { name = "griffelib" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/04/56/28a0accac339c164b52a92c6cfc45a903acc0c174caa5c1713803467b533/griffe-2.0.0.tar.gz", hash = "sha256:c68979cd8395422083a51ea7cf02f9c119d889646d99b7b656ee43725de1b80f", size = 293906, upload-time = "2026-03-23T21:06:53.402Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8b/94/ee21d41e7eb4f823b94603b9d40f86d3c7fde80eacc2c3c71845476dddaa/griffe-2.0.0-py3-none-any.whl", hash = "sha256:5418081135a391c3e6e757a7f3f156f1a1a746cc7b4023868ff7d5e2f9a980aa", size = 5214, upload-time = "2026-02-09T19:09:44.105Z" }, ] @@ -3957,6 +3958,7 @@ dependencies = [ { name = "colorama" }, { name = "griffelib" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/a4/f8/2e129fd4a86e52e58eefe664de05e7d502decf766e7316cc9e70fdec3e18/griffecli-2.0.0.tar.gz", hash = "sha256:312fa5ebb4ce6afc786356e2d0ce85b06c1c20d45abc42d74f0cda65e159f6ef", size = 56213, upload-time = "2026-03-23T21:06:54.8Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e6/ed/d93f7a447bbf7a935d8868e9617cbe1cadf9ee9ee6bd275d3040fbf93d60/griffecli-2.0.0-py3-none-any.whl", hash = "sha256:9f7cd9ee9b21d55e91689358978d2385ae65c22f307a63fb3269acf3f21e643d", size = 9345, upload-time = "2026-02-09T19:09:42.554Z" }, ] @@ -3965,6 +3967,7 @@ wheels = [ name = "griffelib" version = "2.0.0" source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/06/eccbd311c9e2b3ca45dbc063b93134c57a1ccc7607c5e545264ad092c4a9/griffelib-2.0.0.tar.gz", hash = "sha256:e504d637a089f5cab9b5daf18f7645970509bf4f53eda8d79ed71cce8bd97934", size = 166312, upload-time = "2026-03-23T21:06:55.954Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/4d/51/c936033e16d12b627ea334aaaaf42229c37620d0f15593456ab69ab48161/griffelib-2.0.0-py3-none-any.whl", hash = "sha256:01284878c966508b6d6f1dbff9b6fa607bc062d8261c5c7253cb285b06422a7f", size = 142004, upload-time = "2026-02-09T19:09:40.561Z" }, ] @@ -5738,7 +5741,7 @@ wheels = [ [[package]] name = "langflow" -version = "1.8.2" +version = "1.8.3" source = { editable = "." } dependencies = [ { name = "langflow-base", extra = ["complete"] }, @@ -5916,7 +5919,7 @@ dev = [ [[package]] name = "langflow-base" -version = "0.8.2" +version = "0.8.3" source = { editable = "src/backend/base" } dependencies = [ { name = "aiofile" }, @@ -7096,7 +7099,7 @@ wheels = [ [[package]] name = "lfx" -version = "0.3.2" +version = "0.3.3" source = { editable = "src/lfx" } dependencies = [ { name = "ag-ui-protocol" },