From bc2bf9a96204ae99cc60decac05017aa99a8d128 Mon Sep 17 00:00:00 2001 From: Jordan Frazier Date: Thu, 13 Nov 2025 12:24:37 -0500 Subject: [PATCH 01/25] updates for version comp --- pyproject.toml | 7 +- .../base/langflow/api/v1/mcp_projects.py | 7 +- src/backend/base/pyproject.toml | 6 +- src/lfx/pyproject.toml | 2 +- .../src/lfx/services/mcp_composer/service.py | 34 +- uv.lock | 570 ++++++++++++++---- 6 files changed, 484 insertions(+), 142 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9c41b0dac7f7..66648288e16f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ dependencies = [ "pyarrow==19.0.0", "wikipedia==1.4.0", "qdrant-client==1.9.2", - "weaviate-client==4.10.2", + "weaviate-client>=4.10.2", "faiss-cpu==1.9.0.post1", "types-cachetools>=5.5.0.20240820,<6.0.0", "pymongo==4.10.1", @@ -37,7 +37,7 @@ dependencies = [ 'fastavro>=1.9.8,<2.0.0; python_version >= "3.13"', "redis>=5.2.1,<6.0.0", "metaphor-python==0.1.23", - 'pywin32==307; sys_platform == "win32"', + 'pywin32>=307; sys_platform == "win32"', "langfuse==2.53.9", "metal_sdk==2.5.1", "MarkupSafe==3.0.2", @@ -105,7 +105,8 @@ dependencies = [ "arize-phoenix-otel>=0.6.1,<1.0.0", "openinference-instrumentation-langchain>=0.1.29,<0.1.52", # "crewai>=0.126.0", - "mcp>=1.10.1,<2.0.0", + "fastmcp==2.13.0", + "mcp>=1.17.0,<2.0.0", "uv==0.7.20", "scipy>=1.14.1,<1.16.2", "scrapegraph-py>=1.12.0,<2.0.0", diff --git a/src/backend/base/langflow/api/v1/mcp_projects.py b/src/backend/base/langflow/api/v1/mcp_projects.py index 8a3a2392e79e..c431de98915f 100644 --- a/src/backend/base/langflow/api/v1/mcp_projects.py +++ b/src/backend/base/langflow/api/v1/mcp_projects.py @@ -630,9 +630,12 @@ async def install_mcp_config( # For OAuth/MCP Composer, use the special format settings = get_settings_service().settings - command = "uvx" + command = "uv" args = [ - f"mcp-composer{settings.mcp_composer_version}", + "run", + "python", + "-m", + "mcp_composer", "--mode", "stdio", "--sse-url", diff --git a/src/backend/base/pyproject.toml b/src/backend/base/pyproject.toml index 8e7dbb593d51..a271d54c2491 100644 --- a/src/backend/base/pyproject.toml +++ b/src/backend/base/pyproject.toml @@ -32,11 +32,11 @@ dependencies = [ "rich>=13.7.0,<14.0.0", "langchain-experimental>=0.3.4,<1.0.0", "sqlmodel==0.0.22", - "pydantic~=2.10.1", + "pydantic>=2.10.1,<3.0.0", "pydantic-settings>=2.2.0,<3.0.0", "email-validator>=2.0.0", "typer>=0.13.0,<1.0.0", - "cachetools>=5.5.0,<6.0.0", + "cachetools>=6.0.0", "platformdirs>=4.2.0,<5.0.0", "python-multipart>=0.0.12,<1.0.0", "orjson==3.10.15", @@ -80,7 +80,7 @@ dependencies = [ "validators>=0.34.0,<1.0.0", "networkx>=3.4.2,<4.0.0", "json-repair>=0.30.3,<1.0.0", - "mcp~=1.10.1", + "mcp>=1.17.0,<2.0.0", "aiosqlite>=0.20.0,<1.0.0", "greenlet>=3.1.1,<4.0.0", "jsonquerylang>=1.1.1,<2.0.0", diff --git a/src/lfx/pyproject.toml b/src/lfx/pyproject.toml index 630820003336..0ccf4e1905c3 100644 --- a/src/lfx/pyproject.toml +++ b/src/lfx/pyproject.toml @@ -26,7 +26,7 @@ dependencies = [ "docstring-parser>=0.16,<1.0.0", "networkx>=3.4.2,<4.0.0", "nanoid>=2.0.0,<3.0.0", - "cachetools>=5.5.2,<6.0.0", + "cachetools>=6.0.0", "emoji>=2.14.1,<3.0.0", "chardet>=5.2.0,<6.0.0", "defusedxml>=0.7.1,<1.0.0", diff --git a/src/lfx/src/lfx/services/mcp_composer/service.py b/src/lfx/src/lfx/services/mcp_composer/service.py index a48ef39cfb33..f5d17fe5847c 100644 --- a/src/lfx/src/lfx/services/mcp_composer/service.py +++ b/src/lfx/src/lfx/services/mcp_composer/service.py @@ -419,8 +419,11 @@ async def _start_project_composer_process( """Start the MCP Composer subprocess for a specific project.""" settings = get_settings_service().settings cmd = [ - "uvx", - f"mcp-composer{settings.mcp_composer_version}", + "uv", + "run", + "python", + "-m", + "mcp_composer", "--mode", "sse", "--sse-url", @@ -463,6 +466,11 @@ async def _start_project_composer_process( cmd.extend(["--env", env_key, str(value)]) # Start the subprocess with both stdout and stderr captured + # TEMPORARY DEBUG: Print command being executed + safe_cmd = self._obfuscate_command_secrets(cmd) + await logger.adebug(f"Starting MCP Composer with command: {' '.join(safe_cmd)}") + print(f"[MCP Composer] Starting command: {' '.join(safe_cmd)}") + process = subprocess.Popen(cmd, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) # noqa: ASYNC220, S603 # Monitor the process startup with multiple checks @@ -470,6 +478,7 @@ async def _start_project_composer_process( port_bound = False await logger.adebug(f"Monitoring MCP Composer startup for project {project_id} (PID: {process.pid})") + print(f"[MCP Composer] Process started with PID: {process.pid}") for check in range(max_startup_checks): await asyncio.sleep(startup_delay) @@ -516,12 +525,27 @@ async def _start_project_composer_process( f"(check {check + 1}/{max_startup_checks})" ) - # Try to read any available stderr without blocking (only log if there's an error) + # Try to read any available stderr/stdout without blocking + # TEMPORARY DEBUG: Print all output, not just errors if process.stderr and select.select([process.stderr], [], [], 0)[0]: try: stderr_line = process.stderr.readline() - if stderr_line and "ERROR" in stderr_line: - await logger.aerror(f"MCP Composer error: {stderr_line.strip()}") + if stderr_line: + print(f"[MCP Composer STDERR] {stderr_line.strip()}") + if "ERROR" in stderr_line: + await logger.aerror(f"MCP Composer error: {stderr_line.strip()}") + else: + await logger.adebug(f"MCP Composer stderr: {stderr_line.strip()}") + except Exception: # noqa: BLE001 + pass + + # TEMPORARY DEBUG: Also check stdout + if process.stdout and select.select([process.stdout], [], [], 0)[0]: + try: + stdout_line = process.stdout.readline() + if stdout_line: + print(f"[MCP Composer STDOUT] {stdout_line.strip()}") + await logger.adebug(f"MCP Composer stdout: {stdout_line.strip()}") except Exception: # noqa: BLE001 pass diff --git a/uv.lock b/uv.lock index 7f91465a1334..b12bf4c7b498 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.10, <3.14" resolution-markers = [ "python_full_version >= '3.13' and platform_machine == 'arm64' and sys_platform == 'darwin'", @@ -547,14 +547,14 @@ wheels = [ [[package]] name = "authlib" -version = "1.3.1" +version = "1.6.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/09/47/df70ecd34fbf86d69833fe4e25bb9ecbaab995c8e49df726dd416f6bb822/authlib-1.3.1.tar.gz", hash = "sha256:7ae843f03c06c5c0debd63c9db91f9fda64fa62a42a77419fa15fbb7e7a58917", size = 146074, upload-time = "2024-06-04T14:15:32.06Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/3f/1d3bbd0bf23bdd99276d4def22f29c27a914067b4cf66f753ff9b8bbd0f3/authlib-1.6.5.tar.gz", hash = "sha256:6aaf9c79b7cc96c900f0b284061691c5d4e61221640a948fe690b556a6d6d10b", size = 164553, upload-time = "2025-10-02T13:36:09.489Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/1f/bc95e43ffb57c05b8efcc376dd55a0240bf58f47ddf5a0f92452b6457b75/Authlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:d35800b973099bbadc49b42b256ecb80041ad56b7fe1216a362c7943c088f377", size = 223827, upload-time = "2024-06-04T14:15:29.218Z" }, + { url = "https://files.pythonhosted.org/packages/f8/aa/5082412d1ee302e9e7d80b6949bc4d2a8fa1149aaab610c5fc24709605d6/authlib-1.6.5-py2.py3-none-any.whl", hash = "sha256:3e0e0507807f842b02175507bdee8957a1d5707fd4afb17c32fb43fee90b6e3a", size = 243608, upload-time = "2025-10-02T13:36:07.637Z" }, ] [[package]] @@ -663,6 +663,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/46/81/d8c22cd7e5e1c6a7d48e41a1d1d46c92f17dae70a54d9814f746e6027dec/bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9", size = 152930, upload-time = "2022-10-09T15:36:34.635Z" }, ] +[[package]] +name = "beartype" +version = "0.22.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/09/9003e5662691056e0e8b2e6f57c799e71875fac0be0e785d8cb11557cd2a/beartype-0.22.5.tar.gz", hash = "sha256:516a9096cc77103c96153474fa35c3ebcd9d36bd2ec8d0e3a43307ced0fa6341", size = 1586256, upload-time = "2025-11-01T05:49:20.771Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/f6/073d19f7b571c08327fbba3f8e011578da67ab62a11f98911274ff80653f/beartype-0.22.5-py3-none-any.whl", hash = "sha256:d9743dd7cd6d193696eaa1e025f8a70fb09761c154675679ff236e61952dfba0", size = 1321700, upload-time = "2025-11-01T05:49:18.436Z" }, +] + [[package]] name = "beautifulsoup4" version = "4.12.3" @@ -919,11 +928,11 @@ wheels = [ [[package]] name = "cachetools" -version = "5.5.2" +version = "6.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380, upload-time = "2025-02-20T21:01:19.524Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/7e/b975b5814bd36faf009faebe22c1072a1fa1168db34d285ef0ba071ad78c/cachetools-6.2.1.tar.gz", hash = "sha256:3f391e4bd8f8bf0931169baf7456cc822705f4e2a31f840d218f445b9a854201", size = 31325, upload-time = "2025-10-12T14:55:30.139Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload-time = "2025-02-20T21:01:16.647Z" }, + { url = "https://files.pythonhosted.org/packages/96/c5/1e741d26306c42e2bf6ab740b2202872727e0f606033c9dd713f8b93f5a8/cachetools-6.2.1-py3-none-any.whl", hash = "sha256:09868944b6dde876dfd44e1d47e18484541eaf12f26f29b7af91b26cc892d701", size = 11280, upload-time = "2025-10-12T14:55:28.382Z" }, ] [[package]] @@ -1836,6 +1845,23 @@ version = "0.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/55/ca/d323556e2bf9bfb63219fbb849ce61bb830cc42d1b25b91cde3815451b91/cuid-0.4.tar.gz", hash = "sha256:74eaba154916a2240405c3631acee708c263ef8fa05a86820b87d0f59f84e978", size = 4986, upload-time = "2023-03-06T00:41:12.708Z" } +[[package]] +name = "cyclopts" +version = "4.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "docstring-parser" }, + { name = "rich" }, + { name = "rich-rst" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/2a/c06f1346079dbeddf5307bc7f4a190f26d2692d7420042d2fef21b9513e4/cyclopts-4.2.3.tar.gz", hash = "sha256:5949d5d0fc8f269547bdc507985d4d973cf6794ab781bf0600d5994eda29a471", size = 148688, upload-time = "2025-11-11T20:00:19.731Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/24/8b13ebd2b1f26da4e3830a19bd05b56400b538c0aeb7050db9d3dd853303/cyclopts-4.2.3-py3-none-any.whl", hash = "sha256:4c2bc17af50e1a958f758cdc541f0a28b0eccf3f718e26be85b712c54ac0ef0b", size = 184319, upload-time = "2025-11-11T20:00:18.393Z" }, +] + [[package]] name = "dataclasses-json" version = "0.6.7" @@ -2204,6 +2230,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, ] +[[package]] +name = "docutils" +version = "0.22.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/02/111134bfeb6e6c7ac4c74594e39a59f6c0195dc4846afbeac3cba60f1927/docutils-0.22.3.tar.gz", hash = "sha256:21486ae730e4ca9f622677b1412b879af1791efcfba517e4c6f60be543fc8cdd", size = 2290153, upload-time = "2025-11-06T02:35:55.655Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/a8/c6a4b901d17399c77cd81fb001ce8961e9f5e04d3daf27e8925cb012e163/docutils-0.22.3-py3-none-any.whl", hash = "sha256:bd772e4aca73aff037958d44f2be5229ded4c09927fcf8690c577b66234d6ceb", size = 633032, upload-time = "2025-11-06T02:35:52.391Z" }, +] + [[package]] name = "dspy" version = "3.0.3" @@ -2798,21 +2833,27 @@ wheels = [ [[package]] name = "fastmcp" -version = "2.5.2" +version = "2.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "authlib" }, + { name = "cyclopts" }, { name = "exceptiongroup" }, { name = "httpx" }, { name = "mcp" }, + { name = "openapi-core" }, { name = "openapi-pydantic" }, + { name = "platformdirs" }, + { name = "py-key-value-aio", extra = ["disk", "keyring", "memory"] }, + { name = "pydantic", extra = ["email"] }, + { name = "pyperclip" }, { name = "python-dotenv" }, { name = "rich" }, - { name = "typer" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/cc/d2c0e63d2b34681bef4e077611dae662ea722add13a83dc4ae08b6e0fd23/fastmcp-2.5.2.tar.gz", hash = "sha256:761c92fb54f561136f631d7d98b4920152978f6f0a66a4cef689a7983fd05c8b", size = 1039189, upload-time = "2025-05-29T18:11:33.088Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/3b/c30af894db2c3ec439d0e4168ba7ce705474cabdd0a599033ad9a19ad977/fastmcp-2.13.0.tar.gz", hash = "sha256:57f7b7503363e1babc0d1a13af18252b80366a409e1de85f1256cce66a4bee35", size = 7767346, upload-time = "2025-10-25T12:54:10.957Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/ac/caa94ff747e2136829ac2fea33b9583e086ca5431451751bcb2f773e087f/fastmcp-2.5.2-py3-none-any.whl", hash = "sha256:4ea46ef35c1308b369eff7c8a10e4c9639bed046fd646449c1227ac7c3856d83", size = 107502, upload-time = "2025-05-29T18:11:31.577Z" }, + { url = "https://files.pythonhosted.org/packages/c0/7f/09942135f506953fc61bb81b9e5eaf50a8eea923b83d9135bd959168ef2d/fastmcp-2.13.0-py3-none-any.whl", hash = "sha256:bdff1399d3b7ebb79286edfd43eb660182432514a5ab8e4cbfb45f1d841d2aa0", size = 367134, upload-time = "2025-10-25T12:54:09.284Z" }, ] [[package]] @@ -3735,19 +3776,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/41/80/84087dc56437ced7cdd4b13d7875e7439a52a261e3ab4e06488ba6173b0a/grpcio-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:f9f7bd5faab55f47231ad8dba7787866b69f5e93bc306e3915606779bbfb4ba8", size = 4702799, upload-time = "2025-10-21T16:22:12.709Z" }, ] -[[package]] -name = "grpcio-health-checking" -version = "1.71.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "grpcio" }, - { name = "protobuf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/53/86/20994347ef36b7626fb74539f13128100dd8b7eaac67efc063264e6cdc80/grpcio_health_checking-1.71.2.tar.gz", hash = "sha256:1c21ece88c641932f432b573ef504b20603bdf030ad4e1ec35dd7fdb4ea02637", size = 16770, upload-time = "2025-06-28T04:24:08.768Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/74/7bc6ab96bf1083cab2684f9c3ae434caa638de3d5c5574e8435e2c146598/grpcio_health_checking-1.71.2-py3-none-any.whl", hash = "sha256:f91db41410d6bd18a7828c5b6ac2bebd77a63483263cbe42bf3c0c9b86cece33", size = 18918, upload-time = "2025-06-28T04:23:56.923Z" }, -] - [[package]] name = "grpcio-status" version = "1.71.2" @@ -4507,6 +4535,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" }, ] +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, +] + [[package]] name = "jaraco-context" version = "6.0.1" @@ -4519,6 +4559,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", size = 6825, upload-time = "2024-08-20T03:39:25.966Z" }, ] +[[package]] +name = "jaraco-functools" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/ed/1aa2d585304ec07262e1a83a9889880701079dde796ac7b1d1826f40c63d/jaraco_functools-4.3.0.tar.gz", hash = "sha256:cfd13ad0dd2c47a3600b439ef72d8615d482cedcff1632930d6f28924d92f294", size = 19755, upload-time = "2025-08-18T20:05:09.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/09/726f168acad366b11e420df31bf1c702a54d373a83f968d94141a8c3fde0/jaraco_functools-4.3.0-py3-none-any.whl", hash = "sha256:227ff8ed6f7b8f62c56deff101545fa7543cf2c8e7b82a7c2116e672f29c26e8", size = 10408, upload-time = "2025-08-18T20:05:08.69Z" }, +] + [[package]] name = "jedi" version = "0.19.2" @@ -4531,6 +4583,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, ] +[[package]] +name = "jeepney" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, +] + [[package]] name = "jigsawstack" version = "0.2.7" @@ -4796,6 +4857,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" }, ] +[[package]] +name = "jsonschema-path" +version = "0.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pathable" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/45/41ebc679c2a4fced6a722f624c18d658dee42612b83ea24c1caf7c0eb3a8/jsonschema_path-0.3.4.tar.gz", hash = "sha256:8365356039f16cc65fddffafda5f58766e34bebab7d6d105616ab52bc4297001", size = 11159, upload-time = "2025-01-24T14:33:16.547Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/58/3485da8cb93d2f393bce453adeef16896751f14ba3e2024bc21dc9597646/jsonschema_path-0.3.4-py3-none-any.whl", hash = "sha256:f502191fdc2b22050f9a81c9237be9d27145b9001c55842bece5e94e382e52f8", size = 14810, upload-time = "2025-01-24T14:33:14.652Z" }, +] + [[package]] name = "jsonschema-specifications" version = "2025.9.1" @@ -4846,6 +4922,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, ] +[[package]] +name = "keyring" +version = "25.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, + { name = "jaraco-classes" }, + { name = "jaraco-context" }, + { name = "jaraco-functools" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "secretstorage", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/09/d904a6e96f76ff214be59e7aa6ef7190008f52a0ab6689760a98de0bf37d/keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66", size = 62750, upload-time = "2024-12-25T15:26:45.782Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/32/da7f44bcb1105d3e88a0b74ebdca50c59121d2ddf71c9e34ba47df7f3a56/keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd", size = 39085, upload-time = "2024-12-25T15:26:44.377Z" }, +] + [[package]] name = "kstar-planner" version = "1.4.16" @@ -5403,6 +5497,7 @@ dependencies = [ { name = "fake-useragent" }, { name = "fastavro", version = "1.9.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13'" }, { name = "fastavro", version = "1.12.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, + { name = "fastmcp" }, { name = "fastparquet" }, { name = "filelock" }, { name = "gassist", marker = "sys_platform == 'win32'" }, @@ -5614,6 +5709,7 @@ requires-dist = [ { name = "fake-useragent", specifier = "==1.5.1" }, { name = "fastavro", marker = "python_full_version < '3.13'", specifier = "==1.9.7" }, { name = "fastavro", marker = "python_full_version >= '3.13'", specifier = ">=1.9.8,<2.0.0" }, + { name = "fastmcp", specifier = "==2.13.0" }, { name = "fastparquet", specifier = ">=2024.11.0,<2025.0.0" }, { name = "filelock", specifier = ">=3.18.0,<4.0.0" }, { name = "gassist", marker = "sys_platform == 'win32'", specifier = ">=0.0.1" }, @@ -5662,7 +5758,7 @@ requires-dist = [ { name = "llama-cpp-python", marker = "extra == 'local'", specifier = "~=0.2.0" }, { name = "markdown", specifier = "==3.7" }, { name = "markupsafe", specifier = "==3.0.2" }, - { name = "mcp", specifier = ">=1.10.1,<2.0.0" }, + { name = "mcp", specifier = ">=1.17.0,<2.0.0" }, { name = "mem0ai", specifier = "==0.1.34" }, { name = "metal-sdk", specifier = "==2.5.1" }, { name = "metaphor-python", specifier = "==0.1.23" }, @@ -5685,7 +5781,7 @@ requires-dist = [ { name = "pydantic-settings", specifier = ">=2.2.0,<3.0.0" }, { name = "pymongo", specifier = "==4.10.1" }, { name = "pytube", specifier = "==15.0.0" }, - { name = "pywin32", marker = "sys_platform == 'win32'", specifier = "==307" }, + { name = "pywin32", marker = "sys_platform == 'win32'", specifier = ">=307" }, { name = "qdrant-client", specifier = "==1.9.2" }, { name = "qianfan", specifier = "==0.3.5" }, { name = "rapidocr-onnxruntime", marker = "extra == 'docling'", specifier = ">=1.4.4" }, @@ -5708,7 +5804,7 @@ requires-dist = [ { name = "upstash-vector", specifier = "==0.6.0" }, { name = "uv", specifier = "==0.7.20" }, { name = "vlmrun", extras = ["all"], specifier = ">=0.2.0" }, - { name = "weaviate-client", specifier = "==4.10.2" }, + { name = "weaviate-client", specifier = ">=4.10.2" }, { name = "webrtcvad", marker = "extra == 'audio'", specifier = ">=2.0.10" }, { name = "wikipedia", specifier = "==1.4.0" }, { name = "wolframalpha", specifier = "==5.1.3" }, @@ -5917,7 +6013,7 @@ requires-dist = [ { name = "assemblyai", specifier = ">=0.33.0,<1.0.0" }, { name = "asyncer", specifier = ">=0.0.5,<1.0.0" }, { name = "bcrypt", specifier = "==4.0.1" }, - { name = "cachetools", specifier = ">=5.5.0,<6.0.0" }, + { name = "cachetools", specifier = ">=6.0.0" }, { name = "chardet", specifier = ">=5.2.0,<6.0.0" }, { name = "clickhouse-connect", specifier = "==0.7.19" }, { name = "cryptography", specifier = ">=43.0.1,<44.0.0" }, @@ -5954,7 +6050,7 @@ requires-dist = [ { name = "llama-cpp-python", marker = "extra == 'all'", specifier = ">=0.2.0" }, { name = "llama-cpp-python", marker = "extra == 'local'", specifier = ">=0.2.0" }, { name = "loguru", specifier = ">=0.7.1,<1.0.0" }, - { name = "mcp", specifier = "~=1.10.1" }, + { name = "mcp", specifier = ">=1.17.0,<2.0.0" }, { name = "multiprocess", specifier = ">=0.70.14,<1.0.0" }, { name = "nanoid", specifier = ">=2.0.0,<3.0.0" }, { name = "nest-asyncio", specifier = ">=1.6.0,<2.0.0" }, @@ -5969,7 +6065,7 @@ requires-dist = [ { name = "pillow", specifier = ">=11.1.0,<12.0.0" }, { name = "platformdirs", specifier = ">=4.2.0,<5.0.0" }, { name = "prometheus-client", specifier = ">=0.20.0,<1.0.0" }, - { name = "pydantic", specifier = "~=2.10.1" }, + { name = "pydantic", specifier = ">=2.10.1,<3.0.0" }, { name = "pydantic-settings", specifier = ">=2.2.0,<3.0.0" }, { name = "pypdf", specifier = "~=5.1.0" }, { name = "pyperclip", specifier = ">=1.8.2,<2.0.0" }, @@ -6186,6 +6282,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc", size = 12097, upload-time = "2024-04-05T13:03:10.514Z" }, ] +[[package]] +name = "lazy-object-proxy" +version = "1.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/08/a2/69df9c6ba6d316cfd81fe2381e464db3e6de5db45f8c43c6a23504abf8cb/lazy_object_proxy-1.12.0.tar.gz", hash = "sha256:1f5a462d92fd0cfb82f1fab28b51bfb209fabbe6aabf7f0d51472c0c124c0c61", size = 43681, upload-time = "2025-08-22T13:50:06.783Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/2b/d5e8915038acbd6c6a9fcb8aaf923dc184222405d3710285a1fec6e262bc/lazy_object_proxy-1.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61d5e3310a4aa5792c2b599a7a78ccf8687292c8eb09cf187cca8f09cf6a7519", size = 26658, upload-time = "2025-08-22T13:42:23.373Z" }, + { url = "https://files.pythonhosted.org/packages/da/8f/91fc00eeea46ee88b9df67f7c5388e60993341d2a406243d620b2fdfde57/lazy_object_proxy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1ca33565f698ac1aece152a10f432415d1a2aa9a42dfe23e5ba2bc255ab91f6", size = 68412, upload-time = "2025-08-22T13:42:24.727Z" }, + { url = "https://files.pythonhosted.org/packages/07/d2/b7189a0e095caedfea4d42e6b6949d2685c354263bdf18e19b21ca9b3cd6/lazy_object_proxy-1.12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01c7819a410f7c255b20799b65d36b414379a30c6f1684c7bd7eb6777338c1b", size = 67559, upload-time = "2025-08-22T13:42:25.875Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/b013840cc43971582ff1ceaf784d35d3a579650eb6cc348e5e6ed7e34d28/lazy_object_proxy-1.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:029d2b355076710505c9545aef5ab3f750d89779310e26ddf2b7b23f6ea03cd8", size = 66651, upload-time = "2025-08-22T13:42:27.427Z" }, + { url = "https://files.pythonhosted.org/packages/7e/6f/b7368d301c15612fcc4cd00412b5d6ba55548bde09bdae71930e1a81f2ab/lazy_object_proxy-1.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc6e3614eca88b1c8a625fc0a47d0d745e7c3255b21dac0e30b3037c5e3deeb8", size = 66901, upload-time = "2025-08-22T13:42:28.585Z" }, + { url = "https://files.pythonhosted.org/packages/61/1b/c6b1865445576b2fc5fa0fbcfce1c05fee77d8979fd1aa653dd0f179aefc/lazy_object_proxy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:be5fe974e39ceb0d6c9db0663c0464669cf866b2851c73971409b9566e880eab", size = 26536, upload-time = "2025-08-22T13:42:29.636Z" }, + { url = "https://files.pythonhosted.org/packages/01/b3/4684b1e128a87821e485f5a901b179790e6b5bc02f89b7ee19c23be36ef3/lazy_object_proxy-1.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1cf69cd1a6c7fe2dbcc3edaa017cf010f4192e53796538cc7d5e1fedbfa4bcff", size = 26656, upload-time = "2025-08-22T13:42:30.605Z" }, + { url = "https://files.pythonhosted.org/packages/3a/03/1bdc21d9a6df9ff72d70b2ff17d8609321bea4b0d3cffd2cea92fb2ef738/lazy_object_proxy-1.12.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:efff4375a8c52f55a145dc8487a2108c2140f0bec4151ab4e1843e52eb9987ad", size = 68832, upload-time = "2025-08-22T13:42:31.675Z" }, + { url = "https://files.pythonhosted.org/packages/3d/4b/5788e5e8bd01d19af71e50077ab020bc5cce67e935066cd65e1215a09ff9/lazy_object_proxy-1.12.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1192e8c2f1031a6ff453ee40213afa01ba765b3dc861302cd91dbdb2e2660b00", size = 69148, upload-time = "2025-08-22T13:42:32.876Z" }, + { url = "https://files.pythonhosted.org/packages/79/0e/090bf070f7a0de44c61659cb7f74c2fe02309a77ca8c4b43adfe0b695f66/lazy_object_proxy-1.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3605b632e82a1cbc32a1e5034278a64db555b3496e0795723ee697006b980508", size = 67800, upload-time = "2025-08-22T13:42:34.054Z" }, + { url = "https://files.pythonhosted.org/packages/cf/d2/b320325adbb2d119156f7c506a5fbfa37fcab15c26d13cf789a90a6de04e/lazy_object_proxy-1.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a61095f5d9d1a743e1e20ec6d6db6c2ca511961777257ebd9b288951b23b44fa", size = 68085, upload-time = "2025-08-22T13:42:35.197Z" }, + { url = "https://files.pythonhosted.org/packages/6a/48/4b718c937004bf71cd82af3713874656bcb8d0cc78600bf33bb9619adc6c/lazy_object_proxy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:997b1d6e10ecc6fb6fe0f2c959791ae59599f41da61d652f6c903d1ee58b7370", size = 26535, upload-time = "2025-08-22T13:42:36.521Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1b/b5f5bd6bda26f1e15cd3232b223892e4498e34ec70a7f4f11c401ac969f1/lazy_object_proxy-1.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ee0d6027b760a11cc18281e702c0309dd92da458a74b4c15025d7fc490deede", size = 26746, upload-time = "2025-08-22T13:42:37.572Z" }, + { url = "https://files.pythonhosted.org/packages/55/64/314889b618075c2bfc19293ffa9153ce880ac6153aacfd0a52fcabf21a66/lazy_object_proxy-1.12.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4ab2c584e3cc8be0dfca422e05ad30a9abe3555ce63e9ab7a559f62f8dbc6ff9", size = 71457, upload-time = "2025-08-22T13:42:38.743Z" }, + { url = "https://files.pythonhosted.org/packages/11/53/857fc2827fc1e13fbdfc0ba2629a7d2579645a06192d5461809540b78913/lazy_object_proxy-1.12.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14e348185adbd03ec17d051e169ec45686dcd840a3779c9d4c10aabe2ca6e1c0", size = 71036, upload-time = "2025-08-22T13:42:40.184Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/e581ffed864cd33c1b445b5763d617448ebb880f48675fc9de0471a95cbc/lazy_object_proxy-1.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4fcbe74fb85df8ba7825fa05eddca764138da752904b378f0ae5ab33a36c308", size = 69329, upload-time = "2025-08-22T13:42:41.311Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/15f8f5a0b0b2e668e756a152257d26370132c97f2f1943329b08f057eff0/lazy_object_proxy-1.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:563d2ec8e4d4b68ee7848c5ab4d6057a6d703cb7963b342968bb8758dda33a23", size = 70690, upload-time = "2025-08-22T13:42:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/5d/aa/f02be9bbfb270e13ee608c2b28b8771f20a5f64356c6d9317b20043c6129/lazy_object_proxy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:53c7fd99eb156bbb82cbc5d5188891d8fdd805ba6c1e3b92b90092da2a837073", size = 26563, upload-time = "2025-08-22T13:42:43.685Z" }, + { url = "https://files.pythonhosted.org/packages/f4/26/b74c791008841f8ad896c7f293415136c66cc27e7c7577de4ee68040c110/lazy_object_proxy-1.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:86fd61cb2ba249b9f436d789d1356deae69ad3231dc3c0f17293ac535162672e", size = 26745, upload-time = "2025-08-22T13:42:44.982Z" }, + { url = "https://files.pythonhosted.org/packages/9b/52/641870d309e5d1fb1ea7d462a818ca727e43bfa431d8c34b173eb090348c/lazy_object_proxy-1.12.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:81d1852fb30fab81696f93db1b1e55a5d1ff7940838191062f5f56987d5fcc3e", size = 71537, upload-time = "2025-08-22T13:42:46.141Z" }, + { url = "https://files.pythonhosted.org/packages/47/b6/919118e99d51c5e76e8bf5a27df406884921c0acf2c7b8a3b38d847ab3e9/lazy_object_proxy-1.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be9045646d83f6c2664c1330904b245ae2371b5c57a3195e4028aedc9f999655", size = 71141, upload-time = "2025-08-22T13:42:47.375Z" }, + { url = "https://files.pythonhosted.org/packages/e5/47/1d20e626567b41de085cf4d4fb3661a56c159feaa73c825917b3b4d4f806/lazy_object_proxy-1.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:67f07ab742f1adfb3966c40f630baaa7902be4222a17941f3d85fd1dae5565ff", size = 69449, upload-time = "2025-08-22T13:42:48.49Z" }, + { url = "https://files.pythonhosted.org/packages/58/8d/25c20ff1a1a8426d9af2d0b6f29f6388005fc8cd10d6ee71f48bff86fdd0/lazy_object_proxy-1.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ba769017b944fcacbf6a80c18b2761a1795b03f8899acdad1f1c39db4409be", size = 70744, upload-time = "2025-08-22T13:42:49.608Z" }, + { url = "https://files.pythonhosted.org/packages/c0/67/8ec9abe15c4f8a4bcc6e65160a2c667240d025cbb6591b879bea55625263/lazy_object_proxy-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:7b22c2bbfb155706b928ac4d74c1a63ac8552a55ba7fff4445155523ea4067e1", size = 26568, upload-time = "2025-08-22T13:42:57.719Z" }, + { url = "https://files.pythonhosted.org/packages/23/12/cd2235463f3469fd6c62d41d92b7f120e8134f76e52421413a0ad16d493e/lazy_object_proxy-1.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4a79b909aa16bde8ae606f06e6bbc9d3219d2e57fb3e0076e17879072b742c65", size = 27391, upload-time = "2025-08-22T13:42:50.62Z" }, + { url = "https://files.pythonhosted.org/packages/60/9e/f1c53e39bbebad2e8609c67d0830cc275f694d0ea23d78e8f6db526c12d3/lazy_object_proxy-1.12.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:338ab2f132276203e404951205fe80c3fd59429b3a724e7b662b2eb539bb1be9", size = 80552, upload-time = "2025-08-22T13:42:51.731Z" }, + { url = "https://files.pythonhosted.org/packages/4c/b6/6c513693448dcb317d9d8c91d91f47addc09553613379e504435b4cc8b3e/lazy_object_proxy-1.12.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c40b3c9faee2e32bfce0df4ae63f4e73529766893258eca78548bac801c8f66", size = 82857, upload-time = "2025-08-22T13:42:53.225Z" }, + { url = "https://files.pythonhosted.org/packages/12/1c/d9c4aaa4c75da11eb7c22c43d7c90a53b4fca0e27784a5ab207768debea7/lazy_object_proxy-1.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:717484c309df78cedf48396e420fa57fc8a2b1f06ea889df7248fdd156e58847", size = 80833, upload-time = "2025-08-22T13:42:54.391Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ae/29117275aac7d7d78ae4f5a4787f36ff33262499d486ac0bf3e0b97889f6/lazy_object_proxy-1.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a6b7ea5ea1ffe15059eb44bcbcb258f97bcb40e139b88152c40d07b1a1dfc9ac", size = 79516, upload-time = "2025-08-22T13:42:55.812Z" }, + { url = "https://files.pythonhosted.org/packages/19/40/b4e48b2c38c69392ae702ae7afa7b6551e0ca5d38263198b7c79de8b3bdf/lazy_object_proxy-1.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:08c465fb5cd23527512f9bd7b4c7ba6cec33e28aad36fbbe46bf7b858f9f3f7f", size = 27656, upload-time = "2025-08-22T13:42:56.793Z" }, + { url = "https://files.pythonhosted.org/packages/41/a0/b91504515c1f9a299fc157967ffbd2f0321bce0516a3d5b89f6f4cad0355/lazy_object_proxy-1.12.0-pp39.pp310.pp311.graalpy311-none-any.whl", hash = "sha256:c3b2e0af1f7f77c4263759c4824316ce458fabe0fceadcd24ef8ca08b2d1e402", size = 15072, upload-time = "2025-08-22T13:50:05.498Z" }, +] + [[package]] name = "lfx" version = "0.2.0" @@ -6241,7 +6376,7 @@ requires-dist = [ { name = "aiofile", specifier = ">=3.8.0,<4.0.0" }, { name = "aiofiles", specifier = ">=24.1.0,<25.0.0" }, { name = "asyncer", specifier = ">=0.0.8,<1.0.0" }, - { name = "cachetools", specifier = ">=5.5.2,<6.0.0" }, + { name = "cachetools", specifier = ">=6.0.0" }, { name = "chardet", specifier = ">=5.2.0,<6.0.0" }, { name = "defusedxml", specifier = ">=0.7.1,<1.0.0" }, { name = "docstring-parser", specifier = ">=0.16,<1.0.0" }, @@ -6835,7 +6970,7 @@ wheels = [ [[package]] name = "mcp" -version = "1.10.1" +version = "1.21.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -6844,14 +6979,16 @@ dependencies = [ { name = "jsonschema" }, { name = "pydantic" }, { name = "pydantic-settings" }, + { name = "pyjwt", extra = ["crypto"] }, { name = "python-multipart" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, { name = "sse-starlette" }, { name = "starlette" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7c/68/63045305f29ff680a9cd5be360c755270109e6b76f696ea6824547ddbc30/mcp-1.10.1.tar.gz", hash = "sha256:aaa0957d8307feeff180da2d9d359f2b801f35c0c67f1882136239055ef034c2", size = 392969, upload-time = "2025-06-27T12:03:08.982Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/54/dd2330ef4611c27ae59124820863c34e1d3edb1133c58e6375e2d938c9c5/mcp-1.21.0.tar.gz", hash = "sha256:bab0a38e8f8c48080d787233343f8d301b0e1e95846ae7dead251b2421d99855", size = 452697, upload-time = "2025-11-06T23:19:58.432Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/3f/435a5b3d10ae242a9d6c2b33175551173c3c61fe637dc893be05c4ed0aaf/mcp-1.10.1-py3-none-any.whl", hash = "sha256:4d08301aefe906dce0fa482289db55ce1db831e3e67212e65b5e23ad8454b3c5", size = 150878, upload-time = "2025-06-27T12:03:07.328Z" }, + { url = "https://files.pythonhosted.org/packages/39/47/850b6edc96c03bd44b00de9a0ca3c1cc71e0ba1cd5822955bc9e4eb3fad3/mcp-1.21.0-py3-none-any.whl", hash = "sha256:598619e53eb0b7a6513db38c426b28a4bdf57496fed04332100d2c56acade98b", size = 173672, upload-time = "2025-11-06T23:19:56.508Z" }, ] [package.optional-dependencies] @@ -7933,6 +8070,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a8/d9/7ec61c010f0d0b0bc57dab8b8dff398f84230d269e8bfa068ad542ff050c/openai-1.82.1-py3-none-any.whl", hash = "sha256:334eb5006edf59aa464c9e932b9d137468d810b2659e5daea9b3a8c39d052395", size = 720466, upload-time = "2025-05-29T16:15:12.531Z" }, ] +[[package]] +name = "openapi-core" +version = "0.19.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "isodate" }, + { name = "jsonschema" }, + { name = "jsonschema-path" }, + { name = "more-itertools" }, + { name = "openapi-schema-validator" }, + { name = "openapi-spec-validator" }, + { name = "parse" }, + { name = "typing-extensions" }, + { name = "werkzeug" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/35/1acaa5f2fcc6e54eded34a2ec74b479439c4e469fc4e8d0e803fda0234db/openapi_core-0.19.5.tar.gz", hash = "sha256:421e753da56c391704454e66afe4803a290108590ac8fa6f4a4487f4ec11f2d3", size = 103264, upload-time = "2025-03-20T20:17:28.193Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/6f/83ead0e2e30a90445ee4fc0135f43741aebc30cca5b43f20968b603e30b6/openapi_core-0.19.5-py3-none-any.whl", hash = "sha256:ef7210e83a59394f46ce282639d8d26ad6fc8094aa904c9c16eb1bac8908911f", size = 106595, upload-time = "2025-03-20T20:17:26.77Z" }, +] + [[package]] name = "openapi-pydantic" version = "0.5.1" @@ -7945,6 +8102,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", size = 96381, upload-time = "2025-01-08T19:29:25.275Z" }, ] +[[package]] +name = "openapi-schema-validator" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "jsonschema-specifications" }, + { name = "rfc3339-validator" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/f3/5507ad3325169347cd8ced61c232ff3df70e2b250c49f0fe140edb4973c6/openapi_schema_validator-0.6.3.tar.gz", hash = "sha256:f37bace4fc2a5d96692f4f8b31dc0f8d7400fd04f3a937798eaf880d425de6ee", size = 11550, upload-time = "2025-01-10T18:08:22.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/c6/ad0fba32775ae749016829dace42ed80f4407b171da41313d1a3a5f102e4/openapi_schema_validator-0.6.3-py3-none-any.whl", hash = "sha256:f3b9870f4e556b5a62a1c39da72a6b4b16f3ad9c73dc80084b1b11e74ba148a3", size = 8755, upload-time = "2025-01-10T18:08:19.758Z" }, +] + +[[package]] +name = "openapi-spec-validator" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "jsonschema-path" }, + { name = "lazy-object-proxy" }, + { name = "openapi-schema-validator" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/af/fe2d7618d6eae6fb3a82766a44ed87cd8d6d82b4564ed1c7cfb0f6378e91/openapi_spec_validator-0.7.2.tar.gz", hash = "sha256:cc029309b5c5dbc7859df0372d55e9d1ff43e96d678b9ba087f7c56fc586f734", size = 36855, upload-time = "2025-06-07T14:48:56.299Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/dd/b3fd642260cb17532f66cc1e8250f3507d1e580483e209dc1e9d13bd980d/openapi_spec_validator-0.7.2-py3-none-any.whl", hash = "sha256:4bbdc0894ec85f1d1bea1d6d9c8b2c3c8d7ccaa13577ef40da9c006c9fd0eb60", size = 39713, upload-time = "2025-06-07T14:48:54.077Z" }, +] + [[package]] name = "opencv-python" version = "4.11.0.86" @@ -9122,6 +9308,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/2f/804f58f0b856ab3bf21617cccf5b39206e6c4c94c2cd227bde125ea6105f/parameterized-0.9.0-py2.py3-none-any.whl", hash = "sha256:4e0758e3d41bea3bbd05ec14fc2c24736723f243b28d702081aef438c9372b1b", size = 20475, upload-time = "2023-03-27T02:01:09.31Z" }, ] +[[package]] +name = "parse" +version = "1.20.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/78/d9b09ba24bb36ef8b83b71be547e118d46214735b6dfb39e4bfde0e9b9dd/parse-1.20.2.tar.gz", hash = "sha256:b41d604d16503c79d81af5165155c0b20f6c8d6c559efa66b4b695c3e5a0a0ce", size = 29391, upload-time = "2024-06-11T04:41:57.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/31/ba45bf0b2aa7898d81cbbfac0e88c267befb59ad91a19e36e1bc5578ddb1/parse-1.20.2-py2.py3-none-any.whl", hash = "sha256:967095588cb802add9177d0c0b6133b5ba33b1ea9007ca800e526f42a85af558", size = 20126, upload-time = "2024-06-11T04:41:55.057Z" }, +] + [[package]] name = "parso" version = "0.8.5" @@ -9140,6 +9335,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3b/a4/ab6b7589382ca3df236e03faa71deac88cae040af60c071a78d254a62172/passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1", size = 525554, upload-time = "2020-10-08T19:00:49.856Z" }, ] +[[package]] +name = "pathable" +version = "0.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/67/93/8f2c2075b180c12c1e9f6a09d1a985bc2036906b13dff1d8917e395f2048/pathable-0.4.4.tar.gz", hash = "sha256:6905a3cd17804edfac7875b5f6c9142a218c7caef78693c2dbbbfbac186d88b2", size = 8124, upload-time = "2025-01-10T18:43:13.247Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/eb/b6260b31b1a96386c0a880edebe26f89669098acea8e0318bff6adb378fd/pathable-0.4.4-py3-none-any.whl", hash = "sha256:5ae9e94793b6ef5a4cbe0a7ce9dbbefc1eec38df253763fd0aeeacf2762dbbc2", size = 9592, upload-time = "2025-01-10T18:43:11.88Z" }, +] + [[package]] name = "pathspec" version = "0.12.1" @@ -9149,6 +9353,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, ] +[[package]] +name = "pathvalidate" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/2a/52a8da6fe965dea6192eb716b357558e103aea0a1e9a8352ad575a8406ca/pathvalidate-3.3.1.tar.gz", hash = "sha256:b18c07212bfead624345bb8e1d6141cdcf15a39736994ea0b94035ad2b1ba177", size = 63262, upload-time = "2025-06-15T09:07:20.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl", hash = "sha256:5263baab691f8e1af96092fa5137ee17df5bdfbd6cff1fcac4d6ef4bc2e1735f", size = 24305, upload-time = "2025-06-15T09:07:19.117Z" }, +] + [[package]] name = "peewee" version = "3.18.2" @@ -9695,6 +9908,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e0/a9/023730ba63db1e494a271cb018dcd361bd2c917ba7004c3e49d5daf795a2/py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5", size = 22335, upload-time = "2022-10-25T20:38:27.636Z" }, ] +[[package]] +name = "py-key-value-aio" +version = "0.2.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beartype" }, + { name = "py-key-value-shared" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/35/65310a4818acec0f87a46e5565e341c5a96fc062a9a03495ad28828ff4d7/py_key_value_aio-0.2.8.tar.gz", hash = "sha256:c0cfbb0bd4e962a3fa1a9fa6db9ba9df812899bd9312fa6368aaea7b26008b36", size = 32853, upload-time = "2025-10-24T13:31:04.688Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/5a/e56747d87a97ad2aff0f3700d77f186f0704c90c2da03bfed9e113dae284/py_key_value_aio-0.2.8-py3-none-any.whl", hash = "sha256:561565547ce8162128fd2bd0b9d70ce04a5f4586da8500cce79a54dfac78c46a", size = 69200, upload-time = "2025-10-24T13:31:03.81Z" }, +] + +[package.optional-dependencies] +disk = [ + { name = "diskcache" }, + { name = "pathvalidate" }, +] +keyring = [ + { name = "keyring" }, +] +memory = [ + { name = "cachetools" }, +] + +[[package]] +name = "py-key-value-shared" +version = "0.2.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beartype" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/79/05a1f9280cfa0709479319cbfd2b1c5beb23d5034624f548c83fb65b0b61/py_key_value_shared-0.2.8.tar.gz", hash = "sha256:703b4d3c61af124f0d528ba85995c3c8d78f8bd3d2b217377bd3278598070cc1", size = 8216, upload-time = "2025-10-24T13:31:03.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/7a/1726ceaa3343874f322dd83c9ec376ad81f533df8422b8b1e1233a59f8ce/py_key_value_shared-0.2.8-py3-none-any.whl", hash = "sha256:aff1bbfd46d065b2d67897d298642e80e5349eae588c6d11b48452b46b8d46ba", size = 14586, upload-time = "2025-10-24T13:31:02.838Z" }, +] + [[package]] name = "pyarrow" version = "19.0.0" @@ -9970,16 +10221,17 @@ wheels = [ [[package]] name = "pydantic" -version = "2.10.6" +version = "2.12.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681, upload-time = "2025-01-24T01:42:12.693Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/ad/a17bc283d7d81837c061c49e3eaa27a45991759a1b7eae1031921c6bd924/pydantic-2.12.4.tar.gz", hash = "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac", size = 821038, upload-time = "2025-11-05T10:50:08.59Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696, upload-time = "2025-01-24T01:42:10.371Z" }, + { url = "https://files.pythonhosted.org/packages/82/2f/e68750da9b04856e2a7ec56fc6f034a5a79775e9b9a81882252789873798/pydantic-2.12.4-py3-none-any.whl", hash = "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e", size = 463400, upload-time = "2025-11-05T10:50:06.732Z" }, ] [package.optional-dependencies] @@ -10061,77 +10313,92 @@ vertexai = [ [[package]] name = "pydantic-core" -version = "2.27.2" +version = "2.41.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443, upload-time = "2024-12-18T11:31:54.917Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/bc/fed5f74b5d802cf9a03e83f60f18864e90e3aed7223adaca5ffb7a8d8d64/pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", size = 1895938, upload-time = "2024-12-18T11:27:14.406Z" }, - { url = "https://files.pythonhosted.org/packages/71/2a/185aff24ce844e39abb8dd680f4e959f0006944f4a8a0ea372d9f9ae2e53/pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", size = 1815684, upload-time = "2024-12-18T11:27:16.489Z" }, - { url = "https://files.pythonhosted.org/packages/c3/43/fafabd3d94d159d4f1ed62e383e264f146a17dd4d48453319fd782e7979e/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", size = 1829169, upload-time = "2024-12-18T11:27:22.16Z" }, - { url = "https://files.pythonhosted.org/packages/a2/d1/f2dfe1a2a637ce6800b799aa086d079998959f6f1215eb4497966efd2274/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", size = 1867227, upload-time = "2024-12-18T11:27:25.097Z" }, - { url = "https://files.pythonhosted.org/packages/7d/39/e06fcbcc1c785daa3160ccf6c1c38fea31f5754b756e34b65f74e99780b5/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", size = 2037695, upload-time = "2024-12-18T11:27:28.656Z" }, - { url = "https://files.pythonhosted.org/packages/7a/67/61291ee98e07f0650eb756d44998214231f50751ba7e13f4f325d95249ab/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", size = 2741662, upload-time = "2024-12-18T11:27:30.798Z" }, - { url = "https://files.pythonhosted.org/packages/32/90/3b15e31b88ca39e9e626630b4c4a1f5a0dfd09076366f4219429e6786076/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", size = 1993370, upload-time = "2024-12-18T11:27:33.692Z" }, - { url = "https://files.pythonhosted.org/packages/ff/83/c06d333ee3a67e2e13e07794995c1535565132940715931c1c43bfc85b11/pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", size = 1996813, upload-time = "2024-12-18T11:27:37.111Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f7/89be1c8deb6e22618a74f0ca0d933fdcb8baa254753b26b25ad3acff8f74/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", size = 2005287, upload-time = "2024-12-18T11:27:40.566Z" }, - { url = "https://files.pythonhosted.org/packages/b7/7d/8eb3e23206c00ef7feee17b83a4ffa0a623eb1a9d382e56e4aa46fd15ff2/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", size = 2128414, upload-time = "2024-12-18T11:27:43.757Z" }, - { url = "https://files.pythonhosted.org/packages/4e/99/fe80f3ff8dd71a3ea15763878d464476e6cb0a2db95ff1c5c554133b6b83/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", size = 2155301, upload-time = "2024-12-18T11:27:47.36Z" }, - { url = "https://files.pythonhosted.org/packages/2b/a3/e50460b9a5789ca1451b70d4f52546fa9e2b420ba3bfa6100105c0559238/pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", size = 1816685, upload-time = "2024-12-18T11:27:50.508Z" }, - { url = "https://files.pythonhosted.org/packages/57/4c/a8838731cb0f2c2a39d3535376466de6049034d7b239c0202a64aaa05533/pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", size = 1982876, upload-time = "2024-12-18T11:27:53.54Z" }, - { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421, upload-time = "2024-12-18T11:27:55.409Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998, upload-time = "2024-12-18T11:27:57.252Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167, upload-time = "2024-12-18T11:27:59.146Z" }, - { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071, upload-time = "2024-12-18T11:28:02.625Z" }, - { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244, upload-time = "2024-12-18T11:28:04.442Z" }, - { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470, upload-time = "2024-12-18T11:28:07.679Z" }, - { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291, upload-time = "2024-12-18T11:28:10.297Z" }, - { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613, upload-time = "2024-12-18T11:28:13.362Z" }, - { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355, upload-time = "2024-12-18T11:28:16.587Z" }, - { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661, upload-time = "2024-12-18T11:28:18.407Z" }, - { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261, upload-time = "2024-12-18T11:28:21.471Z" }, - { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361, upload-time = "2024-12-18T11:28:23.53Z" }, - { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484, upload-time = "2024-12-18T11:28:25.391Z" }, - { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102, upload-time = "2024-12-18T11:28:28.593Z" }, - { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127, upload-time = "2024-12-18T11:28:30.346Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340, upload-time = "2024-12-18T11:28:32.521Z" }, - { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900, upload-time = "2024-12-18T11:28:34.507Z" }, - { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177, upload-time = "2024-12-18T11:28:36.488Z" }, - { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046, upload-time = "2024-12-18T11:28:39.409Z" }, - { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386, upload-time = "2024-12-18T11:28:41.221Z" }, - { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060, upload-time = "2024-12-18T11:28:44.709Z" }, - { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870, upload-time = "2024-12-18T11:28:46.839Z" }, - { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822, upload-time = "2024-12-18T11:28:48.896Z" }, - { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364, upload-time = "2024-12-18T11:28:50.755Z" }, - { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303, upload-time = "2024-12-18T11:28:54.122Z" }, - { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064, upload-time = "2024-12-18T11:28:56.074Z" }, - { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046, upload-time = "2024-12-18T11:28:58.107Z" }, - { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092, upload-time = "2024-12-18T11:29:01.335Z" }, - { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709, upload-time = "2024-12-18T11:29:03.193Z" }, - { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273, upload-time = "2024-12-18T11:29:05.306Z" }, - { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027, upload-time = "2024-12-18T11:29:07.294Z" }, - { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888, upload-time = "2024-12-18T11:29:09.249Z" }, - { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738, upload-time = "2024-12-18T11:29:11.23Z" }, - { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138, upload-time = "2024-12-18T11:29:16.396Z" }, - { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025, upload-time = "2024-12-18T11:29:20.25Z" }, - { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633, upload-time = "2024-12-18T11:29:23.877Z" }, - { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404, upload-time = "2024-12-18T11:29:25.872Z" }, - { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130, upload-time = "2024-12-18T11:29:29.252Z" }, - { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946, upload-time = "2024-12-18T11:29:31.338Z" }, - { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387, upload-time = "2024-12-18T11:29:33.481Z" }, - { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453, upload-time = "2024-12-18T11:29:35.533Z" }, - { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186, upload-time = "2024-12-18T11:29:37.649Z" }, - { url = "https://files.pythonhosted.org/packages/46/72/af70981a341500419e67d5cb45abe552a7c74b66326ac8877588488da1ac/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", size = 1891159, upload-time = "2024-12-18T11:30:54.382Z" }, - { url = "https://files.pythonhosted.org/packages/ad/3d/c5913cccdef93e0a6a95c2d057d2c2cba347815c845cda79ddd3c0f5e17d/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", size = 1768331, upload-time = "2024-12-18T11:30:58.178Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f0/a3ae8fbee269e4934f14e2e0e00928f9346c5943174f2811193113e58252/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", size = 1822467, upload-time = "2024-12-18T11:31:00.6Z" }, - { url = "https://files.pythonhosted.org/packages/d7/7a/7bbf241a04e9f9ea24cd5874354a83526d639b02674648af3f350554276c/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", size = 1979797, upload-time = "2024-12-18T11:31:07.243Z" }, - { url = "https://files.pythonhosted.org/packages/4f/5f/4784c6107731f89e0005a92ecb8a2efeafdb55eb992b8e9d0a2be5199335/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", size = 1987839, upload-time = "2024-12-18T11:31:09.775Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a7/61246562b651dff00de86a5f01b6e4befb518df314c54dec187a78d81c84/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", size = 1998861, upload-time = "2024-12-18T11:31:13.469Z" }, - { url = "https://files.pythonhosted.org/packages/86/aa/837821ecf0c022bbb74ca132e117c358321e72e7f9702d1b6a03758545e2/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", size = 2116582, upload-time = "2024-12-18T11:31:17.423Z" }, - { url = "https://files.pythonhosted.org/packages/81/b0/5e74656e95623cbaa0a6278d16cf15e10a51f6002e3ec126541e95c29ea3/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", size = 2151985, upload-time = "2024-12-18T11:31:19.901Z" }, - { url = "https://files.pythonhosted.org/packages/63/37/3e32eeb2a451fddaa3898e2163746b0cffbbdbb4740d38372db0490d67f3/pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", size = 2004715, upload-time = "2024-12-18T11:31:22.821Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298, upload-time = "2025-11-04T13:39:04.116Z" }, + { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475, upload-time = "2025-11-04T13:39:06.055Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815, upload-time = "2025-11-04T13:39:10.41Z" }, + { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567, upload-time = "2025-11-04T13:39:12.244Z" }, + { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442, upload-time = "2025-11-04T13:39:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956, upload-time = "2025-11-04T13:39:15.889Z" }, + { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253, upload-time = "2025-11-04T13:39:17.403Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050, upload-time = "2025-11-04T13:39:19.351Z" }, + { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178, upload-time = "2025-11-04T13:39:21Z" }, + { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833, upload-time = "2025-11-04T13:39:22.606Z" }, + { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156, upload-time = "2025-11-04T13:39:25.843Z" }, + { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378, upload-time = "2025-11-04T13:39:27.92Z" }, + { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622, upload-time = "2025-11-04T13:39:29.848Z" }, + { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, + { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, + { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, + { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, + { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, + { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, + { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, + { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, + { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, + { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351, upload-time = "2025-11-04T13:43:02.058Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363, upload-time = "2025-11-04T13:43:05.159Z" }, + { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615, upload-time = "2025-11-04T13:43:08.116Z" }, + { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369, upload-time = "2025-11-04T13:43:12.49Z" }, + { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218, upload-time = "2025-11-04T13:43:15.431Z" }, + { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951, upload-time = "2025-11-04T13:43:18.062Z" }, + { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428, upload-time = "2025-11-04T13:43:20.679Z" }, + { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009, upload-time = "2025-11-04T13:43:23.286Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, + { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, + { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, + { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, ] [[package]] @@ -10906,21 +11173,30 @@ wheels = [ [[package]] name = "pywin32" -version = "307" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" }, + { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/3d/91d710c40cc61fd241025351fd61fb674859973c5a0b3111e532d7229012/pywin32-307-cp310-cp310-win32.whl", hash = "sha256:f8f25d893c1e1ce2d685ef6d0a481e87c6f510d0f3f117932781f412e0eba31b", size = 5904291, upload-time = "2024-10-04T19:58:18.643Z" }, - { url = "https://files.pythonhosted.org/packages/94/b4/20804bb7528419d503c71cfcb8988f0eb9f3596501a9d86eb528c9998055/pywin32-307-cp310-cp310-win_amd64.whl", hash = "sha256:36e650c5e5e6b29b5d317385b02d20803ddbac5d1031e1f88d20d76676dd103d", size = 6535115, upload-time = "2024-10-04T19:58:20.695Z" }, - { url = "https://files.pythonhosted.org/packages/65/55/f1c84fcccbd5b75c09aa2a948551ad4569f9c14994a39959d3fee3267911/pywin32-307-cp310-cp310-win_arm64.whl", hash = "sha256:0c12d61e0274e0c62acee79e3e503c312426ddd0e8d4899c626cddc1cafe0ff4", size = 7948521, upload-time = "2024-10-04T19:58:22.486Z" }, - { url = "https://files.pythonhosted.org/packages/f9/29/5f50cb02aef57711bf941e1d93bfe602625f89faf33abb737441ab698496/pywin32-307-cp311-cp311-win32.whl", hash = "sha256:fec5d27cc893178fab299de911b8e4d12c5954e1baf83e8a664311e56a272b75", size = 5905392, upload-time = "2024-10-04T19:58:24.589Z" }, - { url = "https://files.pythonhosted.org/packages/5e/8d/dd2bf7e5dbfed3ea17b07763bc13d007583ef48914ed446be1c329c8e601/pywin32-307-cp311-cp311-win_amd64.whl", hash = "sha256:987a86971753ed7fdd52a7fb5747aba955b2c7fbbc3d8b76ec850358c1cc28c3", size = 6536159, upload-time = "2024-10-04T19:58:26.93Z" }, - { url = "https://files.pythonhosted.org/packages/63/72/dce6d08a2adeaf9e7e0462173610900d01d16a449aa74c9e035b7c2ec8f8/pywin32-307-cp311-cp311-win_arm64.whl", hash = "sha256:fd436897c186a2e693cd0437386ed79f989f4d13d6f353f8787ecbb0ae719398", size = 7949586, upload-time = "2024-10-04T19:58:29.248Z" }, - { url = "https://files.pythonhosted.org/packages/90/4e/9c660fa6c34db3c9542c9682b0ccd9edd63a6a4cb6ac4d22014b2c3355c9/pywin32-307-cp312-cp312-win32.whl", hash = "sha256:07649ec6b01712f36debf39fc94f3d696a46579e852f60157a729ac039df0815", size = 5916997, upload-time = "2024-10-04T19:58:32.086Z" }, - { url = "https://files.pythonhosted.org/packages/9c/11/c56e771d2cdbd2dac8e656edb2c814e4b2239da2c9028aa7265cdfff8aed/pywin32-307-cp312-cp312-win_amd64.whl", hash = "sha256:00d047992bb5dcf79f8b9b7c81f72e0130f9fe4b22df613f755ab1cc021d8347", size = 6519708, upload-time = "2024-10-04T19:58:34.597Z" }, - { url = "https://files.pythonhosted.org/packages/cd/64/53b1112cb05f85a6c87339a9f90a3b82d67ecb46f16b45abaac3bf4dee2b/pywin32-307-cp312-cp312-win_arm64.whl", hash = "sha256:b53658acbfc6a8241d72cc09e9d1d666be4e6c99376bc59e26cdb6223c4554d2", size = 7952978, upload-time = "2024-10-04T19:58:36.518Z" }, - { url = "https://files.pythonhosted.org/packages/61/c2/bdff07ee75b9c0a0f87cd52bfb45152e40d4c6f99e7256336e243cf4da2d/pywin32-307-cp313-cp313-win32.whl", hash = "sha256:ea4d56e48dc1ab2aa0a5e3c0741ad6e926529510516db7a3b6981a1ae74405e5", size = 5915947, upload-time = "2024-10-04T19:58:38.637Z" }, - { url = "https://files.pythonhosted.org/packages/fd/59/b891cf47d5893ee87e09686e736a84b80a8c5112a1a80e37363ab8801f54/pywin32-307-cp313-cp313-win_amd64.whl", hash = "sha256:576d09813eaf4c8168d0bfd66fb7cb3b15a61041cf41598c2db4a4583bf832d2", size = 6518782, upload-time = "2024-10-04T19:58:41.313Z" }, - { url = "https://files.pythonhosted.org/packages/08/9b/3c797468a96f68ce86f84917c198f60fc4189ab2ddc5841bcd71ead7680f/pywin32-307-cp313-cp313-win_arm64.whl", hash = "sha256:b30c9bdbffda6a260beb2919f918daced23d32c79109412c2085cbc513338a0a", size = 7952027, upload-time = "2024-10-04T19:58:43.823Z" }, + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, ] [[package]] @@ -11265,16 +11541,16 @@ wheels = [ [[package]] name = "referencing" -version = "0.37.0" +version = "0.36.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, ] [[package]] @@ -11421,6 +11697,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4b/0d/53aea75710af4528a25ed6837d71d117602b01946b307a3912cb3cfcbcba/retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606", size = 7986, upload-time = "2016-05-11T13:58:39.925Z" }, ] +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" }, +] + [[package]] name = "rich" version = "13.9.4" @@ -11435,6 +11723,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424, upload-time = "2024-11-01T16:43:55.817Z" }, ] +[[package]] +name = "rich-rst" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "rich" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/6d/a506aaa4a9eaa945ed8ab2b7347859f53593864289853c5d6d62b77246e0/rich_rst-1.3.2.tar.gz", hash = "sha256:a1196fdddf1e364b02ec68a05e8ff8f6914fee10fbca2e6b6735f166bb0da8d4", size = 14936, upload-time = "2025-10-14T16:49:45.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/2f/b4530fbf948867702d0a3f27de4a6aab1d156f406d72852ab902c4d04de9/rich_rst-1.3.2-py3-none-any.whl", hash = "sha256:a99b4907cbe118cf9d18b0b44de272efa61f15117c61e39ebdc431baf5df722a", size = 12567, upload-time = "2025-10-14T16:49:42.953Z" }, +] + [[package]] name = "rich-toolkit" version = "0.15.1" @@ -12027,6 +12328,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f6/eb/6a978fa081fb7533782f40c4d740bf11880795d4a459d568bf842c37d23a/scrapegraph_py-1.38.0-py3-none-any.whl", hash = "sha256:a1871b48060e950051c7d73b9f3cba69abaa9bfdbb190df9f775660d45bf8b6e", size = 44375, upload-time = "2025-10-23T18:42:51.093Z" }, ] +[[package]] +name = "secretstorage" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography", marker = "(python_full_version >= '3.12' and platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, + { name = "jeepney", marker = "(python_full_version >= '3.12' and platform_machine != 'arm64' and platform_machine != 'x86_64') or sys_platform != 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/8a/ed6747b1cc723c81f526d4c12c1b1d43d07190e1e8258dbf934392fc850e/secretstorage-3.4.1.tar.gz", hash = "sha256:a799acf5be9fb93db609ebaa4ab6e8f1f3ed5ae640e0fa732bfea59e9c3b50e8", size = 19871, upload-time = "2025-11-11T11:30:23.798Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/6d/24ebb101484f1911a6be6695b76ce43219caa110ebbe07d8c3a5f3106cca/secretstorage-3.4.1-py3-none-any.whl", hash = "sha256:c55d57b4da3de568d8c3af89dad244ab24c35ca1da8625fc1b550edf005ebc41", size = 15301, upload-time = "2025-11-11T11:30:22.618Z" }, +] + [[package]] name = "semchunk" version = "2.2.2" @@ -13878,20 +14192,20 @@ wheels = [ [[package]] name = "weaviate-client" -version = "4.10.2" +version = "4.18.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "authlib" }, + { name = "deprecation" }, { name = "grpcio" }, - { name = "grpcio-health-checking" }, - { name = "grpcio-tools" }, { name = "httpx" }, + { name = "protobuf" }, { name = "pydantic" }, { name = "validators" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e8/80/5e36a1923d0bc01a6151f1cfb1550da83efec340cded1c4f885615e09575/weaviate_client-4.10.2.tar.gz", hash = "sha256:fde5ad8e36604674d26b115288b58a7e182c91e36c2b41a00d18a36fe4ec7e3f", size = 587835, upload-time = "2024-12-13T17:04:25.329Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/6f/1c7e4f212c306d75bdf84d53509a8e7ec47db7fd23c0855cbe9c98ef00af/weaviate_client-4.18.0.tar.gz", hash = "sha256:12e04e3361884191a82aff7a8b6e8f5ead7e8bf6f2c09e03d46a67347b4a0f9b", size = 780122, upload-time = "2025-11-10T17:13:29.428Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/ca/9f2f1f27a05bfe90cb35a6dacaa547ad5a133211aeca7bb0021e2bbabb06/weaviate_client-4.10.2-py3-none-any.whl", hash = "sha256:e1706438aa7b57be5443bbdebff206cc6688110d1669d54c2721b3aa640b2c4c", size = 325368, upload-time = "2024-12-13T17:04:23.377Z" }, + { url = "https://files.pythonhosted.org/packages/f0/8e/7fe628b97c15bb0b293de0c9e2b03eb8560441fec9e20906e56e2fd9f433/weaviate_client-4.18.0-py3-none-any.whl", hash = "sha256:e5dda0b07520c26e1213b26dd2d7ef742d09fde6316d01bb0caae03a3c920c6d", size = 597989, upload-time = "2025-11-10T17:13:27.687Z" }, ] [[package]] @@ -13979,14 +14293,14 @@ wheels = [ [[package]] name = "werkzeug" -version = "3.1.3" +version = "3.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/69/83029f1f6300c5fb2471d621ab06f6ec6b3324685a2ce0f9777fd4a8b71e/werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746", size = 806925, upload-time = "2024-11-08T15:52:18.093Z" } +sdist = { url = "https://files.pythonhosted.org/packages/32/af/d4502dc713b4ccea7175d764718d5183caf8d0867a4f0190d5d4a45cea49/werkzeug-3.1.1.tar.gz", hash = "sha256:8cd39dfbdfc1e051965f156163e2974e52c210f130810e9ad36858f0fd3edad4", size = 806453, upload-time = "2024-11-01T16:40:45.462Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", size = 224498, upload-time = "2024-11-08T15:52:16.132Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ea/c67e1dee1ba208ed22c06d1d547ae5e293374bfc43e0eb0ef5e262b68561/werkzeug-3.1.1-py3-none-any.whl", hash = "sha256:a71124d1ef06008baafa3d266c02f56e1836a5984afd6dd6c9230669d60d9fb5", size = 224371, upload-time = "2024-11-01T16:40:43.994Z" }, ] [[package]] From fd9bb675cd5c6d28c2678556447b69a712f5c7ef Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Mon, 17 Nov 2025 12:46:21 -0300 Subject: [PATCH 02/25] migrate mcp composer fix to main --- .../base/langflow/api/v1/mcp_projects.py | 58 +- src/backend/base/langflow/main.py | 4 + .../API/queries/mcp/use-patch-flows-mcp.ts | 10 +- .../API/queries/mcp/use-patch-install-mcp.ts | 4 +- .../authModal/__tests__/AuthModal.test.tsx | 275 ++++ src/frontend/src/modals/authModal/index.tsx | 24 +- .../pages/homePage/hooks/useMcpServer.ts | 57 +- .../src/lfx/services/mcp_composer/service.py | 1102 ++++++++++++++--- .../custom/custom_component/test_component.py | 15 +- .../services/settings/test_mcp_composer.py | 322 +++++ .../settings/test_mcp_composer_windows.py | 523 ++++++++ 11 files changed, 2202 insertions(+), 192 deletions(-) create mode 100644 src/frontend/src/modals/authModal/__tests__/AuthModal.test.tsx create mode 100644 src/lfx/tests/unit/services/settings/test_mcp_composer.py create mode 100644 src/lfx/tests/unit/services/settings/test_mcp_composer_windows.py diff --git a/src/backend/base/langflow/api/v1/mcp_projects.py b/src/backend/base/langflow/api/v1/mcp_projects.py index 8a3a2392e79e..c2718c7a2fa1 100644 --- a/src/backend/base/langflow/api/v1/mcp_projects.py +++ b/src/backend/base/langflow/api/v1/mcp_projects.py @@ -408,6 +408,9 @@ async def update_project_mcp_settings( should_start_composer = False should_stop_composer = False + # Store original auth settings in case we need to rollback + original_auth_settings = project.auth_settings + # Update project-level auth settings with encryption if "auth_settings" in request.model_fields_set and request.auth_settings is not None: auth_result = handle_auth_settings_update( @@ -419,8 +422,6 @@ async def update_project_mcp_settings( should_start_composer = auth_result["should_start_composer"] should_stop_composer = auth_result["should_stop_composer"] - session.add(project) - # Query flows in the project flows = (await session.exec(select(Flow).where(Flow.folder_id == project_id))).all() flows_to_update = {x.id: x for x in request.settings} @@ -439,13 +440,17 @@ async def update_project_mcp_settings( session.add(flow) updated_flows.append(flow) - await session.commit() - response: dict[str, Any] = { "message": f"Updated MCP settings for {len(updated_flows)} flows and project auth settings" } + # Handle MCP Composer start/stop before committing auth settings if should_handle_mcp_composer: + # Get MCP Composer service once for all branches + mcp_composer_service: MCPComposerService = cast( + MCPComposerService, get_service(ServiceType.MCP_COMPOSER_SERVICE) + ) + if should_start_composer: await logger.adebug( f"Auth settings changed to OAuth for project {project.name} ({project_id}), " @@ -457,23 +462,34 @@ async def update_project_mcp_settings( auth_config = await _get_mcp_composer_auth_config(project) await get_or_start_mcp_composer(auth_config, project.name, project_id) composer_sse_url = await get_composer_sse_url(project) + # Clear any previous error on success + mcp_composer_service.clear_last_error(str(project_id)) response["result"] = { "project_id": str(project_id), "sse_url": composer_sse_url, "uses_composer": True, } except MCPComposerError as e: + # Don't rollback auth settings - persist them so UI can show the error + await logger.awarning(f"MCP Composer failed to start for project {project_id}: {e.message}") + # Store the error message so it can be retrieved via composer-url endpoint + mcp_composer_service.set_last_error(str(project_id), e.message) response["result"] = { "project_id": str(project_id), "uses_composer": True, "error_message": e.message, } except Exception as e: - # Unexpected errors - await logger.aerror(f"Failed to get mcp composer URL for project {project_id}: {e}") + # Rollback auth settings on unexpected errors + await logger.aerror( + f"Unexpected error starting MCP Composer for project {project_id}, " + f"rolling back auth settings: {e}" + ) + project.auth_settings = original_auth_settings raise HTTPException(status_code=500, detail=str(e)) from e else: - # This shouldn't happen - we determined we should start composer but now we can't use it + # OAuth is set but MCP Composer is disabled - save settings but return error + # Don't rollback - keep the auth settings so they can be used when composer is enabled await logger.aerror( f"PATCH: OAuth set but MCP Composer is disabled in settings for project {project_id}" ) @@ -487,10 +503,9 @@ async def update_project_mcp_settings( f"Auth settings changed from OAuth for project {project.name} ({project_id}), " "stopping MCP Composer" ) - mcp_composer_service: MCPComposerService = cast( - "MCPComposerService", get_service(ServiceType.MCP_COMPOSER_SERVICE) - ) await mcp_composer_service.stop_project_composer(str(project_id)) + # Clear any error when user explicitly disables OAuth + mcp_composer_service.clear_last_error(str(project_id)) # Provide the direct SSE URL since we're no longer using composer sse_url = await get_project_sse_url(project_id) @@ -503,6 +518,10 @@ async def update_project_mcp_settings( "uses_composer": False, } + # Only commit if composer started successfully (or wasn't needed) + session.add(project) + await session.commit() + return response except Exception as e: @@ -755,6 +774,20 @@ async def get_project_composer_url( try: project = await verify_project_access(project_id, current_user) if not should_use_mcp_composer(project): + # Check if there's a recent error from a failed OAuth attempt + mcp_composer_service: MCPComposerService = cast( + MCPComposerService, get_service(ServiceType.MCP_COMPOSER_SERVICE) + ) + last_error = mcp_composer_service.get_last_error(str(project_id)) + + # If there's a recent error, return it even though OAuth is not currently active + # This happens when OAuth was attempted but rolled back due to an error + if last_error: + return { + "project_id": str(project_id), + "uses_composer": False, + "error_message": last_error, + } return { "project_id": str(project_id), "uses_composer": False, @@ -768,6 +801,11 @@ async def get_project_composer_url( try: await get_or_start_mcp_composer(auth_config, project.name, project_id) composer_sse_url = await get_composer_sse_url(project) + # Clear any previous error on success + mcp_composer_service: MCPComposerService = cast( + MCPComposerService, get_service(ServiceType.MCP_COMPOSER_SERVICE) + ) + mcp_composer_service.clear_last_error(str(project_id)) return {"project_id": str(project_id), "sse_url": composer_sse_url, "uses_composer": True} except MCPComposerError as e: return {"project_id": str(project_id), "uses_composer": True, "error_message": e.message} diff --git a/src/backend/base/langflow/main.py b/src/backend/base/langflow/main.py index e4a2ecdd4758..2c8deb647b49 100644 --- a/src/backend/base/langflow/main.py +++ b/src/backend/base/langflow/main.py @@ -46,6 +46,10 @@ # Ignore Pydantic deprecation warnings from Langchain warnings.filterwarnings("ignore", category=PydanticDeprecatedSince20) +# Suppress ResourceWarning from anyio streams (SSE connections) +warnings.filterwarnings("ignore", category=ResourceWarning, message=".*MemoryObjectReceiveStream.*") +warnings.filterwarnings("ignore", category=ResourceWarning, message=".*MemoryObjectSendStream.*") + _tasks: list[asyncio.Task] = [] MAX_PORT = 65535 diff --git a/src/frontend/src/controllers/API/queries/mcp/use-patch-flows-mcp.ts b/src/frontend/src/controllers/API/queries/mcp/use-patch-flows-mcp.ts index b4bf2c7b036c..79b4e7b02ba0 100644 --- a/src/frontend/src/controllers/API/queries/mcp/use-patch-flows-mcp.ts +++ b/src/frontend/src/controllers/API/queries/mcp/use-patch-flows-mcp.ts @@ -45,7 +45,7 @@ export const usePatchFlowsMCP: useMutationFunctionType< PatchFlowMCPResponse, any, PatchFlowMCPRequest - > = mutate(["usePatchFlowsMCP"], patchFlowMCP, { + > = mutate(["usePatchFlowsMCP", params.project_id], patchFlowMCP, { onSuccess: (data, variables, context) => { const authSettings = (variables as unknown as PatchFlowMCPRequest) .auth_settings; @@ -73,12 +73,12 @@ export const usePatchFlowsMCP: useMutationFunctionType< } }, onSettled: () => { - // Use invalidateQueries instead of refetchQueries to avoid race conditions - // This marks the queries as stale but doesn't immediately refetch them - queryClient.invalidateQueries({ queryKey: ["useGetFlowsMCP"] }); + // Invalidate only this specific project's queries to avoid affecting other projects + queryClient.invalidateQueries({ + queryKey: ["useGetFlowsMCP", params.project_id], + }); }, ...options, - retry: 0, }); return mutation; diff --git a/src/frontend/src/controllers/API/queries/mcp/use-patch-install-mcp.ts b/src/frontend/src/controllers/API/queries/mcp/use-patch-install-mcp.ts index 5af1531caebf..d9a01b365ebb 100644 --- a/src/frontend/src/controllers/API/queries/mcp/use-patch-install-mcp.ts +++ b/src/frontend/src/controllers/API/queries/mcp/use-patch-install-mcp.ts @@ -47,10 +47,8 @@ export const usePatchInstallMCP: useMutationFunctionType< PatchInstallMCPResponse, any, PatchInstallMCPBody - > = mutate(["usePatchInstallMCP"], patchInstallMCP, { + > = mutate(["usePatchInstallMCP", params.project_id], patchInstallMCP, { ...options, - retry: 0, - onSuccess: (data, variables, context) => { queryClient.invalidateQueries({ queryKey: ["useGetInstalledMCP", params.project_id], diff --git a/src/frontend/src/modals/authModal/__tests__/AuthModal.test.tsx b/src/frontend/src/modals/authModal/__tests__/AuthModal.test.tsx new file mode 100644 index 000000000000..59c1eaff2ac5 --- /dev/null +++ b/src/frontend/src/modals/authModal/__tests__/AuthModal.test.tsx @@ -0,0 +1,275 @@ +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { TooltipProvider } from "@/components/ui/tooltip"; +import AuthModal from "../index"; + +// Mock utilities +jest.mock("@/utils/mcpUtils", () => ({ + AUTH_METHODS_ARRAY: [ + { id: "none", label: "None" }, + { id: "apikey", label: "API Key" }, + { id: "oauth", label: "OAuth" }, + ], +})); + +jest.mock("@/utils/stringManipulation", () => ({ + toSpaceCase: (str: string) => str.replace(/_/g, " "), +})); + +// Mock UI components +jest.mock("@/components/common/genericIconComponent", () => ({ + __esModule: true, + default: ({ name, className, ...props }: any) => ( + + {name} + + ), +})); + +// Mock custom link +jest.mock("@/customization/components/custom-link", () => ({ + CustomLink: ({ children, to, className }: any) => ( + + {children} + + ), +})); + +// Custom render function with TooltipProvider +const renderWithTooltip = (ui: React.ReactElement) => { + return render({ui}); +}; + +describe("AuthModal OAuth Port Synchronization", () => { + const mockOnSave = jest.fn(); + const mockSetOpen = jest.fn(); + + const defaultProps = { + open: true, + setOpen: mockSetOpen, + onSave: mockOnSave, + installedClients: [], + autoInstall: false, + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("should auto-sync Server URL when Port is changed", async () => { + const user = userEvent.setup(); + + renderWithTooltip(); + + // Select OAuth auth type + const oauthRadio = screen.getByLabelText(/OAuth/i); + await user.click(oauthRadio); + + // Fill in the Port field + const portInput = screen.getByLabelText(/^Port$/i); + await user.clear(portInput); + await user.type(portInput, "9001"); + + // Check that Server URL was auto-updated + const serverUrlInput = screen.getByLabelText(/Server URL/i); + expect(serverUrlInput).toHaveValue("http://localhost:9001"); + }); + + it("should auto-sync Server URL when Host is changed", async () => { + const user = userEvent.setup(); + + renderWithTooltip(); + + // Select OAuth auth type + const oauthRadio = screen.getByLabelText(/OAuth/i); + await user.click(oauthRadio); + + // Fill in the Host first + const hostInput = screen.getByLabelText(/^Host$/i); + await user.clear(hostInput); + await user.type(hostInput, "example.com"); + + // Then fill in the Port + const portInput = screen.getByLabelText(/^Port$/i); + await user.clear(portInput); + await user.type(portInput, "8080"); + + // Check that Server URL was auto-updated with both host and port + const serverUrlInput = screen.getByLabelText(/Server URL/i); + expect(serverUrlInput).toHaveValue("http://example.com:8080"); + }); + + it("should auto-sync Callback Path when Port is changed", async () => { + const user = userEvent.setup(); + + renderWithTooltip(); + + // Select OAuth auth type + const oauthRadio = screen.getByLabelText(/OAuth/i); + await user.click(oauthRadio); + + // Fill in the Port field + const portInput = screen.getByLabelText(/^Port$/i); + await user.clear(portInput); + await user.type(portInput, "9001"); + + // Check that Callback Path was auto-updated + const callbackPathInput = screen.getByLabelText(/Callback Path/i); + expect(callbackPathInput).toHaveValue( + "http://localhost:9001/auth/idaas/callback", + ); + }); + + it("should auto-sync both Server URL and Callback Path when Host changes", async () => { + const user = userEvent.setup(); + + renderWithTooltip(); + + // Select OAuth auth type + const oauthRadio = screen.getByLabelText(/OAuth/i); + await user.click(oauthRadio); + + // Fill in Host and Port + const hostInput = screen.getByLabelText(/^Host$/i); + await user.clear(hostInput); + await user.type(hostInput, "192.168.1.100"); + + const portInput = screen.getByLabelText(/^Port$/i); + await user.clear(portInput); + await user.type(portInput, "9002"); + + // Verify Server URL + const serverUrlInput = screen.getByLabelText(/Server URL/i); + expect(serverUrlInput).toHaveValue("http://192.168.1.100:9002"); + + // Verify Callback Path + const callbackPathInput = screen.getByLabelText(/Callback Path/i); + expect(callbackPathInput).toHaveValue( + "http://192.168.1.100:9002/auth/idaas/callback", + ); + }); + + it("should save correctly synced OAuth settings", async () => { + const user = userEvent.setup(); + + renderWithTooltip(); + + // Select OAuth auth type + const oauthRadio = screen.getByLabelText(/OAuth/i); + await user.click(oauthRadio); + + // Fill in OAuth fields + const hostInput = screen.getByLabelText(/^Host$/i); + await user.clear(hostInput); + await user.type(hostInput, "localhost"); + + const portInput = screen.getByLabelText(/^Port$/i); + await user.clear(portInput); + await user.type(portInput, "9001"); + + const clientIdInput = screen.getByLabelText(/Client ID/i); + await user.type(clientIdInput, "test-client-id"); + + const clientSecretInput = screen.getByLabelText(/Client Secret/i); + await user.type(clientSecretInput, "test-secret"); + + const authUrlInput = screen.getByLabelText(/Authorization URL/i); + await user.type(authUrlInput, "http://localhost:9001/auth/authorize"); + + const tokenUrlInput = screen.getByLabelText(/Token URL/i); + await user.type(tokenUrlInput, "http://localhost:9001/auth/token"); + + // Click Save + const saveButton = screen.getByRole("button", { name: /Save/i }); + await user.click(saveButton); + + // Verify onSave was called with correct synced data + expect(mockOnSave).toHaveBeenCalledWith( + expect.objectContaining({ + auth_type: "oauth", + oauth_host: "localhost", + oauth_port: "9001", + oauth_server_url: "http://localhost:9001", + oauth_callback_path: "http://localhost:9001/auth/idaas/callback", + oauth_client_id: "test-client-id", + oauth_client_secret: "test-secret", + oauth_auth_url: "http://localhost:9001/auth/authorize", + oauth_token_url: "http://localhost:9001/auth/token", + }), + ); + }); + + it("should preserve existing Server URL if manually edited after port change", async () => { + const user = userEvent.setup(); + + renderWithTooltip(); + + // Select OAuth auth type + const oauthRadio = screen.getByLabelText(/OAuth/i); + await user.click(oauthRadio); + + // Set port (auto-syncs Server URL) + const portInput = screen.getByLabelText(/^Port$/i); + await user.clear(portInput); + await user.type(portInput, "9001"); + + // Manually edit Server URL to something different + const serverUrlInput = screen.getByLabelText(/Server URL/i); + await user.clear(serverUrlInput); + await user.type(serverUrlInput, "http://custom.example.com:9001"); + + // Verify the manual edit is preserved + expect(serverUrlInput).toHaveValue("http://custom.example.com:9001"); + + // Change port again + await user.clear(portInput); + await user.type(portInput, "9002"); + + // Server URL should now be auto-synced again + expect(serverUrlInput).toHaveValue("http://localhost:9002"); + }); + + it("should load existing auth settings correctly", () => { + const existingAuthSettings = { + auth_type: "oauth", + oauth_host: "existing.host.com", + oauth_port: "8080", + oauth_server_url: "http://existing.host.com:8080", + oauth_callback_path: "http://existing.host.com:8080/auth/idaas/callback", + oauth_client_id: "existing-client", + oauth_client_secret: "existing-secret", + oauth_auth_url: "http://existing.host.com:8080/auth", + oauth_token_url: "http://existing.host.com:8080/token", + oauth_mcp_scope: "user", + oauth_provider_scope: "openid", + }; + + renderWithTooltip( + , + ); + + // Verify fields are populated + expect(screen.getByLabelText(/^Host$/i)).toHaveValue("existing.host.com"); + expect(screen.getByLabelText(/^Port$/i)).toHaveValue("8080"); + expect(screen.getByLabelText(/Server URL/i)).toHaveValue( + "http://existing.host.com:8080", + ); + expect(screen.getByLabelText(/Callback Path/i)).toHaveValue( + "http://existing.host.com:8080/auth/idaas/callback", + ); + }); + + it("should not auto-sync if auth type is not OAuth", async () => { + const user = userEvent.setup(); + + renderWithTooltip(); + + // Select API Key auth type + const apikeyRadio = screen.getByLabelText(/API Key/i); + await user.click(apikeyRadio); + + // OAuth fields should not be visible + expect(screen.queryByLabelText(/^Port$/i)).not.toBeInTheDocument(); + expect(screen.queryByLabelText(/Server URL/i)).not.toBeInTheDocument(); + }); +}); diff --git a/src/frontend/src/modals/authModal/index.tsx b/src/frontend/src/modals/authModal/index.tsx index 5446a2c55547..58b69fe1af7f 100644 --- a/src/frontend/src/modals/authModal/index.tsx +++ b/src/frontend/src/modals/authModal/index.tsx @@ -79,10 +79,26 @@ const AuthModal = ({ }; const handleAuthFieldChange = (field: string, value: string) => { - setAuthFields((prev) => ({ - ...prev, - [field]: value, - })); + setAuthFields((prev) => { + const newFields = { + ...prev, + [field]: value, + }; + + // Auto-sync Server URL and Callback Path when Port or Host changes + if (field === "oauthPort" || field === "oauthHost") { + const host = + field === "oauthHost" ? value : prev.oauthHost || "localhost"; + const port = field === "oauthPort" ? value : prev.oauthPort || ""; + + if (port) { + newFields.oauthServerUrl = `http://${host}:${port}`; + newFields.oauthCallbackPath = `http://${host}:${port}/auth/idaas/callback`; + } + } + + return newFields; + }); }; const handleSave = () => { diff --git a/src/frontend/src/pages/MainPage/pages/homePage/hooks/useMcpServer.ts b/src/frontend/src/pages/MainPage/pages/homePage/hooks/useMcpServer.ts index a74d6c7f5f3a..bf518ee4366e 100644 --- a/src/frontend/src/pages/MainPage/pages/homePage/hooks/useMcpServer.ts +++ b/src/frontend/src/pages/MainPage/pages/homePage/hooks/useMcpServer.ts @@ -1,4 +1,5 @@ -import { useCallback, useMemo, useState } from "react"; +import { useQueryClient } from "@tanstack/react-query"; +import { useCallback, useEffect, useMemo, useState } from "react"; import { useGetFlowsMCP, usePatchFlowsMCP, @@ -11,7 +12,6 @@ import { customGetMCPUrl } from "@/customization/utils/custom-mcp-url"; import useAlertStore from "@/stores/alertStore"; import useAuthStore from "@/stores/authStore"; import type { InputFieldType } from "@/types/api"; -import { FlowType } from "@/types/flow"; import type { AuthSettingsType, MCPSettingsType } from "@/types/mcp"; import { buildMcpServerJson, @@ -30,6 +30,8 @@ type State = { isCopied: boolean; loadingMCP: string[]; authModalOpen: boolean; + isWaitingForComposer: boolean; + showSlowWarning: boolean; }; export const useMcpServer = ({ @@ -43,21 +45,23 @@ export const useMcpServer = ({ }) => { const setSuccessData = useAlertStore((s) => s.setSuccessData); const setErrorData = useAlertStore((s) => s.setErrorData); + const queryClient = useQueryClient(); const { data: mcpProjectData, isLoading: isLoadingMCPProjectData } = useGetFlowsMCP({ projectId }); const { mutate: patchFlowsMCP, isPending: isPatchingFlowsMCP } = usePatchFlowsMCP({ project_id: projectId }); - const { data: composerUrlData } = useGetProjectComposerUrl( - { projectId }, - { - enabled: - !!projectId && - mcpProjectData?.auth_settings?.auth_type === "oauth" && - ENABLE_MCP_COMPOSER && - !isPatchingFlowsMCP, - }, - ); + const { data: composerUrlData, isLoading: isLoadingComposerUrl } = + useGetProjectComposerUrl( + { projectId }, + { + enabled: + !!projectId && + mcpProjectData?.auth_settings?.auth_type === "oauth" && + ENABLE_MCP_COMPOSER && + !isPatchingFlowsMCP, + }, + ); const { data: installedMCPData } = useGetInstalledMCP({ projectId }); const { mutate: patchInstallMCP } = usePatchInstallMCP({ project_id: projectId, @@ -74,7 +78,20 @@ export const useMcpServer = ({ isCopied: false, loadingMCP: [], authModalOpen: false, + isWaitingForComposer: false, + showSlowWarning: false, }); + + // Clear waiting state when composer URL is loaded + useEffect(() => { + if (s.isWaitingForComposer && !isLoadingComposerUrl && composerUrlData) { + setS((prev) => ({ + ...prev, + isWaitingForComposer: false, + showSlowWarning: false, + })); + } + }, [s.isWaitingForComposer, isLoadingComposerUrl, composerUrlData]); // auth store selectors const apiKeyFromStore = useAuthStore((st) => st.apiKey); const isAutoLoginFromStore = useAuthStore((st) => st.autoLogin); @@ -188,9 +205,20 @@ export const useMcpServer = ({ action_description: f.action_description, mcp_enabled: f.mcp_enabled, })); + + // Clear cached composer URL data BEFORE making the request to ensure fresh errors are fetched + queryClient.removeQueries({ + queryKey: ["project-composer-url", projectId], + }); + + // Set waiting state for OAuth before making the request + if (authSettings.auth_type === "oauth") { + setS((prev) => ({ ...prev, isWaitingForComposer: true })); + } + patchFlowsMCP({ settings, auth_settings: authSettings }); }, - [patchFlowsMCP, flows], + [patchFlowsMCP, flows, queryClient, projectId], ); const authHeadersFragment = useMemo( @@ -259,6 +287,9 @@ export const useMcpServer = ({ composerUrlData, composerError, hasOAuthError, + isWaitingForComposer: s.isWaitingForComposer, + showSlowWarning: s.showSlowWarning, + isLoadingComposerUrl, // mcp json + url apiUrl, authHeadersFragment, diff --git a/src/lfx/src/lfx/services/mcp_composer/service.py b/src/lfx/src/lfx/services/mcp_composer/service.py index a48ef39cfb33..07d8e3b59046 100644 --- a/src/lfx/src/lfx/services/mcp_composer/service.py +++ b/src/lfx/src/lfx/services/mcp_composer/service.py @@ -1,13 +1,18 @@ """MCP Composer service for proxying and orchestrating MCP servers.""" import asyncio +import json import os +import platform import re import select import socket import subprocess +import tempfile +import typing from collections.abc import Callable from functools import wraps +from pathlib import Path from typing import Any from lfx.log.logger import logger @@ -72,17 +77,342 @@ def __init__(self): self._start_locks: dict[ str, asyncio.Lock ] = {} # Lock to prevent concurrent start operations for the same project + self._active_start_tasks: dict[ + str, asyncio.Task + ] = {} # Track active start tasks to cancel them when new request arrives + self._port_to_project: dict[int, str] = {} # Track which project is using which port + self._pid_to_project: dict[int, str] = {} # Track which PID belongs to which project + self._last_errors: dict[str, str] = {} # Track last error message per project for UI display - def _is_port_available(self, port: int) -> bool: - """Check if a port is available by trying to bind to it.""" + def get_last_error(self, project_id: str) -> str | None: + """Get the last error message for a project, if any.""" + return self._last_errors.get(project_id) + + def set_last_error(self, project_id: str, error_message: str) -> None: + """Set the last error message for a project.""" + self._last_errors[project_id] = error_message + + def clear_last_error(self, project_id: str) -> None: + """Clear the last error message for a project.""" + self._last_errors.pop(project_id, None) + + def _is_port_available(self, port: int, host: str = "localhost") -> bool: + """Check if a port is available by trying to bind to it. + + Args: + port: Port number to check + host: Host to check (default: localhost) + + Returns: + True if port is available (not in use), False if in use + """ try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - sock.bind(("0.0.0.0", port)) + # Don't use SO_REUSEADDR here as it can give false positives + sock.bind((host, port)) return True # Port is available except OSError: return False # Port is in use/bound + async def _kill_process_on_port(self, port: int) -> bool: + """Kill the process using the specified port. + + Cross-platform implementation supporting Windows, macOS, and Linux. + + Args: + port: The port number to check + + Returns: + True if a process was found and killed, False otherwise + """ + try: + await logger.adebug(f"Checking for processes using port {port}...") + os_type = platform.system() + + # Platform-specific command to find PID + if os_type == "Windows": + # Use netstat on Windows - use full path to avoid PATH issues + netstat_cmd = os.path.join(os.environ.get("SYSTEMROOT", "C:\\Windows"), "System32", "netstat.exe") # noqa: PTH118 + result = await asyncio.to_thread( + subprocess.run, + [netstat_cmd, "-ano"], + capture_output=True, + text=True, + check=False, + ) + + if result.returncode == 0: + # Parse netstat output to find PID + # Format: TCP 0.0.0.0:PORT 0.0.0.0:0 LISTENING PID + windows_pids: list[int] = [] + for line in result.stdout.split("\n"): + if f":{port}" in line and "LISTENING" in line: + parts = line.split() + if parts: + try: + pid = int(parts[-1]) + windows_pids.append(pid) + except (ValueError, IndexError): + continue + + await logger.adebug(f"Found {len(windows_pids)} process(es) using port {port}: {windows_pids}") + + for pid in windows_pids: + try: + await logger.adebug(f"Attempting to kill process {pid} on port {port}...") + # Use taskkill on Windows - use full path to avoid PATH issues + taskkill_cmd = os.path.join( # noqa: PTH118 + os.environ.get("SYSTEMROOT", "C:\\Windows"), "System32", "taskkill.exe" + ) + kill_result = await asyncio.to_thread( + subprocess.run, + [taskkill_cmd, "/F", "/PID", str(pid)], + capture_output=True, + check=False, + ) + + if kill_result.returncode == 0: + await logger.adebug(f"Successfully killed process {pid} on port {port}") + return True + await logger.awarning( + f"taskkill returned {kill_result.returncode} for process {pid} on port {port}" + ) + except Exception as e: # noqa: BLE001 + await logger.aerror(f"Error killing PID {pid}: {e}") + + return False + else: + # Use lsof on Unix-like systems (macOS, Linux) + result = await asyncio.to_thread( + subprocess.run, + ["lsof", "-ti", f":{port}"], + capture_output=True, + text=True, + check=False, + ) + + await logger.adebug(f"lsof returned code {result.returncode} for port {port}") + + # Extract PIDs from lsof output + lsof_output = result.stdout.strip() + lsof_errors = result.stderr.strip() + + if lsof_output: + await logger.adebug(f"lsof stdout: {lsof_output}") + if lsof_errors: + await logger.adebug(f"lsof stderr: {lsof_errors}") + + if result.returncode == 0 and lsof_output: + unix_pids = lsof_output.split("\n") + await logger.adebug(f"Found {len(unix_pids)} process(es) using port {port}: {unix_pids}") + + for pid_str in unix_pids: + try: + pid = int(pid_str.strip()) + await logger.adebug(f"Attempting to kill process {pid} on port {port}...") + + # Try to kill the process + kill_result = await asyncio.to_thread( + subprocess.run, + ["kill", "-9", str(pid)], + capture_output=True, + check=False, + ) + + if kill_result.returncode == 0: + await logger.adebug(f"Successfully sent kill signal to process {pid} on port {port}") + return True + await logger.awarning( + f"kill command returned {kill_result.returncode} for process {pid} on port {port}" + ) + except (ValueError, ProcessLookupError) as e: + await logger.aerror(f"Error processing PID {pid_str}: {e}") + + # If we get here, we found processes but couldn't kill any + return False + await logger.adebug(f"No process found using port {port}") + return False + except Exception as e: # noqa: BLE001 + await logger.aerror(f"Error finding/killing process on port {port}: {e}") + return False + return False + + async def _kill_zombie_mcp_processes(self, port: int) -> bool: + """Kill zombie MCP Composer processes that may be stuck. + + On Windows, sometimes MCP Composer processes start but fail to bind to port. + These processes become "zombies" that need to be killed before retry. + + Args: + port: The port that should be used + + Returns: + True if zombie processes were found and killed + """ + try: + os_type = platform.system() + if os_type != "Windows": + return False + + await logger.adebug(f"Looking for zombie MCP Composer processes on Windows for port {port}...") + + # First, try to find and kill any process using the port directly + # Use full path to netstat on Windows to avoid PATH issues + netstat_cmd = os.path.join(os.environ.get("SYSTEMROOT", "C:\\Windows"), "System32", "netstat.exe") # noqa: PTH118 + netstat_result = await asyncio.to_thread( + subprocess.run, + [netstat_cmd, "-ano"], + capture_output=True, + text=True, + check=False, + ) + + killed_any = False + if netstat_result.returncode == 0: + # Parse netstat output to find PIDs using our port + pids_on_port: list[int] = [] + for line in netstat_result.stdout.split("\n"): + if f":{port}" in line and "LISTENING" in line: + parts = line.split() + if parts: + try: + pid = int(parts[-1]) + # Only kill if not tracked by us + if pid not in self._pid_to_project: + pids_on_port.append(pid) + else: + project = self._pid_to_project[pid] + await logger.adebug( + f"Process {pid} on port {port} is tracked, skipping (project: {project})" + ) + except (ValueError, IndexError): + continue + + if pids_on_port: + await logger.adebug( + f"Found {len(pids_on_port)} untracked process(es) on port {port}: {pids_on_port}" + ) + for pid in pids_on_port: + try: + await logger.adebug(f"Killing process {pid} on port {port}...") + # Use full path to taskkill on Windows to avoid PATH issues + taskkill_cmd = os.path.join( # noqa: PTH118 + os.environ.get("SYSTEMROOT", "C:\\Windows"), "System32", "taskkill.exe" + ) + kill_result = await asyncio.to_thread( + subprocess.run, + [taskkill_cmd, "/F", "/PID", str(pid)], + capture_output=True, + check=False, + ) + if kill_result.returncode == 0: + await logger.adebug(f"Successfully killed process {pid} on port {port}") + killed_any = True + else: + stderr_output = ( + kill_result.stderr.decode() + if isinstance(kill_result.stderr, bytes) + else kill_result.stderr + ) + await logger.awarning(f"Failed to kill process {pid} on port {port}: {stderr_output}") + except Exception as e: # noqa: BLE001 + await logger.adebug(f"Error killing process {pid}: {e}") + + # Also look for any orphaned mcp-composer processes (without checking port) + # This catches processes that failed to bind but are still running + # Use PowerShell instead of deprecated wmic.exe for Windows 10/11 compatibility + try: + # Use PowerShell to get Python processes with command line info + # Build PowerShell command to find MCP Composer processes + ps_filter = ( + f"$_.Name -eq 'python.exe' -and $_.CommandLine -like '*mcp-composer*' " + f"-and ($_.CommandLine -like '*--port {port}*' -or $_.CommandLine -like '*--port={port}*')" + ) + ps_cmd = ( + f"Get-WmiObject Win32_Process | Where-Object {{ {ps_filter} }} | " + "Select-Object ProcessId,CommandLine | ConvertTo-Json" + ) + powershell_cmd = ["powershell.exe", "-NoProfile", "-Command", ps_cmd] + + ps_result = await asyncio.to_thread( + subprocess.run, + powershell_cmd, + capture_output=True, + text=True, + check=False, + timeout=5, + ) + + if ps_result.returncode == 0 and ps_result.stdout.strip(): + try: + # PowerShell may return single object or array + processes = json.loads(ps_result.stdout) + if isinstance(processes, dict): + processes = [processes] + elif not isinstance(processes, list): + processes = [] + + for proc in processes: + try: + pid = int(proc.get("ProcessId", 0)) + if pid <= 0 or pid in self._pid_to_project: + continue + + await logger.adebug( + f"Found orphaned MCP Composer process {pid} for port {port}, killing it" + ) + # Use full path to taskkill on Windows to avoid PATH issues + taskkill_cmd = os.path.join( # noqa: PTH118 + os.environ.get("SYSTEMROOT", "C:\\Windows"), "System32", "taskkill.exe" + ) + kill_result = await asyncio.to_thread( + subprocess.run, + [taskkill_cmd, "/F", "/PID", str(pid)], + capture_output=True, + check=False, + ) + if kill_result.returncode == 0: + await logger.adebug(f"Successfully killed orphaned process {pid}") + killed_any = True + + except (ValueError, KeyError) as e: + await logger.adebug(f"Error processing PowerShell result: {e}") + continue + + except json.JSONDecodeError as e: + await logger.adebug(f"Failed to parse PowerShell output: {e}") + + except asyncio.TimeoutError: + await logger.adebug("PowerShell command timed out while checking for orphaned processes") + except Exception as e: # noqa: BLE001 + await logger.adebug(f"Error using PowerShell to find orphaned processes: {e}") + + if killed_any: + # Give Windows time to clean up + await logger.adebug("Waiting 3 seconds for Windows to release port...") + await asyncio.sleep(3) + + return killed_any # noqa: TRY300 + + except Exception as e: # noqa: BLE001 + await logger.adebug(f"Error killing zombie processes: {e}") + return False + + def _is_port_used_by_another_project(self, port: int, current_project_id: str) -> tuple[bool, str | None]: + """Check if a port is being used by another project. + + Args: + port: The port to check + current_project_id: The current project ID + + Returns: + Tuple of (is_used_by_other, other_project_id) + """ + other_project_id = self._port_to_project.get(port) + if other_project_id and other_project_id != current_project_id: + return True, other_project_id + return False, None + async def start(self): """Check if the MCP Composer service is enabled.""" settings = get_settings_service().settings @@ -125,47 +455,290 @@ async def _do_stop_project_composer(self, project_id: str): composer_info = self.project_composers[project_id] process = composer_info.get("process") - if process: - try: - # Check if process is still running before trying to terminate - if process.poll() is None: - await logger.adebug(f"Terminating MCP Composer process {process.pid} for project {project_id}") - process.terminate() + try: + if process: + try: + # Check if process is still running before trying to terminate + if process.poll() is None: + await logger.adebug(f"Terminating MCP Composer process {process.pid} for project {project_id}") + process.terminate() - # Wait longer for graceful shutdown - try: - await asyncio.wait_for(self._wait_for_process_exit(process), timeout=3.0) - await logger.adebug(f"MCP Composer for project {project_id} terminated gracefully") - except asyncio.TimeoutError: - await logger.aerror( - f"MCP Composer for project {project_id} did not terminate gracefully, force killing" - ) - process.kill() - # Wait a bit more for force kill to complete + # Wait longer for graceful shutdown try: - await asyncio.wait_for(self._wait_for_process_exit(process), timeout=2.0) + await asyncio.wait_for(asyncio.to_thread(process.wait), timeout=2.0) + await logger.adebug(f"MCP Composer for project {project_id} terminated gracefully") except asyncio.TimeoutError: await logger.aerror( - f"Failed to kill MCP Composer process {process.pid} for project {project_id}" + f"MCP Composer for project {project_id} did not terminate gracefully, force killing" ) - else: - await logger.adebug(f"MCP Composer process for project {project_id} was already terminated") - - await logger.adebug(f"MCP Composer stopped for project {project_id}") + await asyncio.to_thread(process.kill) + await asyncio.to_thread(process.wait) + else: + await logger.adebug(f"MCP Composer process for project {project_id} was already terminated") - except ProcessLookupError: - # Process already terminated - await logger.adebug(f"MCP Composer process for project {project_id} was already terminated") - except Exception as e: # noqa: BLE001 - await logger.aerror(f"Error stopping MCP Composer for project {project_id}: {e}") + await logger.adebug(f"MCP Composer stopped for project {project_id}") - # Remove from tracking - del self.project_composers[project_id] + except ProcessLookupError: + # Process already terminated + await logger.adebug(f"MCP Composer process for project {project_id} was already terminated") + except Exception as e: # noqa: BLE001 + await logger.aerror(f"Error stopping MCP Composer for project {project_id}: {e}") + finally: + # Always clean up tracking, even if stopping failed + port = composer_info.get("port") + if port and self._port_to_project.get(port) == project_id: + self._port_to_project.pop(port, None) + await logger.adebug(f"Released port {port} from project {project_id}") + + # Clean up PID tracking + if process and process.pid: + self._pid_to_project.pop(process.pid, None) + await logger.adebug(f"Released PID {process.pid} tracking for project {project_id}") + + # Remove from tracking + self.project_composers.pop(project_id, None) + await logger.adebug(f"Removed tracking for project {project_id}") async def _wait_for_process_exit(self, process): """Wait for a process to exit.""" await asyncio.to_thread(process.wait) + async def _read_process_output_and_extract_error( + self, + process: subprocess.Popen, + oauth_server_url: str | None, + timeout: float = 2.0, + stdout_file=None, + stderr_file=None, + ) -> tuple[str, str, str]: + """Read process output and extract user-friendly error message. + + Args: + process: The subprocess to read from + oauth_server_url: OAuth server URL for error messages + timeout: Timeout for reading output + stdout_file: Optional file handle for stdout (Windows) + stderr_file: Optional file handle for stderr (Windows) + + Returns: + Tuple of (stdout, stderr, error_message) + """ + stdout_content = "" + stderr_content = "" + + try: + # On Windows with temp files, read from files instead of pipes + if stdout_file and stderr_file: + # Close file handles to flush and allow reading + try: + stdout_file.close() + stderr_file.close() + except Exception as e: # noqa: BLE001 + await logger.adebug(f"Error closing temp files: {e}") + + # Read from temp files using asyncio.to_thread + try: + + def read_file(filepath): + return Path(filepath).read_bytes() + + stdout_bytes = await asyncio.to_thread(read_file, stdout_file.name) + stdout_content = stdout_bytes.decode("utf-8", errors="replace") if stdout_bytes else "" + except Exception as e: # noqa: BLE001 + await logger.adebug(f"Error reading stdout file: {e}") + + try: + + def read_file(filepath): + return Path(filepath).read_bytes() + + stderr_bytes = await asyncio.to_thread(read_file, stderr_file.name) + stderr_content = stderr_bytes.decode("utf-8", errors="replace") if stderr_bytes else "" + except Exception as e: # noqa: BLE001 + await logger.adebug(f"Error reading stderr file: {e}") + + # Clean up temp files + try: + Path(stdout_file.name).unlink() + Path(stderr_file.name).unlink() + except Exception as e: # noqa: BLE001 + await logger.adebug(f"Error removing temp files: {e}") + else: + # Use asyncio.to_thread to avoid blocking the event loop + # Process returns bytes, decode with error handling + stdout_bytes, stderr_bytes = await asyncio.to_thread(process.communicate, timeout=timeout) + stdout_content = stdout_bytes.decode("utf-8", errors="replace") if stdout_bytes else "" + stderr_content = stderr_bytes.decode("utf-8", errors="replace") if stderr_bytes else "" + + except subprocess.TimeoutExpired: + process.kill() + error_msg = self._extract_error_message("", "", oauth_server_url) + return "", "", error_msg + + error_msg = self._extract_error_message(stdout_content, stderr_content, oauth_server_url) + return stdout_content, stderr_content, error_msg + + async def _read_stream_non_blocking(self, stream, stream_name: str) -> str: + """Read from a stream without blocking and log the content. + + Args: + stream: The stream to read from (stdout or stderr) + stream_name: Name of the stream for logging ("stdout" or "stderr") + + Returns: + The content read from the stream (empty string if nothing available) + """ + if not stream: + return "" + + try: + # On Windows, select.select() doesn't work with pipes (only sockets) + # Use platform-specific approach + os_type = platform.system() + + if os_type == "Windows": + # On Windows, select.select() doesn't work with pipes + # Skip stream reading during monitoring - output will be captured when process terminates + # This prevents blocking on peek() which can cause the monitoring loop to hang + return "" + # On Unix-like systems, use select + if select.select([stream], [], [], 0)[0]: + line_bytes = stream.readline() + if line_bytes: + # Decode bytes with error handling + line = line_bytes.decode("utf-8", errors="replace") if isinstance(line_bytes, bytes) else line_bytes + stripped = line.strip() + if stripped: + # Log errors at error level, everything else at debug + if stream_name == "stderr" and ("ERROR" in stripped or "error" in stripped): + await logger.aerror(f"MCP Composer {stream_name}: {stripped}") + else: + await logger.adebug(f"MCP Composer {stream_name}: {stripped}") + return stripped + except Exception as e: # noqa: BLE001 + await logger.adebug(f"Error reading {stream_name}: {e}") + return "" + + async def _ensure_port_available(self, port: int, current_project_id: str) -> None: + """Ensure a port is available, only killing untracked processes. + + Args: + port: The port number to ensure is available + current_project_id: The project ID requesting the port + + Raises: + MCPComposerPortError: If port cannot be made available + """ + is_port_available = self._is_port_available(port) + await logger.adebug(f"Port {port} availability check: {is_port_available}") + + if not is_port_available: + # Check if the port is being used by a tracked project + is_used_by_other, other_project_id = self._is_port_used_by_another_project(port, current_project_id) + + if is_used_by_other and other_project_id: + # Port is being used by another tracked project + # Check if we can take ownership (e.g., the other project is failing) + other_composer = self.project_composers.get(other_project_id) + if other_composer and other_composer.get("process"): + other_process = other_composer["process"] + # If the other process is still running and healthy, don't kill it + if other_process.poll() is None: + await logger.aerror( + f"Port {port} requested by project {current_project_id} is already in use by " + f"project {other_project_id}. Will not kill active MCP Composer process." + ) + port_error_msg = ( + f"Port {port} is already in use by another project. " + f"Please choose a different port (e.g., {port + 1}) " + f"or disable OAuth on the other project first." + ) + raise MCPComposerPortError(port_error_msg, current_project_id) + + # Process died but port tracking wasn't cleaned up - allow takeover + await logger.adebug( + f"Port {port} was tracked to project {other_project_id} but process died. " + f"Allowing project {current_project_id} to take ownership." + ) + # Clean up the old tracking + await self._do_stop_project_composer(other_project_id) + + # Check if port is used by a process owned by the current project (e.g., stuck in startup loop) + port_owner_project = self._port_to_project.get(port) + if port_owner_project == current_project_id: + # Port is owned by current project - safe to kill + await logger.adebug( + f"Port {port} is in use by current project {current_project_id} (likely stuck in startup). " + f"Killing process to retry." + ) + killed = await self._kill_process_on_port(port) + if killed: + await logger.adebug( + f"Successfully killed own process on port {port}. Waiting for port to be released..." + ) + await asyncio.sleep(2) + is_port_available = self._is_port_available(port) + if not is_port_available: + await logger.aerror(f"Port {port} is still in use after killing own process.") + port_error_msg = f"Port {port} is still in use after killing process" + raise MCPComposerPortError(port_error_msg) + else: + # Port is in use by unknown process - don't kill it (security concern) + await logger.aerror( + f"Port {port} is in use by an unknown process (not owned by Langflow). " + f"Will not kill external application for security reasons." + ) + port_error_msg = ( + f"Port {port} is already in use by another application. " + f"Please choose a different port (e.g., {port + 1}) or free up the port manually." + ) + raise MCPComposerPortError(port_error_msg, current_project_id) + + await logger.adebug(f"Port {port} is available, proceeding with MCP Composer startup") + + async def _log_startup_error_details( + self, + project_id: str, + cmd: list[str], + host: str, + port: int, + stdout: str = "", + stderr: str = "", + error_msg: str = "", + exit_code: int | None = None, + pid: int | None = None, + ) -> None: + """Log detailed startup error information. + + Args: + project_id: The project ID + cmd: The command that was executed + host: Target host + port: Target port + stdout: Standard output from the process + stderr: Standard error from the process + error_msg: User-friendly error message + exit_code: Process exit code (if terminated) + pid: Process ID (if still running) + """ + await logger.aerror(f"MCP Composer startup failed for project {project_id}:") + if exit_code is not None: + await logger.aerror(f" - Process died with exit code: {exit_code}") + if pid is not None: + await logger.aerror(f" - Process is running (PID: {pid}) but failed to bind to port {port}") + await logger.aerror(f" - Target: {host}:{port}") + + # Obfuscate secrets in command before logging + safe_cmd = self._obfuscate_command_secrets(cmd) + await logger.aerror(f" - Command: {' '.join(safe_cmd)}") + + if stderr.strip(): + await logger.aerror(f" - Error output: {stderr.strip()}") + if stdout.strip(): + await logger.aerror(f" - Standard output: {stdout.strip()}") + if error_msg: + await logger.aerror(f" - Error message: {error_msg}") + def _validate_oauth_settings(self, auth_config: dict[str, Any]) -> None: """Validate that all required OAuth settings are present and non-empty. @@ -205,6 +778,18 @@ def _validate_oauth_settings(self, auth_config: dict[str, Any]) -> None: config_error_msg = f"Invalid OAuth configuration: {'; '.join(error_parts)}" raise MCPComposerConfigError(config_error_msg) + @staticmethod + def _normalize_config_value(value: Any) -> Any: + """Normalize a config value (None or empty string becomes None). + + Args: + value: The value to normalize + + Returns: + None if value is None or empty string, otherwise the value + """ + return None if (value is None or value == "") else value + def _has_auth_config_changed(self, existing_auth: dict[str, Any] | None, new_auth: dict[str, Any] | None) -> bool: """Check if auth configuration has changed in a way that requires restart.""" if not existing_auth and not new_auth: @@ -230,12 +815,8 @@ def _has_auth_config_changed(self, existing_auth: dict[str, Any] | None, new_aut # Compare relevant fields for field in fields_to_check: - old_val = existing_auth.get(field) - new_val = new_auth.get(field) - - # Convert None and empty string to None for comparison - old_normalized = None if (old_val is None or old_val == "") else old_val - new_normalized = None if (new_val is None or new_val == "") else new_val + old_normalized = self._normalize_config_value(existing_auth.get(field)) + new_normalized = self._normalize_config_value(new_auth.get(field)) if old_normalized != new_normalized: return True @@ -252,23 +833,30 @@ def _obfuscate_command_secrets(self, cmd: list[str]) -> list[str]: List of command arguments with secrets replaced with ***REDACTED*** """ safe_cmd = [] - skip_next = False + i = 0 - for i, arg in enumerate(cmd): - if skip_next: - skip_next = False - safe_cmd.append("***REDACTED***") - continue + while i < len(cmd): + arg = cmd[i] + # Check if this is --env followed by a secret key if arg == "--env" and i + 2 < len(cmd): - # Check if next env var is a secret env_key = cmd[i + 1] + env_value = cmd[i + 2] + if any(secret in env_key.lower() for secret in ["secret", "key", "token"]): - safe_cmd.extend([arg, env_key]) # Keep env key, redact value - skip_next = True + # Redact the value + safe_cmd.extend([arg, env_key, "***REDACTED***"]) + i += 3 # Skip all three: --env, key, and value continue + # Not a secret, keep as-is + safe_cmd.extend([arg, env_key, env_value]) + i += 3 + continue + + # Regular argument safe_cmd.append(arg) + i += 1 return safe_cmd @@ -321,11 +909,75 @@ async def start_project_composer( project_id: str, sse_url: str, auth_config: dict[str, Any] | None, - max_startup_checks: int = 5, + max_retries: int = 3, + max_startup_checks: int = 40, startup_delay: float = 2.0, ) -> None: """Start an MCP Composer instance for a specific project. + Args: + project_id: The project ID + sse_url: The SSE URL to connect to + auth_config: Authentication configuration + max_retries: Maximum number of retry attempts (default: 3) + max_startup_checks: Number of checks per retry attempt (default: 40) + startup_delay: Delay between checks in seconds (default: 2.0) + + Raises: + MCPComposerError: Various specific errors if startup fails + """ + # Cancel any active start operation for this project + if project_id in self._active_start_tasks: + active_task = self._active_start_tasks[project_id] + if not active_task.done(): + await logger.adebug(f"Cancelling previous MCP Composer start operation for project {project_id}") + active_task.cancel() + try: + await active_task + except asyncio.CancelledError: + await logger.adebug(f"Previous start operation for project {project_id} cancelled successfully") + finally: + # Clean up the cancelled task from tracking + del self._active_start_tasks[project_id] + + # Create and track the current task + current_task = asyncio.current_task() + if not current_task: + await logger.awarning( + f"Could not get current task for project {project_id}. " + f"Concurrent start operations may not be properly cancelled." + ) + else: + self._active_start_tasks[project_id] = current_task + + try: + await self._do_start_project_composer( + project_id, sse_url, auth_config, max_retries, max_startup_checks, startup_delay + ) + finally: + # Clean up the task reference when done + if project_id in self._active_start_tasks and self._active_start_tasks[project_id] == current_task: + del self._active_start_tasks[project_id] + + async def _do_start_project_composer( + self, + project_id: str, + sse_url: str, + auth_config: dict[str, Any] | None, + max_retries: int = 3, + max_startup_checks: int = 40, + startup_delay: float = 2.0, + ) -> None: + """Internal method to start an MCP Composer instance. + + Args: + project_id: The project ID + sse_url: The SSE URL to connect to + auth_config: Authentication configuration + max_retries: Maximum number of retry attempts (default: 3) + max_startup_checks: Number of checks per retry attempt (default: 40) + startup_delay: Delay between checks in seconds (default: 2.0) + Raises: MCPComposerError: Various specific errors if startup fails """ @@ -366,11 +1018,13 @@ async def start_project_composer( composer_info = self.project_composers[project_id] process = composer_info.get("process") existing_auth = composer_info.get("auth_config", {}) + existing_port = composer_info.get("port") # Check if process is still running if process and process.poll() is None: # Process is running - only restart if config changed auth_changed = self._has_auth_config_changed(existing_auth, auth_config) + if auth_changed: await logger.adebug(f"Config changed for project {project_id}, restarting MCP Composer") await self._do_stop_project_composer(project_id) @@ -383,28 +1037,123 @@ async def start_project_composer( # Process died or never started properly, restart it await logger.adebug(f"MCP Composer process died for project {project_id}, restarting") await self._do_stop_project_composer(project_id) + # Also kill any process that might be using the old port + if existing_port: + try: + await asyncio.wait_for(self._kill_process_on_port(existing_port), timeout=5.0) + except asyncio.TimeoutError: + await logger.aerror(f"Timeout while killing process on port {existing_port}") - is_port_available = self._is_port_available(project_port) - if not is_port_available: - await logger.awarning(f"Port {project_port} is already in use.") - port_error_msg = f"Port {project_port} is already in use" - raise MCPComposerPortError(port_error_msg) + # Retry loop: try starting the process multiple times + last_error = None + try: + # Before first attempt, try to kill any zombie MCP Composer processes + # This is a best-effort operation - don't fail startup if it errors + try: + await logger.adebug( + f"Checking for zombie MCP Composer processes on port {project_port} before startup..." + ) + zombies_killed = await self._kill_zombie_mcp_processes(project_port) + if zombies_killed: + await logger.adebug(f"Killed zombie processes, port {project_port} should now be free") + except Exception as zombie_error: # noqa: BLE001 + # Log but continue - zombie cleanup is optional + await logger.awarning( + f"Failed to check/kill zombie processes (non-fatal): {zombie_error}. Continuing with startup..." + ) - # Start the MCP Composer process (single attempt, no outer retry loop) - process = await self._start_project_composer_process( - project_id, project_host, project_port, sse_url, auth_config, max_startup_checks, startup_delay - ) - self.project_composers[project_id] = { - "process": process, - "host": project_host, - "port": project_port, - "sse_url": sse_url, - "auth_config": auth_config, - } + # Ensure port is available (only kill untracked processes) + try: + await self._ensure_port_available(project_port, project_id) + except MCPComposerPortError as e: + # Port error before starting - store and raise immediately + self._last_errors[project_id] = e.message + raise + for retry_attempt in range(1, max_retries + 1): + try: + await logger.adebug( + f"Starting MCP Composer for project {project_id} (attempt {retry_attempt}/{max_retries})" + ) - await logger.adebug( - f"MCP Composer started for project {project_id} on port {project_port} (PID: {process.pid})" - ) + # Re-check port availability before each attempt to prevent race conditions + if retry_attempt > 1: + await logger.adebug(f"Re-checking port {project_port} availability before retry...") + await self._ensure_port_available(project_port, project_id) + + process = await self._start_project_composer_process( + project_id, + project_host, + project_port, + sse_url, + auth_config, + max_startup_checks, + startup_delay, + ) + + except MCPComposerError as e: + last_error = e + await logger.aerror( + f"MCP Composer startup attempt {retry_attempt}/{max_retries} failed " + f"for project {project_id}: {e.message}" + ) + + # Clean up any partially started process before retrying + if project_id in self.project_composers: + await self._do_stop_project_composer(project_id) + + # If not the last attempt, wait and try to clean up zombie processes + if retry_attempt < max_retries: + await logger.adebug(f"Waiting 2 seconds before retry attempt {retry_attempt + 1}...") + await asyncio.sleep(2) + + # On Windows, try to kill any zombie MCP Composer processes for this port + # This is a best-effort operation - don't fail retry if it errors + try: + msg = f"Checking for zombie MCP Composer processes on port {project_port}" + await logger.adebug(msg) + zombies_killed = await self._kill_zombie_mcp_processes(project_port) + if zombies_killed: + await logger.adebug(f"Killed zombie processes, port {project_port} should be free") + except Exception as retry_zombie_error: # noqa: BLE001 + # Log but continue - zombie cleanup is optional + msg = f"Failed to check/kill zombie processes during retry: {retry_zombie_error}" + await logger.awarning(msg) + + else: + # Success! Store the composer info and register the port and PID + self.project_composers[project_id] = { + "process": process, + "host": project_host, + "port": project_port, + "sse_url": sse_url, + "auth_config": auth_config, + } + self._port_to_project[project_port] = project_id + self._pid_to_project[process.pid] = project_id + # Clear any previous error on success + self.clear_last_error(project_id) + + await logger.adebug( + f"MCP Composer started for project {project_id} on port {project_port} " + f"(PID: {process.pid}) after {retry_attempt} attempt(s)" + ) + return # Success! + + # All retries failed, raise the last error + if last_error: + await logger.aerror( + f"MCP Composer failed to start for project {project_id} after {max_retries} attempts" + ) + # Store the error message for later retrieval + self._last_errors[project_id] = last_error.message + raise last_error + + except asyncio.CancelledError: + # Operation was cancelled, clean up any started process + await logger.adebug(f"MCP Composer start operation for project {project_id} was cancelled") + if project_id in self.project_composers: + await self._do_stop_project_composer(project_id) + raise # Re-raise to propagate cancellation async def _start_project_composer_process( self, @@ -413,14 +1162,34 @@ async def _start_project_composer_process( port: int, sse_url: str, auth_config: dict[str, Any] | None = None, - max_startup_checks: int = 5, + max_startup_checks: int = 40, startup_delay: float = 2.0, ) -> subprocess.Popen: - """Start the MCP Composer subprocess for a specific project.""" + """Start the MCP Composer subprocess for a specific project. + + Args: + project_id: The project ID + host: Host to bind to + port: Port to bind to + sse_url: SSE URL to connect to + auth_config: Authentication configuration + max_startup_checks: Number of port binding checks (default: 40) + startup_delay: Delay between checks in seconds (default: 2.0) + + Returns: + The started subprocess + + Raises: + MCPComposerStartupError: If startup fails + """ settings = get_settings_service().settings cmd = [ "uvx", f"mcp-composer{settings.mcp_composer_version}", + "--port", + str(port), + "--host", + host, "--mode", "sse", "--sse-url", @@ -442,6 +1211,8 @@ async def _start_project_composer_process( cmd.extend(["--env", "ENABLE_OAUTH", "True"]) # Map auth config to environment variables for OAuth + # Note: oauth_host and oauth_port are passed both via --host/--port CLI args + # (for server binding) and as environment variables (for OAuth flow) oauth_env_mapping = { "oauth_host": "OAUTH_HOST", "oauth_port": "OAUTH_PORT", @@ -462,68 +1233,102 @@ async def _start_project_composer_process( if value is not None and str(value).strip(): cmd.extend(["--env", env_key, str(value)]) + # Log the command being executed (with secrets obfuscated) + safe_cmd = self._obfuscate_command_secrets(cmd) + await logger.adebug(f"Starting MCP Composer with command: {' '.join(safe_cmd)}") + # Start the subprocess with both stdout and stderr captured - process = subprocess.Popen(cmd, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) # noqa: ASYNC220, S603 + # On Windows, use temp files to avoid pipe buffering issues that can cause process to hang + stdout_handle: int | typing.IO[bytes] = subprocess.PIPE + stderr_handle: int | typing.IO[bytes] = subprocess.PIPE + stdout_file = None + stderr_file = None + + if platform.system() == "Windows": + # Create temp files for stdout/stderr on Windows to avoid pipe deadlocks + # Note: We intentionally don't use context manager as we need files to persist + # for the subprocess and be cleaned up manually later + stdout_file = tempfile.NamedTemporaryFile( # noqa: SIM115 + mode="w+b", delete=False, prefix=f"mcp_composer_{project_id}_stdout_", suffix=".log" + ) + stderr_file = tempfile.NamedTemporaryFile( # noqa: SIM115 + mode="w+b", delete=False, prefix=f"mcp_composer_{project_id}_stderr_", suffix=".log" + ) + stdout_handle = stdout_file + stderr_handle = stderr_file + stdout_name = stdout_file.name + stderr_name = stderr_file.name + await logger.adebug(f"Using temp files for MCP Composer logs: stdout={stdout_name}, stderr={stderr_name}") + + process = subprocess.Popen(cmd, env=env, stdout=stdout_handle, stderr=stderr_handle) # noqa: ASYNC220, S603 # Monitor the process startup with multiple checks process_running = False port_bound = False - await logger.adebug(f"Monitoring MCP Composer startup for project {project_id} (PID: {process.pid})") + await logger.adebug( + f"MCP Composer process started with PID {process.pid}, monitoring startup for project {project_id}..." + ) - for check in range(max_startup_checks): - await asyncio.sleep(startup_delay) + try: + for check in range(max_startup_checks): + await asyncio.sleep(startup_delay) - # Check if process is still running - poll_result = process.poll() + # Check if process is still running + poll_result = process.poll() - startup_error_msg = None - if poll_result is not None: - # Process terminated, get the error output - await logger.aerror(f"MCP Composer process {process.pid} terminated with exit code: {poll_result}") - try: - stdout_content, stderr_content = process.communicate(timeout=2) - # Log the full error details for debugging - await logger.aerror(f"MCP Composer startup failed for project {project_id}") - await logger.aerror(f"MCP Composer stdout:\n{stdout_content}") - await logger.aerror(f"MCP Composer stderr:\n{stderr_content}") - safe_cmd = self._obfuscate_command_secrets(cmd) - await logger.aerror(f"Command that failed: {' '.join(safe_cmd)}") - - # Extract meaningful error message - startup_error_msg = self._extract_error_message(stdout_content, stderr_content, oauth_server_url) - raise MCPComposerStartupError(startup_error_msg, project_id) - except subprocess.TimeoutExpired: - process.kill() - await logger.aerror( - f"MCP Composer process {process.pid} terminated unexpectedly for project {project_id}" + startup_error_msg = None + if poll_result is not None: + # Process terminated, get the error output + ( + stdout_content, + stderr_content, + startup_error_msg, + ) = await self._read_process_output_and_extract_error( + process, oauth_server_url, stdout_file=stdout_file, stderr_file=stderr_file + ) + await self._log_startup_error_details( + project_id, cmd, host, port, stdout_content, stderr_content, startup_error_msg, poll_result ) - startup_error_msg = self._extract_error_message("", "", oauth_server_url) - raise MCPComposerStartupError(startup_error_msg, project_id) from None + raise MCPComposerStartupError(startup_error_msg, project_id) - # Process is still running, check if port is bound - port_bound = not self._is_port_available(port) + # Process is still running, check if port is bound + port_bound = not self._is_port_available(port) - if port_bound: + if port_bound: + await logger.adebug( + f"MCP Composer for project {project_id} bound to port {port} " + f"(check {check + 1}/{max_startup_checks})" + ) + process_running = True + break await logger.adebug( - f"MCP Composer for project {project_id} bound to port {port} " + f"MCP Composer for project {project_id} not yet bound to port {port} " f"(check {check + 1}/{max_startup_checks})" ) - process_running = True - break + + # Try to read any available stderr/stdout without blocking to see what's happening + await self._read_stream_non_blocking(process.stderr, "stderr") + await self._read_stream_non_blocking(process.stdout, "stdout") + + except asyncio.CancelledError: + # Operation was cancelled, kill the process and cleanup await logger.adebug( - f"MCP Composer for project {project_id} not yet bound to port {port} " - f"(check {check + 1}/{max_startup_checks})" + f"MCP Composer process startup cancelled for project {project_id}, terminating process {process.pid}" ) - - # Try to read any available stderr without blocking (only log if there's an error) - if process.stderr and select.select([process.stderr], [], [], 0)[0]: + try: + process.terminate() + # Wait for graceful termination with timeout try: - stderr_line = process.stderr.readline() - if stderr_line and "ERROR" in stderr_line: - await logger.aerror(f"MCP Composer error: {stderr_line.strip()}") - except Exception: # noqa: BLE001 - pass + await asyncio.wait_for(asyncio.to_thread(process.wait), timeout=2.0) + except asyncio.TimeoutError: + # Force kill if graceful termination times out + await logger.adebug(f"Process {process.pid} did not terminate gracefully, force killing") + await asyncio.to_thread(process.kill) + await asyncio.to_thread(process.wait) + except Exception as e: # noqa: BLE001 + await logger.adebug(f"Error terminating process during cancellation: {e}") + raise # Re-raise to propagate cancellation # After all checks if not process_running or not port_bound: @@ -532,56 +1337,43 @@ async def _start_project_composer_process( if poll_result is not None: # Process died - startup_error_msg = None - try: - stdout_content, stderr_content = process.communicate(timeout=2) - # Extract meaningful error message - startup_error_msg = self._extract_error_message(stdout_content, stderr_content, oauth_server_url) - await logger.aerror(f"MCP Composer startup failed for project {project_id}:") - await logger.aerror(f" - Process died with exit code: {poll_result}") - await logger.aerror(f" - Target: {host}:{port}") - # Obfuscate secrets in command before logging - safe_cmd = self._obfuscate_command_secrets(cmd) - await logger.aerror(f" - Command: {' '.join(safe_cmd)}") - if stderr_content.strip(): - await logger.aerror(f" - Error output: {stderr_content.strip()}") - if stdout_content.strip(): - await logger.aerror(f" - Standard output: {stdout_content.strip()}") - await logger.aerror(f" - Error message: {startup_error_msg}") - except subprocess.TimeoutExpired: - await logger.aerror(f"MCP Composer for project {project_id} died but couldn't read output") - process.kill() - + stdout_content, stderr_content, startup_error_msg = await self._read_process_output_and_extract_error( + process, oauth_server_url, stdout_file=stdout_file, stderr_file=stderr_file + ) + await self._log_startup_error_details( + project_id, cmd, host, port, stdout_content, stderr_content, startup_error_msg, poll_result + ) raise MCPComposerStartupError(startup_error_msg, project_id) # Process running but port not bound - await logger.aerror(f"MCP Composer startup failed for project {project_id}:") - await logger.aerror(f" - Process is running (PID: {process.pid}) but failed to bind to port {port}") await logger.aerror( f" - Checked {max_startup_checks} times over {max_startup_checks * startup_delay} seconds" ) - await logger.aerror(f" - Target: {host}:{port}") # Get any available output before terminating - startup_error_msg = None - try: - process.terminate() - stdout_content, stderr_content = process.communicate(timeout=2) - startup_error_msg = self._extract_error_message(stdout_content, stderr_content, oauth_server_url) - if stderr_content.strip(): - await logger.aerror(f" - Process stderr: {stderr_content.strip()}") - if stdout_content.strip(): - await logger.aerror(f" - Process stdout: {stdout_content.strip()}") - except Exception: # noqa: BLE001 - process.kill() - await logger.aerror(" - Could not retrieve process output before termination") - + process.terminate() + stdout_content, stderr_content, startup_error_msg = await self._read_process_output_and_extract_error( + process, oauth_server_url, stdout_file=stdout_file, stderr_file=stderr_file + ) + await self._log_startup_error_details( + project_id, cmd, host, port, stdout_content, stderr_content, startup_error_msg, pid=process.pid + ) raise MCPComposerStartupError(startup_error_msg, project_id) - # Close the pipes if everything is successful - if process.stdout: - process.stdout.close() - if process.stderr: - process.stderr.close() + # Close the pipes/files if everything is successful + if stdout_file and stderr_file: + # Clean up temp files on success + try: + stdout_file.close() + stderr_file.close() + Path(stdout_file.name).unlink() + Path(stderr_file.name).unlink() + except Exception as e: # noqa: BLE001 + await logger.adebug(f"Error cleaning up temp files on success: {e}") + else: + if process.stdout: + process.stdout.close() + if process.stderr: + process.stderr.close() return process diff --git a/src/lfx/tests/unit/custom/custom_component/test_component.py b/src/lfx/tests/unit/custom/custom_component/test_component.py index d1b9be7d80df..363c4d6e3361 100644 --- a/src/lfx/tests/unit/custom/custom_component/test_component.py +++ b/src/lfx/tests/unit/custom/custom_component/test_component.py @@ -112,19 +112,30 @@ async def update_build_config( assert build_config["foo"] == "bar" -@pytest.mark.usefixtures("use_noop_session") @pytest.mark.asyncio -async def test_send_message_without_database(monkeypatch): # noqa: ARG001 +async def test_send_message_without_database(): + from unittest.mock import AsyncMock + component = Component() event_manager = MagicMock() component._event_manager = event_manager message = Message(text="Hello", session_id="session", flow_id=None, sender="User", sender_name="Test") + # Mock _store_message to avoid database interaction + async def mock_store_message(msg): + # Simulate what _store_message does: add an ID and return the message + msg.data["id"] = "test-message-id" + return msg + + component._store_message = AsyncMock(side_effect=mock_store_message) + result = await component.send_message(message) assert isinstance(result, Message) assert result.text == "Hello" assert result.sender == "User" assert result.sender_name == "Test" + # Verify the message was stored (mock was called) + component._store_message.assert_called_once() # The focus is on testing the message handling logic, not the database persistence layer assert event_manager.on_message.called diff --git a/src/lfx/tests/unit/services/settings/test_mcp_composer.py b/src/lfx/tests/unit/services/settings/test_mcp_composer.py new file mode 100644 index 000000000000..22d13e635fda --- /dev/null +++ b/src/lfx/tests/unit/services/settings/test_mcp_composer.py @@ -0,0 +1,322 @@ +"""Unit tests for MCP Composer Service port management and process killing.""" + +import asyncio +import contextlib +import socket +from unittest.mock import AsyncMock, MagicMock, patch + +import pytest +from lfx.services.mcp_composer.service import MCPComposerPortError, MCPComposerService + + +@pytest.fixture +def mcp_service(): + """Create an MCP Composer service instance for testing.""" + return MCPComposerService() + + +class TestPortAvailability: + """Test port availability checking.""" + + def test_is_port_available_when_free(self, mcp_service): + """Test that is_port_available returns True for an available port.""" + # Use a very high port number that's likely to be free + test_port = 59999 + assert mcp_service._is_port_available(test_port) is True + + def test_is_port_available_when_in_use(self, mcp_service): + """Test that is_port_available returns False when port is in use.""" + # Create a socket that binds to a port + test_port = 59998 + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + sock.bind(("0.0.0.0", test_port)) # noqa: S104 + sock.listen(1) + # Port should now be unavailable + assert mcp_service._is_port_available(test_port) is False + finally: + sock.close() + + +class TestKillProcessOnPort: + """Test process killing functionality.""" + + @pytest.mark.asyncio + async def test_kill_process_on_port_no_process(self, mcp_service): + """Test that _kill_process_on_port returns False when no process is found.""" + with patch("asyncio.to_thread") as mock_to_thread: + # Mock lsof returning no processes + mock_result = MagicMock() + mock_result.returncode = 1 # lsof returns 1 when no matches + mock_result.stdout = "" + mock_result.stderr = "" + mock_to_thread.return_value = mock_result + + result = await mcp_service._kill_process_on_port(9999) + assert result is False + + @pytest.mark.asyncio + async def test_kill_process_on_port_success(self, mcp_service): + """Test that _kill_process_on_port successfully kills a process.""" + with patch("asyncio.to_thread") as mock_to_thread: + # Mock lsof returning a PID + mock_lsof_result = MagicMock() + mock_lsof_result.returncode = 0 + mock_lsof_result.stdout = "12345\n" + mock_lsof_result.stderr = "" + + # Mock kill command succeeding + mock_kill_result = MagicMock() + mock_kill_result.returncode = 0 + mock_kill_result.stdout = "" + mock_kill_result.stderr = "" + + # Set up side effects for two calls: lsof, then kill + mock_to_thread.side_effect = [mock_lsof_result, mock_kill_result] + + result = await mcp_service._kill_process_on_port(9000) + assert result is True + assert mock_to_thread.call_count == 2 + + @pytest.mark.asyncio + async def test_kill_process_on_port_multiple_pids(self, mcp_service): + """Test that _kill_process_on_port handles multiple PIDs.""" + with patch("asyncio.to_thread") as mock_to_thread: + # Mock lsof returning multiple PIDs + mock_lsof_result = MagicMock() + mock_lsof_result.returncode = 0 + mock_lsof_result.stdout = "12345\n67890\n" + mock_lsof_result.stderr = "" + + # Mock kill command succeeding for first PID + mock_kill_result = MagicMock() + mock_kill_result.returncode = 0 + + mock_to_thread.side_effect = [mock_lsof_result, mock_kill_result] + + result = await mcp_service._kill_process_on_port(9000) + assert result is True + + @pytest.mark.asyncio + async def test_kill_process_on_port_kill_fails(self, mcp_service): + """Test that _kill_process_on_port handles kill command failure.""" + with patch("asyncio.to_thread") as mock_to_thread: + # Mock lsof returning a PID + mock_lsof_result = MagicMock() + mock_lsof_result.returncode = 0 + mock_lsof_result.stdout = "12345\n" + mock_lsof_result.stderr = "" + + # Mock kill command failing + mock_kill_result = MagicMock() + mock_kill_result.returncode = 1 + + mock_to_thread.side_effect = [mock_lsof_result, mock_kill_result] + + result = await mcp_service._kill_process_on_port(9000) + assert result is False + + @pytest.mark.asyncio + async def test_kill_process_on_port_exception_handling(self, mcp_service): + """Test that _kill_process_on_port handles exceptions gracefully.""" + with patch("asyncio.to_thread", side_effect=Exception("Test error")): + result = await mcp_service._kill_process_on_port(9000) + assert result is False + + +class TestAuthConfigChanges: + """Test authentication configuration change detection.""" + + def test_has_auth_config_changed_port_changed(self, mcp_service): + """Test that port change is detected.""" + existing_auth = { + "auth_type": "oauth", + "oauth_host": "localhost", + "oauth_port": "9000", + "oauth_server_url": "http://localhost:9000", + } + new_auth = { + "auth_type": "oauth", + "oauth_host": "localhost", + "oauth_port": "9001", + "oauth_server_url": "http://localhost:9001", + } + + assert mcp_service._has_auth_config_changed(existing_auth, new_auth) is True + + def test_has_auth_config_changed_no_change(self, mcp_service): + """Test that identical configs are not detected as changed.""" + existing_auth = { + "auth_type": "oauth", + "oauth_host": "localhost", + "oauth_port": "9000", + "oauth_server_url": "http://localhost:9000", + } + new_auth = existing_auth.copy() + + assert mcp_service._has_auth_config_changed(existing_auth, new_auth) is False + + def test_has_auth_config_changed_auth_type_changed(self, mcp_service): + """Test that auth type change is detected.""" + existing_auth = {"auth_type": "oauth", "oauth_port": "9000"} + new_auth = {"auth_type": "apikey", "api_key": "test_key"} + + assert mcp_service._has_auth_config_changed(existing_auth, new_auth) is True + + def test_has_auth_config_changed_both_none(self, mcp_service): + """Test that two None configs are not detected as changed.""" + assert mcp_service._has_auth_config_changed(None, None) is False + + def test_has_auth_config_changed_one_none(self, mcp_service): + """Test that changing from None to config is detected.""" + existing_auth = None + new_auth = {"auth_type": "oauth", "oauth_port": "9000"} + + assert mcp_service._has_auth_config_changed(existing_auth, new_auth) is True + + +class TestPortChangeHandling: + """Test handling of port changes in composer restart.""" + + @pytest.mark.asyncio + async def test_port_change_triggers_restart(self, mcp_service): + """Test that changing ports triggers a restart via auth config change detection.""" + project_id = "test-project" + old_port = 9000 + new_port = 9001 + + # Set up existing composer + mock_process = MagicMock(poll=MagicMock(return_value=None), pid=12345) + mcp_service.project_composers[project_id] = { + "process": mock_process, + "host": "localhost", + "port": old_port, + "sse_url": "http://test", + "auth_config": { + "auth_type": "oauth", + "oauth_host": "localhost", + "oauth_port": str(old_port), + "oauth_server_url": f"http://localhost:{old_port}", + "oauth_client_id": "test", + "oauth_client_secret": "test", + "oauth_auth_url": "http://test", + "oauth_token_url": "http://test", + }, + } + mcp_service._port_to_project[old_port] = project_id + mcp_service._pid_to_project[12345] = project_id + + new_auth_config = { + "auth_type": "oauth", + "oauth_host": "localhost", + "oauth_port": str(new_port), + "oauth_server_url": f"http://localhost:{new_port}", + "oauth_client_id": "test", + "oauth_client_secret": "test", + "oauth_auth_url": "http://test", + "oauth_token_url": "http://test", + } + + with ( + patch.object(mcp_service, "_do_stop_project_composer", new=AsyncMock()) as mock_stop, + patch.object(mcp_service, "_is_port_available", return_value=True), + patch.object(mcp_service, "_start_project_composer_process", new=AsyncMock()), + ): + # Initialize locks + mcp_service._start_locks[project_id] = asyncio.Lock() + + with contextlib.suppress(Exception): + await mcp_service._do_start_project_composer( + project_id=project_id, + sse_url="http://test", + auth_config=new_auth_config, + max_retries=1, + max_startup_checks=1, + startup_delay=0.1, + ) + + # Verify composer was stopped (because config changed) + mock_stop.assert_called_once_with(project_id) + + @pytest.mark.asyncio + async def test_port_in_use_by_own_project_triggers_kill(self, mcp_service): + """Test that when port is in use by the current project, it kills the process.""" + project_id = "test-project" + test_port = 9001 + + # Register the port as owned by this project + mcp_service._port_to_project[test_port] = project_id + + auth_config = { + "auth_type": "oauth", + "oauth_host": "localhost", + "oauth_port": str(test_port), + "oauth_server_url": f"http://localhost:{test_port}", + "oauth_client_id": "test", + "oauth_client_secret": "test", + "oauth_auth_url": "http://test", + "oauth_token_url": "http://test", + } + + with ( + patch.object(mcp_service, "_is_port_available") as mock_port_check, + patch.object(mcp_service, "_kill_process_on_port", new=AsyncMock(return_value=True)) as mock_kill, + ): + # First check: port is in use, second check after kill: port is free + mock_port_check.side_effect = [False, True] + + # Initialize locks + mcp_service._start_locks[project_id] = asyncio.Lock() + + with ( + patch.object(mcp_service, "_start_project_composer_process", new=AsyncMock()), + contextlib.suppress(Exception), + ): + await mcp_service._do_start_project_composer( + project_id=project_id, + sse_url="http://test", + auth_config=auth_config, + max_retries=1, + max_startup_checks=1, + startup_delay=0.1, + ) + + # Verify kill was attempted on own project's port + mock_kill.assert_called_with(test_port) + + @pytest.mark.asyncio + async def test_port_in_use_by_unknown_process_raises_error(self, mcp_service): + """Test that error is raised when port is in use by unknown process (security).""" + project_id = "test-project" + test_port = 9001 + + # Port is NOT tracked (unknown process) + # mcp_service._port_to_project does NOT contain test_port + + auth_config = { + "auth_type": "oauth", + "oauth_host": "localhost", + "oauth_port": str(test_port), + "oauth_server_url": f"http://localhost:{test_port}", + "oauth_client_id": "test", + "oauth_client_secret": "test", + "oauth_auth_url": "http://test", + "oauth_token_url": "http://test", + } + + with patch.object(mcp_service, "_is_port_available", return_value=False): # Port in use + # Initialize locks + mcp_service._start_locks[project_id] = asyncio.Lock() + + with pytest.raises(MCPComposerPortError) as exc_info: + await mcp_service._do_start_project_composer( + project_id=project_id, + sse_url="http://test", + auth_config=auth_config, + max_retries=1, + max_startup_checks=1, + startup_delay=0.1, + ) + + # New security message: won't kill unknown processes + assert "already in use by another application" in str(exc_info.value) diff --git a/src/lfx/tests/unit/services/settings/test_mcp_composer_windows.py b/src/lfx/tests/unit/services/settings/test_mcp_composer_windows.py new file mode 100644 index 000000000000..2f8dab8e26d2 --- /dev/null +++ b/src/lfx/tests/unit/services/settings/test_mcp_composer_windows.py @@ -0,0 +1,523 @@ +"""Unit tests for MCP Composer Service Windows-specific functionality.""" + +# ruff: noqa: SIM115, SIM117 + +import asyncio +import contextlib +import json +import subprocess +import tempfile +from pathlib import Path +from unittest.mock import AsyncMock, MagicMock, patch + +import pytest +from lfx.services.mcp_composer.service import MCPComposerService, MCPComposerStartupError + + +@pytest.fixture +def mcp_service(): + """Create an MCP Composer service instance for testing.""" + return MCPComposerService() + + +class TestWindowsZombieProcessDetection: + """Test Windows-specific zombie process detection using PowerShell.""" + + @pytest.mark.asyncio + async def test_kill_zombie_mcp_processes_windows_no_processes(self, mcp_service): + """Test that PowerShell command runs when no zombie processes found.""" + with patch("platform.system", return_value="Windows"), patch("asyncio.to_thread") as mock_to_thread: + # Mock PowerShell returning empty result (no processes) + mock_result = MagicMock() + mock_result.returncode = 0 + mock_result.stdout = "" + mock_to_thread.return_value = mock_result + + result = await mcp_service._kill_zombie_mcp_processes(2000) + + # Should return False since no processes were killed + assert result is False + # Verify PowerShell was called (not wmic) + assert mock_to_thread.called + # Access args correctly - call_args is a tuple (args, kwargs) + call_args = mock_to_thread.call_args.args + assert call_args[1][0] == "powershell.exe" + + @pytest.mark.asyncio + async def test_kill_zombie_mcp_processes_windows_single_process(self, mcp_service): + """Test that single zombie process is detected and killed via PowerShell.""" + with patch("platform.system", return_value="Windows"), patch("asyncio.to_thread") as mock_to_thread: + # Mock PowerShell returning single process as JSON object + zombie_pid = 12345 + ps_output = json.dumps({"ProcessId": zombie_pid, "CommandLine": "python mcp-composer --port 2000"}) + + # First call: netstat (no processes on port) + mock_netstat_result = MagicMock() + mock_netstat_result.returncode = 0 + mock_netstat_result.stdout = "" + + # Second call: PowerShell Get-WmiObject + mock_ps_result = MagicMock() + mock_ps_result.returncode = 0 + mock_ps_result.stdout = ps_output + + # Third call: taskkill + mock_kill_result = MagicMock() + mock_kill_result.returncode = 0 + + mock_to_thread.side_effect = [mock_netstat_result, mock_ps_result, mock_kill_result] + + result = await mcp_service._kill_zombie_mcp_processes(2000) + + # Should return True since process was killed + assert result is True + # Verify three calls: netstat + PowerShell + taskkill + assert mock_to_thread.call_count == 3 + + @pytest.mark.asyncio + async def test_kill_zombie_mcp_processes_windows_multiple_processes(self, mcp_service): + """Test that multiple zombie processes are detected and killed.""" + with patch("platform.system", return_value="Windows"), patch("asyncio.to_thread") as mock_to_thread: + # Mock PowerShell returning multiple processes as JSON array + ps_output = json.dumps( + [ + {"ProcessId": 12345, "CommandLine": "python mcp-composer --port 2000"}, + {"ProcessId": 67890, "CommandLine": "python mcp-composer --port=2000"}, + ] + ) + + # First call: netstat (no processes on port) + mock_netstat_result = MagicMock() + mock_netstat_result.returncode = 0 + mock_netstat_result.stdout = "" + + # Second call: PowerShell Get-WmiObject + mock_ps_result = MagicMock() + mock_ps_result.returncode = 0 + mock_ps_result.stdout = ps_output + + # Mock successful kills + mock_kill_result = MagicMock() + mock_kill_result.returncode = 0 + + mock_to_thread.side_effect = [ + mock_netstat_result, + mock_ps_result, + mock_kill_result, + mock_kill_result, + ] + + result = await mcp_service._kill_zombie_mcp_processes(2000) + + assert result is True + # Verify netstat + PowerShell + 2 taskkill calls + assert mock_to_thread.call_count == 4 + + @pytest.mark.asyncio + async def test_kill_zombie_mcp_processes_windows_powershell_timeout(self, mcp_service): + """Test that PowerShell timeout is handled gracefully.""" + with ( + patch("platform.system", return_value="Windows"), + patch("asyncio.to_thread", side_effect=asyncio.TimeoutError("PowerShell timed out")), + ): + # Should not raise, just return False + result = await mcp_service._kill_zombie_mcp_processes(2000) + assert result is False + + @pytest.mark.asyncio + async def test_kill_zombie_mcp_processes_windows_invalid_json(self, mcp_service): + """Test that invalid JSON from PowerShell is handled gracefully.""" + with patch("platform.system", return_value="Windows"), patch("asyncio.to_thread") as mock_to_thread: + mock_ps_result = MagicMock() + mock_ps_result.returncode = 0 + mock_ps_result.stdout = "invalid json {{" + mock_to_thread.return_value = mock_ps_result + + # Should not raise, just return False + result = await mcp_service._kill_zombie_mcp_processes(2000) + assert result is False + + @pytest.mark.asyncio + async def test_kill_zombie_mcp_processes_windows_skips_tracked_pids(self, mcp_service): + """Test that processes tracked by service are not killed.""" + with patch("platform.system", return_value="Windows"): + tracked_pid = 12345 + # Register PID as tracked + mcp_service._pid_to_project[tracked_pid] = "test-project" + + with patch("asyncio.to_thread") as mock_to_thread: + ps_output = json.dumps({"ProcessId": tracked_pid, "CommandLine": "python mcp-composer --port 2000"}) + + # First call: netstat (no processes on port) + mock_netstat_result = MagicMock() + mock_netstat_result.returncode = 0 + mock_netstat_result.stdout = "" + + # Second call: PowerShell Get-WmiObject + mock_ps_result = MagicMock() + mock_ps_result.returncode = 0 + mock_ps_result.stdout = ps_output + + mock_to_thread.side_effect = [mock_netstat_result, mock_ps_result] + + result = await mcp_service._kill_zombie_mcp_processes(2000) + + # Should return False since tracked PID was skipped + assert result is False + # netstat + PowerShell call, no taskkill (because PID is tracked) + assert mock_to_thread.call_count == 2 + + @pytest.mark.asyncio + async def test_kill_zombie_mcp_processes_non_fatal_on_error(self, mcp_service): + """Test that zombie cleanup errors are non-fatal (wrapped in try-catch).""" + with ( + patch("platform.system", return_value="Windows"), + patch("asyncio.to_thread", side_effect=Exception("Test error")), + ): + # Should not raise exception + result = await mcp_service._kill_zombie_mcp_processes(2000) + assert result is False + + +class TestWindowsTempFileHandling: + """Test Windows-specific temp file handling for stdout/stderr.""" + + @pytest.mark.asyncio + async def test_windows_uses_temp_files_instead_of_pipes(self, mcp_service): + """Test that Windows creates temp files for stdout/stderr instead of pipes.""" + project_id = "test-project" + port = 2000 + + with ( + patch("platform.system", return_value="Windows"), + patch("subprocess.Popen") as mock_popen, + patch("tempfile.NamedTemporaryFile") as mock_tempfile, + ): + # Mock temp file creation + mock_stdout_file = MagicMock() + mock_stdout_file.name = tempfile.gettempdir() + "/mcp_composer_test_stdout.log" + mock_stderr_file = MagicMock() + mock_stderr_file.name = tempfile.gettempdir() + "/mcp_composer_test_stderr.log" + + mock_tempfile.side_effect = [mock_stdout_file, mock_stderr_file] + + # Mock process + mock_process = MagicMock() + mock_process.pid = 12345 + mock_process.poll.return_value = None # Process running + mock_popen.return_value = mock_process + + with patch.object(mcp_service, "_is_port_available", return_value=True): + auth_config = { + "auth_type": "oauth", + "oauth_host": "localhost", + "oauth_port": str(port), + "oauth_server_url": f"http://localhost:{port}", + "oauth_client_id": "test", + "oauth_client_secret": "test", + "oauth_auth_url": "http://test", + "oauth_token_url": "http://test", + } + + with contextlib.suppress(Exception): + await mcp_service._start_project_composer_process( + project_id=project_id, + host="localhost", + port=port, + sse_url="http://test", + auth_config=auth_config, + max_startup_checks=1, + startup_delay=0.1, + ) + + # Verify temp files were created + assert mock_tempfile.call_count == 2 + # Verify Popen was called with file handles, not PIPE + popen_call = mock_popen.call_args + assert popen_call[1]["stdout"] == mock_stdout_file + assert popen_call[1]["stderr"] == mock_stderr_file + + @pytest.mark.asyncio + async def test_windows_temp_files_are_read_async(self, mcp_service): + """Test that temp files are read using asyncio.to_thread (non-blocking).""" + mock_process = MagicMock() + mock_process.poll.return_value = 1 # Process died + + # Create real temp files to test reading + stdout_file = tempfile.NamedTemporaryFile(mode="w+b", delete=False, suffix=".log") + stderr_file = tempfile.NamedTemporaryFile(mode="w+b", delete=False, suffix=".log") + + try: + # Write test data + stdout_file.write(b"stdout test data") + stderr_file.write(b"stderr test data") + stdout_file.close() + stderr_file.close() + + stdout, stderr, _error_msg = await mcp_service._read_process_output_and_extract_error( + mock_process, oauth_server_url=None, timeout=2.0, stdout_file=stdout_file, stderr_file=stderr_file + ) + + # Verify content was read + assert "stdout test data" in stdout + assert "stderr test data" in stderr + + # Verify files were cleaned up + assert not Path(stdout_file.name).exists() + assert not Path(stderr_file.name).exists() + + finally: + # Cleanup in case test fails + for f in [stdout_file.name, stderr_file.name]: + with contextlib.suppress(FileNotFoundError): + Path(f).unlink() + + @pytest.mark.asyncio + async def test_windows_temp_files_cleanup_on_success(self, mcp_service): + """Test that temp files are cleaned up when process starts successfully.""" + project_id = "test-project" + port = 2000 + + with patch("platform.system", return_value="Windows"): + # Create real temp files + stdout_file = tempfile.NamedTemporaryFile(mode="w+b", delete=False) + stderr_file = tempfile.NamedTemporaryFile(mode="w+b", delete=False) + stdout_file.close() + stderr_file.close() + + try: + with patch("subprocess.Popen") as mock_popen: + with patch("tempfile.NamedTemporaryFile") as mock_tempfile: + mock_tempfile.side_effect = [stdout_file, stderr_file] + + # Mock successful process startup + mock_process = MagicMock() + mock_process.pid = 12345 + mock_process.poll.return_value = None + mock_popen.return_value = mock_process + + with patch.object(mcp_service, "_is_port_available") as mock_port: + # First checks: not bound, then bound + mock_port.side_effect = [True, False] + + auth_config = { + "auth_type": "oauth", + "oauth_host": "localhost", + "oauth_port": str(port), + "oauth_server_url": f"http://localhost:{port}", + "oauth_client_id": "test", + "oauth_client_secret": "test", + "oauth_auth_url": "http://test", + "oauth_token_url": "http://test", + } + + process = await mcp_service._start_project_composer_process( + project_id=project_id, + host="localhost", + port=port, + sse_url="http://test", + auth_config=auth_config, + max_startup_checks=2, + startup_delay=0.1, + ) + + # Verify files were cleaned up + assert not Path(stdout_file.name).exists() + assert not Path(stderr_file.name).exists() + assert process == mock_process + + finally: + # Cleanup + for f in [stdout_file.name, stderr_file.name]: + with contextlib.suppress(FileNotFoundError): + Path(f).unlink() + + @pytest.mark.asyncio + async def test_non_windows_uses_pipes(self, mcp_service): + """Test that non-Windows systems still use pipes (not temp files).""" + project_id = "test-project" + port = 2000 + + with patch("platform.system", return_value="Linux"), patch("subprocess.Popen") as mock_popen: + mock_process = MagicMock() + mock_process.pid = 12345 + mock_process.poll.return_value = None + mock_popen.return_value = mock_process + + with patch.object(mcp_service, "_is_port_available", return_value=True): + auth_config = { + "auth_type": "oauth", + "oauth_host": "localhost", + "oauth_port": str(port), + "oauth_server_url": f"http://localhost:{port}", + "oauth_client_id": "test", + "oauth_client_secret": "test", + "oauth_auth_url": "http://test", + "oauth_token_url": "http://test", + } + + with contextlib.suppress(Exception): + await mcp_service._start_project_composer_process( + project_id=project_id, + host="localhost", + port=port, + sse_url="http://test", + auth_config=auth_config, + max_startup_checks=1, + startup_delay=0.1, + ) + + # Verify Popen was called with subprocess.PIPE + popen_call = mock_popen.call_args + assert popen_call[1]["stdout"] == subprocess.PIPE + assert popen_call[1]["stderr"] == subprocess.PIPE + + +class TestIncreasedStartupTimeout: + """Test that startup timeout was increased for Windows.""" + + @pytest.mark.asyncio + async def test_startup_timeout_is_80_seconds(self, mcp_service): + """Test that max_startup_checks default is 40 * 2s = 80 seconds.""" + # Check default parameters + import inspect + + sig = inspect.signature(mcp_service.start_project_composer) + assert sig.parameters["max_startup_checks"].default == 40 + assert sig.parameters["startup_delay"].default == 2.0 + + # Verify total timeout is 80 seconds + assert 40 * 2.0 == 80.0 + + @pytest.mark.asyncio + async def test_retry_with_increased_timeout(self, mcp_service): + """Test that retries use increased timeout (80s total per attempt).""" + project_id = "test-project" + + with patch.object(mcp_service, "_start_project_composer_process") as mock_start: + # Simulate failure + mock_start.side_effect = MCPComposerStartupError("Test error", project_id) + + with patch.object(mcp_service, "_kill_zombie_mcp_processes", new=AsyncMock()): + with patch.object(mcp_service, "_is_port_available", return_value=True): + mcp_service._start_locks[project_id] = asyncio.Lock() + + auth_config = { + "auth_type": "oauth", + "oauth_host": "localhost", + "oauth_port": "2000", + "oauth_server_url": "http://localhost:2000", + "oauth_client_id": "test", + "oauth_client_secret": "test", + "oauth_auth_url": "http://test", + "oauth_token_url": "http://test", + } + + with contextlib.suppress(Exception): + await mcp_service._do_start_project_composer( + project_id=project_id, + sse_url="http://test", + auth_config=auth_config, + max_retries=3, + ) + + # Verify _start_project_composer_process was called with correct defaults + assert mock_start.call_count == 3 + for call in mock_start.call_args_list: + # Check positional arguments (args) and keyword arguments (kwargs) + # max_startup_checks is the 6th argument (index 5) or in kwargs + # startup_delay is the 7th argument (index 6) or in kwargs + if "max_startup_checks" in call.kwargs: + assert call.kwargs["max_startup_checks"] == 40 + else: + assert call.args[5] == 40 + + if "startup_delay" in call.kwargs: + assert call.kwargs["startup_delay"] == 2.0 + else: + assert call.args[6] == 2.0 + + +class TestStreamReadingAvoidance: + """Test that stream.peek() blocking issue is avoided on Windows.""" + + @pytest.mark.asyncio + async def test_read_stream_non_blocking_returns_empty_on_windows(self, mcp_service): + """Test that _read_stream_non_blocking returns empty string on Windows.""" + with patch("platform.system", return_value="Windows"): + mock_stream = MagicMock() + + result = await mcp_service._read_stream_non_blocking(mock_stream, "stdout") + + # Should return empty string without trying to read + assert result == "" + # Verify no peek() or readline() was called + assert not mock_stream.peek.called + assert not mock_stream.readline.called + + @pytest.mark.asyncio + async def test_read_stream_non_blocking_uses_select_on_unix(self, mcp_service): + """Test that Unix systems use select.select() for non-blocking read.""" + with patch("platform.system", return_value="Linux"): + with patch("select.select", return_value=([True], [], [])) as mock_select: + mock_stream = MagicMock() + mock_stream.readline.return_value = b"test output\n" + + result = await mcp_service._read_stream_non_blocking(mock_stream, "stdout") + + # Should use select and read line + assert mock_select.called + assert "test output" in result + + +class TestRetryRobustness: + """Test that retry logic handles Windows-specific errors gracefully.""" + + @pytest.mark.asyncio + async def test_zombie_cleanup_failure_is_non_fatal_during_retry(self, mcp_service): + """Test that zombie cleanup failure during retry doesn't stop retry attempts.""" + project_id = "test-project" + + call_count = 0 + + async def mock_start_raises_once(*_args, **_kwargs): + nonlocal call_count + call_count += 1 + if call_count == 1: + msg = "First attempt failed" + raise MCPComposerStartupError(msg, project_id) + # Second attempt succeeds + mock_process = MagicMock() + mock_process.pid = 12345 + return mock_process + + with patch.object(mcp_service, "_start_project_composer_process", side_effect=mock_start_raises_once): + # Zombie cleanup raises error + with patch.object(mcp_service, "_kill_zombie_mcp_processes", side_effect=Exception("PowerShell error")): + with patch.object(mcp_service, "_is_port_available", return_value=True): + mcp_service._start_locks[project_id] = asyncio.Lock() + + auth_config = { + "auth_type": "oauth", + "oauth_host": "localhost", + "oauth_port": "2000", + "oauth_server_url": "http://localhost:2000", + "oauth_client_id": "test", + "oauth_client_secret": "test", + "oauth_auth_url": "http://test", + "oauth_token_url": "http://test", + } + + # Should succeed on second attempt despite zombie cleanup failure + await mcp_service._do_start_project_composer( + project_id=project_id, + sse_url="http://test", + auth_config=auth_config, + max_retries=2, + max_startup_checks=1, + startup_delay=0.1, + ) + + # Verify it retried successfully + assert call_count == 2 + assert project_id in mcp_service.project_composers From 5bdf51b0253ff8475a6bb7c8130308e8a5a9dd2e Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Mon, 17 Nov 2025 12:46:25 -0300 Subject: [PATCH 03/25] migrate mcp composer fix to main --- src/lfx/tests/unit/services/settings/test_mcp_composer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lfx/tests/unit/services/settings/test_mcp_composer.py b/src/lfx/tests/unit/services/settings/test_mcp_composer.py index 22d13e635fda..8a5596b06d11 100644 --- a/src/lfx/tests/unit/services/settings/test_mcp_composer.py +++ b/src/lfx/tests/unit/services/settings/test_mcp_composer.py @@ -30,7 +30,7 @@ def test_is_port_available_when_in_use(self, mcp_service): test_port = 59998 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: - sock.bind(("0.0.0.0", test_port)) # noqa: S104 + sock.bind(("0.0.0.0", test_port)) sock.listen(1) # Port should now be unavailable assert mcp_service._is_port_available(test_port) is False From 9ceebc9e8027eb8fe63f9706876f1a49fb79ced6 Mon Sep 17 00:00:00 2001 From: Jordan Frazier Date: Tue, 18 Nov 2025 10:30:17 -0500 Subject: [PATCH 04/25] version constraints --- pyproject.toml | 4 ++-- uv.lock | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 66648288e16f..95ba8c3b2d9d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ dependencies = [ "pyarrow==19.0.0", "wikipedia==1.4.0", "qdrant-client==1.9.2", - "weaviate-client>=4.10.2", + "weaviate-client>=4.10.2,<5.0.0", "faiss-cpu==1.9.0.post1", "types-cachetools>=5.5.0.20240820,<6.0.0", "pymongo==4.10.1", @@ -37,7 +37,7 @@ dependencies = [ 'fastavro>=1.9.8,<2.0.0; python_version >= "3.13"', "redis>=5.2.1,<6.0.0", "metaphor-python==0.1.23", - 'pywin32>=307; sys_platform == "win32"', + 'pywin32>=307,<400; sys_platform == "win32"', "langfuse==2.53.9", "metal_sdk==2.5.1", "MarkupSafe==3.0.2", diff --git a/uv.lock b/uv.lock index b12bf4c7b498..658551f88976 100644 --- a/uv.lock +++ b/uv.lock @@ -5781,7 +5781,7 @@ requires-dist = [ { name = "pydantic-settings", specifier = ">=2.2.0,<3.0.0" }, { name = "pymongo", specifier = "==4.10.1" }, { name = "pytube", specifier = "==15.0.0" }, - { name = "pywin32", marker = "sys_platform == 'win32'", specifier = ">=307" }, + { name = "pywin32", marker = "sys_platform == 'win32'", specifier = ">=307,<400" }, { name = "qdrant-client", specifier = "==1.9.2" }, { name = "qianfan", specifier = "==0.3.5" }, { name = "rapidocr-onnxruntime", marker = "extra == 'docling'", specifier = ">=1.4.4" }, @@ -5804,7 +5804,7 @@ requires-dist = [ { name = "upstash-vector", specifier = "==0.6.0" }, { name = "uv", specifier = "==0.7.20" }, { name = "vlmrun", extras = ["all"], specifier = ">=0.2.0" }, - { name = "weaviate-client", specifier = ">=4.10.2" }, + { name = "weaviate-client", specifier = ">=4.10.2,<5.0.0" }, { name = "webrtcvad", marker = "extra == 'audio'", specifier = ">=2.0.10" }, { name = "wikipedia", specifier = "==1.4.0" }, { name = "wolframalpha", specifier = "==5.1.3" }, From 93dacab18deb57011eb4f02ae4d5951d7562080e Mon Sep 17 00:00:00 2001 From: Jordan Frazier Date: Tue, 18 Nov 2025 10:31:48 -0500 Subject: [PATCH 05/25] go back to pydantic 2.11 --- src/backend/base/pyproject.toml | 2 +- uv.lock | 169 ++++++++++++++++---------------- 2 files changed, 84 insertions(+), 87 deletions(-) diff --git a/src/backend/base/pyproject.toml b/src/backend/base/pyproject.toml index a271d54c2491..003f06d5c59e 100644 --- a/src/backend/base/pyproject.toml +++ b/src/backend/base/pyproject.toml @@ -32,7 +32,7 @@ dependencies = [ "rich>=13.7.0,<14.0.0", "langchain-experimental>=0.3.4,<1.0.0", "sqlmodel==0.0.22", - "pydantic>=2.10.1,<3.0.0", + "pydantic~=2.11.0", "pydantic-settings>=2.2.0,<3.0.0", "email-validator>=2.0.0", "typer>=0.13.0,<1.0.0", diff --git a/uv.lock b/uv.lock index 658551f88976..aa32cb6c374b 100644 --- a/uv.lock +++ b/uv.lock @@ -6065,7 +6065,7 @@ requires-dist = [ { name = "pillow", specifier = ">=11.1.0,<12.0.0" }, { name = "platformdirs", specifier = ">=4.2.0,<5.0.0" }, { name = "prometheus-client", specifier = ">=0.20.0,<1.0.0" }, - { name = "pydantic", specifier = ">=2.10.1,<3.0.0" }, + { name = "pydantic", specifier = "~=2.11.0" }, { name = "pydantic-settings", specifier = ">=2.2.0,<3.0.0" }, { name = "pypdf", specifier = "~=5.1.0" }, { name = "pyperclip", specifier = ">=1.8.2,<2.0.0" }, @@ -10221,7 +10221,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.12.4" +version = "2.11.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -10229,9 +10229,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/ad/a17bc283d7d81837c061c49e3eaa27a45991759a1b7eae1031921c6bd924/pydantic-2.12.4.tar.gz", hash = "sha256:0f8cb9555000a4b5b617f66bfd2566264c4984b27589d3b845685983e8ea85ac", size = 821038, upload-time = "2025-11-05T10:50:08.59Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/54/ecab642b3bed45f7d5f59b38443dcb36ef50f85af192e6ece103dbfe9587/pydantic-2.11.10.tar.gz", hash = "sha256:dc280f0982fbda6c38fada4e476dc0a4f3aeaf9c6ad4c28df68a666ec3c61423", size = 788494, upload-time = "2025-10-04T10:40:41.338Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/2f/e68750da9b04856e2a7ec56fc6f034a5a79775e9b9a81882252789873798/pydantic-2.12.4-py3-none-any.whl", hash = "sha256:92d3d202a745d46f9be6df459ac5a064fdaa3c1c4cd8adcfa332ccf3c05f871e", size = 463400, upload-time = "2025-11-05T10:50:06.732Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1f/73c53fcbfb0b5a78f91176df41945ca466e71e9d9d836e5c522abda39ee7/pydantic-2.11.10-py3-none-any.whl", hash = "sha256:802a655709d49bd004c31e865ef37da30b540786a46bfce02333e0e24b5fe29a", size = 444823, upload-time = "2025-10-04T10:40:39.055Z" }, ] [package.optional-dependencies] @@ -10313,92 +10313,89 @@ vertexai = [ [[package]] name = "pydantic-core" -version = "2.41.5" +version = "2.33.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298, upload-time = "2025-11-04T13:39:04.116Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475, upload-time = "2025-11-04T13:39:06.055Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815, upload-time = "2025-11-04T13:39:10.41Z" }, - { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567, upload-time = "2025-11-04T13:39:12.244Z" }, - { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442, upload-time = "2025-11-04T13:39:13.962Z" }, - { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956, upload-time = "2025-11-04T13:39:15.889Z" }, - { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253, upload-time = "2025-11-04T13:39:17.403Z" }, - { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050, upload-time = "2025-11-04T13:39:19.351Z" }, - { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178, upload-time = "2025-11-04T13:39:21Z" }, - { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833, upload-time = "2025-11-04T13:39:22.606Z" }, - { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156, upload-time = "2025-11-04T13:39:25.843Z" }, - { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378, upload-time = "2025-11-04T13:39:27.92Z" }, - { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622, upload-time = "2025-11-04T13:39:29.848Z" }, - { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, - { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, - { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, - { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, - { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, - { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, - { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, - { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, - { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, - { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, - { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, - { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, - { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, - { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, - { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, - { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, - { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, - { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, - { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, - { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, - { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, - { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, - { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, - { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, - { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, - { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, - { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, - { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, - { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, - { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, - { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, - { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351, upload-time = "2025-11-04T13:43:02.058Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363, upload-time = "2025-11-04T13:43:05.159Z" }, - { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615, upload-time = "2025-11-04T13:43:08.116Z" }, - { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369, upload-time = "2025-11-04T13:43:12.49Z" }, - { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218, upload-time = "2025-11-04T13:43:15.431Z" }, - { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951, upload-time = "2025-11-04T13:43:18.062Z" }, - { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428, upload-time = "2025-11-04T13:43:20.679Z" }, - { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009, upload-time = "2025-11-04T13:43:23.286Z" }, - { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, - { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, - { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, - { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, - { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, - { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/92/b31726561b5dae176c2d2c2dc43a9c5bfba5d32f96f8b4c0a600dd492447/pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", size = 2028817, upload-time = "2025-04-23T18:30:43.919Z" }, + { url = "https://files.pythonhosted.org/packages/a3/44/3f0b95fafdaca04a483c4e685fe437c6891001bf3ce8b2fded82b9ea3aa1/pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", size = 1861357, upload-time = "2025-04-23T18:30:46.372Z" }, + { url = "https://files.pythonhosted.org/packages/30/97/e8f13b55766234caae05372826e8e4b3b96e7b248be3157f53237682e43c/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", size = 1898011, upload-time = "2025-04-23T18:30:47.591Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a3/99c48cf7bafc991cc3ee66fd544c0aae8dc907b752f1dad2d79b1b5a471f/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", size = 1982730, upload-time = "2025-04-23T18:30:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/de/8e/a5b882ec4307010a840fb8b58bd9bf65d1840c92eae7534c7441709bf54b/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", size = 2136178, upload-time = "2025-04-23T18:30:50.907Z" }, + { url = "https://files.pythonhosted.org/packages/e4/bb/71e35fc3ed05af6834e890edb75968e2802fe98778971ab5cba20a162315/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", size = 2736462, upload-time = "2025-04-23T18:30:52.083Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/c8f7593e6bc7066289bbc366f2235701dcbebcd1ff0ef8e64f6f239fb47d/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", size = 2005652, upload-time = "2025-04-23T18:30:53.389Z" }, + { url = "https://files.pythonhosted.org/packages/d2/7a/996d8bd75f3eda405e3dd219ff5ff0a283cd8e34add39d8ef9157e722867/pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", size = 2113306, upload-time = "2025-04-23T18:30:54.661Z" }, + { url = "https://files.pythonhosted.org/packages/ff/84/daf2a6fb2db40ffda6578a7e8c5a6e9c8affb251a05c233ae37098118788/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", size = 2073720, upload-time = "2025-04-23T18:30:56.11Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/2258da019f4825128445ae79456a5499c032b55849dbd5bed78c95ccf163/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", size = 2244915, upload-time = "2025-04-23T18:30:57.501Z" }, + { url = "https://files.pythonhosted.org/packages/d8/7a/925ff73756031289468326e355b6fa8316960d0d65f8b5d6b3a3e7866de7/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", size = 2241884, upload-time = "2025-04-23T18:30:58.867Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b0/249ee6d2646f1cdadcb813805fe76265745c4010cf20a8eba7b0e639d9b2/pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", size = 1910496, upload-time = "2025-04-23T18:31:00.078Z" }, + { url = "https://files.pythonhosted.org/packages/66/ff/172ba8f12a42d4b552917aa65d1f2328990d3ccfc01d5b7c943ec084299f/pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", size = 1955019, upload-time = "2025-04-23T18:31:01.335Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584, upload-time = "2025-04-23T18:31:03.106Z" }, + { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071, upload-time = "2025-04-23T18:31:04.621Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823, upload-time = "2025-04-23T18:31:06.377Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792, upload-time = "2025-04-23T18:31:07.93Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338, upload-time = "2025-04-23T18:31:09.283Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998, upload-time = "2025-04-23T18:31:11.7Z" }, + { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200, upload-time = "2025-04-23T18:31:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890, upload-time = "2025-04-23T18:31:15.011Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359, upload-time = "2025-04-23T18:31:16.393Z" }, + { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883, upload-time = "2025-04-23T18:31:17.892Z" }, + { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074, upload-time = "2025-04-23T18:31:19.205Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538, upload-time = "2025-04-23T18:31:20.541Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909, upload-time = "2025-04-23T18:31:22.371Z" }, + { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786, upload-time = "2025-04-23T18:31:24.161Z" }, + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, + { url = "https://files.pythonhosted.org/packages/30/68/373d55e58b7e83ce371691f6eaa7175e3a24b956c44628eb25d7da007917/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", size = 2023982, upload-time = "2025-04-23T18:32:53.14Z" }, + { url = "https://files.pythonhosted.org/packages/a4/16/145f54ac08c96a63d8ed6442f9dec17b2773d19920b627b18d4f10a061ea/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", size = 1858412, upload-time = "2025-04-23T18:32:55.52Z" }, + { url = "https://files.pythonhosted.org/packages/41/b1/c6dc6c3e2de4516c0bb2c46f6a373b91b5660312342a0cf5826e38ad82fa/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", size = 1892749, upload-time = "2025-04-23T18:32:57.546Z" }, + { url = "https://files.pythonhosted.org/packages/12/73/8cd57e20afba760b21b742106f9dbdfa6697f1570b189c7457a1af4cd8a0/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", size = 2067527, upload-time = "2025-04-23T18:32:59.771Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d5/0bb5d988cc019b3cba4a78f2d4b3854427fc47ee8ec8e9eaabf787da239c/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", size = 2108225, upload-time = "2025-04-23T18:33:04.51Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c5/00c02d1571913d496aabf146106ad8239dc132485ee22efe08085084ff7c/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", size = 2069490, upload-time = "2025-04-23T18:33:06.391Z" }, + { url = "https://files.pythonhosted.org/packages/22/a8/dccc38768274d3ed3a59b5d06f59ccb845778687652daa71df0cab4040d7/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", size = 2237525, upload-time = "2025-04-23T18:33:08.44Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e7/4f98c0b125dda7cf7ccd14ba936218397b44f50a56dd8c16a3091df116c3/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", size = 2238446, upload-time = "2025-04-23T18:33:10.313Z" }, + { url = "https://files.pythonhosted.org/packages/ce/91/2ec36480fdb0b783cd9ef6795753c1dea13882f2e68e73bce76ae8c21e6a/pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", size = 2066678, upload-time = "2025-04-23T18:33:12.224Z" }, + { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200, upload-time = "2025-04-23T18:33:14.199Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123, upload-time = "2025-04-23T18:33:16.555Z" }, + { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852, upload-time = "2025-04-23T18:33:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484, upload-time = "2025-04-23T18:33:20.475Z" }, + { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896, upload-time = "2025-04-23T18:33:22.501Z" }, + { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475, upload-time = "2025-04-23T18:33:24.528Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013, upload-time = "2025-04-23T18:33:26.621Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715, upload-time = "2025-04-23T18:33:28.656Z" }, + { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, ] [[package]] From 79016cd6d1cf1160da3543b1dc0010b5382e9823 Mon Sep 17 00:00:00 2001 From: Jordan Frazier Date: Tue, 18 Nov 2025 10:55:40 -0500 Subject: [PATCH 06/25] remove logging --- .../base/langflow/api/v1/mcp_projects.py | 7 ++---- .../src/lfx/services/mcp_composer/service.py | 25 ++----------------- 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/src/backend/base/langflow/api/v1/mcp_projects.py b/src/backend/base/langflow/api/v1/mcp_projects.py index c431de98915f..8a3a2392e79e 100644 --- a/src/backend/base/langflow/api/v1/mcp_projects.py +++ b/src/backend/base/langflow/api/v1/mcp_projects.py @@ -630,12 +630,9 @@ async def install_mcp_config( # For OAuth/MCP Composer, use the special format settings = get_settings_service().settings - command = "uv" + command = "uvx" args = [ - "run", - "python", - "-m", - "mcp_composer", + f"mcp-composer{settings.mcp_composer_version}", "--mode", "stdio", "--sse-url", diff --git a/src/lfx/src/lfx/services/mcp_composer/service.py b/src/lfx/src/lfx/services/mcp_composer/service.py index f5d17fe5847c..7dcad77775fa 100644 --- a/src/lfx/src/lfx/services/mcp_composer/service.py +++ b/src/lfx/src/lfx/services/mcp_composer/service.py @@ -419,11 +419,8 @@ async def _start_project_composer_process( """Start the MCP Composer subprocess for a specific project.""" settings = get_settings_service().settings cmd = [ - "uv", - "run", - "python", - "-m", - "mcp_composer", + "uvx", + f"mcp-composer{settings.mcp_composer_version}", "--mode", "sse", "--sse-url", @@ -466,11 +463,6 @@ async def _start_project_composer_process( cmd.extend(["--env", env_key, str(value)]) # Start the subprocess with both stdout and stderr captured - # TEMPORARY DEBUG: Print command being executed - safe_cmd = self._obfuscate_command_secrets(cmd) - await logger.adebug(f"Starting MCP Composer with command: {' '.join(safe_cmd)}") - print(f"[MCP Composer] Starting command: {' '.join(safe_cmd)}") - process = subprocess.Popen(cmd, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) # noqa: ASYNC220, S603 # Monitor the process startup with multiple checks @@ -478,7 +470,6 @@ async def _start_project_composer_process( port_bound = False await logger.adebug(f"Monitoring MCP Composer startup for project {project_id} (PID: {process.pid})") - print(f"[MCP Composer] Process started with PID: {process.pid}") for check in range(max_startup_checks): await asyncio.sleep(startup_delay) @@ -526,12 +517,10 @@ async def _start_project_composer_process( ) # Try to read any available stderr/stdout without blocking - # TEMPORARY DEBUG: Print all output, not just errors if process.stderr and select.select([process.stderr], [], [], 0)[0]: try: stderr_line = process.stderr.readline() if stderr_line: - print(f"[MCP Composer STDERR] {stderr_line.strip()}") if "ERROR" in stderr_line: await logger.aerror(f"MCP Composer error: {stderr_line.strip()}") else: @@ -539,16 +528,6 @@ async def _start_project_composer_process( except Exception: # noqa: BLE001 pass - # TEMPORARY DEBUG: Also check stdout - if process.stdout and select.select([process.stdout], [], [], 0)[0]: - try: - stdout_line = process.stdout.readline() - if stdout_line: - print(f"[MCP Composer STDOUT] {stdout_line.strip()}") - await logger.adebug(f"MCP Composer stdout: {stdout_line.strip()}") - except Exception: # noqa: BLE001 - pass - # After all checks if not process_running or not port_bound: # Get comprehensive error information From 8951bb55dcfe5ef2b5e2aa45c7e5eae3731575c6 Mon Sep 17 00:00:00 2001 From: Jordan Frazier Date: Tue, 18 Nov 2025 10:57:14 -0500 Subject: [PATCH 07/25] directly pin to new version --- src/lfx/src/lfx/services/settings/base.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lfx/src/lfx/services/settings/base.py b/src/lfx/src/lfx/services/settings/base.py index 48c345a72313..17ab474d65ca 100644 --- a/src/lfx/src/lfx/services/settings/base.py +++ b/src/lfx/src/lfx/services/settings/base.py @@ -292,9 +292,8 @@ class Settings(BaseSettings): # MCP Composer mcp_composer_enabled: bool = True """If set to False, Langflow will not start the MCP Composer service.""" - mcp_composer_version: str = "~=0.1.0.7" - """Version constraint for mcp-composer when using uvx. Uses PEP 440 syntax. - ~=0.1.0.7 allows patch updates (0.1.0.x) but prevents minor/major version changes.""" + mcp_composer_version: str = "==0.1.0.21" + """Version constraint for mcp-composer when using uvx. Uses PEP 440 syntax.""" # Public Flow Settings public_flow_cleanup_interval: int = Field(default=3600, gt=600) From 8d9a2ee14c4f677f2211ba269079b81e54e60041 Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Tue, 18 Nov 2025 15:59:42 -0300 Subject: [PATCH 08/25] add instant feedback on error --- .../src/lfx/services/mcp_composer/service.py | 61 +++++++++++++++++-- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/src/lfx/src/lfx/services/mcp_composer/service.py b/src/lfx/src/lfx/services/mcp_composer/service.py index 07d8e3b59046..19fc94c3524e 100644 --- a/src/lfx/src/lfx/services/mcp_composer/service.py +++ b/src/lfx/src/lfx/services/mcp_composer/service.py @@ -105,14 +105,46 @@ def _is_port_available(self, port: int, host: str = "localhost") -> bool: Returns: True if port is available (not in use), False if in use + + Raises: + ValueError: If port is not in valid range (0-65535) """ + import errno + + # Validate port range before attempting bind + max_port = 65535 + if not isinstance(port, int) or port < 0 or port > max_port: + msg = f"Invalid port number: {port}. Port must be between 0 and {max_port}." + raise ValueError(msg) + + # Check both IPv4 and IPv6 to ensure port is truly available + # MCP Composer tries to bind on both, so we need to check both + + # Check IPv4 try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: # Don't use SO_REUSEADDR here as it can give false positives sock.bind((host, port)) - return True # Port is available except OSError: - return False # Port is in use/bound + return False # Port is in use on IPv4 + + # Check IPv6 (if supported on this system) + try: + with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as sock: + # Don't use SO_REUSEADDR here as it can give false positives + # Use ::1 for localhost on IPv6 + ipv6_host = "::1" if host in ("localhost", "127.0.0.1") else host + sock.bind((ipv6_host, port)) + except OSError as e: + # Check if it's "address already in use" error + # errno.EADDRINUSE is 48 on macOS, 98 on Linux, 10048 on Windows (WSAEADDRINUSE) + # We check both the standard errno and Windows-specific error code + if e.errno in (errno.EADDRINUSE, 10048): + return False # Port is in use on IPv6 + # For other errors (e.g., IPv6 not supported, EADDRNOTAVAIL), continue + # IPv6 might not be supported on this system, which is okay + + return True # Port is available on both IPv4 and IPv6 (or IPv6 not supported) async def _kill_process_on_port(self, port: int) -> bool: """Kill the process using the specified port. @@ -628,9 +660,19 @@ async def _ensure_port_available(self, port: int, current_project_id: str) -> No Raises: MCPComposerPortError: If port cannot be made available + MCPComposerConfigError: If port is invalid """ - is_port_available = self._is_port_available(port) - await logger.adebug(f"Port {port} availability check: {is_port_available}") + try: + is_port_available = self._is_port_available(port) + await logger.adebug(f"Port {port} availability check: {is_port_available}") + except (ValueError, OverflowError, TypeError) as e: + # Port validation failed - invalid port number or type + # ValueError: from our validation + # OverflowError: from socket.bind() when port > 65535 + # TypeError: when port is not an integer + error_msg = f"Invalid port number: {port}. Port must be an integer between 0 and 65535." + await logger.aerror(f"Invalid port for project {current_project_id}: {e}") + raise MCPComposerConfigError(error_msg, current_project_id) from e if not is_port_available: # Check if the port is being used by a tracked project @@ -1065,8 +1107,8 @@ async def _do_start_project_composer( # Ensure port is available (only kill untracked processes) try: await self._ensure_port_available(project_port, project_id) - except MCPComposerPortError as e: - # Port error before starting - store and raise immediately + except (MCPComposerPortError, MCPComposerConfigError) as e: + # Port/config error before starting - store and raise immediately (no retries) self._last_errors[project_id] = e.message raise for retry_attempt in range(1, max_retries + 1): @@ -1097,6 +1139,13 @@ async def _do_start_project_composer( f"for project {project_id}: {e.message}" ) + # For config/port errors, don't retry - fail immediately + if isinstance(e, (MCPComposerConfigError, MCPComposerPortError)): + await logger.aerror( + f"Configuration or port error for project {project_id}, not retrying: {e.message}" + ) + raise # Re-raise to exit retry loop immediately + # Clean up any partially started process before retrying if project_id in self.project_composers: await self._do_stop_project_composer(project_id) From 1be78ae443f531eaa3eaf62761702787e9c78620 Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Tue, 18 Nov 2025 16:17:54 -0300 Subject: [PATCH 09/25] improve callback function behavior ux --- src/frontend/src/modals/authModal/index.tsx | 7 +++++- .../pages/homePage/hooks/useMcpServer.ts | 23 +++++++++++++------ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/frontend/src/modals/authModal/index.tsx b/src/frontend/src/modals/authModal/index.tsx index 58b69fe1af7f..5f9b9d3010e9 100644 --- a/src/frontend/src/modals/authModal/index.tsx +++ b/src/frontend/src/modals/authModal/index.tsx @@ -93,7 +93,12 @@ const AuthModal = ({ if (port) { newFields.oauthServerUrl = `http://${host}:${port}`; - newFields.oauthCallbackPath = `http://${host}:${port}/auth/idaas/callback`; + + // Only auto-populate callback path if it's empty (convenience for initial setup) + // Preserve user's custom callback path if they've already set one + if (!prev.oauthCallbackPath) { + newFields.oauthCallbackPath = `http://${host}:${port}/auth/idaas/callback`; + } } } diff --git a/src/frontend/src/pages/MainPage/pages/homePage/hooks/useMcpServer.ts b/src/frontend/src/pages/MainPage/pages/homePage/hooks/useMcpServer.ts index bf518ee4366e..211ce262fcc2 100644 --- a/src/frontend/src/pages/MainPage/pages/homePage/hooks/useMcpServer.ts +++ b/src/frontend/src/pages/MainPage/pages/homePage/hooks/useMcpServer.ts @@ -34,6 +34,8 @@ type State = { showSlowWarning: boolean; }; +const AUTH_TYPE = "oauth"; + export const useMcpServer = ({ projectId, folderName, @@ -51,15 +53,18 @@ export const useMcpServer = ({ useGetFlowsMCP({ projectId }); const { mutate: patchFlowsMCP, isPending: isPatchingFlowsMCP } = usePatchFlowsMCP({ project_id: projectId }); + + const enableProjectComposerUrl = + !!projectId && + mcpProjectData?.auth_settings?.auth_type === AUTH_TYPE && + ENABLE_MCP_COMPOSER && + !isPatchingFlowsMCP; + const { data: composerUrlData, isLoading: isLoadingComposerUrl } = useGetProjectComposerUrl( { projectId }, { - enabled: - !!projectId && - mcpProjectData?.auth_settings?.auth_type === "oauth" && - ENABLE_MCP_COMPOSER && - !isPatchingFlowsMCP, + enabled: enableProjectComposerUrl, }, ); const { data: installedMCPData } = useGetInstalledMCP({ projectId }); @@ -151,7 +156,9 @@ export const useMcpServer = ({ { onSuccess: () => { setSuccessData({ - title: `MCP Server installed successfully on ${clientTitle ?? clientName}. You may need to restart your client to see the changes.`, + title: `MCP Server installed successfully on ${ + clientTitle ?? clientName + }. You may need to restart your client to see the changes.`, }); setS((p) => ({ ...p, @@ -161,7 +168,9 @@ export const useMcpServer = ({ onError: (e) => { const message = (e as { message?: string })?.message ?? String(e); setErrorData({ - title: `Failed to install MCP Server on ${clientTitle ?? clientName}`, + title: `Failed to install MCP Server on ${ + clientTitle ?? clientName + }`, list: [message], }); setS((p) => ({ From 2d609040e26a43241be3694d8b0cf43a0bd8e9c0 Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Fri, 21 Nov 2025 10:38:51 -0300 Subject: [PATCH 10/25] fix tests and mypy issues --- src/backend/base/langflow/api/v1/mcp_projects.py | 10 ++++------ src/frontend/src/modals/authModal/index.tsx | 13 ++++++++++--- .../services/settings/test_mcp_composer_version.py | 8 ++++---- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/backend/base/langflow/api/v1/mcp_projects.py b/src/backend/base/langflow/api/v1/mcp_projects.py index c2718c7a2fa1..868d9f056dda 100644 --- a/src/backend/base/langflow/api/v1/mcp_projects.py +++ b/src/backend/base/langflow/api/v1/mcp_projects.py @@ -773,11 +773,12 @@ async def get_project_composer_url( """ try: project = await verify_project_access(project_id, current_user) + mcp_composer_service: MCPComposerService = cast( + MCPComposerService, get_service(ServiceType.MCP_COMPOSER_SERVICE) + ) + if not should_use_mcp_composer(project): # Check if there's a recent error from a failed OAuth attempt - mcp_composer_service: MCPComposerService = cast( - MCPComposerService, get_service(ServiceType.MCP_COMPOSER_SERVICE) - ) last_error = mcp_composer_service.get_last_error(str(project_id)) # If there's a recent error, return it even though OAuth is not currently active @@ -802,9 +803,6 @@ async def get_project_composer_url( await get_or_start_mcp_composer(auth_config, project.name, project_id) composer_sse_url = await get_composer_sse_url(project) # Clear any previous error on success - mcp_composer_service: MCPComposerService = cast( - MCPComposerService, get_service(ServiceType.MCP_COMPOSER_SERVICE) - ) mcp_composer_service.clear_last_error(str(project_id)) return {"project_id": str(project_id), "sse_url": composer_sse_url, "uses_composer": True} except MCPComposerError as e: diff --git a/src/frontend/src/modals/authModal/index.tsx b/src/frontend/src/modals/authModal/index.tsx index 5f9b9d3010e9..28c9583b814c 100644 --- a/src/frontend/src/modals/authModal/index.tsx +++ b/src/frontend/src/modals/authModal/index.tsx @@ -94,9 +94,16 @@ const AuthModal = ({ if (port) { newFields.oauthServerUrl = `http://${host}:${port}`; - // Only auto-populate callback path if it's empty (convenience for initial setup) - // Preserve user's custom callback path if they've already set one - if (!prev.oauthCallbackPath) { + // Auto-sync callback path if: + // 1. It's empty (initial setup), OR + // 2. It matches the standard format pattern (auto-update when host/port changes) + const isStandardFormat = + !prev.oauthCallbackPath || + /^https?:\/\/[^:/]+:\d+\/auth\/idaas\/callback$/.test( + prev.oauthCallbackPath, + ); + + if (isStandardFormat) { newFields.oauthCallbackPath = `http://${host}:${port}/auth/idaas/callback`; } } diff --git a/src/lfx/tests/unit/services/settings/test_mcp_composer_version.py b/src/lfx/tests/unit/services/settings/test_mcp_composer_version.py index d3f57e35c0b9..2da33285bcd6 100644 --- a/src/lfx/tests/unit/services/settings/test_mcp_composer_version.py +++ b/src/lfx/tests/unit/services/settings/test_mcp_composer_version.py @@ -70,14 +70,14 @@ def test_empty_version_gets_default(monkeypatch): """Test that empty string gets default value.""" monkeypatch.setenv("LANGFLOW_MCP_COMPOSER_VERSION", "") settings = Settings() - assert settings.mcp_composer_version == "~=0.1.0.7" + assert settings.mcp_composer_version == "==0.1.0.21" def test_no_env_var_uses_default(monkeypatch): """Test that missing env var uses default value.""" monkeypatch.delenv("LANGFLOW_MCP_COMPOSER_VERSION", raising=False) settings = Settings() - assert settings.mcp_composer_version == "~=0.1.0.7" + assert settings.mcp_composer_version == "==0.1.0.21" def test_three_part_version_gets_prefix(monkeypatch): @@ -113,8 +113,8 @@ def test_validator_directly(): # Test empty result = Settings.validate_mcp_composer_version("") - assert result == "~=0.1.0.7" + assert result == "==0.1.0.21" # Test None result = Settings.validate_mcp_composer_version(None) - assert result == "~=0.1.0.7" + assert result == "==0.1.0.21" From 0335cc17e967e218f39a02b0b5153680c2b5f2af Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Fri, 21 Nov 2025 10:56:50 -0300 Subject: [PATCH 11/25] bump mcp composer version --- src/lfx/src/lfx/services/settings/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lfx/src/lfx/services/settings/base.py b/src/lfx/src/lfx/services/settings/base.py index 17ab474d65ca..ae3372c4bbe1 100644 --- a/src/lfx/src/lfx/services/settings/base.py +++ b/src/lfx/src/lfx/services/settings/base.py @@ -383,7 +383,7 @@ def validate_mcp_composer_version(cls, value): Supports PEP 440 specifiers: ==, !=, <=, >=, <, >, ~=, === """ if not value: - return "~=0.1.0.7" # Default + return "==0.1.0.21" # Default # Check if it already has a version specifier # Order matters: check longer specifiers first to avoid false matches From dd325b8c7afb2aa2a2bb7f4c3f4c12cbfe9d714d Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Fri, 21 Nov 2025 11:16:08 -0300 Subject: [PATCH 12/25] fixed latest version mcp --- src/lfx/src/lfx/services/settings/base.py | 4 ++-- .../unit/services/settings/test_mcp_composer_version.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lfx/src/lfx/services/settings/base.py b/src/lfx/src/lfx/services/settings/base.py index ae3372c4bbe1..6614b360f1a7 100644 --- a/src/lfx/src/lfx/services/settings/base.py +++ b/src/lfx/src/lfx/services/settings/base.py @@ -292,7 +292,7 @@ class Settings(BaseSettings): # MCP Composer mcp_composer_enabled: bool = True """If set to False, Langflow will not start the MCP Composer service.""" - mcp_composer_version: str = "==0.1.0.21" + mcp_composer_version: str = "==0.1.0.8.10" """Version constraint for mcp-composer when using uvx. Uses PEP 440 syntax.""" # Public Flow Settings @@ -383,7 +383,7 @@ def validate_mcp_composer_version(cls, value): Supports PEP 440 specifiers: ==, !=, <=, >=, <, >, ~=, === """ if not value: - return "==0.1.0.21" # Default + return "==0.1.0.8.10" # Default # Check if it already has a version specifier # Order matters: check longer specifiers first to avoid false matches diff --git a/src/lfx/tests/unit/services/settings/test_mcp_composer_version.py b/src/lfx/tests/unit/services/settings/test_mcp_composer_version.py index 2da33285bcd6..11110dcd80ae 100644 --- a/src/lfx/tests/unit/services/settings/test_mcp_composer_version.py +++ b/src/lfx/tests/unit/services/settings/test_mcp_composer_version.py @@ -70,14 +70,14 @@ def test_empty_version_gets_default(monkeypatch): """Test that empty string gets default value.""" monkeypatch.setenv("LANGFLOW_MCP_COMPOSER_VERSION", "") settings = Settings() - assert settings.mcp_composer_version == "==0.1.0.21" + assert settings.mcp_composer_version == "==0.1.0.8.10" def test_no_env_var_uses_default(monkeypatch): """Test that missing env var uses default value.""" monkeypatch.delenv("LANGFLOW_MCP_COMPOSER_VERSION", raising=False) settings = Settings() - assert settings.mcp_composer_version == "==0.1.0.21" + assert settings.mcp_composer_version == "==0.1.0.8.10" def test_three_part_version_gets_prefix(monkeypatch): @@ -113,8 +113,8 @@ def test_validator_directly(): # Test empty result = Settings.validate_mcp_composer_version("") - assert result == "==0.1.0.21" + assert result == "==0.1.0.8.10" # Test None result = Settings.validate_mcp_composer_version(None) - assert result == "==0.1.0.21" + assert result == "==0.1.0.8.10" From 074f479e0120a093a1d6bf7e402de3205bb63e7d Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 14:18:08 +0000 Subject: [PATCH 13/25] [autofix.ci] apply automated fixes From 5662429ff2f35133a90a5fb85f161c45f0239430 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 14:23:43 +0000 Subject: [PATCH 14/25] [autofix.ci] apply automated fixes (attempt 2/3) From bc129d9997d884c36d835d51dd2a19fcb4a99677 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 14:28:24 +0000 Subject: [PATCH 15/25] [autofix.ci] apply automated fixes (attempt 3/3) From b5b10671a4ce487a8ecd432d2e8947e394bdb89c Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 17:37:34 +0000 Subject: [PATCH 16/25] [autofix.ci] apply automated fixes --- src/lfx/src/lfx/_assets/component_index.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lfx/src/lfx/_assets/component_index.json b/src/lfx/src/lfx/_assets/component_index.json index a02d61435c40..fe99d60fb7db 100644 --- a/src/lfx/src/lfx/_assets/component_index.json +++ b/src/lfx/src/lfx/_assets/component_index.json @@ -1 +1 @@ -{"entries":[["FAISS",{"FAISS":{"base_classes":["Data","DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"FAISS Vector Store with search capabilities","display_name":"FAISS","documentation":"","edited":false,"field_order":["index_name","persist_directory","ingest_data","search_query","should_cache_vector_store","allow_dangerous_deserialization","embedding","number_of_results"],"frozen":false,"icon":"FAISS","legacy":false,"metadata":{"code_hash":"2bd7a064d724","dependencies":{"dependencies":[{"name":"langchain_community","version":"0.3.21"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.FAISS.faiss.FaissVectorStoreComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Search Results","group_outputs":false,"method":"search_documents","name":"search_results","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","allow_dangerous_deserialization":{"_input_type":"BoolInput","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.","list":false,"list_add_label":"Add More","name":"allow_dangerous_deserialization","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"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"},"embedding":{"_input_type":"HandleInput","advanced":false,"display_name":"Embedding","dynamic":false,"info":"","input_types":["Embeddings"],"list":false,"list_add_label":"Add More","name":"embedding","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"index_name":{"_input_type":"StrInput","advanced":false,"display_name":"Index Name","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"index_name","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"langflow_index"},"ingest_data":{"_input_type":"HandleInput","advanced":false,"display_name":"Ingest Data","dynamic":false,"info":"","input_types":["Data","DataFrame"],"list":true,"list_add_label":"Add More","name":"ingest_data","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Results","dynamic":false,"info":"Number of results to return.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":4},"persist_directory":{"_input_type":"StrInput","advanced":false,"display_name":"Persist Directory","dynamic":false,"info":"Path to save the FAISS index. It will be relative to where Langflow is running.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"persist_directory","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"search_query":{"_input_type":"QueryInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Enter a query to run a similarity search.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"search_query","placeholder":"Enter a query...","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"query","value":""},"should_cache_vector_store":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache Vector Store","dynamic":false,"info":"If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.","list":false,"list_add_label":"Add More","name":"should_cache_vector_store","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true}},"tool_mode":false}}],["Notion",{"AddContentToPage":{"base_classes":["Data","Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Convert markdown text to Notion blocks and append them to a Notion page.","display_name":"Add Content to Page ","documentation":"https://developers.notion.com/reference/patch-block-children","edited":false,"field_order":["markdown_text","block_id","notion_secret"],"frozen":false,"icon":"NotionDirectoryLoader","legacy":false,"metadata":{"code_hash":"ffcd44201c09","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"bs4","version":"4.12.3"},{"name":"langchain","version":"0.3.23"},{"name":"markdown","version":"3.7"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":6},"module":"lfx.components.Notion.add_content_to_page.AddContentToPage"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"run_model","name":"api_run_model","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool","group_outputs":false,"method":"build_tool","name":"api_build_tool","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","block_id":{"_input_type":"StrInput","advanced":false,"display_name":"Page/Block ID","dynamic":false,"info":"The ID of the page/block to add the content.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"block_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import json\nfrom typing import Any\n\nimport requests\nfrom bs4 import BeautifulSoup\nfrom langchain.tools import StructuredTool\nfrom markdown import markdown\nfrom pydantic import BaseModel, Field\n\nfrom lfx.base.langchain_utilities.model import LCToolComponent\nfrom lfx.field_typing import Tool\nfrom lfx.inputs.inputs import MultilineInput, SecretStrInput, StrInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\n\nMIN_ROWS_IN_TABLE = 3\n\n\nclass AddContentToPage(LCToolComponent):\n display_name: str = \"Add Content to Page \"\n description: str = \"Convert markdown text to Notion blocks and append them to a Notion page.\"\n documentation: str = \"https://developers.notion.com/reference/patch-block-children\"\n icon = \"NotionDirectoryLoader\"\n\n inputs = [\n MultilineInput(\n name=\"markdown_text\",\n display_name=\"Markdown Text\",\n info=\"The markdown text to convert to Notion blocks.\",\n ),\n StrInput(\n name=\"block_id\",\n display_name=\"Page/Block ID\",\n info=\"The ID of the page/block to add the content.\",\n ),\n SecretStrInput(\n name=\"notion_secret\",\n display_name=\"Notion Secret\",\n info=\"The Notion integration token.\",\n required=True,\n ),\n ]\n\n class AddContentToPageSchema(BaseModel):\n markdown_text: str = Field(..., description=\"The markdown text to convert to Notion blocks.\")\n block_id: str = Field(..., description=\"The ID of the page/block to add the content.\")\n\n def run_model(self) -> Data:\n result = self._add_content_to_page(self.markdown_text, self.block_id)\n return Data(data=result, text=json.dumps(result))\n\n def build_tool(self) -> Tool:\n return StructuredTool.from_function(\n name=\"add_content_to_notion_page\",\n description=\"Convert markdown text to Notion blocks and append them to a Notion page.\",\n func=self._add_content_to_page,\n args_schema=self.AddContentToPageSchema,\n )\n\n def _add_content_to_page(self, markdown_text: str, block_id: str) -> dict[str, Any] | str:\n try:\n html_text = markdown(markdown_text)\n soup = BeautifulSoup(html_text, \"html.parser\")\n blocks = self.process_node(soup)\n\n url = f\"https://api.notion.com/v1/blocks/{block_id}/children\"\n headers = {\n \"Authorization\": f\"Bearer {self.notion_secret}\",\n \"Content-Type\": \"application/json\",\n \"Notion-Version\": \"2022-06-28\",\n }\n\n data = {\n \"children\": blocks,\n }\n\n response = requests.patch(url, headers=headers, json=data, timeout=10)\n response.raise_for_status()\n\n return response.json()\n except requests.exceptions.RequestException as e:\n error_message = f\"Error: Failed to add content to Notion page. {e}\"\n if hasattr(e, \"response\") and e.response is not None:\n error_message += f\" Status code: {e.response.status_code}, Response: {e.response.text}\"\n return error_message\n except Exception as e: # noqa: BLE001\n logger.debug(\"Error adding content to Notion page\", exc_info=True)\n return f\"Error: An unexpected error occurred while adding content to Notion page. {e}\"\n\n def process_node(self, node):\n blocks = []\n if isinstance(node, str):\n text = node.strip()\n if text:\n if text.startswith(\"#\"):\n heading_level = text.count(\"#\", 0, 6)\n heading_text = text[heading_level:].strip()\n if heading_level in range(3):\n blocks.append(self.create_block(f\"heading_{heading_level + 1}\", heading_text))\n else:\n blocks.append(self.create_block(\"paragraph\", text))\n elif node.name == \"h1\":\n blocks.append(self.create_block(\"heading_1\", node.get_text(strip=True)))\n elif node.name == \"h2\":\n blocks.append(self.create_block(\"heading_2\", node.get_text(strip=True)))\n elif node.name == \"h3\":\n blocks.append(self.create_block(\"heading_3\", node.get_text(strip=True)))\n elif node.name == \"p\":\n code_node = node.find(\"code\")\n if code_node:\n code_text = code_node.get_text()\n language, code = self.extract_language_and_code(code_text)\n blocks.append(self.create_block(\"code\", code, language=language))\n elif self.is_table(str(node)):\n blocks.extend(self.process_table(node))\n else:\n blocks.append(self.create_block(\"paragraph\", node.get_text(strip=True)))\n elif node.name == \"ul\":\n blocks.extend(self.process_list(node, \"bulleted_list_item\"))\n elif node.name == \"ol\":\n blocks.extend(self.process_list(node, \"numbered_list_item\"))\n elif node.name == \"blockquote\":\n blocks.append(self.create_block(\"quote\", node.get_text(strip=True)))\n elif node.name == \"hr\":\n blocks.append(self.create_block(\"divider\", \"\"))\n elif node.name == \"img\":\n blocks.append(self.create_block(\"image\", \"\", image_url=node.get(\"src\")))\n elif node.name == \"a\":\n blocks.append(self.create_block(\"bookmark\", node.get_text(strip=True), link_url=node.get(\"href\")))\n elif node.name == \"table\":\n blocks.extend(self.process_table(node))\n\n for child in node.children:\n if isinstance(child, str):\n continue\n blocks.extend(self.process_node(child))\n\n return blocks\n\n def extract_language_and_code(self, code_text):\n lines = code_text.split(\"\\n\")\n language = lines[0].strip()\n code = \"\\n\".join(lines[1:]).strip()\n return language, code\n\n def is_code_block(self, text):\n return text.startswith(\"```\")\n\n def extract_code_block(self, text):\n lines = text.split(\"\\n\")\n language = lines[0].strip(\"`\").strip()\n code = \"\\n\".join(lines[1:]).strip(\"`\").strip()\n return language, code\n\n def is_table(self, text):\n rows = text.split(\"\\n\")\n if len(rows) < MIN_ROWS_IN_TABLE:\n return False\n\n has_separator = False\n for i, row in enumerate(rows):\n if \"|\" in row:\n cells = [cell.strip() for cell in row.split(\"|\")]\n cells = [cell for cell in cells if cell] # Remove empty cells\n if i == 1 and all(set(cell) <= set(\"-|\") for cell in cells):\n has_separator = True\n elif not cells:\n return False\n\n return has_separator\n\n def process_list(self, node, list_type):\n blocks = []\n for item in node.find_all(\"li\"):\n item_text = item.get_text(strip=True)\n checked = item_text.startswith(\"[x]\")\n is_checklist = item_text.startswith(\"[ ]\") or checked\n\n if is_checklist:\n item_text = item_text.replace(\"[x]\", \"\").replace(\"[ ]\", \"\").strip()\n blocks.append(self.create_block(\"to_do\", item_text, checked=checked))\n else:\n blocks.append(self.create_block(list_type, item_text))\n return blocks\n\n def process_table(self, node):\n blocks = []\n header_row = node.find(\"thead\").find(\"tr\") if node.find(\"thead\") else None\n body_rows = node.find(\"tbody\").find_all(\"tr\") if node.find(\"tbody\") else []\n\n if header_row or body_rows:\n table_width = max(\n len(header_row.find_all([\"th\", \"td\"])) if header_row else 0,\n *(len(row.find_all([\"th\", \"td\"])) for row in body_rows),\n )\n\n table_block = self.create_block(\"table\", \"\", table_width=table_width, has_column_header=bool(header_row))\n blocks.append(table_block)\n\n if header_row:\n header_cells = [cell.get_text(strip=True) for cell in header_row.find_all([\"th\", \"td\"])]\n header_row_block = self.create_block(\"table_row\", header_cells)\n blocks.append(header_row_block)\n\n for row in body_rows:\n cells = [cell.get_text(strip=True) for cell in row.find_all([\"th\", \"td\"])]\n row_block = self.create_block(\"table_row\", cells)\n blocks.append(row_block)\n\n return blocks\n\n def create_block(self, block_type: str, content: str, **kwargs) -> dict[str, Any]:\n block: dict[str, Any] = {\n \"object\": \"block\",\n \"type\": block_type,\n block_type: {},\n }\n\n if block_type in {\n \"paragraph\",\n \"heading_1\",\n \"heading_2\",\n \"heading_3\",\n \"bulleted_list_item\",\n \"numbered_list_item\",\n \"quote\",\n }:\n block[block_type][\"rich_text\"] = [\n {\n \"type\": \"text\",\n \"text\": {\n \"content\": content,\n },\n }\n ]\n elif block_type == \"to_do\":\n block[block_type][\"rich_text\"] = [\n {\n \"type\": \"text\",\n \"text\": {\n \"content\": content,\n },\n }\n ]\n block[block_type][\"checked\"] = kwargs.get(\"checked\", False)\n elif block_type == \"code\":\n block[block_type][\"rich_text\"] = [\n {\n \"type\": \"text\",\n \"text\": {\n \"content\": content,\n },\n }\n ]\n block[block_type][\"language\"] = kwargs.get(\"language\", \"plain text\")\n elif block_type == \"image\":\n block[block_type] = {\"type\": \"external\", \"external\": {\"url\": kwargs.get(\"image_url\", \"\")}}\n elif block_type == \"divider\":\n pass\n elif block_type == \"bookmark\":\n block[block_type][\"url\"] = kwargs.get(\"link_url\", \"\")\n elif block_type == \"table\":\n block[block_type][\"table_width\"] = kwargs.get(\"table_width\", 0)\n block[block_type][\"has_column_header\"] = kwargs.get(\"has_column_header\", False)\n block[block_type][\"has_row_header\"] = kwargs.get(\"has_row_header\", False)\n elif block_type == \"table_row\":\n block[block_type][\"cells\"] = [[{\"type\": \"text\", \"text\": {\"content\": cell}} for cell in content]]\n\n return block\n"},"markdown_text":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Markdown Text","dynamic":false,"info":"The markdown text to convert to Notion blocks.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"markdown_text","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"notion_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Notion Secret","dynamic":false,"info":"The Notion integration token.","input_types":[],"load_from_db":true,"name":"notion_secret","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"NotionDatabaseProperties":{"base_classes":["Data","Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Retrieve properties of a Notion database.","display_name":"List Database Properties ","documentation":"https://docs.langflow.org/integrations/notion/list-database-properties","edited":false,"field_order":["database_id","notion_secret"],"frozen":false,"icon":"NotionDirectoryLoader","legacy":false,"metadata":{"code_hash":"10e5883790bc","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"langchain","version":"0.3.23"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.Notion.list_database_properties.NotionDatabaseProperties"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"run_model","name":"api_run_model","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool","group_outputs":false,"method":"build_tool","name":"api_build_tool","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import requests\nfrom langchain.tools import StructuredTool\nfrom pydantic import BaseModel, Field\n\nfrom lfx.base.langchain_utilities.model import LCToolComponent\nfrom lfx.field_typing import Tool\nfrom lfx.inputs.inputs import SecretStrInput, StrInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\n\n\nclass NotionDatabaseProperties(LCToolComponent):\n display_name: str = \"List Database Properties \"\n description: str = \"Retrieve properties of a Notion database.\"\n documentation: str = \"https://docs.langflow.org/integrations/notion/list-database-properties\"\n icon = \"NotionDirectoryLoader\"\n\n inputs = [\n StrInput(\n name=\"database_id\",\n display_name=\"Database ID\",\n info=\"The ID of the Notion database.\",\n ),\n SecretStrInput(\n name=\"notion_secret\",\n display_name=\"Notion Secret\",\n info=\"The Notion integration token.\",\n required=True,\n ),\n ]\n\n class NotionDatabasePropertiesSchema(BaseModel):\n database_id: str = Field(..., description=\"The ID of the Notion database.\")\n\n def run_model(self) -> Data:\n result = self._fetch_database_properties(self.database_id)\n if isinstance(result, str):\n # An error occurred, return it as text\n return Data(text=result)\n # Success, return the properties\n return Data(text=str(result), data=result)\n\n def build_tool(self) -> Tool:\n return StructuredTool.from_function(\n name=\"notion_database_properties\",\n description=\"Retrieve properties of a Notion database. Input should include the database ID.\",\n func=self._fetch_database_properties,\n args_schema=self.NotionDatabasePropertiesSchema,\n )\n\n def _fetch_database_properties(self, database_id: str) -> dict | str:\n url = f\"https://api.notion.com/v1/databases/{database_id}\"\n headers = {\n \"Authorization\": f\"Bearer {self.notion_secret}\",\n \"Notion-Version\": \"2022-06-28\", # Use the latest supported version\n }\n try:\n response = requests.get(url, headers=headers, timeout=10)\n response.raise_for_status()\n data = response.json()\n return data.get(\"properties\", {})\n except requests.exceptions.RequestException as e:\n return f\"Error fetching Notion database properties: {e}\"\n except ValueError as e:\n return f\"Error parsing Notion API response: {e}\"\n except Exception as e: # noqa: BLE001\n logger.debug(\"Error fetching Notion database properties\", exc_info=True)\n return f\"An unexpected error occurred: {e}\"\n"},"database_id":{"_input_type":"StrInput","advanced":false,"display_name":"Database ID","dynamic":false,"info":"The ID of the Notion database.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"database_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"notion_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Notion Secret","dynamic":false,"info":"The Notion integration token.","input_types":[],"load_from_db":true,"name":"notion_secret","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"NotionListPages":{"base_classes":["Data","Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Query a Notion database with filtering and sorting. The input should be a JSON string containing the 'filter' and 'sorts' objects. Example input:\n{\"filter\": {\"property\": \"Status\", \"select\": {\"equals\": \"Done\"}}, \"sorts\": [{\"timestamp\": \"created_time\", \"direction\": \"descending\"}]}","display_name":"List Pages ","documentation":"https://docs.langflow.org/integrations/notion/list-pages","edited":false,"field_order":["notion_secret","database_id","query_json"],"frozen":false,"icon":"NotionDirectoryLoader","legacy":false,"metadata":{"code_hash":"6b649a872172","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"langchain","version":"0.3.23"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.Notion.list_pages.NotionListPages"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"run_model","name":"api_run_model","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool","group_outputs":false,"method":"build_tool","name":"api_build_tool","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import json\nfrom typing import Any\n\nimport requests\nfrom langchain.tools import StructuredTool\nfrom pydantic import BaseModel, Field\n\nfrom lfx.base.langchain_utilities.model import LCToolComponent\nfrom lfx.field_typing import Tool\nfrom lfx.inputs.inputs import MultilineInput, SecretStrInput, StrInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\n\n\nclass NotionListPages(LCToolComponent):\n display_name: str = \"List Pages \"\n description: str = (\n \"Query a Notion database with filtering and sorting. \"\n \"The input should be a JSON string containing the 'filter' and 'sorts' objects. \"\n \"Example input:\\n\"\n '{\"filter\": {\"property\": \"Status\", \"select\": {\"equals\": \"Done\"}}, '\n '\"sorts\": [{\"timestamp\": \"created_time\", \"direction\": \"descending\"}]}'\n )\n documentation: str = \"https://docs.langflow.org/integrations/notion/list-pages\"\n icon = \"NotionDirectoryLoader\"\n\n inputs = [\n SecretStrInput(\n name=\"notion_secret\",\n display_name=\"Notion Secret\",\n info=\"The Notion integration token.\",\n required=True,\n ),\n StrInput(\n name=\"database_id\",\n display_name=\"Database ID\",\n info=\"The ID of the Notion database to query.\",\n ),\n MultilineInput(\n name=\"query_json\",\n display_name=\"Database query (JSON)\",\n info=\"A JSON string containing the filters and sorts that will be used for querying the database. \"\n \"Leave empty for no filters or sorts.\",\n ),\n ]\n\n class NotionListPagesSchema(BaseModel):\n database_id: str = Field(..., description=\"The ID of the Notion database to query.\")\n query_json: str | None = Field(\n default=\"\",\n description=\"A JSON string containing the filters and sorts for querying the database. \"\n \"Leave empty for no filters or sorts.\",\n )\n\n def run_model(self) -> list[Data]:\n result = self._query_notion_database(self.database_id, self.query_json)\n\n if isinstance(result, str):\n # An error occurred, return it as a single record\n return [Data(text=result)]\n\n records = []\n combined_text = f\"Pages found: {len(result)}\\n\\n\"\n\n for page in result:\n page_data = {\n \"id\": page[\"id\"],\n \"url\": page[\"url\"],\n \"created_time\": page[\"created_time\"],\n \"last_edited_time\": page[\"last_edited_time\"],\n \"properties\": page[\"properties\"],\n }\n\n text = (\n f\"id: {page['id']}\\n\"\n f\"url: {page['url']}\\n\"\n f\"created_time: {page['created_time']}\\n\"\n f\"last_edited_time: {page['last_edited_time']}\\n\"\n f\"properties: {json.dumps(page['properties'], indent=2)}\\n\\n\"\n )\n\n combined_text += text\n records.append(Data(text=text, **page_data))\n\n self.status = records\n return records\n\n def build_tool(self) -> Tool:\n return StructuredTool.from_function(\n name=\"notion_list_pages\",\n description=self.description,\n func=self._query_notion_database,\n args_schema=self.NotionListPagesSchema,\n )\n\n def _query_notion_database(self, database_id: str, query_json: str | None = None) -> list[dict[str, Any]] | str:\n url = f\"https://api.notion.com/v1/databases/{database_id}/query\"\n headers = {\n \"Authorization\": f\"Bearer {self.notion_secret}\",\n \"Content-Type\": \"application/json\",\n \"Notion-Version\": \"2022-06-28\",\n }\n\n query_payload = {}\n if query_json and query_json.strip():\n try:\n query_payload = json.loads(query_json)\n except json.JSONDecodeError as e:\n return f\"Invalid JSON format for query: {e}\"\n\n try:\n response = requests.post(url, headers=headers, json=query_payload, timeout=10)\n response.raise_for_status()\n results = response.json()\n return results[\"results\"]\n except requests.exceptions.RequestException as e:\n return f\"Error querying Notion database: {e}\"\n except KeyError:\n return \"Unexpected response format from Notion API\"\n except Exception as e: # noqa: BLE001\n logger.debug(\"Error querying Notion database\", exc_info=True)\n return f\"An unexpected error occurred: {e}\"\n"},"database_id":{"_input_type":"StrInput","advanced":false,"display_name":"Database ID","dynamic":false,"info":"The ID of the Notion database to query.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"database_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"notion_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Notion Secret","dynamic":false,"info":"The Notion integration token.","input_types":[],"load_from_db":true,"name":"notion_secret","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"query_json":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Database query (JSON)","dynamic":false,"info":"A JSON string containing the filters and sorts that will be used for querying the database. Leave empty for no filters or sorts.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"query_json","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"NotionPageContent":{"base_classes":["Data","Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Retrieve the content of a Notion page as plain text.","display_name":"Page Content Viewer ","documentation":"https://docs.langflow.org/integrations/notion/page-content-viewer","edited":false,"field_order":["page_id","notion_secret"],"frozen":false,"icon":"NotionDirectoryLoader","legacy":false,"metadata":{"code_hash":"72e657df5236","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"langchain","version":"0.3.23"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.Notion.page_content_viewer.NotionPageContent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"run_model","name":"api_run_model","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool","group_outputs":false,"method":"build_tool","name":"api_build_tool","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import requests\nfrom langchain.tools import StructuredTool\nfrom pydantic import BaseModel, Field\n\nfrom lfx.base.langchain_utilities.model import LCToolComponent\nfrom lfx.field_typing import Tool\nfrom lfx.inputs.inputs import SecretStrInput, StrInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\n\n\nclass NotionPageContent(LCToolComponent):\n display_name = \"Page Content Viewer \"\n description = \"Retrieve the content of a Notion page as plain text.\"\n documentation = \"https://docs.langflow.org/integrations/notion/page-content-viewer\"\n icon = \"NotionDirectoryLoader\"\n\n inputs = [\n StrInput(\n name=\"page_id\",\n display_name=\"Page ID\",\n info=\"The ID of the Notion page to retrieve.\",\n ),\n SecretStrInput(\n name=\"notion_secret\",\n display_name=\"Notion Secret\",\n info=\"The Notion integration token.\",\n required=True,\n ),\n ]\n\n class NotionPageContentSchema(BaseModel):\n page_id: str = Field(..., description=\"The ID of the Notion page to retrieve.\")\n\n def run_model(self) -> Data:\n result = self._retrieve_page_content(self.page_id)\n if isinstance(result, str) and result.startswith(\"Error:\"):\n # An error occurred, return it as text\n return Data(text=result)\n # Success, return the content\n return Data(text=result, data={\"content\": result})\n\n def build_tool(self) -> Tool:\n return StructuredTool.from_function(\n name=\"notion_page_content\",\n description=\"Retrieve the content of a Notion page as plain text.\",\n func=self._retrieve_page_content,\n args_schema=self.NotionPageContentSchema,\n )\n\n def _retrieve_page_content(self, page_id: str) -> str:\n blocks_url = f\"https://api.notion.com/v1/blocks/{page_id}/children?page_size=100\"\n headers = {\n \"Authorization\": f\"Bearer {self.notion_secret}\",\n \"Notion-Version\": \"2022-06-28\",\n }\n try:\n blocks_response = requests.get(blocks_url, headers=headers, timeout=10)\n blocks_response.raise_for_status()\n blocks_data = blocks_response.json()\n return self.parse_blocks(blocks_data.get(\"results\", []))\n except requests.exceptions.RequestException as e:\n error_message = f\"Error: Failed to retrieve Notion page content. {e}\"\n if hasattr(e, \"response\") and e.response is not None:\n error_message += f\" Status code: {e.response.status_code}, Response: {e.response.text}\"\n return error_message\n except Exception as e: # noqa: BLE001\n logger.debug(\"Error retrieving Notion page content\", exc_info=True)\n return f\"Error: An unexpected error occurred while retrieving Notion page content. {e}\"\n\n def parse_blocks(self, blocks: list) -> str:\n content = \"\"\n for block in blocks:\n block_type = block.get(\"type\")\n if block_type in {\"paragraph\", \"heading_1\", \"heading_2\", \"heading_3\", \"quote\"}:\n content += self.parse_rich_text(block[block_type].get(\"rich_text\", [])) + \"\\n\\n\"\n elif block_type in {\"bulleted_list_item\", \"numbered_list_item\"}:\n content += self.parse_rich_text(block[block_type].get(\"rich_text\", [])) + \"\\n\"\n elif block_type == \"to_do\":\n content += self.parse_rich_text(block[\"to_do\"].get(\"rich_text\", [])) + \"\\n\"\n elif block_type == \"code\":\n content += self.parse_rich_text(block[\"code\"].get(\"rich_text\", [])) + \"\\n\\n\"\n elif block_type == \"image\":\n content += f\"[Image: {block['image'].get('external', {}).get('url', 'No URL')}]\\n\\n\"\n elif block_type == \"divider\":\n content += \"---\\n\\n\"\n return content.strip()\n\n def parse_rich_text(self, rich_text: list) -> str:\n return \"\".join(segment.get(\"plain_text\", \"\") for segment in rich_text)\n\n def __call__(self, *args, **kwargs):\n return self._retrieve_page_content(*args, **kwargs)\n"},"notion_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Notion Secret","dynamic":false,"info":"The Notion integration token.","input_types":[],"load_from_db":true,"name":"notion_secret","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"page_id":{"_input_type":"StrInput","advanced":false,"display_name":"Page ID","dynamic":false,"info":"The ID of the Notion page to retrieve.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"page_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"NotionPageCreator":{"base_classes":["Data","Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"A component for creating Notion pages.","display_name":"Create Page ","documentation":"https://docs.langflow.org/integrations/notion/page-create","edited":false,"field_order":["database_id","notion_secret","properties_json"],"frozen":false,"icon":"NotionDirectoryLoader","legacy":false,"metadata":{"code_hash":"a561b9f6a4b2","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"langchain","version":"0.3.23"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.Notion.create_page.NotionPageCreator"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"run_model","name":"api_run_model","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool","group_outputs":false,"method":"build_tool","name":"api_build_tool","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import json\nfrom typing import Any\n\nimport requests\nfrom langchain.tools import StructuredTool\nfrom pydantic import BaseModel, Field\n\nfrom lfx.base.langchain_utilities.model import LCToolComponent\nfrom lfx.field_typing import Tool\nfrom lfx.inputs.inputs import MultilineInput, SecretStrInput, StrInput\nfrom lfx.schema.data import Data\n\n\nclass NotionPageCreator(LCToolComponent):\n display_name: str = \"Create Page \"\n description: str = \"A component for creating Notion pages.\"\n documentation: str = \"https://docs.langflow.org/integrations/notion/page-create\"\n icon = \"NotionDirectoryLoader\"\n\n inputs = [\n StrInput(\n name=\"database_id\",\n display_name=\"Database ID\",\n info=\"The ID of the Notion database.\",\n ),\n SecretStrInput(\n name=\"notion_secret\",\n display_name=\"Notion Secret\",\n info=\"The Notion integration token.\",\n required=True,\n ),\n MultilineInput(\n name=\"properties_json\",\n display_name=\"Properties (JSON)\",\n info=\"The properties of the new page as a JSON string.\",\n ),\n ]\n\n class NotionPageCreatorSchema(BaseModel):\n database_id: str = Field(..., description=\"The ID of the Notion database.\")\n properties_json: str = Field(..., description=\"The properties of the new page as a JSON string.\")\n\n def run_model(self) -> Data:\n result = self._create_notion_page(self.database_id, self.properties_json)\n if isinstance(result, str):\n # An error occurred, return it as text\n return Data(text=result)\n # Success, return the created page data\n output = \"Created page properties:\\n\"\n for prop_name, prop_value in result.get(\"properties\", {}).items():\n output += f\"{prop_name}: {prop_value}\\n\"\n return Data(text=output, data=result)\n\n def build_tool(self) -> Tool:\n return StructuredTool.from_function(\n name=\"create_notion_page\",\n description=\"Create a new page in a Notion database. \"\n \"IMPORTANT: Use the tool to check the Database properties for more details before using this tool.\",\n func=self._create_notion_page,\n args_schema=self.NotionPageCreatorSchema,\n )\n\n def _create_notion_page(self, database_id: str, properties_json: str) -> dict[str, Any] | str:\n if not database_id or not properties_json:\n return \"Invalid input. Please provide 'database_id' and 'properties_json'.\"\n\n try:\n properties = json.loads(properties_json)\n except json.JSONDecodeError as e:\n return f\"Invalid properties format. Please provide a valid JSON string. Error: {e}\"\n\n headers = {\n \"Authorization\": f\"Bearer {self.notion_secret}\",\n \"Content-Type\": \"application/json\",\n \"Notion-Version\": \"2022-06-28\",\n }\n\n data = {\n \"parent\": {\"database_id\": database_id},\n \"properties\": properties,\n }\n\n try:\n response = requests.post(\"https://api.notion.com/v1/pages\", headers=headers, json=data, timeout=10)\n response.raise_for_status()\n return response.json()\n except requests.exceptions.RequestException as e:\n error_message = f\"Failed to create Notion page. Error: {e}\"\n if hasattr(e, \"response\") and e.response is not None:\n error_message += f\" Status code: {e.response.status_code}, Response: {e.response.text}\"\n return error_message\n\n def __call__(self, *args, **kwargs):\n return self._create_notion_page(*args, **kwargs)\n"},"database_id":{"_input_type":"StrInput","advanced":false,"display_name":"Database ID","dynamic":false,"info":"The ID of the Notion database.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"database_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"notion_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Notion Secret","dynamic":false,"info":"The Notion integration token.","input_types":[],"load_from_db":true,"name":"notion_secret","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"properties_json":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Properties (JSON)","dynamic":false,"info":"The properties of the new page as a JSON string.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"properties_json","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"NotionPageUpdate":{"base_classes":["Data","Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Update the properties of a Notion page.","display_name":"Update Page Property ","documentation":"https://docs.langflow.org/integrations/notion/page-update","edited":false,"field_order":["page_id","properties","notion_secret"],"frozen":false,"icon":"NotionDirectoryLoader","legacy":false,"metadata":{"code_hash":"b6098f31b0f5","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"langchain","version":"0.3.23"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.Notion.update_page_property.NotionPageUpdate"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"run_model","name":"api_run_model","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool","group_outputs":false,"method":"build_tool","name":"api_build_tool","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import json\nfrom typing import Any\n\nimport requests\nfrom langchain.tools import StructuredTool\nfrom pydantic import BaseModel, Field\n\nfrom lfx.base.langchain_utilities.model import LCToolComponent\nfrom lfx.field_typing import Tool\nfrom lfx.inputs.inputs import MultilineInput, SecretStrInput, StrInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\n\n\nclass NotionPageUpdate(LCToolComponent):\n display_name: str = \"Update Page Property \"\n description: str = \"Update the properties of a Notion page.\"\n documentation: str = \"https://docs.langflow.org/integrations/notion/page-update\"\n icon = \"NotionDirectoryLoader\"\n\n inputs = [\n StrInput(\n name=\"page_id\",\n display_name=\"Page ID\",\n info=\"The ID of the Notion page to update.\",\n ),\n MultilineInput(\n name=\"properties\",\n display_name=\"Properties\",\n info=\"The properties to update on the page (as a JSON string or a dictionary).\",\n ),\n SecretStrInput(\n name=\"notion_secret\",\n display_name=\"Notion Secret\",\n info=\"The Notion integration token.\",\n required=True,\n ),\n ]\n\n class NotionPageUpdateSchema(BaseModel):\n page_id: str = Field(..., description=\"The ID of the Notion page to update.\")\n properties: str | dict[str, Any] = Field(\n ..., description=\"The properties to update on the page (as a JSON string or a dictionary).\"\n )\n\n def run_model(self) -> Data:\n result = self._update_notion_page(self.page_id, self.properties)\n if isinstance(result, str):\n # An error occurred, return it as text\n return Data(text=result)\n # Success, return the updated page data\n output = \"Updated page properties:\\n\"\n for prop_name, prop_value in result.get(\"properties\", {}).items():\n output += f\"{prop_name}: {prop_value}\\n\"\n return Data(text=output, data=result)\n\n def build_tool(self) -> Tool:\n return StructuredTool.from_function(\n name=\"update_notion_page\",\n description=\"Update the properties of a Notion page. \"\n \"IMPORTANT: Use the tool to check the Database properties for more details before using this tool.\",\n func=self._update_notion_page,\n args_schema=self.NotionPageUpdateSchema,\n )\n\n def _update_notion_page(self, page_id: str, properties: str | dict[str, Any]) -> dict[str, Any] | str:\n url = f\"https://api.notion.com/v1/pages/{page_id}\"\n headers = {\n \"Authorization\": f\"Bearer {self.notion_secret}\",\n \"Content-Type\": \"application/json\",\n \"Notion-Version\": \"2022-06-28\", # Use the latest supported version\n }\n\n # Parse properties if it's a string\n if isinstance(properties, str):\n try:\n parsed_properties = json.loads(properties)\n except json.JSONDecodeError as e:\n error_message = f\"Invalid JSON format for properties: {e}\"\n logger.exception(error_message)\n return error_message\n\n else:\n parsed_properties = properties\n\n data = {\"properties\": parsed_properties}\n\n try:\n logger.info(f\"Sending request to Notion API: URL: {url}, Data: {json.dumps(data)}\")\n response = requests.patch(url, headers=headers, json=data, timeout=10)\n response.raise_for_status()\n updated_page = response.json()\n\n logger.info(f\"Successfully updated Notion page. Response: {json.dumps(updated_page)}\")\n except requests.exceptions.HTTPError as e:\n error_message = f\"HTTP Error occurred: {e}\"\n if e.response is not None:\n error_message += f\"\\nStatus code: {e.response.status_code}\"\n error_message += f\"\\nResponse body: {e.response.text}\"\n logger.exception(error_message)\n return error_message\n except requests.exceptions.RequestException as e:\n error_message = f\"An error occurred while making the request: {e}\"\n logger.exception(error_message)\n return error_message\n except Exception as e: # noqa: BLE001\n error_message = f\"An unexpected error occurred: {e}\"\n logger.exception(error_message)\n return error_message\n\n return updated_page\n\n def __call__(self, *args, **kwargs):\n return self._update_notion_page(*args, **kwargs)\n"},"notion_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Notion Secret","dynamic":false,"info":"The Notion integration token.","input_types":[],"load_from_db":true,"name":"notion_secret","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"page_id":{"_input_type":"StrInput","advanced":false,"display_name":"Page ID","dynamic":false,"info":"The ID of the Notion page to update.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"page_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"properties":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Properties","dynamic":false,"info":"The properties to update on the page (as a JSON string or a dictionary).","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"properties","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"NotionSearch":{"base_classes":["Data","Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Searches all pages and databases that have been shared with an integration.","display_name":"Search ","documentation":"https://docs.langflow.org/integrations/notion/search","edited":false,"field_order":["notion_secret","query","filter_value","sort_direction"],"frozen":false,"icon":"NotionDirectoryLoader","legacy":false,"metadata":{"code_hash":"5840d86cda2d","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"langchain","version":"0.3.23"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.Notion.search.NotionSearch"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"run_model","name":"api_run_model","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool","group_outputs":false,"method":"build_tool","name":"api_build_tool","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from typing import Any\n\nimport requests\nfrom langchain.tools import StructuredTool\nfrom pydantic import BaseModel, Field\n\nfrom lfx.base.langchain_utilities.model import LCToolComponent\nfrom lfx.field_typing import Tool\nfrom lfx.inputs.inputs import DropdownInput, SecretStrInput, StrInput\nfrom lfx.schema.data import Data\n\n\nclass NotionSearch(LCToolComponent):\n display_name: str = \"Search \"\n description: str = \"Searches all pages and databases that have been shared with an integration.\"\n documentation: str = \"https://docs.langflow.org/integrations/notion/search\"\n icon = \"NotionDirectoryLoader\"\n\n inputs = [\n SecretStrInput(\n name=\"notion_secret\",\n display_name=\"Notion Secret\",\n info=\"The Notion integration token.\",\n required=True,\n ),\n StrInput(\n name=\"query\",\n display_name=\"Search Query\",\n info=\"The text that the API compares page and database titles against.\",\n ),\n DropdownInput(\n name=\"filter_value\",\n display_name=\"Filter Type\",\n info=\"Limits the results to either only pages or only databases.\",\n options=[\"page\", \"database\"],\n value=\"page\",\n ),\n DropdownInput(\n name=\"sort_direction\",\n display_name=\"Sort Direction\",\n info=\"The direction to sort the results.\",\n options=[\"ascending\", \"descending\"],\n value=\"descending\",\n ),\n ]\n\n class NotionSearchSchema(BaseModel):\n query: str = Field(..., description=\"The search query text.\")\n filter_value: str = Field(default=\"page\", description=\"Filter type: 'page' or 'database'.\")\n sort_direction: str = Field(default=\"descending\", description=\"Sort direction: 'ascending' or 'descending'.\")\n\n def run_model(self) -> list[Data]:\n results = self._search_notion(self.query, self.filter_value, self.sort_direction)\n records = []\n combined_text = f\"Results found: {len(results)}\\n\\n\"\n\n for result in results:\n result_data = {\n \"id\": result[\"id\"],\n \"type\": result[\"object\"],\n \"last_edited_time\": result[\"last_edited_time\"],\n }\n\n if result[\"object\"] == \"page\":\n result_data[\"title_or_url\"] = result[\"url\"]\n text = f\"id: {result['id']}\\ntitle_or_url: {result['url']}\\n\"\n elif result[\"object\"] == \"database\":\n if \"title\" in result and isinstance(result[\"title\"], list) and len(result[\"title\"]) > 0:\n result_data[\"title_or_url\"] = result[\"title\"][0][\"plain_text\"]\n text = f\"id: {result['id']}\\ntitle_or_url: {result['title'][0]['plain_text']}\\n\"\n else:\n result_data[\"title_or_url\"] = \"N/A\"\n text = f\"id: {result['id']}\\ntitle_or_url: N/A\\n\"\n\n text += f\"type: {result['object']}\\nlast_edited_time: {result['last_edited_time']}\\n\\n\"\n combined_text += text\n records.append(Data(text=text, data=result_data))\n\n self.status = records\n return records\n\n def build_tool(self) -> Tool:\n return StructuredTool.from_function(\n name=\"notion_search\",\n description=\"Search Notion pages and databases. \"\n \"Input should include the search query and optionally filter type and sort direction.\",\n func=self._search_notion,\n args_schema=self.NotionSearchSchema,\n )\n\n def _search_notion(\n self, query: str, filter_value: str = \"page\", sort_direction: str = \"descending\"\n ) -> list[dict[str, Any]]:\n url = \"https://api.notion.com/v1/search\"\n headers = {\n \"Authorization\": f\"Bearer {self.notion_secret}\",\n \"Content-Type\": \"application/json\",\n \"Notion-Version\": \"2022-06-28\",\n }\n\n data = {\n \"query\": query,\n \"filter\": {\"value\": filter_value, \"property\": \"object\"},\n \"sort\": {\"direction\": sort_direction, \"timestamp\": \"last_edited_time\"},\n }\n\n response = requests.post(url, headers=headers, json=data, timeout=10)\n response.raise_for_status()\n\n results = response.json()\n return results[\"results\"]\n"},"filter_value":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Filter Type","dynamic":false,"external_options":{},"info":"Limits the results to either only pages or only databases.","name":"filter_value","options":["page","database"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"page"},"notion_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Notion Secret","dynamic":false,"info":"The Notion integration token.","input_types":[],"load_from_db":true,"name":"notion_secret","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"query":{"_input_type":"StrInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"The text that the API compares page and database titles against.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"query","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"sort_direction":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Sort Direction","dynamic":false,"external_options":{},"info":"The direction to sort the results.","name":"sort_direction","options":["ascending","descending"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"descending"}},"tool_mode":false},"NotionUserList":{"base_classes":["Data","Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Retrieve users from Notion.","display_name":"List Users ","documentation":"https://docs.langflow.org/integrations/notion/list-users","edited":false,"field_order":["notion_secret"],"frozen":false,"icon":"NotionDirectoryLoader","legacy":false,"metadata":{"code_hash":"adc59c2d29d8","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"langchain","version":"0.3.23"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.Notion.list_users.NotionUserList"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"run_model","name":"api_run_model","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool","group_outputs":false,"method":"build_tool","name":"api_build_tool","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import requests\nfrom langchain.tools import StructuredTool\nfrom pydantic import BaseModel\n\nfrom lfx.base.langchain_utilities.model import LCToolComponent\nfrom lfx.field_typing import Tool\nfrom lfx.inputs.inputs import SecretStrInput\nfrom lfx.schema.data import Data\n\n\nclass NotionUserList(LCToolComponent):\n display_name = \"List Users \"\n description = \"Retrieve users from Notion.\"\n documentation = \"https://docs.langflow.org/integrations/notion/list-users\"\n icon = \"NotionDirectoryLoader\"\n\n inputs = [\n SecretStrInput(\n name=\"notion_secret\",\n display_name=\"Notion Secret\",\n info=\"The Notion integration token.\",\n required=True,\n ),\n ]\n\n class NotionUserListSchema(BaseModel):\n pass\n\n def run_model(self) -> list[Data]:\n users = self._list_users()\n records = []\n combined_text = \"\"\n\n for user in users:\n output = \"User:\\n\"\n for key, value in user.items():\n output += f\"{key.replace('_', ' ').title()}: {value}\\n\"\n output += \"________________________\\n\"\n\n combined_text += output\n records.append(Data(text=output, data=user))\n\n self.status = records\n return records\n\n def build_tool(self) -> Tool:\n return StructuredTool.from_function(\n name=\"notion_list_users\",\n description=\"Retrieve users from Notion.\",\n func=self._list_users,\n args_schema=self.NotionUserListSchema,\n )\n\n def _list_users(self) -> list[dict]:\n url = \"https://api.notion.com/v1/users\"\n headers = {\n \"Authorization\": f\"Bearer {self.notion_secret}\",\n \"Notion-Version\": \"2022-06-28\",\n }\n\n response = requests.get(url, headers=headers, timeout=10)\n response.raise_for_status()\n\n data = response.json()\n results = data[\"results\"]\n\n users = []\n for user in results:\n user_data = {\n \"id\": user[\"id\"],\n \"type\": user[\"type\"],\n \"name\": user.get(\"name\", \"\"),\n \"avatar_url\": user.get(\"avatar_url\", \"\"),\n }\n users.append(user_data)\n\n return users\n"},"notion_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Notion Secret","dynamic":false,"info":"The Notion integration token.","input_types":[],"load_from_db":true,"name":"notion_secret","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false}}],["agentql",{"AgentQL":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Extracts structured data from a web page using an AgentQL query or a Natural Language description.","display_name":"Extract Web Data","documentation":"https://docs.agentql.com/rest-api/api-reference","edited":false,"field_order":["api_key","url","query","prompt","is_stealth_mode_enabled","timeout","mode","wait_for","is_scroll_to_bottom_enabled","is_screenshot_enabled"],"frozen":false,"icon":"AgentQL","legacy":false,"metadata":{"code_hash":"37de3210aed9","dependencies":{"dependencies":[{"name":"httpx","version":"0.28.1"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.agentql.agentql_api.AgentQL"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"build_output","name":"data","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AgentQL API Key","dynamic":false,"info":"Your AgentQL API key from dev.agentql.com","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import httpx\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.field_typing.range_spec import RangeSpec\nfrom lfx.io import BoolInput, DropdownInput, IntInput, MessageTextInput, MultilineInput, Output, SecretStrInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\n\n\nclass AgentQL(Component):\n display_name = \"Extract Web Data\"\n description = \"Extracts structured data from a web page using an AgentQL query or a Natural Language description.\"\n documentation: str = \"https://docs.agentql.com/rest-api/api-reference\"\n icon = \"AgentQL\"\n name = \"AgentQL\"\n\n inputs = [\n SecretStrInput(\n name=\"api_key\",\n display_name=\"AgentQL API Key\",\n required=True,\n password=True,\n info=\"Your AgentQL API key from dev.agentql.com\",\n ),\n MessageTextInput(\n name=\"url\",\n display_name=\"URL\",\n required=True,\n info=\"The URL of the public web page you want to extract data from.\",\n tool_mode=True,\n ),\n MultilineInput(\n name=\"query\",\n display_name=\"AgentQL Query\",\n required=False,\n info=\"The AgentQL query to execute. Learn more at https://docs.agentql.com/agentql-query or use a prompt.\",\n tool_mode=True,\n ),\n MultilineInput(\n name=\"prompt\",\n display_name=\"Prompt\",\n required=False,\n info=\"A Natural Language description of the data to extract from the page. Alternative to AgentQL query.\",\n tool_mode=True,\n ),\n BoolInput(\n name=\"is_stealth_mode_enabled\",\n display_name=\"Enable Stealth Mode (Beta)\",\n info=\"Enable experimental anti-bot evasion strategies. May not work for all websites at all times.\",\n value=False,\n advanced=True,\n ),\n IntInput(\n name=\"timeout\",\n display_name=\"Timeout\",\n info=\"Seconds to wait for a request.\",\n value=900,\n advanced=True,\n ),\n DropdownInput(\n name=\"mode\",\n display_name=\"Request Mode\",\n info=\"'standard' uses deep data analysis, while 'fast' trades some depth of analysis for speed.\",\n options=[\"fast\", \"standard\"],\n value=\"fast\",\n advanced=True,\n ),\n IntInput(\n name=\"wait_for\",\n display_name=\"Wait For\",\n info=\"Seconds to wait for the page to load before extracting data.\",\n value=0,\n range_spec=RangeSpec(min=0, max=10, step_type=\"int\"),\n advanced=True,\n ),\n BoolInput(\n name=\"is_scroll_to_bottom_enabled\",\n display_name=\"Enable scroll to bottom\",\n info=\"Scroll to bottom of the page before extracting data.\",\n value=False,\n advanced=True,\n ),\n BoolInput(\n name=\"is_screenshot_enabled\",\n display_name=\"Enable screenshot\",\n info=\"Take a screenshot before extracting data. Returned in 'metadata' as a Base64 string.\",\n value=False,\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"build_output\"),\n ]\n\n def build_output(self) -> Data:\n endpoint = \"https://api.agentql.com/v1/query-data\"\n headers = {\n \"X-API-Key\": self.api_key,\n \"Content-Type\": \"application/json\",\n \"X-TF-Request-Origin\": \"langflow\",\n }\n\n payload = {\n \"url\": self.url,\n \"query\": self.query,\n \"prompt\": self.prompt,\n \"params\": {\n \"mode\": self.mode,\n \"wait_for\": self.wait_for,\n \"is_scroll_to_bottom_enabled\": self.is_scroll_to_bottom_enabled,\n \"is_screenshot_enabled\": self.is_screenshot_enabled,\n },\n \"metadata\": {\n \"experimental_stealth_mode_enabled\": self.is_stealth_mode_enabled,\n },\n }\n\n if not self.prompt and not self.query:\n self.status = \"Either Query or Prompt must be provided.\"\n raise ValueError(self.status)\n if self.prompt and self.query:\n self.status = \"Both Query and Prompt can't be provided at the same time.\"\n raise ValueError(self.status)\n\n try:\n response = httpx.post(endpoint, headers=headers, json=payload, timeout=self.timeout)\n response.raise_for_status()\n\n json = response.json()\n data = Data(result=json[\"data\"], metadata=json[\"metadata\"])\n\n except httpx.HTTPStatusError as e:\n response = e.response\n if response.status_code == httpx.codes.UNAUTHORIZED:\n self.status = \"Please, provide a valid API Key. You can create one at https://dev.agentql.com.\"\n else:\n try:\n error_json = response.json()\n logger.error(\n f\"Failure response: '{response.status_code} {response.reason_phrase}' with body: {error_json}\"\n )\n msg = error_json[\"error_info\"] if \"error_info\" in error_json else error_json[\"detail\"]\n except (ValueError, TypeError):\n msg = f\"HTTP {e}.\"\n self.status = msg\n raise ValueError(self.status) from e\n\n else:\n self.status = data\n return data\n"},"is_screenshot_enabled":{"_input_type":"BoolInput","advanced":true,"display_name":"Enable screenshot","dynamic":false,"info":"Take a screenshot before extracting data. Returned in 'metadata' as a Base64 string.","list":false,"list_add_label":"Add More","name":"is_screenshot_enabled","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"is_scroll_to_bottom_enabled":{"_input_type":"BoolInput","advanced":true,"display_name":"Enable scroll to bottom","dynamic":false,"info":"Scroll to bottom of the page before extracting data.","list":false,"list_add_label":"Add More","name":"is_scroll_to_bottom_enabled","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"is_stealth_mode_enabled":{"_input_type":"BoolInput","advanced":true,"display_name":"Enable Stealth Mode (Beta)","dynamic":false,"info":"Enable experimental anti-bot evasion strategies. May not work for all websites at all times.","list":false,"list_add_label":"Add More","name":"is_stealth_mode_enabled","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"mode":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Request Mode","dynamic":false,"external_options":{},"info":"'standard' uses deep data analysis, while 'fast' trades some depth of analysis for speed.","name":"mode","options":["fast","standard"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"fast"},"prompt":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Prompt","dynamic":false,"info":"A Natural Language description of the data to extract from the page. Alternative to AgentQL query.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"prompt","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"query":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"AgentQL Query","dynamic":false,"info":"The AgentQL query to execute. Learn more at https://docs.agentql.com/agentql-query or use a prompt.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"query","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"timeout":{"_input_type":"IntInput","advanced":true,"display_name":"Timeout","dynamic":false,"info":"Seconds to wait for a request.","list":false,"list_add_label":"Add More","name":"timeout","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":900},"url":{"_input_type":"MessageTextInput","advanced":false,"display_name":"URL","dynamic":false,"info":"The URL of the public web page you want to extract data from.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"url","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"wait_for":{"_input_type":"IntInput","advanced":true,"display_name":"Wait For","dynamic":false,"info":"Seconds to wait for the page to load before extracting data.","list":false,"list_add_label":"Add More","name":"wait_for","placeholder":"","range_spec":{"max":10.0,"min":0.0,"step":0.1,"step_type":"int"},"required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":0}},"tool_mode":false}}],["aiml",{"AIMLEmbeddings":{"base_classes":["Embeddings"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate embeddings using the AI/ML API.","display_name":"AI/ML API Embeddings","documentation":"","edited":false,"field_order":["model_name","aiml_api_key"],"frozen":false,"icon":"AIML","legacy":false,"metadata":{"code_hash":"dae370391ba3","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.aiml.aiml_embeddings.AIMLEmbeddingsComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Embedding Model","group_outputs":false,"method":"build_embeddings","name":"embeddings","selected":"Embeddings","tool_mode":true,"types":["Embeddings"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","aiml_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AI/ML API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"aiml_api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"AIML_API_KEY"},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.embeddings.aiml_embeddings import AIMLEmbeddingsImpl\nfrom lfx.base.embeddings.model import LCEmbeddingsModel\nfrom lfx.field_typing import Embeddings\nfrom lfx.inputs.inputs import DropdownInput\nfrom lfx.io import SecretStrInput\n\n\nclass AIMLEmbeddingsComponent(LCEmbeddingsModel):\n display_name = \"AI/ML API Embeddings\"\n description = \"Generate embeddings using the AI/ML API.\"\n icon = \"AIML\"\n name = \"AIMLEmbeddings\"\n\n inputs = [\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n options=[\n \"text-embedding-3-small\",\n \"text-embedding-3-large\",\n \"text-embedding-ada-002\",\n ],\n required=True,\n ),\n SecretStrInput(\n name=\"aiml_api_key\",\n display_name=\"AI/ML API Key\",\n value=\"AIML_API_KEY\",\n required=True,\n ),\n ]\n\n def build_embeddings(self) -> Embeddings:\n return AIMLEmbeddingsImpl(\n api_key=self.aiml_api_key,\n model=self.model_name,\n )\n"},"model_name":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model Name","dynamic":false,"external_options":{},"info":"","name":"model_name","options":["text-embedding-3-small","text-embedding-3-large","text-embedding-ada-002"],"options_metadata":[],"placeholder":"","required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""}},"tool_mode":false},"AIMLModel":{"base_classes":["LanguageModel","Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generates text using AI/ML API LLMs.","display_name":"AI/ML API","documentation":"https://docs.aimlapi.com/api-reference","edited":false,"field_order":["input_value","system_message","stream","max_tokens","model_kwargs","model_name","aiml_api_base","api_key","temperature"],"frozen":false,"icon":"AIML","legacy":false,"metadata":{"code_hash":"db72277a0d5a","dependencies":{"dependencies":[{"name":"langchain_openai","version":"0.3.23"},{"name":"pydantic","version":"2.10.6"},{"name":"typing_extensions","version":"4.15.0"},{"name":"lfx","version":null},{"name":"openai","version":"1.82.1"}],"total_dependencies":5},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.aiml.aiml.AIMLModelComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Model Response","group_outputs":false,"method":"text_response","name":"text_output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Language Model","group_outputs":false,"method":"build_model","name":"model_output","selected":"LanguageModel","tool_mode":true,"types":["LanguageModel"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","aiml_api_base":{"_input_type":"StrInput","advanced":true,"display_name":"AI/ML API Base","dynamic":false,"info":"The base URL of the API. Defaults to https://api.aimlapi.com . You can change this to use other APIs like JinaChat, LocalAI and Prem.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"aiml_api_base","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AI/ML API Key","dynamic":false,"info":"The AI/ML API Key to use for the OpenAI model.","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"AIML_API_KEY"},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\nfrom typing_extensions import override\n\nfrom lfx.base.models.aiml_constants import AimlModels\nfrom lfx.base.models.model import LCModelComponent\nfrom lfx.field_typing import LanguageModel\nfrom lfx.field_typing.range_spec import RangeSpec\nfrom lfx.inputs.inputs import (\n DictInput,\n DropdownInput,\n IntInput,\n SecretStrInput,\n SliderInput,\n StrInput,\n)\n\n\nclass AIMLModelComponent(LCModelComponent):\n display_name = \"AI/ML API\"\n description = \"Generates text using AI/ML API LLMs.\"\n icon = \"AIML\"\n name = \"AIMLModel\"\n documentation = \"https://docs.aimlapi.com/api-reference\"\n\n inputs = [\n *LCModelComponent.get_base_inputs(),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n range_spec=RangeSpec(min=0, max=128000),\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n advanced=False,\n options=[],\n refresh_button=True,\n ),\n StrInput(\n name=\"aiml_api_base\",\n display_name=\"AI/ML API Base\",\n advanced=True,\n info=\"The base URL of the API. Defaults to https://api.aimlapi.com . \"\n \"You can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"AI/ML API Key\",\n info=\"The AI/ML API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"AIML_API_KEY\",\n required=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n range_spec=RangeSpec(min=0, max=2, step=0.01),\n ),\n ]\n\n @override\n def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None):\n if field_name in {\"api_key\", \"aiml_api_base\", \"model_name\"}:\n aiml = AimlModels()\n aiml.get_aiml_models()\n build_config[\"model_name\"][\"options\"] = aiml.chat_models\n return build_config\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n aiml_api_key = self.api_key\n temperature = self.temperature\n model_name: str = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs or {}\n aiml_api_base = self.aiml_api_base or \"https://api.aimlapi.com/v2\"\n\n openai_api_key = aiml_api_key.get_secret_value() if isinstance(aiml_api_key, SecretStr) else aiml_api_key\n\n # TODO: Once OpenAI fixes their o1 models, this part will need to be removed\n # to work correctly with o1 temperature settings.\n if \"o1\" in model_name:\n temperature = 1\n\n return ChatOpenAI(\n model=model_name,\n temperature=temperature,\n api_key=openai_api_key,\n base_url=aiml_api_base,\n max_tokens=max_tokens or None,\n **model_kwargs,\n )\n\n def _get_exception_message(self, e: Exception):\n \"\"\"Get a message from an OpenAI exception.\n\n Args:\n e (Exception): The exception to get the message from.\n\n Returns:\n str: The message from the exception.\n \"\"\"\n try:\n from openai.error import BadRequestError\n except ImportError:\n return None\n if isinstance(e, BadRequestError):\n message = e.json_body.get(\"error\", {}).get(\"message\", \"\")\n if message:\n return message\n return None\n"},"input_value":{"_input_type":"MessageInput","advanced":false,"display_name":"Input","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"max_tokens":{"_input_type":"IntInput","advanced":true,"display_name":"Max Tokens","dynamic":false,"info":"The maximum number of tokens to generate. Set to 0 for unlimited tokens.","list":false,"list_add_label":"Add More","name":"max_tokens","placeholder":"","range_spec":{"max":128000.0,"min":0.0,"step":0.1,"step_type":"float"},"required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"model_kwargs":{"_input_type":"DictInput","advanced":true,"display_name":"Model Kwargs","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"model_kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"model_name":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model Name","dynamic":false,"external_options":{},"info":"","name":"model_name","options":[],"options_metadata":[],"placeholder":"","refresh_button":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"stream":{"_input_type":"BoolInput","advanced":true,"display_name":"Stream","dynamic":false,"info":"Stream the response from the model. Streaming works only in Chat.","list":false,"list_add_label":"Add More","name":"stream","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"system_message":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"System Message","dynamic":false,"info":"System message to pass to the model.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"system_message","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"temperature":{"_input_type":"SliderInput","advanced":false,"display_name":"Temperature","dynamic":false,"info":"","max_label":"","max_label_icon":"","min_label":"","min_label_icon":"","name":"temperature","placeholder":"","range_spec":{"max":2.0,"min":0.0,"step":0.01,"step_type":"float"},"required":false,"show":true,"slider_buttons":false,"slider_buttons_options":[],"slider_input":false,"title_case":false,"tool_mode":false,"track_in_telemetry":false,"type":"slider","value":0.1}},"tool_mode":false}}],["altk",{"ALTK Agent":{"base_classes":["Message"],"beta":true,"conditional_paths":[],"custom_fields":{},"description":"Advanced agent with both pre-tool validation and post-tool processing capabilities.","display_name":"ALTK Agent","documentation":"https://docs.langflow.org/agents","edited":false,"field_order":["agent_llm","api_key","base_url","project_id","max_output_tokens","max_tokens","model_kwargs","model_name","openai_api_base","api_key","temperature","seed","max_retries","timeout","system_prompt","context_id","n_messages","format_instructions","output_schema","tools","input_value","handle_parsing_errors","verbose","max_iterations","agent_description","add_current_date_tool","enable_tool_validation","enable_post_tool_reflection","response_processing_size_threshold"],"frozen":false,"icon":"zap","legacy":false,"metadata":{"code_hash":"bed8c951f729","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"langchain_core","version":"0.3.79"}],"total_dependencies":2},"module":"lfx.components.altk.altk_agent.ALTKAgentComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Response","group_outputs":false,"method":"message_response","name":"response","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","add_current_date_tool":{"_input_type":"BoolInput","advanced":true,"display_name":"Current Date","dynamic":false,"info":"If true, will add a tool to the agent that returns the current date.","list":false,"list_add_label":"Add More","name":"add_current_date_tool","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"agent_description":{"_input_type":"MultilineInput","advanced":true,"copy_field":false,"display_name":"Agent Description [Deprecated]","dynamic":false,"info":"The description of the agent. This is only used when in Tool Mode. Defaults to 'A helpful assistant with access to the following tools:' and tools are added dynamically. This feature is deprecated and will be removed in future versions.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"agent_description","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"A helpful assistant with access to the following tools:"},"agent_llm":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model Provider","dynamic":false,"external_options":{},"info":"The provider of the language model that the agent will use to generate responses.","input_types":[],"name":"agent_llm","options":["Anthropic","OpenAI"],"options_metadata":[{"icon":"Anthropic"},{"icon":"OpenAI"}],"placeholder":"","real_time_refresh":true,"refresh_button":false,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"OpenAI"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"OpenAI API Key","dynamic":false,"info":"The OpenAI API Key to use for the OpenAI model.","input_types":[],"load_from_db":false,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"The base URL of the API.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","required":true,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"\"\"\"ALTK Agent Component that combines pre-tool validation and post-tool processing capabilities.\"\"\"\n\nfrom lfx.base.agents.altk_base_agent import ALTKBaseAgentComponent\nfrom lfx.base.agents.altk_tool_wrappers import (\n PostToolProcessingWrapper,\n PreToolValidationWrapper,\n)\nfrom lfx.base.models.model_input_constants import MODEL_PROVIDERS_DICT, MODELS_METADATA\nfrom lfx.components.models_and_agents.memory import MemoryComponent\nfrom lfx.inputs.inputs import BoolInput\nfrom lfx.io import DropdownInput, IntInput, Output\nfrom lfx.log.logger import logger\n\n\ndef set_advanced_true(component_input):\n \"\"\"Set the advanced flag to True for a component input.\"\"\"\n component_input.advanced = True\n return component_input\n\n\nMODEL_PROVIDERS_LIST = [\"Anthropic\", \"OpenAI\"]\nINPUT_NAMES_TO_BE_OVERRIDDEN = [\"agent_llm\"]\n\n\ndef get_parent_agent_inputs():\n return [\n input_field\n for input_field in ALTKBaseAgentComponent.inputs\n if input_field.name not in INPUT_NAMES_TO_BE_OVERRIDDEN\n ]\n\n\n# === Combined ALTK Agent Component ===\n\n\nclass ALTKAgentComponent(ALTKBaseAgentComponent):\n \"\"\"ALTK Agent with both pre-tool validation and post-tool processing capabilities.\n\n This agent combines the functionality of both ALTKAgent and AgentReflection components,\n implementing a modular pipeline for tool processing that can be extended with\n additional capabilities in the future.\n \"\"\"\n\n display_name: str = \"ALTK Agent\"\n description: str = \"Advanced agent with both pre-tool validation and post-tool processing capabilities.\"\n documentation: str = \"https://docs.langflow.org/agents\"\n icon = \"zap\"\n beta = True\n name = \"ALTK Agent\"\n\n memory_inputs = [set_advanced_true(component_input) for component_input in MemoryComponent().inputs]\n\n # Filter out json_mode from OpenAI inputs since we handle structured output differently\n if \"OpenAI\" in MODEL_PROVIDERS_DICT:\n openai_inputs_filtered = [\n input_field\n for input_field in MODEL_PROVIDERS_DICT[\"OpenAI\"][\"inputs\"]\n if not (hasattr(input_field, \"name\") and input_field.name == \"json_mode\")\n ]\n else:\n openai_inputs_filtered = []\n\n inputs = [\n DropdownInput(\n name=\"agent_llm\",\n display_name=\"Model Provider\",\n info=\"The provider of the language model that the agent will use to generate responses.\",\n options=[*MODEL_PROVIDERS_LIST],\n value=\"OpenAI\",\n real_time_refresh=True,\n refresh_button=False,\n input_types=[],\n options_metadata=[MODELS_METADATA[key] for key in MODEL_PROVIDERS_LIST if key in MODELS_METADATA],\n ),\n *get_parent_agent_inputs(),\n BoolInput(\n name=\"enable_tool_validation\",\n display_name=\"Tool Validation\",\n info=\"Validates tool calls using SPARC before execution.\",\n value=True,\n ),\n BoolInput(\n name=\"enable_post_tool_reflection\",\n display_name=\"Post Tool JSON Processing\",\n info=\"Processes tool output through JSON analysis.\",\n value=True,\n ),\n IntInput(\n name=\"response_processing_size_threshold\",\n display_name=\"Response Processing Size Threshold\",\n value=100,\n info=\"Tool output is post-processed only if response exceeds this character threshold.\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(name=\"response\", display_name=\"Response\", method=\"message_response\"),\n ]\n\n def configure_tool_pipeline(self) -> None:\n \"\"\"Configure the tool pipeline with wrappers based on enabled features.\"\"\"\n wrappers = []\n\n # Add post-tool processing first (innermost wrapper)\n if self.enable_post_tool_reflection:\n logger.info(\"Enabling Post-Tool Processing Wrapper!\")\n post_processor = PostToolProcessingWrapper(\n response_processing_size_threshold=self.response_processing_size_threshold\n )\n wrappers.append(post_processor)\n\n # Add pre-tool validation last (outermost wrapper)\n if self.enable_tool_validation:\n logger.info(\"Enabling Pre-Tool Validation Wrapper!\")\n pre_validator = PreToolValidationWrapper()\n wrappers.append(pre_validator)\n\n self.pipeline_manager.configure_wrappers(wrappers)\n\n def update_runnable_instance(self, agent, runnable, tools):\n \"\"\"Override to add tool specs update for validation wrappers.\"\"\"\n # Get context info (copied from parent)\n user_query = self.get_user_query()\n conversation_context = self.build_conversation_context()\n\n # Initialize pipeline (this ensures configure_tool_pipeline is called)\n self._initialize_tool_pipeline()\n\n # Update tool specs for validation wrappers BEFORE processing\n for wrapper in self.pipeline_manager.wrappers:\n if isinstance(wrapper, PreToolValidationWrapper) and tools:\n wrapper.tool_specs = wrapper.convert_langchain_tools_to_sparc_tool_specs_format(tools)\n\n # Process tools with updated specs\n processed_tools = self.pipeline_manager.process_tools(\n list(tools or []),\n agent=agent,\n user_query=user_query,\n conversation_context=conversation_context,\n )\n\n runnable.tools = processed_tools\n return runnable\n\n def __init__(self, **kwargs):\n \"\"\"Initialize ALTK agent with input normalization for Data.to_lc_message() inconsistencies.\"\"\"\n super().__init__(**kwargs)\n\n # If input_value uses Data.to_lc_message(), wrap it to provide consistent content\n if hasattr(self.input_value, \"to_lc_message\") and callable(self.input_value.to_lc_message):\n self.input_value = self._create_normalized_input_proxy(self.input_value)\n\n def _create_normalized_input_proxy(self, original_input):\n \"\"\"Create a proxy that normalizes to_lc_message() content format.\"\"\"\n\n class NormalizedInputProxy:\n def __init__(self, original):\n self._original = original\n\n def __getattr__(self, name):\n if name == \"to_lc_message\":\n return self._normalized_to_lc_message\n return getattr(self._original, name)\n\n def _normalized_to_lc_message(self):\n \"\"\"Return a message with normalized string content.\"\"\"\n original_msg = self._original.to_lc_message()\n\n # If content is in list format, normalize it to string\n if hasattr(original_msg, \"content\") and isinstance(original_msg.content, list):\n from langchain_core.messages import AIMessage, HumanMessage\n\n from lfx.base.agents.altk_base_agent import (\n normalize_message_content,\n )\n\n normalized_content = normalize_message_content(original_msg)\n\n # Create new message with string content\n if isinstance(original_msg, HumanMessage):\n return HumanMessage(content=normalized_content)\n return AIMessage(content=normalized_content)\n\n # Return original if already string format\n return original_msg\n\n def __str__(self):\n return str(self._original)\n\n def __repr__(self):\n return f\"NormalizedInputProxy({self._original!r})\"\n\n return NormalizedInputProxy(original_input)\n"},"context_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Context ID","dynamic":false,"info":"The context ID of the chat. Adds an extra layer to the local memory.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"context_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"enable_post_tool_reflection":{"_input_type":"BoolInput","advanced":false,"display_name":"Post Tool JSON Processing","dynamic":false,"info":"Processes tool output through JSON analysis.","list":false,"list_add_label":"Add More","name":"enable_post_tool_reflection","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"enable_tool_validation":{"_input_type":"BoolInput","advanced":false,"display_name":"Tool Validation","dynamic":false,"info":"Validates tool calls using SPARC before execution.","list":false,"list_add_label":"Add More","name":"enable_tool_validation","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"format_instructions":{"_input_type":"MultilineInput","advanced":true,"copy_field":false,"display_name":"Output Format Instructions","dynamic":false,"info":"Generic Template for structured output formatting. Valid only with Structured response.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"format_instructions","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"You are an AI that extracts structured JSON objects from unstructured text. Use a predefined schema with expected types (str, int, float, bool, dict). Extract ALL relevant instances that match the schema - if multiple patterns exist, capture them all. Fill missing or ambiguous values with defaults: null for missing values. Remove exact duplicates but keep variations that have different field values. Always return valid JSON in the expected format, never throw errors. If multiple objects can be extracted, return them all in the structured format."},"handle_parsing_errors":{"_input_type":"BoolInput","advanced":true,"display_name":"Handle Parse Errors","dynamic":false,"info":"Should the Agent fix errors when reading user input for better processing?","list":false,"list_add_label":"Add More","name":"handle_parsing_errors","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"input_value":{"_input_type":"MessageInput","advanced":false,"display_name":"Input","dynamic":false,"info":"The input provided by the user for the agent to process.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"max_iterations":{"_input_type":"IntInput","advanced":true,"display_name":"Max Iterations","dynamic":false,"info":"The maximum number of attempts the agent can make to complete its task before it stops.","list":false,"list_add_label":"Add More","name":"max_iterations","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":15},"max_output_tokens":{"_input_type":"IntInput","advanced":false,"display_name":"Max Output Tokens","dynamic":false,"info":"The maximum number of tokens to generate.","list":false,"list_add_label":"Add More","name":"max_output_tokens","placeholder":"","required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"max_retries":{"_input_type":"IntInput","advanced":true,"display_name":"Max Retries","dynamic":false,"info":"The maximum number of retries to make when generating.","list":false,"list_add_label":"Add More","name":"max_retries","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":5},"max_tokens":{"_input_type":"IntInput","advanced":true,"display_name":"Max Tokens","dynamic":false,"info":"The maximum number of tokens to generate. Set to 0 for unlimited tokens.","list":false,"list_add_label":"Add More","name":"max_tokens","placeholder":"","range_spec":{"max":128000.0,"min":0.0,"step":0.1,"step_type":"float"},"required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"model_kwargs":{"_input_type":"DictInput","advanced":true,"display_name":"Model Kwargs","dynamic":false,"info":"Additional keyword arguments to pass to the model.","list":false,"list_add_label":"Add More","name":"model_kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"model_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{},"display_name":"Model Name","dynamic":false,"external_options":{},"info":"To see the model names, first choose a provider. Then, enter your API key and click the refresh button next to the model name.","name":"model_name","options":["gpt-4o-mini","gpt-4o","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","gpt-4-turbo","gpt-4-turbo-preview","gpt-4","gpt-3.5-turbo","gpt-5.1","gpt-5","gpt-5-mini","gpt-5-nano","gpt-5-chat-latest","o1","o3-mini","o3","o3-pro","o4-mini","o4-mini-high"],"options_metadata":[],"placeholder":"","real_time_refresh":false,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"gpt-4o-mini"},"n_messages":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Chat History Messages","dynamic":false,"info":"Number of chat history messages to retrieve.","list":false,"list_add_label":"Add More","name":"n_messages","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":100},"openai_api_base":{"_input_type":"StrInput","advanced":true,"display_name":"OpenAI API Base","dynamic":false,"info":"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"openai_api_base","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"output_schema":{"_input_type":"TableInput","advanced":true,"display_name":"Output Schema","dynamic":false,"info":"Schema Validation: Define the structure and data types for structured output. No validation if no output schema.","is_list":true,"list_add_label":"Add More","name":"output_schema","placeholder":"","required":false,"show":true,"table_icon":"Table","table_schema":[{"default":"field","description":"Specify the name of the output field.","display_name":"Name","edit_mode":"inline","name":"name","type":"str"},{"default":"description of field","description":"Describe the purpose of the output field.","display_name":"Description","edit_mode":"popover","name":"description","type":"str"},{"default":"str","description":"Indicate the data type of the output field (e.g., str, int, float, bool, dict).","display_name":"Type","edit_mode":"inline","name":"type","options":["str","int","float","bool","dict"],"type":"str"},{"default":"False","description":"Set to True if this output field should be a list of the specified type.","display_name":"As List","edit_mode":"inline","name":"multiple","type":"boolean"}],"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"trigger_icon":"Table","trigger_text":"Open table","type":"table","value":[]},"project_id":{"_input_type":"StrInput","advanced":false,"display_name":"Project ID","dynamic":false,"info":"The project ID of the model.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"project_id","placeholder":"","required":true,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"response_processing_size_threshold":{"_input_type":"IntInput","advanced":true,"display_name":"Response Processing Size Threshold","dynamic":false,"info":"Tool output is post-processed only if response exceeds this character threshold.","list":false,"list_add_label":"Add More","name":"response_processing_size_threshold","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":100},"seed":{"_input_type":"IntInput","advanced":true,"display_name":"Seed","dynamic":false,"info":"The seed controls the reproducibility of the job.","list":false,"list_add_label":"Add More","name":"seed","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":1},"system_prompt":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Agent Instructions","dynamic":false,"info":"System Prompt: Initial instructions and context provided to guide the agent's behavior.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"system_prompt","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"You are a helpful assistant that can use tools to answer questions and perform tasks."},"temperature":{"_input_type":"SliderInput","advanced":true,"display_name":"Temperature","dynamic":false,"info":"","max_label":"","max_label_icon":"","min_label":"","min_label_icon":"","name":"temperature","placeholder":"","range_spec":{"max":1.0,"min":0.0,"step":0.01,"step_type":"float"},"required":false,"show":true,"slider_buttons":false,"slider_buttons_options":[],"slider_input":false,"title_case":false,"tool_mode":false,"track_in_telemetry":false,"type":"slider","value":0.1},"timeout":{"_input_type":"IntInput","advanced":true,"display_name":"Timeout","dynamic":false,"info":"The timeout for requests to OpenAI completion API.","list":false,"list_add_label":"Add More","name":"timeout","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":700},"tools":{"_input_type":"HandleInput","advanced":false,"display_name":"Tools","dynamic":false,"info":"These are the tools that the agent can use to help with tasks.","input_types":["Tool"],"list":true,"list_add_label":"Add More","name":"tools","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"verbose":{"_input_type":"BoolInput","advanced":true,"display_name":"Verbose","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"verbose","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true}},"tool_mode":false}}],["amazon",{"AmazonBedrockConverseModel":{"base_classes":["LanguageModel","Message"],"beta":true,"conditional_paths":[],"custom_fields":{},"description":"Generate text using Amazon Bedrock LLMs with the modern Converse API for improved conversation handling.","display_name":"Amazon Bedrock Converse","documentation":"","edited":false,"field_order":["input_value","system_message","stream","model_id","aws_access_key_id","aws_secret_access_key","aws_session_token","credentials_profile_name","region_name","endpoint_url","temperature","max_tokens","top_p","top_k","disable_streaming","additional_model_fields"],"frozen":false,"icon":"Amazon","legacy":false,"metadata":{"code_hash":"54c335f8699f","dependencies":{"dependencies":[{"name":"langflow","version":null},{"name":"lfx","version":null},{"name":"langchain_aws","version":"0.2.33"}],"total_dependencies":3},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.amazon.amazon_bedrock_converse.AmazonBedrockConverseComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Model Response","group_outputs":false,"method":"text_response","name":"text_output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Language Model","group_outputs":false,"method":"build_model","name":"model_output","selected":"LanguageModel","tool_mode":true,"types":["LanguageModel"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","additional_model_fields":{"_input_type":"DictInput","advanced":true,"display_name":"Additional Model Fields","dynamic":false,"info":"Additional model-specific parameters for fine-tuning behavior.","list":true,"list_add_label":"Add More","name":"additional_model_fields","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"aws_access_key_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AWS Access Key ID","dynamic":false,"info":"The access key for your AWS account. Usually set in Python code as the environment variable 'AWS_ACCESS_KEY_ID'.","input_types":[],"load_from_db":true,"name":"aws_access_key_id","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"AWS_ACCESS_KEY_ID"},"aws_secret_access_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AWS Secret Access Key","dynamic":false,"info":"The secret key for your AWS account. Usually set in Python code as the environment variable 'AWS_SECRET_ACCESS_KEY'.","input_types":[],"load_from_db":true,"name":"aws_secret_access_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"AWS_SECRET_ACCESS_KEY"},"aws_session_token":{"_input_type":"SecretStrInput","advanced":true,"display_name":"AWS Session Token","dynamic":false,"info":"The session key for your AWS account. Only needed for temporary credentials. Usually set in Python code as the environment variable 'AWS_SESSION_TOKEN'.","input_types":[],"load_from_db":false,"name":"aws_session_token","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from langflow.field_typing import LanguageModel\nfrom langflow.inputs.inputs import BoolInput, FloatInput, IntInput, MessageTextInput, SecretStrInput\nfrom langflow.io import DictInput, DropdownInput\n\nfrom lfx.base.models.aws_constants import AWS_REGIONS, AWS_MODEL_IDs\nfrom lfx.base.models.model import LCModelComponent\n\n\nclass AmazonBedrockConverseComponent(LCModelComponent):\n display_name: str = \"Amazon Bedrock Converse\"\n description: str = (\n \"Generate text using Amazon Bedrock LLMs with the modern Converse API for improved conversation handling.\"\n )\n icon = \"Amazon\"\n name = \"AmazonBedrockConverseModel\"\n beta = True\n\n inputs = [\n *LCModelComponent.get_base_inputs(),\n DropdownInput(\n name=\"model_id\",\n display_name=\"Model ID\",\n options=AWS_MODEL_IDs,\n value=\"anthropic.claude-3-5-sonnet-20241022-v2:0\",\n info=\"List of available model IDs to choose from.\",\n ),\n SecretStrInput(\n name=\"aws_access_key_id\",\n display_name=\"AWS Access Key ID\",\n info=\"The access key for your AWS account. \"\n \"Usually set in Python code as the environment variable 'AWS_ACCESS_KEY_ID'.\",\n value=\"AWS_ACCESS_KEY_ID\",\n required=True,\n ),\n SecretStrInput(\n name=\"aws_secret_access_key\",\n display_name=\"AWS Secret Access Key\",\n info=\"The secret key for your AWS account. \"\n \"Usually set in Python code as the environment variable 'AWS_SECRET_ACCESS_KEY'.\",\n value=\"AWS_SECRET_ACCESS_KEY\",\n required=True,\n ),\n SecretStrInput(\n name=\"aws_session_token\",\n display_name=\"AWS Session Token\",\n advanced=True,\n info=\"The session key for your AWS account. \"\n \"Only needed for temporary credentials. \"\n \"Usually set in Python code as the environment variable 'AWS_SESSION_TOKEN'.\",\n load_from_db=False,\n ),\n SecretStrInput(\n name=\"credentials_profile_name\",\n display_name=\"Credentials Profile Name\",\n advanced=True,\n info=\"The name of the profile to use from your \"\n \"~/.aws/credentials file. \"\n \"If not provided, the default profile will be used.\",\n load_from_db=False,\n ),\n DropdownInput(\n name=\"region_name\",\n display_name=\"Region Name\",\n value=\"us-east-1\",\n options=AWS_REGIONS,\n info=\"The AWS region where your Bedrock resources are located.\",\n ),\n MessageTextInput(\n name=\"endpoint_url\",\n display_name=\"Endpoint URL\",\n advanced=True,\n info=\"The URL of the Bedrock endpoint to use.\",\n ),\n # Model-specific parameters for fine control\n FloatInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.7,\n info=\"Controls randomness in output. Higher values make output more random.\",\n advanced=True,\n ),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n value=4096,\n info=\"Maximum number of tokens to generate.\",\n advanced=True,\n ),\n FloatInput(\n name=\"top_p\",\n display_name=\"Top P\",\n value=0.9,\n info=\"Nucleus sampling parameter. Controls diversity of output.\",\n advanced=True,\n ),\n IntInput(\n name=\"top_k\",\n display_name=\"Top K\",\n value=250,\n info=\"Limits the number of highest probability vocabulary tokens to consider. \"\n \"Note: Not all models support top_k. Use 'Additional Model Fields' for manual configuration if needed.\",\n advanced=True,\n ),\n BoolInput(\n name=\"disable_streaming\",\n display_name=\"Disable Streaming\",\n value=False,\n info=\"If True, disables streaming responses. Useful for batch processing.\",\n advanced=True,\n ),\n DictInput(\n name=\"additional_model_fields\",\n display_name=\"Additional Model Fields\",\n advanced=True,\n is_list=True,\n info=\"Additional model-specific parameters for fine-tuning behavior.\",\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n try:\n from langchain_aws.chat_models.bedrock_converse import ChatBedrockConverse\n except ImportError as e:\n msg = \"langchain_aws is not installed. Please install it with `pip install langchain_aws`.\"\n raise ImportError(msg) from e\n\n # Prepare initialization parameters\n init_params = {\n \"model\": self.model_id,\n \"region_name\": self.region_name,\n }\n\n # Add AWS credentials if provided\n if self.aws_access_key_id:\n init_params[\"aws_access_key_id\"] = self.aws_access_key_id\n if self.aws_secret_access_key:\n init_params[\"aws_secret_access_key\"] = self.aws_secret_access_key\n if self.aws_session_token:\n init_params[\"aws_session_token\"] = self.aws_session_token\n if self.credentials_profile_name:\n init_params[\"credentials_profile_name\"] = self.credentials_profile_name\n if self.endpoint_url:\n init_params[\"endpoint_url\"] = self.endpoint_url\n\n # Add model parameters directly as supported by ChatBedrockConverse\n if hasattr(self, \"temperature\") and self.temperature is not None:\n init_params[\"temperature\"] = self.temperature\n if hasattr(self, \"max_tokens\") and self.max_tokens is not None:\n init_params[\"max_tokens\"] = self.max_tokens\n if hasattr(self, \"top_p\") and self.top_p is not None:\n init_params[\"top_p\"] = self.top_p\n\n # Handle streaming - only disable if explicitly requested\n if hasattr(self, \"disable_streaming\") and self.disable_streaming:\n init_params[\"disable_streaming\"] = True\n\n # Handle additional model request fields carefully\n # Based on the error, inferenceConfig should not be passed as additional fields for some models\n additional_model_request_fields = {}\n\n # Only add top_k if user explicitly provided additional fields or if needed for specific models\n if hasattr(self, \"additional_model_fields\") and self.additional_model_fields:\n for field in self.additional_model_fields:\n if isinstance(field, dict):\n additional_model_request_fields.update(field)\n\n # For now, don't automatically add inferenceConfig for top_k to avoid validation errors\n # Users can manually add it via additional_model_fields if their model supports it\n\n # Only add if we have actual additional fields\n if additional_model_request_fields:\n init_params[\"additional_model_request_fields\"] = additional_model_request_fields\n\n try:\n output = ChatBedrockConverse(**init_params)\n except Exception as e:\n # Provide helpful error message with fallback suggestions\n error_details = str(e)\n if \"validation error\" in error_details.lower():\n msg = (\n f\"ChatBedrockConverse validation error: {error_details}. \"\n f\"This may be due to incompatible parameters for model '{self.model_id}'. \"\n f\"Consider adjusting the model parameters or trying the legacy Amazon Bedrock component.\"\n )\n elif \"converse api\" in error_details.lower():\n msg = (\n f\"Converse API error: {error_details}. \"\n f\"The model '{self.model_id}' may not support the Converse API. \"\n f\"Try using the legacy Amazon Bedrock component instead.\"\n )\n else:\n msg = f\"Could not initialize ChatBedrockConverse: {error_details}\"\n raise ValueError(msg) from e\n\n return output\n"},"credentials_profile_name":{"_input_type":"SecretStrInput","advanced":true,"display_name":"Credentials Profile Name","dynamic":false,"info":"The name of the profile to use from your ~/.aws/credentials file. If not provided, the default profile will be used.","input_types":[],"load_from_db":false,"name":"credentials_profile_name","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"disable_streaming":{"_input_type":"BoolInput","advanced":true,"display_name":"Disable Streaming","dynamic":false,"info":"If True, disables streaming responses. Useful for batch processing.","list":false,"list_add_label":"Add More","name":"disable_streaming","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"endpoint_url":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Endpoint URL","dynamic":false,"info":"The URL of the Bedrock endpoint to use.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"endpoint_url","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"input_value":{"_input_type":"MessageInput","advanced":false,"display_name":"Input","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"max_tokens":{"_input_type":"IntInput","advanced":true,"display_name":"Max Tokens","dynamic":false,"info":"Maximum number of tokens to generate.","list":false,"list_add_label":"Add More","name":"max_tokens","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":4096},"model_id":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model ID","dynamic":false,"external_options":{},"info":"List of available model IDs to choose from.","name":"model_id","options":["amazon.titan-text-express-v1","amazon.titan-text-lite-v1","amazon.titan-text-premier-v1:0","anthropic.claude-v2","anthropic.claude-v2:1","anthropic.claude-3-sonnet-20240229-v1:0","anthropic.claude-3-5-sonnet-20240620-v1:0","anthropic.claude-3-5-sonnet-20241022-v2:0","anthropic.claude-3-haiku-20240307-v1:0","anthropic.claude-3-5-haiku-20241022-v1:0","anthropic.claude-3-opus-20240229-v1:0","anthropic.claude-instant-v1","ai21.jamba-instruct-v1:0","ai21.j2-mid-v1","ai21.j2-ultra-v1","ai21.jamba-1-5-large-v1:0","ai21.jamba-1-5-mini-v1:0","cohere.command-text-v14","cohere.command-light-text-v14","cohere.command-r-v1:0","cohere.command-r-plus-v1:0","meta.llama2-13b-chat-v1","meta.llama2-70b-chat-v1","meta.llama3-8b-instruct-v1:0","meta.llama3-70b-instruct-v1:0","meta.llama3-1-8b-instruct-v1:0","meta.llama3-1-70b-instruct-v1:0","meta.llama3-1-405b-instruct-v1:0","meta.llama3-2-1b-instruct-v1:0","meta.llama3-2-3b-instruct-v1:0","meta.llama3-2-11b-instruct-v1:0","meta.llama3-2-90b-instruct-v1:0","mistral.mistral-7b-instruct-v0:2","mistral.mixtral-8x7b-instruct-v0:1","mistral.mistral-large-2402-v1:0","mistral.mistral-large-2407-v1:0","mistral.mistral-small-2402-v1:0"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"anthropic.claude-3-5-sonnet-20241022-v2:0"},"region_name":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Region Name","dynamic":false,"external_options":{},"info":"The AWS region where your Bedrock resources are located.","name":"region_name","options":["us-west-2","us-west-1","us-gov-west-1","us-gov-east-1","us-east-2","us-east-1","sa-east-1","me-south-1","me-central-1","il-central-1","eu-west-3","eu-west-2","eu-west-1","eu-south-2","eu-south-1","eu-north-1","eu-central-2","eu-central-1","cn-northwest-1","cn-north-1","ca-west-1","ca-central-1","ap-southeast-5","ap-southeast-4","ap-southeast-3","ap-southeast-2","ap-southeast-1","ap-south-2","ap-south-1","ap-northeast-3","ap-northeast-2","ap-northeast-1","ap-east-1","af-south-1"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"us-east-1"},"stream":{"_input_type":"BoolInput","advanced":true,"display_name":"Stream","dynamic":false,"info":"Stream the response from the model. Streaming works only in Chat.","list":false,"list_add_label":"Add More","name":"stream","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"system_message":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"System Message","dynamic":false,"info":"System message to pass to the model.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"system_message","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"temperature":{"_input_type":"FloatInput","advanced":true,"display_name":"Temperature","dynamic":false,"info":"Controls randomness in output. Higher values make output more random.","list":false,"list_add_label":"Add More","name":"temperature","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":0.7},"top_k":{"_input_type":"IntInput","advanced":true,"display_name":"Top K","dynamic":false,"info":"Limits the number of highest probability vocabulary tokens to consider. Note: Not all models support top_k. Use 'Additional Model Fields' for manual configuration if needed.","list":false,"list_add_label":"Add More","name":"top_k","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":250},"top_p":{"_input_type":"FloatInput","advanced":true,"display_name":"Top P","dynamic":false,"info":"Nucleus sampling parameter. Controls diversity of output.","list":false,"list_add_label":"Add More","name":"top_p","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":0.9}},"tool_mode":false},"AmazonBedrockEmbeddings":{"base_classes":["Embeddings"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate embeddings using Amazon Bedrock models.","display_name":"Amazon Bedrock Embeddings","documentation":"","edited":false,"field_order":["model_id","aws_access_key_id","aws_secret_access_key","aws_session_token","credentials_profile_name","region_name","endpoint_url"],"frozen":false,"icon":"Amazon","legacy":false,"metadata":{"code_hash":"70d039ff79f0","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"langchain_aws","version":"0.2.33"},{"name":"boto3","version":"1.40.59"}],"total_dependencies":3},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.amazon.amazon_bedrock_embedding.AmazonBedrockEmbeddingsComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Embeddings","group_outputs":false,"method":"build_embeddings","name":"embeddings","selected":"Embeddings","tool_mode":true,"types":["Embeddings"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","aws_access_key_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AWS Access Key ID","dynamic":false,"info":"The access key for your AWS account.Usually set in Python code as the environment variable 'AWS_ACCESS_KEY_ID'.","input_types":[],"load_from_db":true,"name":"aws_access_key_id","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"AWS_ACCESS_KEY_ID"},"aws_secret_access_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AWS Secret Access Key","dynamic":false,"info":"The secret key for your AWS account. Usually set in Python code as the environment variable 'AWS_SECRET_ACCESS_KEY'.","input_types":[],"load_from_db":true,"name":"aws_secret_access_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"AWS_SECRET_ACCESS_KEY"},"aws_session_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AWS Session Token","dynamic":false,"info":"The session key for your AWS account. Only needed for temporary credentials. Usually set in Python code as the environment variable 'AWS_SESSION_TOKEN'.","input_types":[],"load_from_db":true,"name":"aws_session_token","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"AWS_SESSION_TOKEN"},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.models.aws_constants import AWS_EMBEDDING_MODEL_IDS, AWS_REGIONS\nfrom lfx.base.models.model import LCModelComponent\nfrom lfx.field_typing import Embeddings\nfrom lfx.inputs.inputs import SecretStrInput\nfrom lfx.io import DropdownInput, MessageTextInput, Output\n\n\nclass AmazonBedrockEmbeddingsComponent(LCModelComponent):\n display_name: str = \"Amazon Bedrock Embeddings\"\n description: str = \"Generate embeddings using Amazon Bedrock models.\"\n icon = \"Amazon\"\n name = \"AmazonBedrockEmbeddings\"\n\n inputs = [\n DropdownInput(\n name=\"model_id\",\n display_name=\"Model Id\",\n options=AWS_EMBEDDING_MODEL_IDS,\n value=\"amazon.titan-embed-text-v1\",\n ),\n SecretStrInput(\n name=\"aws_access_key_id\",\n display_name=\"AWS Access Key ID\",\n info=\"The access key for your AWS account.\"\n \"Usually set in Python code as the environment variable 'AWS_ACCESS_KEY_ID'.\",\n value=\"AWS_ACCESS_KEY_ID\",\n required=True,\n ),\n SecretStrInput(\n name=\"aws_secret_access_key\",\n display_name=\"AWS Secret Access Key\",\n info=\"The secret key for your AWS account. \"\n \"Usually set in Python code as the environment variable 'AWS_SECRET_ACCESS_KEY'.\",\n value=\"AWS_SECRET_ACCESS_KEY\",\n required=True,\n ),\n SecretStrInput(\n name=\"aws_session_token\",\n display_name=\"AWS Session Token\",\n advanced=False,\n info=\"The session key for your AWS account. \"\n \"Only needed for temporary credentials. \"\n \"Usually set in Python code as the environment variable 'AWS_SESSION_TOKEN'.\",\n value=\"AWS_SESSION_TOKEN\",\n ),\n SecretStrInput(\n name=\"credentials_profile_name\",\n display_name=\"Credentials Profile Name\",\n advanced=True,\n info=\"The name of the profile to use from your \"\n \"~/.aws/credentials file. \"\n \"If not provided, the default profile will be used.\",\n value=\"AWS_CREDENTIALS_PROFILE_NAME\",\n ),\n DropdownInput(\n name=\"region_name\",\n display_name=\"Region Name\",\n value=\"us-east-1\",\n options=AWS_REGIONS,\n info=\"The AWS region where your Bedrock resources are located.\",\n ),\n MessageTextInput(\n name=\"endpoint_url\",\n display_name=\"Endpoint URL\",\n advanced=True,\n info=\"The URL of the AWS Bedrock endpoint to use.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Embeddings\", name=\"embeddings\", method=\"build_embeddings\"),\n ]\n\n def build_embeddings(self) -> Embeddings:\n try:\n from langchain_aws import BedrockEmbeddings\n except ImportError as e:\n msg = \"langchain_aws is not installed. Please install it with `pip install langchain_aws`.\"\n raise ImportError(msg) from e\n try:\n import boto3\n except ImportError as e:\n msg = \"boto3 is not installed. Please install it with `pip install boto3`.\"\n raise ImportError(msg) from e\n if self.aws_access_key_id or self.aws_secret_access_key:\n session = boto3.Session(\n aws_access_key_id=self.aws_access_key_id,\n aws_secret_access_key=self.aws_secret_access_key,\n aws_session_token=self.aws_session_token,\n )\n elif self.credentials_profile_name:\n session = boto3.Session(profile_name=self.credentials_profile_name)\n else:\n session = boto3.Session()\n\n client_params = {}\n if self.endpoint_url:\n client_params[\"endpoint_url\"] = self.endpoint_url\n if self.region_name:\n client_params[\"region_name\"] = self.region_name\n\n boto3_client = session.client(\"bedrock-runtime\", **client_params)\n return BedrockEmbeddings(\n credentials_profile_name=self.credentials_profile_name,\n client=boto3_client,\n model_id=self.model_id,\n endpoint_url=self.endpoint_url,\n region_name=self.region_name,\n )\n"},"credentials_profile_name":{"_input_type":"SecretStrInput","advanced":true,"display_name":"Credentials Profile Name","dynamic":false,"info":"The name of the profile to use from your ~/.aws/credentials file. If not provided, the default profile will be used.","input_types":[],"load_from_db":true,"name":"credentials_profile_name","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"AWS_CREDENTIALS_PROFILE_NAME"},"endpoint_url":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Endpoint URL","dynamic":false,"info":"The URL of the AWS Bedrock endpoint to use.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"endpoint_url","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"model_id":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model Id","dynamic":false,"external_options":{},"info":"","name":"model_id","options":["amazon.titan-embed-text-v1","amazon.titan-embed-text-v2:0","cohere.embed-english-v3","cohere.embed-multilingual-v3"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"amazon.titan-embed-text-v1"},"region_name":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Region Name","dynamic":false,"external_options":{},"info":"The AWS region where your Bedrock resources are located.","name":"region_name","options":["us-west-2","us-west-1","us-gov-west-1","us-gov-east-1","us-east-2","us-east-1","sa-east-1","me-south-1","me-central-1","il-central-1","eu-west-3","eu-west-2","eu-west-1","eu-south-2","eu-south-1","eu-north-1","eu-central-2","eu-central-1","cn-northwest-1","cn-north-1","ca-west-1","ca-central-1","ap-southeast-5","ap-southeast-4","ap-southeast-3","ap-southeast-2","ap-southeast-1","ap-south-2","ap-south-1","ap-northeast-3","ap-northeast-2","ap-northeast-1","ap-east-1","af-south-1"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"us-east-1"}},"tool_mode":false},"AmazonBedrockModel":{"base_classes":["LanguageModel","Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate text using Amazon Bedrock LLMs with the legacy ChatBedrock API. This component is deprecated. Please use Amazon Bedrock Converse instead for better compatibility, newer features, and improved conversation handling.","display_name":"Amazon Bedrock","documentation":"","edited":false,"field_order":["input_value","system_message","stream","model_id","aws_access_key_id","aws_secret_access_key","aws_session_token","credentials_profile_name","region_name","model_kwargs","endpoint_url"],"frozen":false,"icon":"Amazon","legacy":true,"metadata":{"code_hash":"922093a831b6","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"langchain_aws","version":"0.2.33"},{"name":"boto3","version":"1.40.59"}],"total_dependencies":3},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.amazon.amazon_bedrock_model.AmazonBedrockComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Model Response","group_outputs":false,"method":"text_response","name":"text_output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Language Model","group_outputs":false,"method":"build_model","name":"model_output","selected":"LanguageModel","tool_mode":true,"types":["LanguageModel"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":[],"template":{"_type":"Component","aws_access_key_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AWS Access Key ID","dynamic":false,"info":"The access key for your AWS account.Usually set in Python code as the environment variable 'AWS_ACCESS_KEY_ID'.","input_types":[],"load_from_db":true,"name":"aws_access_key_id","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"AWS_ACCESS_KEY_ID"},"aws_secret_access_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AWS Secret Access Key","dynamic":false,"info":"The secret key for your AWS account. Usually set in Python code as the environment variable 'AWS_SECRET_ACCESS_KEY'.","input_types":[],"load_from_db":true,"name":"aws_secret_access_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"AWS_SECRET_ACCESS_KEY"},"aws_session_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AWS Session Token","dynamic":false,"info":"The session key for your AWS account. Only needed for temporary credentials. Usually set in Python code as the environment variable 'AWS_SESSION_TOKEN'.","input_types":[],"load_from_db":false,"name":"aws_session_token","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.models.aws_constants import AWS_REGIONS, AWS_MODEL_IDs\nfrom lfx.base.models.model import LCModelComponent\nfrom lfx.field_typing import LanguageModel\nfrom lfx.inputs.inputs import MessageTextInput, SecretStrInput\nfrom lfx.io import DictInput, DropdownInput\n\n\nclass AmazonBedrockComponent(LCModelComponent):\n display_name: str = \"Amazon Bedrock\"\n description: str = (\n \"Generate text using Amazon Bedrock LLMs with the legacy ChatBedrock API. \"\n \"This component is deprecated. Please use Amazon Bedrock Converse instead \"\n \"for better compatibility, newer features, and improved conversation handling.\"\n )\n icon = \"Amazon\"\n name = \"AmazonBedrockModel\"\n legacy = True\n replacement = \"amazon.AmazonBedrockConverseModel\"\n\n inputs = [\n *LCModelComponent.get_base_inputs(),\n DropdownInput(\n name=\"model_id\",\n display_name=\"Model ID\",\n options=AWS_MODEL_IDs,\n value=\"anthropic.claude-3-haiku-20240307-v1:0\",\n info=\"List of available model IDs to choose from.\",\n ),\n SecretStrInput(\n name=\"aws_access_key_id\",\n display_name=\"AWS Access Key ID\",\n info=\"The access key for your AWS account.\"\n \"Usually set in Python code as the environment variable 'AWS_ACCESS_KEY_ID'.\",\n value=\"AWS_ACCESS_KEY_ID\",\n required=True,\n ),\n SecretStrInput(\n name=\"aws_secret_access_key\",\n display_name=\"AWS Secret Access Key\",\n info=\"The secret key for your AWS account. \"\n \"Usually set in Python code as the environment variable 'AWS_SECRET_ACCESS_KEY'.\",\n value=\"AWS_SECRET_ACCESS_KEY\",\n required=True,\n ),\n SecretStrInput(\n name=\"aws_session_token\",\n display_name=\"AWS Session Token\",\n advanced=False,\n info=\"The session key for your AWS account. \"\n \"Only needed for temporary credentials. \"\n \"Usually set in Python code as the environment variable 'AWS_SESSION_TOKEN'.\",\n load_from_db=False,\n ),\n SecretStrInput(\n name=\"credentials_profile_name\",\n display_name=\"Credentials Profile Name\",\n advanced=True,\n info=\"The name of the profile to use from your \"\n \"~/.aws/credentials file. \"\n \"If not provided, the default profile will be used.\",\n load_from_db=False,\n ),\n DropdownInput(\n name=\"region_name\",\n display_name=\"Region Name\",\n value=\"us-east-1\",\n options=AWS_REGIONS,\n info=\"The AWS region where your Bedrock resources are located.\",\n ),\n DictInput(\n name=\"model_kwargs\",\n display_name=\"Model Kwargs\",\n advanced=True,\n is_list=True,\n info=\"Additional keyword arguments to pass to the model.\",\n ),\n MessageTextInput(\n name=\"endpoint_url\",\n display_name=\"Endpoint URL\",\n advanced=True,\n info=\"The URL of the Bedrock endpoint to use.\",\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n try:\n from langchain_aws import ChatBedrock\n except ImportError as e:\n msg = \"langchain_aws is not installed. Please install it with `pip install langchain_aws`.\"\n raise ImportError(msg) from e\n try:\n import boto3\n except ImportError as e:\n msg = \"boto3 is not installed. Please install it with `pip install boto3`.\"\n raise ImportError(msg) from e\n if self.aws_access_key_id or self.aws_secret_access_key:\n try:\n session = boto3.Session(\n aws_access_key_id=self.aws_access_key_id,\n aws_secret_access_key=self.aws_secret_access_key,\n aws_session_token=self.aws_session_token,\n )\n except Exception as e:\n msg = \"Could not create a boto3 session.\"\n raise ValueError(msg) from e\n elif self.credentials_profile_name:\n session = boto3.Session(profile_name=self.credentials_profile_name)\n else:\n session = boto3.Session()\n\n client_params = {}\n if self.endpoint_url:\n client_params[\"endpoint_url\"] = self.endpoint_url\n if self.region_name:\n client_params[\"region_name\"] = self.region_name\n\n boto3_client = session.client(\"bedrock-runtime\", **client_params)\n try:\n output = ChatBedrock(\n client=boto3_client,\n model_id=self.model_id,\n region_name=self.region_name,\n model_kwargs=self.model_kwargs,\n endpoint_url=self.endpoint_url,\n streaming=self.stream,\n )\n except Exception as e:\n msg = \"Could not connect to AmazonBedrock API.\"\n raise ValueError(msg) from e\n return output\n"},"credentials_profile_name":{"_input_type":"SecretStrInput","advanced":true,"display_name":"Credentials Profile Name","dynamic":false,"info":"The name of the profile to use from your ~/.aws/credentials file. If not provided, the default profile will be used.","input_types":[],"load_from_db":false,"name":"credentials_profile_name","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"endpoint_url":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Endpoint URL","dynamic":false,"info":"The URL of the Bedrock endpoint to use.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"endpoint_url","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"input_value":{"_input_type":"MessageInput","advanced":false,"display_name":"Input","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"model_id":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model ID","dynamic":false,"external_options":{},"info":"List of available model IDs to choose from.","name":"model_id","options":["amazon.titan-text-express-v1","amazon.titan-text-lite-v1","amazon.titan-text-premier-v1:0","anthropic.claude-v2","anthropic.claude-v2:1","anthropic.claude-3-sonnet-20240229-v1:0","anthropic.claude-3-5-sonnet-20240620-v1:0","anthropic.claude-3-5-sonnet-20241022-v2:0","anthropic.claude-3-haiku-20240307-v1:0","anthropic.claude-3-5-haiku-20241022-v1:0","anthropic.claude-3-opus-20240229-v1:0","anthropic.claude-instant-v1","ai21.jamba-instruct-v1:0","ai21.j2-mid-v1","ai21.j2-ultra-v1","ai21.jamba-1-5-large-v1:0","ai21.jamba-1-5-mini-v1:0","cohere.command-text-v14","cohere.command-light-text-v14","cohere.command-r-v1:0","cohere.command-r-plus-v1:0","meta.llama2-13b-chat-v1","meta.llama2-70b-chat-v1","meta.llama3-8b-instruct-v1:0","meta.llama3-70b-instruct-v1:0","meta.llama3-1-8b-instruct-v1:0","meta.llama3-1-70b-instruct-v1:0","meta.llama3-1-405b-instruct-v1:0","meta.llama3-2-1b-instruct-v1:0","meta.llama3-2-3b-instruct-v1:0","meta.llama3-2-11b-instruct-v1:0","meta.llama3-2-90b-instruct-v1:0","mistral.mistral-7b-instruct-v0:2","mistral.mixtral-8x7b-instruct-v0:1","mistral.mistral-large-2402-v1:0","mistral.mistral-large-2407-v1:0","mistral.mistral-small-2402-v1:0"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"anthropic.claude-3-haiku-20240307-v1:0"},"model_kwargs":{"_input_type":"DictInput","advanced":true,"display_name":"Model Kwargs","dynamic":false,"info":"Additional keyword arguments to pass to the model.","list":true,"list_add_label":"Add More","name":"model_kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"region_name":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Region Name","dynamic":false,"external_options":{},"info":"The AWS region where your Bedrock resources are located.","name":"region_name","options":["us-west-2","us-west-1","us-gov-west-1","us-gov-east-1","us-east-2","us-east-1","sa-east-1","me-south-1","me-central-1","il-central-1","eu-west-3","eu-west-2","eu-west-1","eu-south-2","eu-south-1","eu-north-1","eu-central-2","eu-central-1","cn-northwest-1","cn-north-1","ca-west-1","ca-central-1","ap-southeast-5","ap-southeast-4","ap-southeast-3","ap-southeast-2","ap-southeast-1","ap-south-2","ap-south-1","ap-northeast-3","ap-northeast-2","ap-northeast-1","ap-east-1","af-south-1"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"us-east-1"},"stream":{"_input_type":"BoolInput","advanced":true,"display_name":"Stream","dynamic":false,"info":"Stream the response from the model. Streaming works only in Chat.","list":false,"list_add_label":"Add More","name":"stream","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"system_message":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"System Message","dynamic":false,"info":"System message to pass to the model.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"system_message","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"s3bucketuploader":{"base_classes":["NoneType"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Uploads files to S3 bucket.","display_name":"S3 Bucket Uploader","documentation":"","edited":false,"field_order":["aws_access_key_id","aws_secret_access_key","bucket_name","strategy","data_inputs","s3_prefix","strip_path"],"frozen":false,"icon":"Amazon","legacy":false,"metadata":{"code_hash":"6e4ba2dafc3c","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"boto3","version":"1.40.59"}],"total_dependencies":2},"module":"lfx.components.amazon.s3_bucket_uploader.S3BucketUploaderComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Writes to AWS Bucket","group_outputs":false,"method":"process_files","name":"data","selected":"NoneType","tool_mode":true,"types":["NoneType"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","aws_access_key_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AWS Access Key ID","dynamic":false,"info":"AWS Access key ID.","input_types":[],"load_from_db":true,"name":"aws_access_key_id","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"aws_secret_access_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"AWS Secret Key","dynamic":false,"info":"AWS Secret Key.","input_types":[],"load_from_db":true,"name":"aws_secret_access_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"bucket_name":{"_input_type":"StrInput","advanced":false,"display_name":"Bucket Name","dynamic":false,"info":"Enter the name of the bucket.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"bucket_name","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from pathlib import Path\nfrom typing import Any\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import (\n BoolInput,\n DropdownInput,\n HandleInput,\n Output,\n SecretStrInput,\n StrInput,\n)\n\n\nclass S3BucketUploaderComponent(Component):\n \"\"\"S3BucketUploaderComponent is a component responsible for uploading files to an S3 bucket.\n\n It provides two strategies for file upload: \"By Data\" and \"By File Name\". The component\n requires AWS credentials and bucket details as inputs and processes files accordingly.\n\n Attributes:\n display_name (str): The display name of the component.\n description (str): A brief description of the components functionality.\n icon (str): The icon representing the component.\n name (str): The internal name of the component.\n inputs (list): A list of input configurations required by the component.\n outputs (list): A list of output configurations provided by the component.\n\n Methods:\n process_files() -> None:\n Processes files based on the selected strategy. Calls the appropriate method\n based on the strategy attribute.\n process_files_by_data() -> None:\n Processes and uploads files to an S3 bucket based on the data inputs. Iterates\n over the data inputs, logs the file path and text content, and uploads each file\n to the specified S3 bucket if both file path and text content are available.\n process_files_by_name() -> None:\n Processes and uploads files to an S3 bucket based on their names. Iterates through\n the list of data inputs, retrieves the file path from each data item, and uploads\n the file to the specified S3 bucket if the file path is available. Logs the file\n path being uploaded.\n _s3_client() -> Any:\n Creates and returns an S3 client using the provided AWS access key ID and secret\n access key.\n\n Please note that this component requires the boto3 library to be installed. It is designed\n to work with File and Director components as inputs\n \"\"\"\n\n display_name = \"S3 Bucket Uploader\"\n description = \"Uploads files to S3 bucket.\"\n icon = \"Amazon\"\n name = \"s3bucketuploader\"\n\n inputs = [\n SecretStrInput(\n name=\"aws_access_key_id\",\n display_name=\"AWS Access Key ID\",\n required=True,\n password=True,\n info=\"AWS Access key ID.\",\n ),\n SecretStrInput(\n name=\"aws_secret_access_key\",\n display_name=\"AWS Secret Key\",\n required=True,\n password=True,\n info=\"AWS Secret Key.\",\n ),\n StrInput(\n name=\"bucket_name\",\n display_name=\"Bucket Name\",\n info=\"Enter the name of the bucket.\",\n advanced=False,\n ),\n DropdownInput(\n name=\"strategy\",\n display_name=\"Strategy for file upload\",\n options=[\"Store Data\", \"Store Original File\"],\n value=\"By Data\",\n info=(\n \"Choose the strategy to upload the file. By Data means that the source file \"\n \"is parsed and stored as LangFlow data. By File Name means that the source \"\n \"file is uploaded as is.\"\n ),\n ),\n HandleInput(\n name=\"data_inputs\",\n display_name=\"Data Inputs\",\n info=\"The data to split.\",\n input_types=[\"Data\"],\n is_list=True,\n required=True,\n ),\n StrInput(\n name=\"s3_prefix\",\n display_name=\"S3 Prefix\",\n info=\"Prefix for all files.\",\n advanced=True,\n ),\n BoolInput(\n name=\"strip_path\",\n display_name=\"Strip Path\",\n info=\"Removes path from file path.\",\n required=True,\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Writes to AWS Bucket\", name=\"data\", method=\"process_files\"),\n ]\n\n def process_files(self) -> None:\n \"\"\"Process files based on the selected strategy.\n\n This method uses a strategy pattern to process files. The strategy is determined\n by the `self.strategy` attribute, which can be either \"By Data\" or \"By File Name\".\n Depending on the strategy, the corresponding method (`process_files_by_data` or\n `process_files_by_name`) is called. If an invalid strategy is provided, an error\n is logged.\n\n Returns:\n None\n \"\"\"\n strategy_methods = {\n \"Store Data\": self.process_files_by_data,\n \"Store Original File\": self.process_files_by_name,\n }\n strategy_methods.get(self.strategy, lambda: self.log(\"Invalid strategy\"))()\n\n def process_files_by_data(self) -> None:\n \"\"\"Processes and uploads files to an S3 bucket based on the data inputs.\n\n This method iterates over the data inputs, logs the file path and text content,\n and uploads each file to the specified S3 bucket if both file path and text content\n are available.\n\n Args:\n None\n\n Returns:\n None\n \"\"\"\n for data_item in self.data_inputs:\n file_path = data_item.data.get(\"file_path\")\n text_content = data_item.data.get(\"text\")\n\n if file_path and text_content:\n self._s3_client().put_object(\n Bucket=self.bucket_name, Key=self._normalize_path(file_path), Body=text_content\n )\n\n def process_files_by_name(self) -> None:\n \"\"\"Processes and uploads files to an S3 bucket based on their names.\n\n Iterates through the list of data inputs, retrieves the file path from each data item,\n and uploads the file to the specified S3 bucket if the file path is available.\n Logs the file path being uploaded.\n\n Returns:\n None\n \"\"\"\n for data_item in self.data_inputs:\n file_path = data_item.data.get(\"file_path\")\n self.log(f\"Uploading file: {file_path}\")\n if file_path:\n self._s3_client().upload_file(file_path, Bucket=self.bucket_name, Key=self._normalize_path(file_path))\n\n def _s3_client(self) -> Any:\n \"\"\"Creates and returns an S3 client using the provided AWS access key ID and secret access key.\n\n Returns:\n Any: A boto3 S3 client instance.\n \"\"\"\n try:\n import boto3\n except ImportError as e:\n msg = \"boto3 is not installed. Please install it using `uv pip install boto3`.\"\n raise ImportError(msg) from e\n\n return boto3.client(\n \"s3\",\n aws_access_key_id=self.aws_access_key_id,\n aws_secret_access_key=self.aws_secret_access_key,\n )\n\n def _normalize_path(self, file_path) -> str:\n \"\"\"Process the file path based on the s3_prefix and path_as_prefix.\n\n Args:\n file_path (str): The original file path.\n s3_prefix (str): The S3 prefix to use.\n path_as_prefix (bool): Whether to use the file path as the S3 prefix.\n\n Returns:\n str: The processed file path.\n \"\"\"\n prefix = self.s3_prefix\n strip_path = self.strip_path\n processed_path: str = file_path\n\n if strip_path:\n # Filename only\n processed_path = Path(file_path).name\n\n # Concatenate the s3_prefix if it exists\n if prefix:\n processed_path = str(Path(prefix) / processed_path)\n\n return processed_path\n"},"data_inputs":{"_input_type":"HandleInput","advanced":false,"display_name":"Data Inputs","dynamic":false,"info":"The data to split.","input_types":["Data"],"list":true,"list_add_label":"Add More","name":"data_inputs","placeholder":"","required":true,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"s3_prefix":{"_input_type":"StrInput","advanced":true,"display_name":"S3 Prefix","dynamic":false,"info":"Prefix for all files.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"s3_prefix","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"strategy":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Strategy for file upload","dynamic":false,"external_options":{},"info":"Choose the strategy to upload the file. By Data means that the source file is parsed and stored as LangFlow data. By File Name means that the source file is uploaded as is.","name":"strategy","options":["Store Data","Store Original File"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"By Data"},"strip_path":{"_input_type":"BoolInput","advanced":true,"display_name":"Strip Path","dynamic":false,"info":"Removes path from file path.","list":false,"list_add_label":"Add More","name":"strip_path","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false}},"tool_mode":false}}],["anthropic",{"AnthropicModel":{"base_classes":["LanguageModel","Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate text using Anthropic's Messages API and models.","display_name":"Anthropic","documentation":"","edited":false,"field_order":["input_value","system_message","stream","max_tokens","model_name","api_key","temperature","base_url","tool_model_enabled"],"frozen":false,"icon":"Anthropic","legacy":false,"metadata":{"code_hash":"7c894c5a66ba","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null},{"name":"langchain_anthropic","version":"0.3.14"},{"name":"anthropic","version":"0.71.0"}],"total_dependencies":5},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.anthropic.anthropic.AnthropicModelComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Model Response","group_outputs":false,"method":"text_response","name":"text_output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Language Model","group_outputs":false,"method":"build_model","name":"model_output","selected":"LanguageModel","tool_mode":true,"types":["LanguageModel"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Anthropic API Key","dynamic":false,"info":"Your Anthropic API key.","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str"},"base_url":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Anthropic API URL","dynamic":false,"info":"Endpoint of the Anthropic API. Defaults to 'https://api.anthropic.com' if not specified.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"https://api.anthropic.com"},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from typing import Any, cast\n\nimport requests\nfrom pydantic import ValidationError\n\nfrom lfx.base.models.anthropic_constants import (\n ANTHROPIC_MODELS,\n DEFAULT_ANTHROPIC_API_URL,\n TOOL_CALLING_SUPPORTED_ANTHROPIC_MODELS,\n TOOL_CALLING_UNSUPPORTED_ANTHROPIC_MODELS,\n)\nfrom lfx.base.models.model import LCModelComponent\nfrom lfx.field_typing import LanguageModel\nfrom lfx.field_typing.range_spec import RangeSpec\nfrom lfx.io import BoolInput, DropdownInput, IntInput, MessageTextInput, SecretStrInput, SliderInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.dotdict import dotdict\n\n\nclass AnthropicModelComponent(LCModelComponent):\n display_name = \"Anthropic\"\n description = \"Generate text using Anthropic's Messages API and models.\"\n icon = \"Anthropic\"\n name = \"AnthropicModel\"\n\n inputs = [\n *LCModelComponent.get_base_inputs(),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n value=4096,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n options=ANTHROPIC_MODELS,\n refresh_button=True,\n value=ANTHROPIC_MODELS[0],\n combobox=True,\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Anthropic API Key\",\n info=\"Your Anthropic API key.\",\n value=None,\n required=True,\n real_time_refresh=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n info=\"Run inference with this temperature. Must by in the closed interval [0.0, 1.0].\",\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n advanced=True,\n ),\n MessageTextInput(\n name=\"base_url\",\n display_name=\"Anthropic API URL\",\n info=\"Endpoint of the Anthropic API. Defaults to 'https://api.anthropic.com' if not specified.\",\n value=DEFAULT_ANTHROPIC_API_URL,\n real_time_refresh=True,\n advanced=True,\n ),\n BoolInput(\n name=\"tool_model_enabled\",\n display_name=\"Enable Tool Models\",\n info=(\n \"Select if you want to use models that can work with tools. If yes, only those models will be shown.\"\n ),\n advanced=False,\n value=False,\n real_time_refresh=True,\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n try:\n from langchain_anthropic.chat_models import ChatAnthropic\n except ImportError as e:\n msg = \"langchain_anthropic is not installed. Please install it with `pip install langchain_anthropic`.\"\n raise ImportError(msg) from e\n try:\n max_tokens_value = getattr(self, \"max_tokens\", \"\")\n max_tokens_value = 4096 if max_tokens_value == \"\" else int(max_tokens_value)\n output = ChatAnthropic(\n model=self.model_name,\n anthropic_api_key=self.api_key,\n max_tokens=max_tokens_value,\n temperature=self.temperature,\n anthropic_api_url=self.base_url or DEFAULT_ANTHROPIC_API_URL,\n streaming=self.stream,\n )\n except ValidationError:\n raise\n except Exception as e:\n msg = \"Could not connect to Anthropic API.\"\n raise ValueError(msg) from e\n\n return output\n\n def get_models(self, *, tool_model_enabled: bool | None = None) -> list[str]:\n try:\n import anthropic\n\n client = anthropic.Anthropic(api_key=self.api_key)\n models = client.models.list(limit=20).data\n model_ids = ANTHROPIC_MODELS + [model.id for model in models]\n except (ImportError, ValueError, requests.exceptions.RequestException) as e:\n logger.exception(f\"Error getting model names: {e}\")\n model_ids = ANTHROPIC_MODELS\n\n if tool_model_enabled:\n try:\n from langchain_anthropic.chat_models import ChatAnthropic\n except ImportError as e:\n msg = \"langchain_anthropic is not installed. Please install it with `pip install langchain_anthropic`.\"\n raise ImportError(msg) from e\n\n # Create a new list instead of modifying while iterating\n filtered_models = []\n for model in model_ids:\n if model in TOOL_CALLING_SUPPORTED_ANTHROPIC_MODELS:\n filtered_models.append(model)\n continue\n\n model_with_tool = ChatAnthropic(\n model=model, # Use the current model being checked\n anthropic_api_key=self.api_key,\n anthropic_api_url=cast(\"str\", self.base_url) or DEFAULT_ANTHROPIC_API_URL,\n )\n\n if (\n not self.supports_tool_calling(model_with_tool)\n or model in TOOL_CALLING_UNSUPPORTED_ANTHROPIC_MODELS\n ):\n continue\n\n filtered_models.append(model)\n\n return filtered_models\n\n return model_ids\n\n def _get_exception_message(self, exception: Exception) -> str | None:\n \"\"\"Get a message from an Anthropic exception.\n\n Args:\n exception (Exception): The exception to get the message from.\n\n Returns:\n str: The message from the exception.\n \"\"\"\n try:\n from anthropic import BadRequestError\n except ImportError:\n return None\n if isinstance(exception, BadRequestError):\n message = exception.body.get(\"error\", {}).get(\"message\")\n if message:\n return message\n return None\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):\n if \"base_url\" in build_config and build_config[\"base_url\"][\"value\"] is None:\n build_config[\"base_url\"][\"value\"] = DEFAULT_ANTHROPIC_API_URL\n self.base_url = DEFAULT_ANTHROPIC_API_URL\n if field_name in {\"base_url\", \"model_name\", \"tool_model_enabled\", \"api_key\"} and field_value:\n try:\n if len(self.api_key) == 0:\n ids = ANTHROPIC_MODELS\n else:\n try:\n ids = self.get_models(tool_model_enabled=self.tool_model_enabled)\n except (ImportError, ValueError, requests.exceptions.RequestException) as e:\n logger.exception(f\"Error getting model names: {e}\")\n ids = ANTHROPIC_MODELS\n build_config.setdefault(\"model_name\", {})\n build_config[\"model_name\"][\"options\"] = ids\n build_config[\"model_name\"].setdefault(\"value\", ids[0])\n build_config[\"model_name\"][\"combobox\"] = True\n except Exception as e:\n msg = f\"Error getting model names: {e}\"\n raise ValueError(msg) from e\n return build_config\n"},"input_value":{"_input_type":"MessageInput","advanced":false,"display_name":"Input","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"max_tokens":{"_input_type":"IntInput","advanced":true,"display_name":"Max Tokens","dynamic":false,"info":"The maximum number of tokens to generate. Set to 0 for unlimited tokens.","list":false,"list_add_label":"Add More","name":"max_tokens","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":4096},"model_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{},"display_name":"Model Name","dynamic":false,"external_options":{},"info":"","name":"model_name","options":["claude-sonnet-4-5-20250929","claude-opus-4-1-20250805","claude-opus-4-20250514","claude-sonnet-4-20250514","claude-3-7-sonnet-latest","claude-3-5-sonnet-latest","claude-3-5-haiku-latest","claude-3-opus-latest"],"options_metadata":[],"placeholder":"","refresh_button":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"claude-sonnet-4-5-20250929"},"stream":{"_input_type":"BoolInput","advanced":true,"display_name":"Stream","dynamic":false,"info":"Stream the response from the model. Streaming works only in Chat.","list":false,"list_add_label":"Add More","name":"stream","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"system_message":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"System Message","dynamic":false,"info":"System message to pass to the model.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"system_message","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"temperature":{"_input_type":"SliderInput","advanced":true,"display_name":"Temperature","dynamic":false,"info":"Run inference with this temperature. Must by in the closed interval [0.0, 1.0].","max_label":"","max_label_icon":"","min_label":"","min_label_icon":"","name":"temperature","placeholder":"","range_spec":{"max":1.0,"min":0.0,"step":0.01,"step_type":"float"},"required":false,"show":true,"slider_buttons":false,"slider_buttons_options":[],"slider_input":false,"title_case":false,"tool_mode":false,"track_in_telemetry":false,"type":"slider","value":0.1},"tool_model_enabled":{"_input_type":"BoolInput","advanced":false,"display_name":"Enable Tool Models","dynamic":false,"info":"Select if you want to use models that can work with tools. If yes, only those models will be shown.","list":false,"list_add_label":"Add More","name":"tool_model_enabled","placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false}},"tool_mode":false}}],["apify",{"ApifyActors":{"base_classes":["Data","Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Use Apify Actors to extract data from hundreds of places fast. This component can be used in a flow to retrieve data or as a tool with an agent.","display_name":"Apify Actors","documentation":"http://docs.langflow.org/integrations-apify","edited":false,"field_order":["apify_token","actor_id","run_input","dataset_fields","flatten_dataset"],"frozen":false,"icon":"Apify","legacy":false,"metadata":{"code_hash":"9fcfdb0fb080","dependencies":{"dependencies":[{"name":"apify_client","version":"1.12.2"},{"name":"langchain_community","version":"0.3.21"},{"name":"langchain_core","version":"0.3.79"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":5},"module":"lfx.components.apify.apify_actor.ApifyActorsComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Output","group_outputs":false,"method":"run_model","name":"output","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool","group_outputs":false,"method":"build_tool","name":"tool","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","actor_id":{"_input_type":"StrInput","advanced":false,"display_name":"Actor","dynamic":false,"info":"Actor name from Apify store to run. For example 'apify/website-content-crawler' to use the Website Content Crawler Actor.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"actor_id","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"apify/website-content-crawler"},"apify_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Apify Token","dynamic":false,"info":"The API token for the Apify account.","input_types":[],"load_from_db":true,"name":"apify_token","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import json\nimport string\nfrom typing import Any, cast\n\nfrom apify_client import ApifyClient\nfrom langchain_community.document_loaders.apify_dataset import ApifyDatasetLoader\nfrom langchain_core.tools import BaseTool\nfrom pydantic import BaseModel, Field, field_serializer\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.field_typing import Tool\nfrom lfx.inputs.inputs import BoolInput\nfrom lfx.io import MultilineInput, Output, SecretStrInput, StrInput\nfrom lfx.schema.data import Data\n\nMAX_DESCRIPTION_LEN = 250\n\n\nclass ApifyActorsComponent(Component):\n display_name = \"Apify Actors\"\n description = (\n \"Use Apify Actors to extract data from hundreds of places fast. \"\n \"This component can be used in a flow to retrieve data or as a tool with an agent.\"\n )\n documentation: str = \"http://docs.langflow.org/integrations-apify\"\n icon = \"Apify\"\n name = \"ApifyActors\"\n\n inputs = [\n SecretStrInput(\n name=\"apify_token\",\n display_name=\"Apify Token\",\n info=\"The API token for the Apify account.\",\n required=True,\n password=True,\n ),\n StrInput(\n name=\"actor_id\",\n display_name=\"Actor\",\n info=(\n \"Actor name from Apify store to run. For example 'apify/website-content-crawler' \"\n \"to use the Website Content Crawler Actor.\"\n ),\n value=\"apify/website-content-crawler\",\n required=True,\n ),\n # multiline input is more pleasant to use than the nested dict input\n MultilineInput(\n name=\"run_input\",\n display_name=\"Run input\",\n info=(\n 'The JSON input for the Actor run. For example for the \"apify/website-content-crawler\" Actor: '\n '{\"startUrls\":[{\"url\":\"https://docs.apify.com/academy/web-scraping-for-beginners\"}],\"maxCrawlDepth\":0}'\n ),\n value='{\"startUrls\":[{\"url\":\"https://docs.apify.com/academy/web-scraping-for-beginners\"}],\"maxCrawlDepth\":0}',\n required=True,\n ),\n MultilineInput(\n name=\"dataset_fields\",\n display_name=\"Output fields\",\n info=(\n \"Fields to extract from the dataset, split by commas. \"\n \"Other fields will be ignored. Dots in nested structures will be replaced by underscores. \"\n \"Sample input: 'text, metadata.title'. \"\n \"Sample output: {'text': 'page content here', 'metadata_title': 'page title here'}. \"\n \"For example, for the 'apify/website-content-crawler' Actor, you can extract the 'markdown' field, \"\n \"which is the content of the website in markdown format.\"\n ),\n ),\n BoolInput(\n name=\"flatten_dataset\",\n display_name=\"Flatten output\",\n info=(\n \"The output dataset will be converted from a nested format to a flat structure. \"\n \"Dots in nested structure will be replaced by underscores. \"\n \"This is useful for further processing of the Data object. \"\n \"For example, {'a': {'b': 1}} will be flattened to {'a_b': 1}.\"\n ),\n ),\n ]\n\n outputs = [\n Output(display_name=\"Output\", name=\"output\", type_=list[Data], method=\"run_model\"),\n Output(display_name=\"Tool\", name=\"tool\", type_=Tool, method=\"build_tool\"),\n ]\n\n def __init__(self, *args, **kwargs) -> None:\n super().__init__(*args, **kwargs)\n self._apify_client: ApifyClient | None = None\n\n def run_model(self) -> list[Data]:\n \"\"\"Run the Actor and return node output.\"\"\"\n input_ = json.loads(self.run_input)\n fields = ApifyActorsComponent.parse_dataset_fields(self.dataset_fields) if self.dataset_fields else None\n res = self.run_actor(self.actor_id, input_, fields=fields)\n if self.flatten_dataset:\n res = [ApifyActorsComponent.flatten(item) for item in res]\n data = [Data(data=item) for item in res]\n\n self.status = data\n return data\n\n def build_tool(self) -> Tool:\n \"\"\"Build a tool for an agent that runs the Apify Actor.\"\"\"\n actor_id = self.actor_id\n\n build = self._get_actor_latest_build(actor_id)\n readme = build.get(\"readme\", \"\")[:250] + \"...\"\n if not (input_schema_str := build.get(\"inputSchema\")):\n msg = \"Input schema not found\"\n raise ValueError(msg)\n input_schema = json.loads(input_schema_str)\n properties, required = ApifyActorsComponent.get_actor_input_schema_from_build(input_schema)\n properties = {\"run_input\": properties}\n\n # works from input schema\n info_ = [\n (\n \"JSON encoded as a string with input schema (STRICTLY FOLLOW JSON FORMAT AND SCHEMA):\\n\\n\"\n f\"{json.dumps(properties, separators=(',', ':'))}\"\n )\n ]\n if required:\n info_.append(\"\\n\\nRequired fields:\\n\" + \"\\n\".join(required))\n\n info = \"\".join(info_)\n\n input_model_cls = ApifyActorsComponent.create_input_model_class(info)\n tool_cls = ApifyActorsComponent.create_tool_class(self, readme, input_model_cls, actor_id)\n\n return cast(\"Tool\", tool_cls())\n\n @staticmethod\n def create_tool_class(\n parent: \"ApifyActorsComponent\", readme: str, input_model: type[BaseModel], actor_id: str\n ) -> type[BaseTool]:\n \"\"\"Create a tool class that runs an Apify Actor.\"\"\"\n\n class ApifyActorRun(BaseTool):\n \"\"\"Tool that runs Apify Actors.\"\"\"\n\n name: str = f\"apify_actor_{ApifyActorsComponent.actor_id_to_tool_name(actor_id)}\"\n description: str = (\n \"Run an Apify Actor with the given input. \"\n \"Here is a part of the currently loaded Actor README:\\n\\n\"\n f\"{readme}\\n\\n\"\n )\n\n args_schema: type[BaseModel] = input_model\n\n @field_serializer(\"args_schema\")\n def serialize_args_schema(self, args_schema):\n return args_schema.schema()\n\n def _run(self, run_input: str | dict) -> str:\n \"\"\"Use the Apify Actor.\"\"\"\n input_dict = json.loads(run_input) if isinstance(run_input, str) else run_input\n\n # retrieve if nested, just in case\n input_dict = input_dict.get(\"run_input\", input_dict)\n\n res = parent.run_actor(actor_id, input_dict)\n return \"\\n\\n\".join([ApifyActorsComponent.dict_to_json_str(item) for item in res])\n\n return ApifyActorRun\n\n @staticmethod\n def create_input_model_class(description: str) -> type[BaseModel]:\n \"\"\"Create a Pydantic model class for the Actor input.\"\"\"\n\n class ActorInput(BaseModel):\n \"\"\"Input for the Apify Actor tool.\"\"\"\n\n run_input: str = Field(..., description=description)\n\n return ActorInput\n\n def _get_apify_client(self) -> ApifyClient:\n \"\"\"Get the Apify client.\n\n Is created if not exists or token changes.\n \"\"\"\n if not self.apify_token:\n msg = \"API token is required.\"\n raise ValueError(msg)\n # when token changes, create a new client\n if self._apify_client is None or self._apify_client.token != self.apify_token:\n self._apify_client = ApifyClient(self.apify_token)\n if httpx_client := self._apify_client.http_client.httpx_client:\n httpx_client.headers[\"user-agent\"] += \"; Origin/langflow\"\n return self._apify_client\n\n def _get_actor_latest_build(self, actor_id: str) -> dict:\n \"\"\"Get the latest build of an Actor from the default build tag.\"\"\"\n client = self._get_apify_client()\n actor = client.actor(actor_id=actor_id)\n if not (actor_info := actor.get()):\n msg = f\"Actor {actor_id} not found.\"\n raise ValueError(msg)\n\n default_build_tag = actor_info.get(\"defaultRunOptions\", {}).get(\"build\")\n latest_build_id = actor_info.get(\"taggedBuilds\", {}).get(default_build_tag, {}).get(\"buildId\")\n\n if (build := client.build(latest_build_id).get()) is None:\n msg = f\"Build {latest_build_id} not found.\"\n raise ValueError(msg)\n\n return build\n\n @staticmethod\n def get_actor_input_schema_from_build(input_schema: dict) -> tuple[dict, list[str]]:\n \"\"\"Get the input schema from the Actor build.\n\n Trim the description to 250 characters.\n \"\"\"\n properties = input_schema.get(\"properties\", {})\n required = input_schema.get(\"required\", [])\n\n properties_out: dict = {}\n for item, meta in properties.items():\n properties_out[item] = {}\n if desc := meta.get(\"description\"):\n properties_out[item][\"description\"] = (\n desc[:MAX_DESCRIPTION_LEN] + \"...\" if len(desc) > MAX_DESCRIPTION_LEN else desc\n )\n for key_name in (\"type\", \"default\", \"prefill\", \"enum\"):\n if value := meta.get(key_name):\n properties_out[item][key_name] = value\n\n return properties_out, required\n\n def _get_run_dataset_id(self, run_id: str) -> str:\n \"\"\"Get the dataset id from the run id.\"\"\"\n client = self._get_apify_client()\n run = client.run(run_id=run_id)\n if (dataset := run.dataset().get()) is None:\n msg = \"Dataset not found\"\n raise ValueError(msg)\n if (did := dataset.get(\"id\")) is None:\n msg = \"Dataset id not found\"\n raise ValueError(msg)\n return did\n\n @staticmethod\n def dict_to_json_str(d: dict) -> str:\n \"\"\"Convert a dictionary to a JSON string.\"\"\"\n return json.dumps(d, separators=(\",\", \":\"), default=lambda _: \"\")\n\n @staticmethod\n def actor_id_to_tool_name(actor_id: str) -> str:\n \"\"\"Turn actor_id into a valid tool name.\n\n Tool name must only contain letters, numbers, underscores, dashes,\n and cannot contain spaces.\n \"\"\"\n valid_chars = string.ascii_letters + string.digits + \"_-\"\n return \"\".join(char if char in valid_chars else \"_\" for char in actor_id)\n\n def run_actor(self, actor_id: str, run_input: dict, fields: list[str] | None = None) -> list[dict]:\n \"\"\"Run an Apify Actor and return the output dataset.\n\n Args:\n actor_id: Actor name from Apify store to run.\n run_input: JSON input for the Actor.\n fields: List of fields to extract from the dataset. Other fields will be ignored.\n \"\"\"\n client = self._get_apify_client()\n if (details := client.actor(actor_id=actor_id).call(run_input=run_input, wait_secs=1)) is None:\n msg = \"Actor run details not found\"\n raise ValueError(msg)\n if (run_id := details.get(\"id\")) is None:\n msg = \"Run id not found\"\n raise ValueError(msg)\n\n if (run_client := client.run(run_id)) is None:\n msg = \"Run client not found\"\n raise ValueError(msg)\n\n # stream logs\n with run_client.log().stream() as response:\n if response:\n for line in response.iter_lines():\n self.log(line)\n run_client.wait_for_finish()\n\n dataset_id = self._get_run_dataset_id(run_id)\n\n loader = ApifyDatasetLoader(\n dataset_id=dataset_id,\n dataset_mapping_function=lambda item: item\n if not fields\n else {k.replace(\".\", \"_\"): ApifyActorsComponent.get_nested_value(item, k) for k in fields},\n )\n return loader.load()\n\n @staticmethod\n def get_nested_value(data: dict[str, Any], key: str) -> Any:\n \"\"\"Get a nested value from a dictionary.\"\"\"\n keys = key.split(\".\")\n value = data\n for k in keys:\n if not isinstance(value, dict) or k not in value:\n return None\n value = value[k]\n return value\n\n @staticmethod\n def parse_dataset_fields(dataset_fields: str) -> list[str]:\n \"\"\"Convert a string of comma-separated fields into a list of fields.\"\"\"\n dataset_fields = dataset_fields.replace(\"'\", \"\").replace('\"', \"\").replace(\"`\", \"\")\n return [field.strip() for field in dataset_fields.split(\",\")]\n\n @staticmethod\n def flatten(d: dict) -> dict:\n \"\"\"Flatten a nested dictionary.\"\"\"\n\n def items():\n for key, value in d.items():\n if isinstance(value, dict):\n for subkey, subvalue in ApifyActorsComponent.flatten(value).items():\n yield key + \"_\" + subkey, subvalue\n else:\n yield key, value\n\n return dict(items())\n"},"dataset_fields":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Output fields","dynamic":false,"info":"Fields to extract from the dataset, split by commas. Other fields will be ignored. Dots in nested structures will be replaced by underscores. Sample input: 'text, metadata.title'. Sample output: {'text': 'page content here', 'metadata_title': 'page title here'}. For example, for the 'apify/website-content-crawler' Actor, you can extract the 'markdown' field, which is the content of the website in markdown format.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"dataset_fields","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"flatten_dataset":{"_input_type":"BoolInput","advanced":false,"display_name":"Flatten output","dynamic":false,"info":"The output dataset will be converted from a nested format to a flat structure. Dots in nested structure will be replaced by underscores. This is useful for further processing of the Data object. For example, {'a': {'b': 1}} will be flattened to {'a_b': 1}.","list":false,"list_add_label":"Add More","name":"flatten_dataset","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"run_input":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Run input","dynamic":false,"info":"The JSON input for the Actor run. For example for the \"apify/website-content-crawler\" Actor: {\"startUrls\":[{\"url\":\"https://docs.apify.com/academy/web-scraping-for-beginners\"}],\"maxCrawlDepth\":0}","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"run_input","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"{\"startUrls\":[{\"url\":\"https://docs.apify.com/academy/web-scraping-for-beginners\"}],\"maxCrawlDepth\":0}"}},"tool_mode":false}}],["arxiv",{"ArXivComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Search and retrieve papers from arXiv.org","display_name":"arXiv","documentation":"","edited":false,"field_order":["search_query","search_type","max_results"],"frozen":false,"icon":"arXiv","legacy":false,"metadata":{"code_hash":"219239ee2b48","dependencies":{"dependencies":[{"name":"defusedxml","version":"0.7.1"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.arxiv.arxiv.ArXivComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"search_papers_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import urllib.request\nfrom urllib.parse import urlparse\nfrom xml.etree.ElementTree import Element\n\nfrom defusedxml.ElementTree import fromstring\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import DropdownInput, IntInput, MessageTextInput, Output\nfrom lfx.schema.data import Data\nfrom lfx.schema.dataframe import DataFrame\n\n\nclass ArXivComponent(Component):\n display_name = \"arXiv\"\n description = \"Search and retrieve papers from arXiv.org\"\n icon = \"arXiv\"\n\n inputs = [\n MessageTextInput(\n name=\"search_query\",\n display_name=\"Search Query\",\n info=\"The search query for arXiv papers (e.g., 'quantum computing')\",\n tool_mode=True,\n ),\n DropdownInput(\n name=\"search_type\",\n display_name=\"Search Field\",\n info=\"The field to search in\",\n options=[\"all\", \"title\", \"abstract\", \"author\", \"cat\"], # cat is for category\n value=\"all\",\n ),\n IntInput(\n name=\"max_results\",\n display_name=\"Max Results\",\n info=\"Maximum number of results to return\",\n value=10,\n ),\n ]\n\n outputs = [\n Output(display_name=\"DataFrame\", name=\"dataframe\", method=\"search_papers_dataframe\"),\n ]\n\n def build_query_url(self) -> str:\n \"\"\"Build the arXiv API query URL.\"\"\"\n base_url = \"http://export.arxiv.org/api/query?\"\n\n # Build the search query based on search type\n if self.search_type == \"all\":\n search_query = self.search_query # No prefix for all fields\n else:\n # Map dropdown values to ArXiv API prefixes\n prefix_map = {\"title\": \"ti\", \"abstract\": \"abs\", \"author\": \"au\", \"cat\": \"cat\"}\n prefix = prefix_map.get(self.search_type, \"\")\n search_query = f\"{prefix}:{self.search_query}\"\n\n # URL parameters\n params = {\n \"search_query\": search_query,\n \"max_results\": str(self.max_results),\n }\n\n # Convert params to URL query string\n query_string = \"&\".join([f\"{k}={urllib.parse.quote(str(v))}\" for k, v in params.items()])\n\n return base_url + query_string\n\n def parse_atom_response(self, response_text: str) -> list[dict]:\n \"\"\"Parse the Atom XML response from arXiv.\"\"\"\n # Parse XML safely using defusedxml\n root = fromstring(response_text)\n\n # Define namespace dictionary for XML parsing\n ns = {\"atom\": \"http://www.w3.org/2005/Atom\", \"arxiv\": \"http://arxiv.org/schemas/atom\"}\n\n papers = []\n # Process each entry (paper)\n for entry in root.findall(\"atom:entry\", ns):\n paper = {\n \"id\": self._get_text(entry, \"atom:id\", ns),\n \"title\": self._get_text(entry, \"atom:title\", ns),\n \"summary\": self._get_text(entry, \"atom:summary\", ns),\n \"published\": self._get_text(entry, \"atom:published\", ns),\n \"updated\": self._get_text(entry, \"atom:updated\", ns),\n \"authors\": [author.find(\"atom:name\", ns).text for author in entry.findall(\"atom:author\", ns)],\n \"arxiv_url\": self._get_link(entry, \"alternate\", ns),\n \"pdf_url\": self._get_link(entry, \"related\", ns),\n \"comment\": self._get_text(entry, \"arxiv:comment\", ns),\n \"journal_ref\": self._get_text(entry, \"arxiv:journal_ref\", ns),\n \"primary_category\": self._get_category(entry, ns),\n \"categories\": [cat.get(\"term\") for cat in entry.findall(\"atom:category\", ns)],\n }\n papers.append(paper)\n\n return papers\n\n def _get_text(self, element: Element, path: str, ns: dict) -> str | None:\n \"\"\"Safely extract text from an XML element.\"\"\"\n el = element.find(path, ns)\n return el.text.strip() if el is not None and el.text else None\n\n def _get_link(self, element: Element, rel: str, ns: dict) -> str | None:\n \"\"\"Get link URL based on relation type.\"\"\"\n for link in element.findall(\"atom:link\", ns):\n if link.get(\"rel\") == rel:\n return link.get(\"href\")\n return None\n\n def _get_category(self, element: Element, ns: dict) -> str | None:\n \"\"\"Get primary category.\"\"\"\n cat = element.find(\"arxiv:primary_category\", ns)\n return cat.get(\"term\") if cat is not None else None\n\n def run_model(self) -> DataFrame:\n return self.search_papers_dataframe()\n\n def search_papers(self) -> list[Data]:\n \"\"\"Search arXiv and return results.\"\"\"\n try:\n # Build the query URL\n url = self.build_query_url()\n\n # Validate URL scheme and host\n parsed_url = urlparse(url)\n if parsed_url.scheme not in {\"http\", \"https\"}:\n error_msg = f\"Invalid URL scheme: {parsed_url.scheme}\"\n raise ValueError(error_msg)\n if parsed_url.hostname != \"export.arxiv.org\":\n error_msg = f\"Invalid host: {parsed_url.hostname}\"\n raise ValueError(error_msg)\n\n # Create a custom opener that only allows http/https schemes\n class RestrictedHTTPHandler(urllib.request.HTTPHandler):\n def http_open(self, req):\n return super().http_open(req)\n\n class RestrictedHTTPSHandler(urllib.request.HTTPSHandler):\n def https_open(self, req):\n return super().https_open(req)\n\n # Build opener with restricted handlers\n opener = urllib.request.build_opener(RestrictedHTTPHandler, RestrictedHTTPSHandler)\n urllib.request.install_opener(opener)\n\n # Make the request with validated URL using restricted opener\n response = opener.open(url)\n response_text = response.read().decode(\"utf-8\")\n\n # Parse the response\n papers = self.parse_atom_response(response_text)\n\n # Convert to Data objects\n results = [Data(data=paper) for paper in papers]\n self.status = results\n except (urllib.error.URLError, ValueError) as e:\n error_data = Data(data={\"error\": f\"Request error: {e!s}\"})\n self.status = error_data\n return [error_data]\n else:\n return results\n\n def search_papers_dataframe(self) -> DataFrame:\n \"\"\"Convert the Arxiv search results to a DataFrame.\n\n Returns:\n DataFrame: A DataFrame containing the search results.\n \"\"\"\n data = self.search_papers()\n return DataFrame(data)\n"},"max_results":{"_input_type":"IntInput","advanced":false,"display_name":"Max Results","dynamic":false,"info":"Maximum number of results to return","list":false,"list_add_label":"Add More","name":"max_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":10},"search_query":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"The search query for arXiv papers (e.g., 'quantum computing')","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"search_query","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"search_type":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Search Field","dynamic":false,"external_options":{},"info":"The field to search in","name":"search_type","options":["all","title","abstract","author","cat"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"all"}},"tool_mode":false}}],["assemblyai",{"AssemblyAIGetSubtitles":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Export your transcript in SRT or VTT format for subtitles and closed captions","display_name":"AssemblyAI Get Subtitles","documentation":"https://www.assemblyai.com/docs","edited":false,"field_order":["api_key","transcription_result","subtitle_format","chars_per_caption"],"frozen":false,"icon":"AssemblyAI","legacy":false,"metadata":{"code_hash":"533d1fcf7c7a","dependencies":{"dependencies":[{"name":"assemblyai","version":"0.35.1"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.assemblyai.assemblyai_get_subtitles.AssemblyAIGetSubtitles"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Subtitles","group_outputs":false,"method":"get_subtitles","name":"subtitles","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Assembly API Key","dynamic":false,"info":"Your AssemblyAI API key. You can get one from https://www.assemblyai.com/","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"chars_per_caption":{"_input_type":"IntInput","advanced":true,"display_name":"Characters per Caption","dynamic":false,"info":"The maximum number of characters per caption (0 for no limit)","list":false,"list_add_label":"Add More","name":"chars_per_caption","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":0},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import assemblyai as aai\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import DataInput, DropdownInput, IntInput, Output, SecretStrInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\n\n\nclass AssemblyAIGetSubtitles(Component):\n display_name = \"AssemblyAI Get Subtitles\"\n description = \"Export your transcript in SRT or VTT format for subtitles and closed captions\"\n documentation = \"https://www.assemblyai.com/docs\"\n icon = \"AssemblyAI\"\n\n inputs = [\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Assembly API Key\",\n info=\"Your AssemblyAI API key. You can get one from https://www.assemblyai.com/\",\n required=True,\n ),\n DataInput(\n name=\"transcription_result\",\n display_name=\"Transcription Result\",\n info=\"The transcription result from AssemblyAI\",\n required=True,\n ),\n DropdownInput(\n name=\"subtitle_format\",\n display_name=\"Subtitle Format\",\n options=[\"srt\", \"vtt\"],\n value=\"srt\",\n info=\"The format of the captions (SRT or VTT)\",\n ),\n IntInput(\n name=\"chars_per_caption\",\n display_name=\"Characters per Caption\",\n info=\"The maximum number of characters per caption (0 for no limit)\",\n value=0,\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Subtitles\", name=\"subtitles\", method=\"get_subtitles\"),\n ]\n\n def get_subtitles(self) -> Data:\n aai.settings.api_key = self.api_key\n\n # check if it's an error message from the previous step\n if self.transcription_result.data.get(\"error\"):\n self.status = self.transcription_result.data[\"error\"]\n return self.transcription_result\n\n try:\n transcript_id = self.transcription_result.data[\"id\"]\n transcript = aai.Transcript.get_by_id(transcript_id)\n except Exception as e: # noqa: BLE001\n error = f\"Getting transcription failed: {e}\"\n logger.debug(error, exc_info=True)\n self.status = error\n return Data(data={\"error\": error})\n\n if transcript.status == aai.TranscriptStatus.completed:\n subtitles = None\n chars_per_caption = self.chars_per_caption if self.chars_per_caption > 0 else None\n if self.subtitle_format == \"srt\":\n subtitles = transcript.export_subtitles_srt(chars_per_caption)\n else:\n subtitles = transcript.export_subtitles_vtt(chars_per_caption)\n\n result = Data(\n subtitles=subtitles,\n format=self.subtitle_format,\n transcript_id=transcript_id,\n chars_per_caption=chars_per_caption,\n )\n\n self.status = result\n return result\n self.status = transcript.error\n return Data(data={\"error\": transcript.error})\n"},"subtitle_format":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Subtitle Format","dynamic":false,"external_options":{},"info":"The format of the captions (SRT or VTT)","name":"subtitle_format","options":["srt","vtt"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"srt"},"transcription_result":{"_input_type":"DataInput","advanced":false,"display_name":"Transcription Result","dynamic":false,"info":"The transcription result from AssemblyAI","input_types":["Data"],"list":false,"list_add_label":"Add More","name":"transcription_result","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""}},"tool_mode":false},"AssemblyAILeMUR":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Apply Large Language Models to spoken data using the AssemblyAI LeMUR framework","display_name":"AssemblyAI LeMUR","documentation":"https://www.assemblyai.com/docs/lemur","edited":false,"field_order":["api_key","transcription_result","prompt","final_model","temperature","max_output_size","endpoint","questions","transcript_ids"],"frozen":false,"icon":"AssemblyAI","legacy":false,"metadata":{"code_hash":"8c96738ab967","dependencies":{"dependencies":[{"name":"assemblyai","version":"0.35.1"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.assemblyai.assemblyai_lemur.AssemblyAILeMUR"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"LeMUR Response","group_outputs":false,"method":"run_lemur","name":"lemur_response","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Assembly API Key","dynamic":false,"info":"Your AssemblyAI API key. You can get one from https://www.assemblyai.com/","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import assemblyai as aai\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import DataInput, DropdownInput, FloatInput, IntInput, MultilineInput, Output, SecretStrInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\n\n\nclass AssemblyAILeMUR(Component):\n display_name = \"AssemblyAI LeMUR\"\n description = \"Apply Large Language Models to spoken data using the AssemblyAI LeMUR framework\"\n documentation = \"https://www.assemblyai.com/docs/lemur\"\n icon = \"AssemblyAI\"\n\n inputs = [\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Assembly API Key\",\n info=\"Your AssemblyAI API key. You can get one from https://www.assemblyai.com/\",\n advanced=False,\n required=True,\n ),\n DataInput(\n name=\"transcription_result\",\n display_name=\"Transcription Result\",\n info=\"The transcription result from AssemblyAI\",\n required=True,\n ),\n MultilineInput(name=\"prompt\", display_name=\"Input Prompt\", info=\"The text to prompt the model\", required=True),\n DropdownInput(\n name=\"final_model\",\n display_name=\"Final Model\",\n options=[\"claude3_5_sonnet\", \"claude3_opus\", \"claude3_haiku\", \"claude3_sonnet\"],\n value=\"claude3_5_sonnet\",\n info=\"The model that is used for the final prompt after compression is performed\",\n advanced=True,\n ),\n FloatInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n advanced=True,\n value=0.0,\n info=\"The temperature to use for the model\",\n ),\n IntInput(\n name=\"max_output_size\",\n display_name=\" Max Output Size\",\n advanced=True,\n value=2000,\n info=\"Max output size in tokens, up to 4000\",\n ),\n DropdownInput(\n name=\"endpoint\",\n display_name=\"Endpoint\",\n options=[\"task\", \"summary\", \"question-answer\"],\n value=\"task\",\n info=(\n \"The LeMUR endpoint to use. For 'summary' and 'question-answer',\"\n \" no prompt input is needed. See https://www.assemblyai.com/docs/api-reference/lemur/ for more info.\"\n ),\n advanced=True,\n ),\n MultilineInput(\n name=\"questions\",\n display_name=\"Questions\",\n info=\"Comma-separated list of your questions. Only used if Endpoint is 'question-answer'\",\n advanced=True,\n ),\n MultilineInput(\n name=\"transcript_ids\",\n display_name=\"Transcript IDs\",\n info=(\n \"Comma-separated list of transcript IDs. LeMUR can perform actions over multiple transcripts.\"\n \" If provided, the Transcription Result is ignored.\"\n ),\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"LeMUR Response\", name=\"lemur_response\", method=\"run_lemur\"),\n ]\n\n def run_lemur(self) -> Data:\n \"\"\"Use the LeMUR task endpoint to input the LLM prompt.\"\"\"\n aai.settings.api_key = self.api_key\n\n if not self.transcription_result and not self.transcript_ids:\n error = \"Either a Transcription Result or Transcript IDs must be provided\"\n self.status = error\n return Data(data={\"error\": error})\n if self.transcription_result and self.transcription_result.data.get(\"error\"):\n # error message from the previous step\n self.status = self.transcription_result.data[\"error\"]\n return self.transcription_result\n if self.endpoint == \"task\" and not self.prompt:\n self.status = \"No prompt specified for the task endpoint\"\n return Data(data={\"error\": \"No prompt specified\"})\n if self.endpoint == \"question-answer\" and not self.questions:\n error = \"No Questions were provided for the question-answer endpoint\"\n self.status = error\n return Data(data={\"error\": error})\n\n # Check for valid transcripts\n transcript_ids = None\n if self.transcription_result and \"id\" in self.transcription_result.data:\n transcript_ids = [self.transcription_result.data[\"id\"]]\n elif self.transcript_ids:\n transcript_ids = self.transcript_ids.split(\",\") or []\n transcript_ids = [t.strip() for t in transcript_ids]\n\n if not transcript_ids:\n error = \"Either a valid Transcription Result or valid Transcript IDs must be provided\"\n self.status = error\n return Data(data={\"error\": error})\n\n # Get TranscriptGroup and check if there is any error\n transcript_group = aai.TranscriptGroup(transcript_ids=transcript_ids)\n transcript_group, failures = transcript_group.wait_for_completion(return_failures=True)\n if failures:\n error = f\"Getting transcriptions failed: {failures[0]}\"\n self.status = error\n return Data(data={\"error\": error})\n\n for t in transcript_group.transcripts:\n if t.status == aai.TranscriptStatus.error:\n self.status = t.error\n return Data(data={\"error\": t.error})\n\n # Perform LeMUR action\n try:\n response = self.perform_lemur_action(transcript_group, self.endpoint)\n except Exception as e: # noqa: BLE001\n logger.debug(\"Error running LeMUR\", exc_info=True)\n error = f\"An Error happened: {e}\"\n self.status = error\n return Data(data={\"error\": error})\n\n result = Data(data=response)\n self.status = result\n return result\n\n def perform_lemur_action(self, transcript_group: aai.TranscriptGroup, endpoint: str) -> dict:\n logger.info(\"Endpoint:\", endpoint, type(endpoint))\n if endpoint == \"task\":\n result = transcript_group.lemur.task(\n prompt=self.prompt,\n final_model=self.get_final_model(self.final_model),\n temperature=self.temperature,\n max_output_size=self.max_output_size,\n )\n elif endpoint == \"summary\":\n result = transcript_group.lemur.summarize(\n final_model=self.get_final_model(self.final_model),\n temperature=self.temperature,\n max_output_size=self.max_output_size,\n )\n elif endpoint == \"question-answer\":\n questions = self.questions.split(\",\")\n questions = [aai.LemurQuestion(question=q) for q in questions]\n result = transcript_group.lemur.question(\n questions=questions,\n final_model=self.get_final_model(self.final_model),\n temperature=self.temperature,\n max_output_size=self.max_output_size,\n )\n else:\n msg = f\"Endpoint not supported: {endpoint}\"\n raise ValueError(msg)\n\n return result.dict()\n\n def get_final_model(self, model_name: str) -> aai.LemurModel:\n if model_name == \"claude3_5_sonnet\":\n return aai.LemurModel.claude3_5_sonnet\n if model_name == \"claude3_opus\":\n return aai.LemurModel.claude3_opus\n if model_name == \"claude3_haiku\":\n return aai.LemurModel.claude3_haiku\n if model_name == \"claude3_sonnet\":\n return aai.LemurModel.claude3_sonnet\n msg = f\"Model name not supported: {model_name}\"\n raise ValueError(msg)\n"},"endpoint":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Endpoint","dynamic":false,"external_options":{},"info":"The LeMUR endpoint to use. For 'summary' and 'question-answer', no prompt input is needed. See https://www.assemblyai.com/docs/api-reference/lemur/ for more info.","name":"endpoint","options":["task","summary","question-answer"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"task"},"final_model":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Final Model","dynamic":false,"external_options":{},"info":"The model that is used for the final prompt after compression is performed","name":"final_model","options":["claude3_5_sonnet","claude3_opus","claude3_haiku","claude3_sonnet"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"claude3_5_sonnet"},"max_output_size":{"_input_type":"IntInput","advanced":true,"display_name":" Max Output Size","dynamic":false,"info":"Max output size in tokens, up to 4000","list":false,"list_add_label":"Add More","name":"max_output_size","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":2000},"prompt":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Input Prompt","dynamic":false,"info":"The text to prompt the model","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"prompt","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"questions":{"_input_type":"MultilineInput","advanced":true,"copy_field":false,"display_name":"Questions","dynamic":false,"info":"Comma-separated list of your questions. Only used if Endpoint is 'question-answer'","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"questions","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"temperature":{"_input_type":"FloatInput","advanced":true,"display_name":"Temperature","dynamic":false,"info":"The temperature to use for the model","list":false,"list_add_label":"Add More","name":"temperature","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":0.0},"transcript_ids":{"_input_type":"MultilineInput","advanced":true,"copy_field":false,"display_name":"Transcript IDs","dynamic":false,"info":"Comma-separated list of transcript IDs. LeMUR can perform actions over multiple transcripts. If provided, the Transcription Result is ignored.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"transcript_ids","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"transcription_result":{"_input_type":"DataInput","advanced":false,"display_name":"Transcription Result","dynamic":false,"info":"The transcription result from AssemblyAI","input_types":["Data"],"list":false,"list_add_label":"Add More","name":"transcription_result","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""}},"tool_mode":false},"AssemblyAIListTranscripts":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Retrieve a list of transcripts from AssemblyAI with filtering options","display_name":"AssemblyAI List Transcripts","documentation":"https://www.assemblyai.com/docs","edited":false,"field_order":["api_key","limit","status_filter","created_on","throttled_only"],"frozen":false,"icon":"AssemblyAI","legacy":false,"metadata":{"code_hash":"267dcda48ad4","dependencies":{"dependencies":[{"name":"assemblyai","version":"0.35.1"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.assemblyai.assemblyai_list_transcripts.AssemblyAIListTranscripts"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Transcript List","group_outputs":false,"method":"list_transcripts","name":"transcript_list","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Assembly API Key","dynamic":false,"info":"Your AssemblyAI API key. You can get one from https://www.assemblyai.com/","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import assemblyai as aai\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import BoolInput, DropdownInput, IntInput, MessageTextInput, Output, SecretStrInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\n\n\nclass AssemblyAIListTranscripts(Component):\n display_name = \"AssemblyAI List Transcripts\"\n description = \"Retrieve a list of transcripts from AssemblyAI with filtering options\"\n documentation = \"https://www.assemblyai.com/docs\"\n icon = \"AssemblyAI\"\n\n inputs = [\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Assembly API Key\",\n info=\"Your AssemblyAI API key. You can get one from https://www.assemblyai.com/\",\n required=True,\n ),\n IntInput(\n name=\"limit\",\n display_name=\"Limit\",\n info=\"Maximum number of transcripts to retrieve (default: 20, use 0 for all)\",\n value=20,\n ),\n DropdownInput(\n name=\"status_filter\",\n display_name=\"Status Filter\",\n options=[\"all\", \"queued\", \"processing\", \"completed\", \"error\"],\n value=\"all\",\n info=\"Filter by transcript status\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"created_on\",\n display_name=\"Created On\",\n info=\"Only get transcripts created on this date (YYYY-MM-DD)\",\n advanced=True,\n ),\n BoolInput(\n name=\"throttled_only\",\n display_name=\"Throttled Only\",\n info=\"Only get throttled transcripts, overrides the status filter\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Transcript List\", name=\"transcript_list\", method=\"list_transcripts\"),\n ]\n\n def list_transcripts(self) -> list[Data]:\n aai.settings.api_key = self.api_key\n\n params = aai.ListTranscriptParameters()\n if self.limit:\n params.limit = self.limit\n if self.status_filter != \"all\":\n params.status = self.status_filter\n if self.created_on and self.created_on.text:\n params.created_on = self.created_on.text\n if self.throttled_only:\n params.throttled_only = True\n\n try:\n transcriber = aai.Transcriber()\n\n def convert_page_to_data_list(page):\n return [Data(**t.dict()) for t in page.transcripts]\n\n if self.limit == 0:\n # paginate over all pages\n params.limit = 100\n page = transcriber.list_transcripts(params)\n transcripts = convert_page_to_data_list(page)\n\n while page.page_details.before_id_of_prev_url is not None:\n params.before_id = page.page_details.before_id_of_prev_url\n page = transcriber.list_transcripts(params)\n transcripts.extend(convert_page_to_data_list(page))\n else:\n # just one page\n page = transcriber.list_transcripts(params)\n transcripts = convert_page_to_data_list(page)\n\n except Exception as e: # noqa: BLE001\n logger.debug(\"Error listing transcripts\", exc_info=True)\n error_data = Data(data={\"error\": f\"An error occurred: {e}\"})\n self.status = [error_data]\n return [error_data]\n\n self.status = transcripts\n return transcripts\n"},"created_on":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Created On","dynamic":false,"info":"Only get transcripts created on this date (YYYY-MM-DD)","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"created_on","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"limit":{"_input_type":"IntInput","advanced":false,"display_name":"Limit","dynamic":false,"info":"Maximum number of transcripts to retrieve (default: 20, use 0 for all)","list":false,"list_add_label":"Add More","name":"limit","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":20},"status_filter":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Status Filter","dynamic":false,"external_options":{},"info":"Filter by transcript status","name":"status_filter","options":["all","queued","processing","completed","error"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"all"},"throttled_only":{"_input_type":"BoolInput","advanced":true,"display_name":"Throttled Only","dynamic":false,"info":"Only get throttled transcripts, overrides the status filter","list":false,"list_add_label":"Add More","name":"throttled_only","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false}},"tool_mode":false},"AssemblyAITranscriptionJobCreator":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Create a transcription job for an audio file using AssemblyAI with advanced options","display_name":"AssemblyAI Start Transcript","documentation":"https://www.assemblyai.com/docs","edited":false,"field_order":["api_key","audio_file","audio_file_url","speech_model","language_detection","language_code","speaker_labels","speakers_expected","punctuate","format_text"],"frozen":false,"icon":"AssemblyAI","legacy":false,"metadata":{"code_hash":"7ff7b3f90298","dependencies":{"dependencies":[{"name":"assemblyai","version":"0.35.1"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.assemblyai.assemblyai_start_transcript.AssemblyAITranscriptionJobCreator"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Transcript ID","group_outputs":false,"method":"create_transcription_job","name":"transcript_id","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Assembly API Key","dynamic":false,"info":"Your AssemblyAI API key. You can get one from https://www.assemblyai.com/","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"audio_file":{"_input_type":"FileInput","advanced":false,"display_name":"Audio File","dynamic":false,"fileTypes":["3ga","8svx","aac","ac3","aif","aiff","alac","amr","ape","au","dss","flac","flv","m4a","m4b","m4p","m4r","mp3","mpga","ogg","oga","mogg","opus","qcp","tta","voc","wav","wma","wv","webm","mts","m2ts","ts","mov","mp2","mp4","m4p","m4v","mxf"],"file_path":"","info":"The audio file to transcribe","list":false,"list_add_label":"Add More","name":"audio_file","placeholder":"","required":true,"show":true,"temp_file":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"file","value":""},"audio_file_url":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Audio File URL","dynamic":false,"info":"The URL of the audio file to transcribe (Can be used instead of a File)","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"audio_file_url","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from pathlib import Path\n\nimport assemblyai as aai\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import BoolInput, DropdownInput, FileInput, MessageTextInput, Output, SecretStrInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\n\n\nclass AssemblyAITranscriptionJobCreator(Component):\n display_name = \"AssemblyAI Start Transcript\"\n description = \"Create a transcription job for an audio file using AssemblyAI with advanced options\"\n documentation = \"https://www.assemblyai.com/docs\"\n icon = \"AssemblyAI\"\n\n inputs = [\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Assembly API Key\",\n info=\"Your AssemblyAI API key. You can get one from https://www.assemblyai.com/\",\n required=True,\n ),\n FileInput(\n name=\"audio_file\",\n display_name=\"Audio File\",\n file_types=[\n \"3ga\",\n \"8svx\",\n \"aac\",\n \"ac3\",\n \"aif\",\n \"aiff\",\n \"alac\",\n \"amr\",\n \"ape\",\n \"au\",\n \"dss\",\n \"flac\",\n \"flv\",\n \"m4a\",\n \"m4b\",\n \"m4p\",\n \"m4r\",\n \"mp3\",\n \"mpga\",\n \"ogg\",\n \"oga\",\n \"mogg\",\n \"opus\",\n \"qcp\",\n \"tta\",\n \"voc\",\n \"wav\",\n \"wma\",\n \"wv\",\n \"webm\",\n \"mts\",\n \"m2ts\",\n \"ts\",\n \"mov\",\n \"mp2\",\n \"mp4\",\n \"m4p\",\n \"m4v\",\n \"mxf\",\n ],\n info=\"The audio file to transcribe\",\n required=True,\n ),\n MessageTextInput(\n name=\"audio_file_url\",\n display_name=\"Audio File URL\",\n info=\"The URL of the audio file to transcribe (Can be used instead of a File)\",\n advanced=True,\n ),\n DropdownInput(\n name=\"speech_model\",\n display_name=\"Speech Model\",\n options=[\n \"best\",\n \"nano\",\n ],\n value=\"best\",\n info=\"The speech model to use for the transcription\",\n advanced=True,\n ),\n BoolInput(\n name=\"language_detection\",\n display_name=\"Automatic Language Detection\",\n info=\"Enable automatic language detection\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"language_code\",\n display_name=\"Language\",\n info=(\n \"\"\"\n The language of the audio file. Can be set manually if automatic language detection is disabled.\n See https://www.assemblyai.com/docs/getting-started/supported-languages \"\"\"\n \"for a list of supported language codes.\"\n ),\n advanced=True,\n ),\n BoolInput(\n name=\"speaker_labels\",\n display_name=\"Enable Speaker Labels\",\n info=\"Enable speaker diarization\",\n ),\n MessageTextInput(\n name=\"speakers_expected\",\n display_name=\"Expected Number of Speakers\",\n info=\"Set the expected number of speakers (optional, enter a number)\",\n advanced=True,\n ),\n BoolInput(\n name=\"punctuate\",\n display_name=\"Punctuate\",\n info=\"Enable automatic punctuation\",\n advanced=True,\n value=True,\n ),\n BoolInput(\n name=\"format_text\",\n display_name=\"Format Text\",\n info=\"Enable text formatting\",\n advanced=True,\n value=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Transcript ID\", name=\"transcript_id\", method=\"create_transcription_job\"),\n ]\n\n def create_transcription_job(self) -> Data:\n aai.settings.api_key = self.api_key\n\n # Convert speakers_expected to int if it's not empty\n speakers_expected = None\n if self.speakers_expected and self.speakers_expected.strip():\n try:\n speakers_expected = int(self.speakers_expected)\n except ValueError:\n self.status = \"Error: Expected Number of Speakers must be a valid integer\"\n return Data(data={\"error\": \"Error: Expected Number of Speakers must be a valid integer\"})\n\n language_code = self.language_code or None\n\n config = aai.TranscriptionConfig(\n speech_model=self.speech_model,\n language_detection=self.language_detection,\n language_code=language_code,\n speaker_labels=self.speaker_labels,\n speakers_expected=speakers_expected,\n punctuate=self.punctuate,\n format_text=self.format_text,\n )\n\n audio = None\n if self.audio_file:\n if self.audio_file_url:\n logger.warning(\"Both an audio file an audio URL were specified. The audio URL was ignored.\")\n\n # Check if the file exists\n if not Path(self.audio_file).exists():\n self.status = \"Error: Audio file not found\"\n return Data(data={\"error\": \"Error: Audio file not found\"})\n audio = self.audio_file\n elif self.audio_file_url:\n audio = self.audio_file_url\n else:\n self.status = \"Error: Either an audio file or an audio URL must be specified\"\n return Data(data={\"error\": \"Error: Either an audio file or an audio URL must be specified\"})\n\n try:\n transcript = aai.Transcriber().submit(audio, config=config)\n except Exception as e: # noqa: BLE001\n logger.debug(\"Error submitting transcription job\", exc_info=True)\n self.status = f\"An error occurred: {e}\"\n return Data(data={\"error\": f\"An error occurred: {e}\"})\n\n if transcript.error:\n self.status = transcript.error\n return Data(data={\"error\": transcript.error})\n result = Data(data={\"transcript_id\": transcript.id})\n self.status = result\n return result\n"},"format_text":{"_input_type":"BoolInput","advanced":true,"display_name":"Format Text","dynamic":false,"info":"Enable text formatting","list":false,"list_add_label":"Add More","name":"format_text","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"language_code":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Language","dynamic":false,"info":"\n The language of the audio file. Can be set manually if automatic language detection is disabled.\n See https://www.assemblyai.com/docs/getting-started/supported-languages for a list of supported language codes.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"language_code","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"language_detection":{"_input_type":"BoolInput","advanced":true,"display_name":"Automatic Language Detection","dynamic":false,"info":"Enable automatic language detection","list":false,"list_add_label":"Add More","name":"language_detection","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"punctuate":{"_input_type":"BoolInput","advanced":true,"display_name":"Punctuate","dynamic":false,"info":"Enable automatic punctuation","list":false,"list_add_label":"Add More","name":"punctuate","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"speaker_labels":{"_input_type":"BoolInput","advanced":false,"display_name":"Enable Speaker Labels","dynamic":false,"info":"Enable speaker diarization","list":false,"list_add_label":"Add More","name":"speaker_labels","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"speakers_expected":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Expected Number of Speakers","dynamic":false,"info":"Set the expected number of speakers (optional, enter a number)","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"speakers_expected","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"speech_model":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Speech Model","dynamic":false,"external_options":{},"info":"The speech model to use for the transcription","name":"speech_model","options":["best","nano"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"best"}},"tool_mode":false},"AssemblyAITranscriptionJobPoller":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Poll for the status of a transcription job using AssemblyAI","display_name":"AssemblyAI Poll Transcript","documentation":"https://www.assemblyai.com/docs","edited":false,"field_order":["api_key","transcript_id","polling_interval"],"frozen":false,"icon":"AssemblyAI","legacy":false,"metadata":{"code_hash":"935c9296b149","dependencies":{"dependencies":[{"name":"assemblyai","version":"0.35.1"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.assemblyai.assemblyai_poll_transcript.AssemblyAITranscriptionJobPoller"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Transcription Result","group_outputs":false,"method":"poll_transcription_job","name":"transcription_result","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Assembly API Key","dynamic":false,"info":"Your AssemblyAI API key. You can get one from https://www.assemblyai.com/","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import assemblyai as aai\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.field_typing.range_spec import RangeSpec\nfrom lfx.io import DataInput, FloatInput, Output, SecretStrInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\n\n\nclass AssemblyAITranscriptionJobPoller(Component):\n display_name = \"AssemblyAI Poll Transcript\"\n description = \"Poll for the status of a transcription job using AssemblyAI\"\n documentation = \"https://www.assemblyai.com/docs\"\n icon = \"AssemblyAI\"\n\n inputs = [\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Assembly API Key\",\n info=\"Your AssemblyAI API key. You can get one from https://www.assemblyai.com/\",\n required=True,\n ),\n DataInput(\n name=\"transcript_id\",\n display_name=\"Transcript ID\",\n info=\"The ID of the transcription job to poll\",\n required=True,\n ),\n FloatInput(\n name=\"polling_interval\",\n display_name=\"Polling Interval\",\n value=3.0,\n info=\"The polling interval in seconds\",\n advanced=True,\n range_spec=RangeSpec(min=3, max=30),\n ),\n ]\n\n outputs = [\n Output(display_name=\"Transcription Result\", name=\"transcription_result\", method=\"poll_transcription_job\"),\n ]\n\n def poll_transcription_job(self) -> Data:\n \"\"\"Polls the transcription status until completion and returns the Data.\"\"\"\n aai.settings.api_key = self.api_key\n aai.settings.polling_interval = self.polling_interval\n\n # check if it's an error message from the previous step\n if self.transcript_id.data.get(\"error\"):\n self.status = self.transcript_id.data[\"error\"]\n return self.transcript_id\n\n try:\n transcript = aai.Transcript.get_by_id(self.transcript_id.data[\"transcript_id\"])\n except Exception as e: # noqa: BLE001\n error = f\"Getting transcription failed: {e}\"\n logger.debug(error, exc_info=True)\n self.status = error\n return Data(data={\"error\": error})\n\n if transcript.status == aai.TranscriptStatus.completed:\n json_response = transcript.json_response\n text = json_response.pop(\"text\", None)\n utterances = json_response.pop(\"utterances\", None)\n transcript_id = json_response.pop(\"id\", None)\n sorted_data = {\"text\": text, \"utterances\": utterances, \"id\": transcript_id}\n sorted_data.update(json_response)\n data = Data(data=sorted_data)\n self.status = data\n return data\n self.status = transcript.error\n return Data(data={\"error\": transcript.error})\n"},"polling_interval":{"_input_type":"FloatInput","advanced":true,"display_name":"Polling Interval","dynamic":false,"info":"The polling interval in seconds","list":false,"list_add_label":"Add More","name":"polling_interval","placeholder":"","range_spec":{"max":30.0,"min":3.0,"step":0.1,"step_type":"float"},"required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":3.0},"transcript_id":{"_input_type":"DataInput","advanced":false,"display_name":"Transcript ID","dynamic":false,"info":"The ID of the transcription job to poll","input_types":["Data"],"list":false,"list_add_label":"Add More","name":"transcript_id","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""}},"tool_mode":false}}],["azure",{"AzureOpenAIEmbeddings":{"base_classes":["Embeddings"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate embeddings using Azure OpenAI models.","display_name":"Azure OpenAI Embeddings","documentation":"https://python.langchain.com/docs/integrations/text_embedding/azureopenai","edited":false,"field_order":["model","azure_endpoint","azure_deployment","api_version","api_key","dimensions"],"frozen":false,"icon":"Azure","legacy":false,"metadata":{"code_hash":"6b54f3243a6a","dependencies":{"dependencies":[{"name":"langchain_openai","version":"0.3.23"},{"name":"lfx","version":null}],"total_dependencies":2},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.azure.azure_openai_embeddings.AzureOpenAIEmbeddingsComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Embeddings","group_outputs":false,"method":"build_embeddings","name":"embeddings","selected":"Embeddings","tool_mode":true,"types":["Embeddings"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Azure OpenAI API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"api_version":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"API Version","dynamic":false,"external_options":{},"info":"","name":"api_version","options":["2022-12-01","2023-03-15-preview","2023-05-15","2023-06-01-preview","2023-07-01-preview","2023-08-01-preview"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"2023-08-01-preview"},"azure_deployment":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Deployment Name","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"azure_deployment","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"azure_endpoint":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Azure Endpoint","dynamic":false,"info":"Your Azure endpoint, including the resource. Example: `https://example-resource.azure.openai.com/`","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"azure_endpoint","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from langchain_openai import AzureOpenAIEmbeddings\n\nfrom lfx.base.models.model import LCModelComponent\nfrom lfx.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES\nfrom lfx.field_typing import Embeddings\nfrom lfx.io import DropdownInput, IntInput, MessageTextInput, Output, SecretStrInput\n\n\nclass AzureOpenAIEmbeddingsComponent(LCModelComponent):\n display_name: str = \"Azure OpenAI Embeddings\"\n description: str = \"Generate embeddings using Azure OpenAI models.\"\n documentation: str = \"https://python.langchain.com/docs/integrations/text_embedding/azureopenai\"\n icon = \"Azure\"\n name = \"AzureOpenAIEmbeddings\"\n\n API_VERSION_OPTIONS = [\n \"2022-12-01\",\n \"2023-03-15-preview\",\n \"2023-05-15\",\n \"2023-06-01-preview\",\n \"2023-07-01-preview\",\n \"2023-08-01-preview\",\n ]\n\n inputs = [\n DropdownInput(\n name=\"model\",\n display_name=\"Model\",\n advanced=False,\n options=OPENAI_EMBEDDING_MODEL_NAMES,\n value=OPENAI_EMBEDDING_MODEL_NAMES[0],\n ),\n MessageTextInput(\n name=\"azure_endpoint\",\n display_name=\"Azure Endpoint\",\n required=True,\n info=\"Your Azure endpoint, including the resource. Example: `https://example-resource.azure.openai.com/`\",\n ),\n MessageTextInput(\n name=\"azure_deployment\",\n display_name=\"Deployment Name\",\n required=True,\n ),\n DropdownInput(\n name=\"api_version\",\n display_name=\"API Version\",\n options=API_VERSION_OPTIONS,\n value=API_VERSION_OPTIONS[-1],\n advanced=True,\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Azure OpenAI API Key\",\n required=True,\n ),\n IntInput(\n name=\"dimensions\",\n display_name=\"Dimensions\",\n info=\"The number of dimensions the resulting output embeddings should have. \"\n \"Only supported by certain models.\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Embeddings\", name=\"embeddings\", method=\"build_embeddings\"),\n ]\n\n def build_embeddings(self) -> Embeddings:\n try:\n embeddings = AzureOpenAIEmbeddings(\n model=self.model,\n azure_endpoint=self.azure_endpoint,\n azure_deployment=self.azure_deployment,\n api_version=self.api_version,\n api_key=self.api_key,\n dimensions=self.dimensions or None,\n )\n except Exception as e:\n msg = f\"Could not connect to AzureOpenAIEmbeddings API: {e}\"\n raise ValueError(msg) from e\n\n return embeddings\n"},"dimensions":{"_input_type":"IntInput","advanced":true,"display_name":"Dimensions","dynamic":false,"info":"The number of dimensions the resulting output embeddings should have. Only supported by certain models.","list":false,"list_add_label":"Add More","name":"dimensions","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"model":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model","dynamic":false,"external_options":{},"info":"","name":"model","options":["text-embedding-3-small","text-embedding-3-large","text-embedding-ada-002"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"text-embedding-3-small"}},"tool_mode":false},"AzureOpenAIModel":{"base_classes":["LanguageModel","Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate text using Azure OpenAI LLMs.","display_name":"Azure OpenAI","documentation":"https://python.langchain.com/docs/integrations/llms/azure_openai","edited":false,"field_order":["input_value","system_message","stream","azure_endpoint","azure_deployment","api_key","api_version","temperature","max_tokens"],"frozen":false,"icon":"Azure","legacy":false,"metadata":{"code_hash":"cc8d003556d8","dependencies":{"dependencies":[{"name":"langchain_openai","version":"0.3.23"},{"name":"lfx","version":null}],"total_dependencies":2},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.azure.azure_openai.AzureChatOpenAIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Model Response","group_outputs":false,"method":"text_response","name":"text_output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Language Model","group_outputs":false,"method":"build_model","name":"model_output","selected":"LanguageModel","tool_mode":true,"types":["LanguageModel"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Azure Chat OpenAI API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"api_version":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"API Version","dynamic":false,"external_options":{},"info":"","name":"api_version","options":["2025-02-01-preview","2025-01-01-preview","2024-12-01-preview","2024-10-01-preview","2024-09-01-preview","2024-08-01-preview","2024-07-01-preview","2024-06-01","2024-03-01-preview","2024-02-15-preview","2023-12-01-preview","2023-05-15"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"2024-06-01"},"azure_deployment":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Deployment Name","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"azure_deployment","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"azure_endpoint":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Azure Endpoint","dynamic":false,"info":"Your Azure endpoint, including the resource. Example: `https://example-resource.azure.openai.com/`","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"azure_endpoint","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from langchain_openai import AzureChatOpenAI\n\nfrom lfx.base.models.model import LCModelComponent\nfrom lfx.field_typing import LanguageModel\nfrom lfx.field_typing.range_spec import RangeSpec\nfrom lfx.inputs.inputs import MessageTextInput\nfrom lfx.io import DropdownInput, IntInput, SecretStrInput, SliderInput\n\n\nclass AzureChatOpenAIComponent(LCModelComponent):\n display_name: str = \"Azure OpenAI\"\n description: str = \"Generate text using Azure OpenAI LLMs.\"\n documentation: str = \"https://python.langchain.com/docs/integrations/llms/azure_openai\"\n beta = False\n icon = \"Azure\"\n name = \"AzureOpenAIModel\"\n\n AZURE_OPENAI_API_VERSIONS = [\n \"2024-06-01\",\n \"2024-07-01-preview\",\n \"2024-08-01-preview\",\n \"2024-09-01-preview\",\n \"2024-10-01-preview\",\n \"2023-05-15\",\n \"2023-12-01-preview\",\n \"2024-02-15-preview\",\n \"2024-03-01-preview\",\n \"2024-12-01-preview\",\n \"2025-01-01-preview\",\n \"2025-02-01-preview\",\n ]\n\n inputs = [\n *LCModelComponent.get_base_inputs(),\n MessageTextInput(\n name=\"azure_endpoint\",\n display_name=\"Azure Endpoint\",\n info=\"Your Azure endpoint, including the resource. Example: `https://example-resource.azure.openai.com/`\",\n required=True,\n ),\n MessageTextInput(name=\"azure_deployment\", display_name=\"Deployment Name\", required=True),\n SecretStrInput(name=\"api_key\", display_name=\"Azure Chat OpenAI API Key\", required=True),\n DropdownInput(\n name=\"api_version\",\n display_name=\"API Version\",\n options=sorted(AZURE_OPENAI_API_VERSIONS, reverse=True),\n value=next(\n (\n version\n for version in sorted(AZURE_OPENAI_API_VERSIONS, reverse=True)\n if not version.endswith(\"-preview\")\n ),\n AZURE_OPENAI_API_VERSIONS[0],\n ),\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.7,\n range_spec=RangeSpec(min=0, max=2, step=0.01),\n info=\"Controls randomness. Lower values are more deterministic, higher values are more creative.\",\n advanced=True,\n ),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n azure_endpoint = self.azure_endpoint\n azure_deployment = self.azure_deployment\n api_version = self.api_version\n api_key = self.api_key\n temperature = self.temperature\n max_tokens = self.max_tokens\n stream = self.stream\n\n try:\n output = AzureChatOpenAI(\n azure_endpoint=azure_endpoint,\n azure_deployment=azure_deployment,\n api_version=api_version,\n api_key=api_key,\n temperature=temperature,\n max_tokens=max_tokens or None,\n streaming=stream,\n )\n except Exception as e:\n msg = f\"Could not connect to AzureOpenAI API: {e}\"\n raise ValueError(msg) from e\n\n return output\n"},"input_value":{"_input_type":"MessageInput","advanced":false,"display_name":"Input","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"max_tokens":{"_input_type":"IntInput","advanced":true,"display_name":"Max Tokens","dynamic":false,"info":"The maximum number of tokens to generate. Set to 0 for unlimited tokens.","list":false,"list_add_label":"Add More","name":"max_tokens","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"stream":{"_input_type":"BoolInput","advanced":true,"display_name":"Stream","dynamic":false,"info":"Stream the response from the model. Streaming works only in Chat.","list":false,"list_add_label":"Add More","name":"stream","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"system_message":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"System Message","dynamic":false,"info":"System message to pass to the model.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"system_message","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"temperature":{"_input_type":"SliderInput","advanced":true,"display_name":"Temperature","dynamic":false,"info":"Controls randomness. Lower values are more deterministic, higher values are more creative.","max_label":"","max_label_icon":"","min_label":"","min_label_icon":"","name":"temperature","placeholder":"","range_spec":{"max":2.0,"min":0.0,"step":0.01,"step_type":"float"},"required":false,"show":true,"slider_buttons":false,"slider_buttons_options":[],"slider_input":false,"title_case":false,"tool_mode":false,"track_in_telemetry":false,"type":"slider","value":0.7}},"tool_mode":false}}],["baidu",{"BaiduQianfanChatModel":{"base_classes":["LanguageModel","Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate text using Baidu Qianfan LLMs.","display_name":"Qianfan","documentation":"https://python.langchain.com/docs/integrations/chat/baidu_qianfan_endpoint","edited":false,"field_order":["input_value","system_message","stream","model","qianfan_ak","qianfan_sk","top_p","temperature","penalty_score","endpoint"],"frozen":false,"icon":"BaiduQianfan","legacy":false,"metadata":{"code_hash":"a5fdfdb5757f","dependencies":{"dependencies":[{"name":"langchain_community","version":"0.3.21"},{"name":"lfx","version":null}],"total_dependencies":2},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.baidu.baidu_qianfan_chat.QianfanChatEndpointComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Model Response","group_outputs":false,"method":"text_response","name":"text_output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Language Model","group_outputs":false,"method":"build_model","name":"model_output","selected":"LanguageModel","tool_mode":true,"types":["LanguageModel"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint\n\nfrom lfx.base.models.model import LCModelComponent\nfrom lfx.field_typing.constants import LanguageModel\nfrom lfx.io import DropdownInput, FloatInput, MessageTextInput, SecretStrInput\n\n\nclass QianfanChatEndpointComponent(LCModelComponent):\n display_name: str = \"Qianfan\"\n description: str = \"Generate text using Baidu Qianfan LLMs.\"\n documentation: str = \"https://python.langchain.com/docs/integrations/chat/baidu_qianfan_endpoint\"\n icon = \"BaiduQianfan\"\n name = \"BaiduQianfanChatModel\"\n\n inputs = [\n *LCModelComponent.get_base_inputs(),\n DropdownInput(\n name=\"model\",\n display_name=\"Model Name\",\n options=[\n \"EB-turbo-AppBuilder\",\n \"Llama-2-70b-chat\",\n \"ERNIE-Bot-turbo-AI\",\n \"ERNIE-Lite-8K-0308\",\n \"ERNIE-Speed\",\n \"Qianfan-Chinese-Llama-2-13B\",\n \"ERNIE-3.5-8K\",\n \"BLOOMZ-7B\",\n \"Qianfan-Chinese-Llama-2-7B\",\n \"XuanYuan-70B-Chat-4bit\",\n \"AquilaChat-7B\",\n \"ERNIE-Bot-4\",\n \"Llama-2-13b-chat\",\n \"ChatGLM2-6B-32K\",\n \"ERNIE-Bot\",\n \"ERNIE-Speed-128k\",\n \"ERNIE-4.0-8K\",\n \"Qianfan-BLOOMZ-7B-compressed\",\n \"ERNIE Speed\",\n \"Llama-2-7b-chat\",\n \"Mixtral-8x7B-Instruct\",\n \"ERNIE 3.5\",\n \"ERNIE Speed-AppBuilder\",\n \"ERNIE-Speed-8K\",\n \"Yi-34B-Chat\",\n ],\n info=\"https://python.langchain.com/docs/integrations/chat/baidu_qianfan_endpoint\",\n value=\"ERNIE-4.0-8K\",\n ),\n SecretStrInput(\n name=\"qianfan_ak\",\n display_name=\"Qianfan Ak\",\n info=\"which you could get from https://cloud.baidu.com/product/wenxinworkshop\",\n ),\n SecretStrInput(\n name=\"qianfan_sk\",\n display_name=\"Qianfan Sk\",\n info=\"which you could get from https://cloud.baidu.com/product/wenxinworkshop\",\n ),\n FloatInput(\n name=\"top_p\",\n display_name=\"Top p\",\n info=\"Model params, only supported in ERNIE-Bot and ERNIE-Bot-turbo\",\n value=0.8,\n advanced=True,\n ),\n FloatInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n info=\"Model params, only supported in ERNIE-Bot and ERNIE-Bot-turbo\",\n value=0.95,\n ),\n FloatInput(\n name=\"penalty_score\",\n display_name=\"Penalty Score\",\n info=\"Model params, only supported in ERNIE-Bot and ERNIE-Bot-turbo\",\n value=1.0,\n advanced=True,\n ),\n MessageTextInput(\n name=\"endpoint\", display_name=\"Endpoint\", info=\"Endpoint of the Qianfan LLM, required if custom model used.\"\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n model = self.model\n qianfan_ak = self.qianfan_ak\n qianfan_sk = self.qianfan_sk\n top_p = self.top_p\n temperature = self.temperature\n penalty_score = self.penalty_score\n endpoint = self.endpoint\n\n try:\n kwargs = {\n \"model\": model,\n \"qianfan_ak\": qianfan_ak or None,\n \"qianfan_sk\": qianfan_sk or None,\n \"top_p\": top_p,\n \"temperature\": temperature,\n \"penalty_score\": penalty_score,\n }\n\n if endpoint: # Only add endpoint if it has a value\n kwargs[\"endpoint\"] = endpoint\n\n output = QianfanChatEndpoint(**kwargs)\n\n except Exception as e:\n msg = \"Could not connect to Baidu Qianfan API.\"\n raise ValueError(msg) from e\n\n return output\n"},"endpoint":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Endpoint","dynamic":false,"info":"Endpoint of the Qianfan LLM, required if custom model used.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"endpoint","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"input_value":{"_input_type":"MessageInput","advanced":false,"display_name":"Input","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"model":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model Name","dynamic":false,"external_options":{},"info":"https://python.langchain.com/docs/integrations/chat/baidu_qianfan_endpoint","name":"model","options":["EB-turbo-AppBuilder","Llama-2-70b-chat","ERNIE-Bot-turbo-AI","ERNIE-Lite-8K-0308","ERNIE-Speed","Qianfan-Chinese-Llama-2-13B","ERNIE-3.5-8K","BLOOMZ-7B","Qianfan-Chinese-Llama-2-7B","XuanYuan-70B-Chat-4bit","AquilaChat-7B","ERNIE-Bot-4","Llama-2-13b-chat","ChatGLM2-6B-32K","ERNIE-Bot","ERNIE-Speed-128k","ERNIE-4.0-8K","Qianfan-BLOOMZ-7B-compressed","ERNIE Speed","Llama-2-7b-chat","Mixtral-8x7B-Instruct","ERNIE 3.5","ERNIE Speed-AppBuilder","ERNIE-Speed-8K","Yi-34B-Chat"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"ERNIE-4.0-8K"},"penalty_score":{"_input_type":"FloatInput","advanced":true,"display_name":"Penalty Score","dynamic":false,"info":"Model params, only supported in ERNIE-Bot and ERNIE-Bot-turbo","list":false,"list_add_label":"Add More","name":"penalty_score","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":1.0},"qianfan_ak":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Qianfan Ak","dynamic":false,"info":"which you could get from https://cloud.baidu.com/product/wenxinworkshop","input_types":[],"load_from_db":true,"name":"qianfan_ak","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"qianfan_sk":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Qianfan Sk","dynamic":false,"info":"which you could get from https://cloud.baidu.com/product/wenxinworkshop","input_types":[],"load_from_db":true,"name":"qianfan_sk","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"stream":{"_input_type":"BoolInput","advanced":true,"display_name":"Stream","dynamic":false,"info":"Stream the response from the model. Streaming works only in Chat.","list":false,"list_add_label":"Add More","name":"stream","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"system_message":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"System Message","dynamic":false,"info":"System message to pass to the model.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"system_message","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"temperature":{"_input_type":"FloatInput","advanced":false,"display_name":"Temperature","dynamic":false,"info":"Model params, only supported in ERNIE-Bot and ERNIE-Bot-turbo","list":false,"list_add_label":"Add More","name":"temperature","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":0.95},"top_p":{"_input_type":"FloatInput","advanced":true,"display_name":"Top p","dynamic":false,"info":"Model params, only supported in ERNIE-Bot and ERNIE-Bot-turbo","list":false,"list_add_label":"Add More","name":"top_p","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":0.8}},"tool_mode":false}}],["bing",{"BingSearchAPI":{"base_classes":["DataFrame","Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Call the Bing Search API.","display_name":"Bing Search API","documentation":"","edited":false,"field_order":["bing_subscription_key","input_value","bing_search_url","k"],"frozen":false,"icon":"Bing","legacy":false,"metadata":{"code_hash":"84334607b325","dependencies":{"dependencies":[{"name":"langchain_community","version":"0.3.21"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.bing.bing_search_api.BingSearchAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"fetch_content_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool","group_outputs":false,"method":"build_tool","name":"tool","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","bing_search_url":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Bing Search URL","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"bing_search_url","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bing_subscription_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bing Subscription Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bing_subscription_key","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from typing import cast\n\nfrom langchain_community.tools.bing_search import BingSearchResults\nfrom langchain_community.utilities import BingSearchAPIWrapper\n\nfrom lfx.base.langchain_utilities.model import LCToolComponent\nfrom lfx.field_typing import Tool\nfrom lfx.inputs.inputs import IntInput, MessageTextInput, MultilineInput, SecretStrInput\nfrom lfx.schema.data import Data\nfrom lfx.schema.dataframe import DataFrame\nfrom lfx.template.field.base import Output\n\n\nclass BingSearchAPIComponent(LCToolComponent):\n display_name = \"Bing Search API\"\n description = \"Call the Bing Search API.\"\n name = \"BingSearchAPI\"\n icon = \"Bing\"\n\n inputs = [\n SecretStrInput(name=\"bing_subscription_key\", display_name=\"Bing Subscription Key\"),\n MultilineInput(\n name=\"input_value\",\n display_name=\"Input\",\n ),\n MessageTextInput(name=\"bing_search_url\", display_name=\"Bing Search URL\", advanced=True),\n IntInput(name=\"k\", display_name=\"Number of results\", value=4, required=True),\n ]\n\n outputs = [\n Output(display_name=\"DataFrame\", name=\"dataframe\", method=\"fetch_content_dataframe\"),\n Output(display_name=\"Tool\", name=\"tool\", method=\"build_tool\"),\n ]\n\n def run_model(self) -> DataFrame:\n return self.fetch_content_dataframe()\n\n def fetch_content(self) -> list[Data]:\n if self.bing_search_url:\n wrapper = BingSearchAPIWrapper(\n bing_search_url=self.bing_search_url, bing_subscription_key=self.bing_subscription_key\n )\n else:\n wrapper = BingSearchAPIWrapper(bing_subscription_key=self.bing_subscription_key)\n results = wrapper.results(query=self.input_value, num_results=self.k)\n data = [Data(data=result, text=result[\"snippet\"]) for result in results]\n self.status = data\n return data\n\n def fetch_content_dataframe(self) -> DataFrame:\n data = self.fetch_content()\n return DataFrame(data)\n\n def build_tool(self) -> Tool:\n if self.bing_search_url:\n wrapper = BingSearchAPIWrapper(\n bing_search_url=self.bing_search_url, bing_subscription_key=self.bing_subscription_key\n )\n else:\n wrapper = BingSearchAPIWrapper(bing_subscription_key=self.bing_subscription_key)\n return cast(\"Tool\", BingSearchResults(api_wrapper=wrapper, num_results=self.k))\n"},"input_value":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Input","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"k":{"_input_type":"IntInput","advanced":false,"display_name":"Number of results","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"k","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":4}},"tool_mode":false}}],["cassandra",{"Cassandra":{"base_classes":["Data","DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Cassandra Vector Store with search capabilities","display_name":"Cassandra","documentation":"https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/cassandra","edited":false,"field_order":["database_ref","username","token","keyspace","table_name","ttl_seconds","batch_size","setup_mode","cluster_kwargs","ingest_data","search_query","should_cache_vector_store","embedding","number_of_results","search_type","search_score_threshold","search_filter","body_search","enable_body_search"],"frozen":false,"icon":"Cassandra","legacy":false,"metadata":{"code_hash":"833f277daab7","dependencies":{"dependencies":[{"name":"langchain_community","version":"0.3.21"},{"name":"lfx","version":null},{"name":"cassio","version":null}],"total_dependencies":3},"module":"lfx.components.cassandra.cassandra.CassandraVectorStoreComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Search Results","group_outputs":false,"method":"search_documents","name":"search_results","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","batch_size":{"_input_type":"IntInput","advanced":true,"display_name":"Batch Size","dynamic":false,"info":"Optional number of data to process in a single batch.","list":false,"list_add_label":"Add More","name":"batch_size","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":16},"body_search":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Search Body","dynamic":false,"info":"Document textual search terms to apply to the search query.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"body_search","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"cluster_kwargs":{"_input_type":"DictInput","advanced":true,"display_name":"Cluster arguments","dynamic":false,"info":"Optional dictionary of additional keyword arguments for the Cassandra cluster.","list":true,"list_add_label":"Add More","name":"cluster_kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from langchain_community.vectorstores import Cassandra\n\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.helpers.data import docs_to_data\nfrom lfx.inputs.inputs import BoolInput, DictInput, FloatInput\nfrom lfx.io import (\n DropdownInput,\n HandleInput,\n IntInput,\n MessageTextInput,\n SecretStrInput,\n)\nfrom lfx.schema.data import Data\n\n\nclass CassandraVectorStoreComponent(LCVectorStoreComponent):\n display_name = \"Cassandra\"\n description = \"Cassandra Vector Store with search capabilities\"\n documentation = \"https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/cassandra\"\n name = \"Cassandra\"\n icon = \"Cassandra\"\n\n inputs = [\n MessageTextInput(\n name=\"database_ref\",\n display_name=\"Contact Points / Astra Database ID\",\n info=\"Contact points for the database (or Astra DB database ID)\",\n required=True,\n ),\n MessageTextInput(\n name=\"username\", display_name=\"Username\", info=\"Username for the database (leave empty for Astra DB).\"\n ),\n SecretStrInput(\n name=\"token\",\n display_name=\"Password / Astra DB Token\",\n info=\"User password for the database (or Astra DB token).\",\n required=True,\n ),\n MessageTextInput(\n name=\"keyspace\",\n display_name=\"Keyspace\",\n info=\"Table Keyspace (or Astra DB namespace).\",\n required=True,\n ),\n MessageTextInput(\n name=\"table_name\",\n display_name=\"Table Name\",\n info=\"The name of the table (or Astra DB collection) where vectors will be stored.\",\n required=True,\n ),\n IntInput(\n name=\"ttl_seconds\",\n display_name=\"TTL Seconds\",\n info=\"Optional time-to-live for the added texts.\",\n advanced=True,\n ),\n IntInput(\n name=\"batch_size\",\n display_name=\"Batch Size\",\n info=\"Optional number of data to process in a single batch.\",\n value=16,\n advanced=True,\n ),\n DropdownInput(\n name=\"setup_mode\",\n display_name=\"Setup Mode\",\n info=\"Configuration mode for setting up the Cassandra table, with options like 'Sync', 'Async', or 'Off'.\",\n options=[\"Sync\", \"Async\", \"Off\"],\n value=\"Sync\",\n advanced=True,\n ),\n DictInput(\n name=\"cluster_kwargs\",\n display_name=\"Cluster arguments\",\n info=\"Optional dictionary of additional keyword arguments for the Cassandra cluster.\",\n advanced=True,\n list=True,\n ),\n *LCVectorStoreComponent.inputs,\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 value=4,\n advanced=True,\n ),\n DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n info=\"Search type to use\",\n options=[\"Similarity\", \"Similarity with score threshold\", \"MMR (Max Marginal Relevance)\"],\n value=\"Similarity\",\n advanced=True,\n ),\n FloatInput(\n name=\"search_score_threshold\",\n display_name=\"Search Score Threshold\",\n info=\"Minimum similarity score threshold for search results. \"\n \"(when using 'Similarity with score threshold')\",\n value=0,\n advanced=True,\n ),\n DictInput(\n name=\"search_filter\",\n display_name=\"Search Metadata Filter\",\n info=\"Optional dictionary of filters to apply to the search query.\",\n advanced=True,\n list=True,\n ),\n MessageTextInput(\n name=\"body_search\",\n display_name=\"Search Body\",\n info=\"Document textual search terms to apply to the search query.\",\n advanced=True,\n ),\n BoolInput(\n name=\"enable_body_search\",\n display_name=\"Enable Body Search\",\n info=\"Flag to enable body search. This must be enabled BEFORE the table is created.\",\n value=False,\n advanced=True,\n ),\n ]\n\n @check_cached_vector_store\n def build_vector_store(self) -> Cassandra:\n try:\n import cassio\n from langchain_community.utilities.cassandra import SetupMode\n except ImportError as e:\n msg = \"Could not import cassio integration package. Please install it with `pip install cassio`.\"\n raise ImportError(msg) from e\n\n from uuid import UUID\n\n database_ref = self.database_ref\n\n try:\n UUID(self.database_ref)\n is_astra = True\n except ValueError:\n is_astra = False\n if \",\" in self.database_ref:\n # use a copy because we can't change the type of the parameter\n database_ref = self.database_ref.split(\",\")\n\n if is_astra:\n cassio.init(\n database_id=database_ref,\n token=self.token,\n cluster_kwargs=self.cluster_kwargs,\n )\n else:\n cassio.init(\n contact_points=database_ref,\n username=self.username,\n password=self.token,\n cluster_kwargs=self.cluster_kwargs,\n )\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 body_index_options = [(\"index_analyzer\", \"STANDARD\")] if self.enable_body_search else None\n\n if self.setup_mode == \"Off\":\n setup_mode = SetupMode.OFF\n elif self.setup_mode == \"Sync\":\n setup_mode = SetupMode.SYNC\n else:\n setup_mode = SetupMode.ASYNC\n\n if documents:\n self.log(f\"Adding {len(documents)} documents to the Vector Store.\")\n table = Cassandra.from_documents(\n documents=documents,\n embedding=self.embedding,\n table_name=self.table_name,\n keyspace=self.keyspace,\n ttl_seconds=self.ttl_seconds or None,\n batch_size=self.batch_size,\n body_index_options=body_index_options,\n )\n else:\n self.log(\"No documents to add to the Vector Store.\")\n table = Cassandra(\n embedding=self.embedding,\n table_name=self.table_name,\n keyspace=self.keyspace,\n ttl_seconds=self.ttl_seconds or None,\n body_index_options=body_index_options,\n setup_mode=setup_mode,\n )\n return table\n\n def _map_search_type(self) -> str:\n if self.search_type == \"Similarity with score threshold\":\n return \"similarity_score_threshold\"\n if self.search_type == \"MMR (Max Marginal Relevance)\":\n return \"mmr\"\n return \"similarity\"\n\n def search_documents(self) -> list[Data]:\n vector_store = self.build_vector_store()\n\n self.log(f\"Search input: {self.search_query}\")\n self.log(f\"Search type: {self.search_type}\")\n self.log(f\"Number of results: {self.number_of_results}\")\n\n if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():\n try:\n search_type = self._map_search_type()\n search_args = self._build_search_args()\n\n self.log(f\"Search args: {search_args}\")\n\n docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)\n except KeyError as e:\n if \"content\" in str(e):\n msg = (\n \"You should ingest data through Langflow (or LangChain) to query it in Langflow. \"\n \"Your collection does not contain a field name 'content'.\"\n )\n raise ValueError(msg) from e\n raise\n\n self.log(f\"Retrieved documents: {len(docs)}\")\n\n data = docs_to_data(docs)\n self.status = data\n return data\n return []\n\n def _build_search_args(self):\n args = {\n \"k\": self.number_of_results,\n \"score_threshold\": self.search_score_threshold,\n }\n\n if self.search_filter:\n clean_filter = {k: v for k, v in self.search_filter.items() if k and v}\n if len(clean_filter) > 0:\n args[\"filter\"] = clean_filter\n if self.body_search:\n if not self.enable_body_search:\n msg = \"You should enable body search when creating the table to search the body field.\"\n raise ValueError(msg)\n args[\"body_search\"] = self.body_search\n return args\n\n def get_retriever_kwargs(self):\n search_args = self._build_search_args()\n return {\n \"search_type\": self._map_search_type(),\n \"search_kwargs\": search_args,\n }\n"},"database_ref":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Contact Points / Astra Database ID","dynamic":false,"info":"Contact points for the database (or Astra DB database ID)","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"database_ref","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"embedding":{"_input_type":"HandleInput","advanced":false,"display_name":"Embedding","dynamic":false,"info":"","input_types":["Embeddings"],"list":false,"list_add_label":"Add More","name":"embedding","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"enable_body_search":{"_input_type":"BoolInput","advanced":true,"display_name":"Enable Body Search","dynamic":false,"info":"Flag to enable body search. This must be enabled BEFORE the table is created.","list":false,"list_add_label":"Add More","name":"enable_body_search","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"ingest_data":{"_input_type":"HandleInput","advanced":false,"display_name":"Ingest Data","dynamic":false,"info":"","input_types":["Data","DataFrame"],"list":true,"list_add_label":"Add More","name":"ingest_data","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"keyspace":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Keyspace","dynamic":false,"info":"Table Keyspace (or Astra DB namespace).","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"keyspace","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Results","dynamic":false,"info":"Number of results to return.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":4},"search_filter":{"_input_type":"DictInput","advanced":true,"display_name":"Search Metadata Filter","dynamic":false,"info":"Optional dictionary of filters to apply to the search query.","list":true,"list_add_label":"Add More","name":"search_filter","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"search_query":{"_input_type":"QueryInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Enter a query to run a similarity search.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"search_query","placeholder":"Enter a query...","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"query","value":""},"search_score_threshold":{"_input_type":"FloatInput","advanced":true,"display_name":"Search Score Threshold","dynamic":false,"info":"Minimum similarity score threshold for search results. (when using 'Similarity with score threshold')","list":false,"list_add_label":"Add More","name":"search_score_threshold","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":0.0},"search_type":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Search Type","dynamic":false,"external_options":{},"info":"Search type to use","name":"search_type","options":["Similarity","Similarity with score threshold","MMR (Max Marginal Relevance)"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Similarity"},"setup_mode":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Setup Mode","dynamic":false,"external_options":{},"info":"Configuration mode for setting up the Cassandra table, with options like 'Sync', 'Async', or 'Off'.","name":"setup_mode","options":["Sync","Async","Off"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Sync"},"should_cache_vector_store":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache Vector Store","dynamic":false,"info":"If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.","list":false,"list_add_label":"Add More","name":"should_cache_vector_store","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"table_name":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Table Name","dynamic":false,"info":"The name of the table (or Astra DB collection) where vectors will be stored.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"table_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password / Astra DB Token","dynamic":false,"info":"User password for the database (or Astra DB token).","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"ttl_seconds":{"_input_type":"IntInput","advanced":true,"display_name":"TTL Seconds","dynamic":false,"info":"Optional time-to-live for the added texts.","list":false,"list_add_label":"Add More","name":"ttl_seconds","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"username":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Username","dynamic":false,"info":"Username for the database (leave empty for Astra DB).","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"CassandraChatMemory":{"base_classes":["Memory"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Retrieves and store chat messages from Apache Cassandra.","display_name":"Cassandra Chat Memory","documentation":"","edited":false,"field_order":["database_ref","username","token","keyspace","table_name","session_id","cluster_kwargs"],"frozen":false,"icon":"Cassandra","legacy":false,"metadata":{"code_hash":"f6497182984e","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"langchain_community","version":"0.3.21"},{"name":"cassio","version":null}],"total_dependencies":3},"module":"lfx.components.cassandra.cassandra_chat.CassandraChatMemory"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Memory","group_outputs":false,"method":"build_message_history","name":"memory","selected":"Memory","tool_mode":true,"types":["Memory"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","cluster_kwargs":{"_input_type":"DictInput","advanced":true,"display_name":"Cluster arguments","dynamic":false,"info":"Optional dictionary of additional keyword arguments for the Cassandra cluster.","list":true,"list_add_label":"Add More","name":"cluster_kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.memory.model import LCChatMemoryComponent\nfrom lfx.field_typing.constants import Memory\nfrom lfx.inputs.inputs import DictInput, MessageTextInput, SecretStrInput\n\n\nclass CassandraChatMemory(LCChatMemoryComponent):\n display_name = \"Cassandra Chat Memory\"\n description = \"Retrieves and store chat messages from Apache Cassandra.\"\n name = \"CassandraChatMemory\"\n icon = \"Cassandra\"\n\n inputs = [\n MessageTextInput(\n name=\"database_ref\",\n display_name=\"Contact Points / Astra Database ID\",\n info=\"Contact points for the database (or Astra DB database ID)\",\n required=True,\n ),\n MessageTextInput(\n name=\"username\", display_name=\"Username\", info=\"Username for the database (leave empty for Astra DB).\"\n ),\n SecretStrInput(\n name=\"token\",\n display_name=\"Password / Astra DB Token\",\n info=\"User password for the database (or Astra DB token).\",\n required=True,\n ),\n MessageTextInput(\n name=\"keyspace\",\n display_name=\"Keyspace\",\n info=\"Table Keyspace (or Astra DB namespace).\",\n required=True,\n ),\n MessageTextInput(\n name=\"table_name\",\n display_name=\"Table Name\",\n info=\"The name of the table (or Astra DB collection) where vectors will be stored.\",\n required=True,\n ),\n MessageTextInput(\n name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True\n ),\n DictInput(\n name=\"cluster_kwargs\",\n display_name=\"Cluster arguments\",\n info=\"Optional dictionary of additional keyword arguments for the Cassandra cluster.\",\n advanced=True,\n is_list=True,\n ),\n ]\n\n def build_message_history(self) -> Memory:\n from langchain_community.chat_message_histories import CassandraChatMessageHistory\n\n try:\n import cassio\n except ImportError as e:\n msg = \"Could not import cassio integration package. Please install it with `pip install cassio`.\"\n raise ImportError(msg) from e\n\n from uuid import UUID\n\n database_ref = self.database_ref\n\n try:\n UUID(self.database_ref)\n is_astra = True\n except ValueError:\n is_astra = False\n if \",\" in self.database_ref:\n # use a copy because we can't change the type of the parameter\n database_ref = self.database_ref.split(\",\")\n\n if is_astra:\n cassio.init(\n database_id=database_ref,\n token=self.token,\n cluster_kwargs=self.cluster_kwargs,\n )\n else:\n cassio.init(\n contact_points=database_ref,\n username=self.username,\n password=self.token,\n cluster_kwargs=self.cluster_kwargs,\n )\n\n return CassandraChatMessageHistory(\n session_id=self.session_id,\n table_name=self.table_name,\n keyspace=self.keyspace,\n )\n"},"database_ref":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Contact Points / Astra Database ID","dynamic":false,"info":"Contact points for the database (or Astra DB database ID)","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"database_ref","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"keyspace":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Keyspace","dynamic":false,"info":"Table Keyspace (or Astra DB namespace).","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"keyspace","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"session_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Session ID","dynamic":false,"info":"Session ID for the message.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"session_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"table_name":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Table Name","dynamic":false,"info":"The name of the table (or Astra DB collection) where vectors will be stored.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"table_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password / Astra DB Token","dynamic":false,"info":"User password for the database (or Astra DB token).","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Username","dynamic":false,"info":"Username for the database (leave empty for Astra DB).","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"CassandraGraph":{"base_classes":["Data","DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Cassandra Graph Vector Store","display_name":"Cassandra Graph","documentation":"","edited":false,"field_order":["database_ref","username","token","keyspace","table_name","setup_mode","cluster_kwargs","ingest_data","search_query","should_cache_vector_store","embedding","number_of_results","search_type","depth","search_score_threshold","search_filter"],"frozen":false,"icon":"Cassandra","legacy":false,"metadata":{"code_hash":"26c63f80745e","dependencies":{"dependencies":[{"name":"langchain_community","version":"0.3.21"},{"name":"lfx","version":null},{"name":"cassio","version":null}],"total_dependencies":3},"module":"lfx.components.cassandra.cassandra_graph.CassandraGraphVectorStoreComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Search Results","group_outputs":false,"method":"search_documents","name":"search_results","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","cluster_kwargs":{"_input_type":"DictInput","advanced":true,"display_name":"Cluster arguments","dynamic":false,"info":"Optional dictionary of additional keyword arguments for the Cassandra cluster.","list":true,"list_add_label":"Add More","name":"cluster_kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from uuid import UUID\n\nfrom langchain_community.graph_vectorstores import CassandraGraphVectorStore\n\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.helpers.data import docs_to_data\nfrom lfx.inputs.inputs import DictInput, FloatInput\nfrom lfx.io import (\n DropdownInput,\n HandleInput,\n IntInput,\n MessageTextInput,\n SecretStrInput,\n)\nfrom lfx.schema.data import Data\n\n\nclass CassandraGraphVectorStoreComponent(LCVectorStoreComponent):\n display_name = \"Cassandra Graph\"\n description = \"Cassandra Graph Vector Store\"\n name = \"CassandraGraph\"\n icon = \"Cassandra\"\n\n inputs = [\n MessageTextInput(\n name=\"database_ref\",\n display_name=\"Contact Points / Astra Database ID\",\n info=\"Contact points for the database (or Astra DB database ID)\",\n required=True,\n ),\n MessageTextInput(\n name=\"username\", display_name=\"Username\", info=\"Username for the database (leave empty for Astra DB).\"\n ),\n SecretStrInput(\n name=\"token\",\n display_name=\"Password / Astra DB Token\",\n info=\"User password for the database (or Astra DB token).\",\n required=True,\n ),\n MessageTextInput(\n name=\"keyspace\",\n display_name=\"Keyspace\",\n info=\"Table Keyspace (or Astra DB namespace).\",\n required=True,\n ),\n MessageTextInput(\n name=\"table_name\",\n display_name=\"Table Name\",\n info=\"The name of the table (or Astra DB collection) where vectors will be stored.\",\n required=True,\n ),\n DropdownInput(\n name=\"setup_mode\",\n display_name=\"Setup Mode\",\n info=\"Configuration mode for setting up the Cassandra table, with options like 'Sync' or 'Off'.\",\n options=[\"Sync\", \"Off\"],\n value=\"Sync\",\n advanced=True,\n ),\n DictInput(\n name=\"cluster_kwargs\",\n display_name=\"Cluster arguments\",\n info=\"Optional dictionary of additional keyword arguments for the Cassandra cluster.\",\n advanced=True,\n list=True,\n ),\n *LCVectorStoreComponent.inputs,\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 value=4,\n advanced=True,\n ),\n DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n info=\"Search type to use\",\n options=[\n \"Traversal\",\n \"MMR traversal\",\n \"Similarity\",\n \"Similarity with score threshold\",\n \"MMR (Max Marginal Relevance)\",\n ],\n value=\"Traversal\",\n advanced=True,\n ),\n IntInput(\n name=\"depth\",\n display_name=\"Depth of traversal\",\n info=\"The maximum depth of edges to traverse. (when using 'Traversal' or 'MMR traversal')\",\n value=1,\n advanced=True,\n ),\n FloatInput(\n name=\"search_score_threshold\",\n display_name=\"Search Score Threshold\",\n info=\"Minimum similarity score threshold for search results. \"\n \"(when using 'Similarity with score threshold')\",\n value=0,\n advanced=True,\n ),\n DictInput(\n name=\"search_filter\",\n display_name=\"Search Metadata Filter\",\n info=\"Optional dictionary of filters to apply to the search query.\",\n advanced=True,\n list=True,\n ),\n ]\n\n @check_cached_vector_store\n def build_vector_store(self) -> CassandraGraphVectorStore:\n try:\n import cassio\n from langchain_community.utilities.cassandra import SetupMode\n except ImportError as e:\n msg = \"Could not import cassio integration package. Please install it with `pip install cassio`.\"\n raise ImportError(msg) from e\n\n database_ref = self.database_ref\n\n try:\n UUID(self.database_ref)\n is_astra = True\n except ValueError:\n is_astra = False\n if \",\" in self.database_ref:\n # use a copy because we can't change the type of the parameter\n database_ref = self.database_ref.split(\",\")\n\n if is_astra:\n cassio.init(\n database_id=database_ref,\n token=self.token,\n cluster_kwargs=self.cluster_kwargs,\n )\n else:\n cassio.init(\n contact_points=database_ref,\n username=self.username,\n password=self.token,\n cluster_kwargs=self.cluster_kwargs,\n )\n\n self.ingest_data = self._prepare_ingest_data()\n\n documents = []\n\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 setup_mode = SetupMode.OFF if self.setup_mode == \"Off\" else SetupMode.SYNC\n\n if documents:\n self.log(f\"Adding {len(documents)} documents to the Vector Store.\")\n store = CassandraGraphVectorStore.from_documents(\n documents=documents,\n embedding=self.embedding,\n node_table=self.table_name,\n keyspace=self.keyspace,\n )\n else:\n self.log(\"No documents to add to the Vector Store.\")\n store = CassandraGraphVectorStore(\n embedding=self.embedding,\n node_table=self.table_name,\n keyspace=self.keyspace,\n setup_mode=setup_mode,\n )\n return store\n\n def _map_search_type(self) -> str:\n if self.search_type == \"Similarity\":\n return \"similarity\"\n if self.search_type == \"Similarity with score threshold\":\n return \"similarity_score_threshold\"\n if self.search_type == \"MMR (Max Marginal Relevance)\":\n return \"mmr\"\n if self.search_type == \"MMR Traversal\":\n return \"mmr_traversal\"\n return \"traversal\"\n\n def search_documents(self) -> list[Data]:\n vector_store = self.build_vector_store()\n\n self.log(f\"Search input: {self.search_query}\")\n self.log(f\"Search type: {self.search_type}\")\n self.log(f\"Number of results: {self.number_of_results}\")\n\n if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():\n try:\n search_type = self._map_search_type()\n search_args = self._build_search_args()\n\n self.log(f\"Search args: {search_args}\")\n\n docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)\n except KeyError as e:\n if \"content\" in str(e):\n msg = (\n \"You should ingest data through Langflow (or LangChain) to query it in Langflow. \"\n \"Your collection does not contain a field name 'content'.\"\n )\n raise ValueError(msg) from e\n raise\n\n self.log(f\"Retrieved documents: {len(docs)}\")\n\n data = docs_to_data(docs)\n self.status = data\n return data\n return []\n\n def _build_search_args(self):\n args = {\n \"k\": self.number_of_results,\n \"score_threshold\": self.search_score_threshold,\n \"depth\": self.depth,\n }\n\n if self.search_filter:\n clean_filter = {k: v for k, v in self.search_filter.items() if k and v}\n if len(clean_filter) > 0:\n args[\"filter\"] = clean_filter\n return args\n\n def get_retriever_kwargs(self):\n search_args = self._build_search_args()\n return {\n \"search_type\": self._map_search_type(),\n \"search_kwargs\": search_args,\n }\n"},"database_ref":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Contact Points / Astra Database ID","dynamic":false,"info":"Contact points for the database (or Astra DB database ID)","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"database_ref","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"depth":{"_input_type":"IntInput","advanced":true,"display_name":"Depth of traversal","dynamic":false,"info":"The maximum depth of edges to traverse. (when using 'Traversal' or 'MMR traversal')","list":false,"list_add_label":"Add More","name":"depth","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":1},"embedding":{"_input_type":"HandleInput","advanced":false,"display_name":"Embedding","dynamic":false,"info":"","input_types":["Embeddings"],"list":false,"list_add_label":"Add More","name":"embedding","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"ingest_data":{"_input_type":"HandleInput","advanced":false,"display_name":"Ingest Data","dynamic":false,"info":"","input_types":["Data","DataFrame"],"list":true,"list_add_label":"Add More","name":"ingest_data","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"keyspace":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Keyspace","dynamic":false,"info":"Table Keyspace (or Astra DB namespace).","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"keyspace","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Results","dynamic":false,"info":"Number of results to return.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":4},"search_filter":{"_input_type":"DictInput","advanced":true,"display_name":"Search Metadata Filter","dynamic":false,"info":"Optional dictionary of filters to apply to the search query.","list":true,"list_add_label":"Add More","name":"search_filter","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"search_query":{"_input_type":"QueryInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Enter a query to run a similarity search.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"search_query","placeholder":"Enter a query...","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"query","value":""},"search_score_threshold":{"_input_type":"FloatInput","advanced":true,"display_name":"Search Score Threshold","dynamic":false,"info":"Minimum similarity score threshold for search results. (when using 'Similarity with score threshold')","list":false,"list_add_label":"Add More","name":"search_score_threshold","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":0.0},"search_type":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Search Type","dynamic":false,"external_options":{},"info":"Search type to use","name":"search_type","options":["Traversal","MMR traversal","Similarity","Similarity with score threshold","MMR (Max Marginal Relevance)"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Traversal"},"setup_mode":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Setup Mode","dynamic":false,"external_options":{},"info":"Configuration mode for setting up the Cassandra table, with options like 'Sync' or 'Off'.","name":"setup_mode","options":["Sync","Off"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Sync"},"should_cache_vector_store":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache Vector Store","dynamic":false,"info":"If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.","list":false,"list_add_label":"Add More","name":"should_cache_vector_store","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"table_name":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Table Name","dynamic":false,"info":"The name of the table (or Astra DB collection) where vectors will be stored.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"table_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password / Astra DB Token","dynamic":false,"info":"User password for the database (or Astra DB token).","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Username","dynamic":false,"info":"Username for the database (leave empty for Astra DB).","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false}}],["chroma",{"Chroma":{"base_classes":["Data","DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Chroma Vector Store with search capabilities","display_name":"Chroma DB","documentation":"","edited":false,"field_order":["collection_name","persist_directory","ingest_data","search_query","should_cache_vector_store","embedding","chroma_server_cors_allow_origins","chroma_server_host","chroma_server_http_port","chroma_server_grpc_port","chroma_server_ssl_enabled","allow_duplicates","search_type","number_of_results","limit"],"frozen":false,"icon":"Chroma","legacy":false,"metadata":{"code_hash":"82d38624f19a","dependencies":{"dependencies":[{"name":"chromadb","version":"1.2.2"},{"name":"langchain_chroma","version":"0.2.6"},{"name":"typing_extensions","version":"4.15.0"},{"name":"lfx","version":null},{"name":"langchain_community","version":"0.3.21"}],"total_dependencies":5},"module":"lfx.components.chroma.chroma.ChromaVectorStoreComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Search Results","group_outputs":false,"method":"search_documents","name":"search_results","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","allow_duplicates":{"_input_type":"BoolInput","advanced":true,"display_name":"Allow Duplicates","dynamic":false,"info":"If false, will not add documents that are already in the Vector Store.","list":false,"list_add_label":"Add More","name":"allow_duplicates","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"chroma_server_cors_allow_origins":{"_input_type":"StrInput","advanced":true,"display_name":"Server CORS Allow Origins","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"chroma_server_cors_allow_origins","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"chroma_server_grpc_port":{"_input_type":"IntInput","advanced":true,"display_name":"Server gRPC Port","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"chroma_server_grpc_port","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"chroma_server_host":{"_input_type":"StrInput","advanced":true,"display_name":"Server Host","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"chroma_server_host","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"chroma_server_http_port":{"_input_type":"IntInput","advanced":true,"display_name":"Server HTTP Port","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"chroma_server_http_port","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"chroma_server_ssl_enabled":{"_input_type":"BoolInput","advanced":true,"display_name":"Server SSL Enabled","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"chroma_server_ssl_enabled","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from copy import deepcopy\nfrom typing import TYPE_CHECKING\n\nfrom chromadb.config import Settings\nfrom langchain_chroma import Chroma\nfrom typing_extensions import override\n\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.base.vectorstores.utils import chroma_collection_to_data\nfrom lfx.inputs.inputs import BoolInput, DropdownInput, HandleInput, IntInput, StrInput\nfrom lfx.schema.data import Data\n\nif TYPE_CHECKING:\n from lfx.schema.dataframe import DataFrame\n\n\nclass ChromaVectorStoreComponent(LCVectorStoreComponent):\n \"\"\"Chroma Vector Store with search capabilities.\"\"\"\n\n display_name: str = \"Chroma DB\"\n description: str = \"Chroma Vector Store with search capabilities\"\n name = \"Chroma\"\n icon = \"Chroma\"\n\n inputs = [\n StrInput(\n name=\"collection_name\",\n display_name=\"Collection Name\",\n value=\"langflow\",\n ),\n StrInput(\n name=\"persist_directory\",\n display_name=\"Persist Directory\",\n ),\n *LCVectorStoreComponent.inputs,\n HandleInput(name=\"embedding\", display_name=\"Embedding\", input_types=[\"Embeddings\"]),\n StrInput(\n name=\"chroma_server_cors_allow_origins\",\n display_name=\"Server CORS Allow Origins\",\n advanced=True,\n ),\n StrInput(\n name=\"chroma_server_host\",\n display_name=\"Server Host\",\n advanced=True,\n ),\n IntInput(\n name=\"chroma_server_http_port\",\n display_name=\"Server HTTP Port\",\n advanced=True,\n ),\n IntInput(\n name=\"chroma_server_grpc_port\",\n display_name=\"Server gRPC Port\",\n advanced=True,\n ),\n BoolInput(\n name=\"chroma_server_ssl_enabled\",\n display_name=\"Server SSL Enabled\",\n advanced=True,\n ),\n BoolInput(\n name=\"allow_duplicates\",\n display_name=\"Allow Duplicates\",\n advanced=True,\n info=\"If false, will not add documents that are already in the Vector Store.\",\n ),\n DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n options=[\"Similarity\", \"MMR\"],\n value=\"Similarity\",\n advanced=True,\n ),\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=10,\n ),\n IntInput(\n name=\"limit\",\n display_name=\"Limit\",\n advanced=True,\n info=\"Limit the number of records to compare when Allow Duplicates is False.\",\n ),\n ]\n\n @override\n @check_cached_vector_store\n def build_vector_store(self) -> Chroma:\n \"\"\"Builds the Chroma object.\"\"\"\n try:\n from chromadb import Client\n from langchain_chroma import Chroma\n except ImportError as e:\n msg = \"Could not import Chroma integration package. Please install it with `pip install langchain-chroma`.\"\n raise ImportError(msg) from e\n # Chroma settings\n chroma_settings = None\n client = None\n if self.chroma_server_host:\n chroma_settings = Settings(\n chroma_server_cors_allow_origins=self.chroma_server_cors_allow_origins or [],\n chroma_server_host=self.chroma_server_host,\n chroma_server_http_port=self.chroma_server_http_port or None,\n chroma_server_grpc_port=self.chroma_server_grpc_port or None,\n chroma_server_ssl_enabled=self.chroma_server_ssl_enabled,\n )\n client = Client(settings=chroma_settings)\n\n # Check persist_directory and expand it if it is a relative path\n persist_directory = self.resolve_path(self.persist_directory) if self.persist_directory is not None else None\n\n chroma = Chroma(\n persist_directory=persist_directory,\n client=client,\n embedding_function=self.embedding,\n collection_name=self.collection_name,\n )\n\n self._add_documents_to_vector_store(chroma)\n limit = int(self.limit) if self.limit is not None and str(self.limit).strip() else None\n self.status = chroma_collection_to_data(chroma.get(limit=limit))\n return chroma\n\n def _add_documents_to_vector_store(self, vector_store: \"Chroma\") -> None:\n \"\"\"Adds documents to the Vector Store.\"\"\"\n ingest_data: list | Data | DataFrame = self.ingest_data\n if not ingest_data:\n self.status = \"\"\n return\n\n # Convert DataFrame to Data if needed using parent's method\n ingest_data = self._prepare_ingest_data()\n\n stored_documents_without_id = []\n if self.allow_duplicates:\n stored_data = []\n else:\n limit = int(self.limit) if self.limit is not None and str(self.limit).strip() else None\n stored_data = chroma_collection_to_data(vector_store.get(limit=limit))\n for value in deepcopy(stored_data):\n del value.id\n stored_documents_without_id.append(value)\n\n documents = []\n for _input in ingest_data or []:\n if isinstance(_input, Data):\n if _input not in stored_documents_without_id:\n documents.append(_input.to_lc_document())\n else:\n msg = \"Vector Store Inputs must be Data objects.\"\n raise TypeError(msg)\n\n if documents and self.embedding is not None:\n self.log(f\"Adding {len(documents)} documents to the Vector Store.\")\n # Filter complex metadata to prevent ChromaDB errors\n try:\n from langchain_community.vectorstores.utils import filter_complex_metadata\n\n filtered_documents = filter_complex_metadata(documents)\n vector_store.add_documents(filtered_documents)\n except ImportError:\n self.log(\"Warning: Could not import filter_complex_metadata. Adding documents without filtering.\")\n vector_store.add_documents(documents)\n else:\n self.log(\"No documents to add to the Vector Store.\")\n"},"collection_name":{"_input_type":"StrInput","advanced":false,"display_name":"Collection Name","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"collection_name","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"langflow"},"embedding":{"_input_type":"HandleInput","advanced":false,"display_name":"Embedding","dynamic":false,"info":"","input_types":["Embeddings"],"list":false,"list_add_label":"Add More","name":"embedding","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"ingest_data":{"_input_type":"HandleInput","advanced":false,"display_name":"Ingest Data","dynamic":false,"info":"","input_types":["Data","DataFrame"],"list":true,"list_add_label":"Add More","name":"ingest_data","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"limit":{"_input_type":"IntInput","advanced":true,"display_name":"Limit","dynamic":false,"info":"Limit the number of records to compare when Allow Duplicates is False.","list":false,"list_add_label":"Add More","name":"limit","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Results","dynamic":false,"info":"Number of results to return.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":10},"persist_directory":{"_input_type":"StrInput","advanced":false,"display_name":"Persist Directory","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"persist_directory","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"search_query":{"_input_type":"QueryInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Enter a query to run a similarity search.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"search_query","placeholder":"Enter a query...","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"query","value":""},"search_type":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Search Type","dynamic":false,"external_options":{},"info":"","name":"search_type","options":["Similarity","MMR"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Similarity"},"should_cache_vector_store":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache Vector Store","dynamic":false,"info":"If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.","list":false,"list_add_label":"Add More","name":"should_cache_vector_store","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true}},"tool_mode":false}}],["cleanlab",{"CleanlabEvaluator":{"base_classes":["float","Message","number"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Evaluates any LLM response using Cleanlab and outputs trust score and explanation.","display_name":"Cleanlab Evaluator","documentation":"","edited":false,"field_order":["system_prompt","prompt","response","api_key","model","quality_preset"],"frozen":false,"icon":"Cleanlab","legacy":false,"metadata":{"code_hash":"06963c804ffe","dependencies":{"dependencies":[{"name":"cleanlab_tlm","version":"1.1.36"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.cleanlab.cleanlab_evaluator.CleanlabEvaluator"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Response","group_outputs":false,"method":"pass_response","name":"response_passthrough","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Trust Score","group_outputs":false,"method":"get_score","name":"score","selected":"number","tool_mode":true,"types":["number","float"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Explanation","group_outputs":false,"method":"get_explanation","name":"explanation","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Cleanlab API Key","dynamic":false,"info":"Your Cleanlab API key.","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from cleanlab_tlm import TLM\n\nfrom lfx.custom import Component\nfrom lfx.io import (\n DropdownInput,\n MessageTextInput,\n Output,\n SecretStrInput,\n)\nfrom lfx.schema.message import Message\n\n\nclass CleanlabEvaluator(Component):\n \"\"\"A component that evaluates the trustworthiness of LLM responses using Cleanlab.\n\n This component takes a prompt and response pair, along with optional system instructions,\n and uses Cleanlab's evaluation algorithms to generate a trust score and explanation.\n\n Inputs:\n - system_prompt (MessageTextInput): Optional system-level instructions prepended to the user prompt.\n - prompt (MessageTextInput): The user's prompt or query sent to the LLM.\n - response (MessageTextInput): The response generated by the LLM to be evaluated. This should come from the\n LLM component, i.e. OpenAI, Gemini, etc.\n - api_key (SecretStrInput): Your Cleanlab API key.\n - model (DropdownInput): The model used by Cleanlab to evaluate the response (can differ from the\n generation model).\n - quality_preset (DropdownInput): Tradeoff setting for accuracy vs. speed and cost. Higher presets are\n slower but more accurate.\n\n Outputs:\n - response_passthrough (Message): The original response, passed through for downstream use.\n - score (number): A float between 0 and 1 indicating Cleanlab's trustworthiness score for the response.\n - explanation (Message): A textual explanation of why the response received its score.\n\n This component works well in conjunction with the CleanlabRemediator to create a complete trust evaluation\n and remediation pipeline.\n\n More details on the evaluation metrics can be found here: https://help.cleanlab.ai/tlm/tutorials/tlm/\n \"\"\"\n\n display_name = \"Cleanlab Evaluator\"\n description = \"Evaluates any LLM response using Cleanlab and outputs trust score and explanation.\"\n icon = \"Cleanlab\"\n name = \"CleanlabEvaluator\"\n\n inputs = [\n MessageTextInput(\n name=\"system_prompt\",\n display_name=\"System Message\",\n info=\"System-level instructions prepended to the user query.\",\n value=\"\",\n ),\n MessageTextInput(\n name=\"prompt\",\n display_name=\"Prompt\",\n info=\"The user's query to the model.\",\n required=True,\n ),\n MessageTextInput(\n name=\"response\",\n display_name=\"Response\",\n info=\"The response to the user's query.\",\n required=True,\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Cleanlab API Key\",\n info=\"Your Cleanlab API key.\",\n required=True,\n ),\n DropdownInput(\n name=\"model\",\n display_name=\"Cleanlab Evaluation Model\",\n options=[\n \"gpt-4.1\",\n \"gpt-4.1-mini\",\n \"gpt-4.1-nano\",\n \"o4-mini\",\n \"o3\",\n \"gpt-4.5-preview\",\n \"gpt-4o-mini\",\n \"gpt-4o\",\n \"o3-mini\",\n \"o1\",\n \"o1-mini\",\n \"gpt-4\",\n \"gpt-3.5-turbo-16k\",\n \"claude-3.7-sonnet\",\n \"claude-3.5-sonnet-v2\",\n \"claude-3.5-sonnet\",\n \"claude-3.5-haiku\",\n \"claude-3-haiku\",\n \"nova-micro\",\n \"nova-lite\",\n \"nova-pro\",\n ],\n info=\"The model Cleanlab uses to evaluate the response. This does NOT need to be the same model that \"\n \"generated the response.\",\n value=\"gpt-4o-mini\",\n required=True,\n advanced=True,\n ),\n DropdownInput(\n name=\"quality_preset\",\n display_name=\"Quality Preset\",\n options=[\"base\", \"low\", \"medium\", \"high\", \"best\"],\n value=\"medium\",\n info=\"This determines the accuracy, latency, and cost of the evaluation. Higher quality is generally \"\n \"slower but more accurate.\",\n required=True,\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(\n display_name=\"Response\",\n name=\"response_passthrough\",\n method=\"pass_response\",\n types=[\"Message\"],\n ),\n Output(display_name=\"Trust Score\", name=\"score\", method=\"get_score\", types=[\"number\"]),\n Output(\n display_name=\"Explanation\",\n name=\"explanation\",\n method=\"get_explanation\",\n types=[\"Message\"],\n ),\n ]\n\n def _evaluate_once(self):\n if not hasattr(self, \"_cached_result\"):\n full_prompt = f\"{self.system_prompt}\\n\\n{self.prompt}\" if self.system_prompt else self.prompt\n tlm = TLM(\n api_key=self.api_key,\n options={\"log\": [\"explanation\"], \"model\": self.model},\n quality_preset=self.quality_preset,\n )\n self._cached_result = tlm.get_trustworthiness_score(full_prompt, self.response)\n return self._cached_result\n\n def get_score(self) -> float:\n result = self._evaluate_once()\n score = result.get(\"trustworthiness_score\", 0.0)\n self.status = f\"Trust score: {score:.2f}\"\n return score\n\n def get_explanation(self) -> Message:\n result = self._evaluate_once()\n explanation = result.get(\"log\", {}).get(\"explanation\", \"No explanation returned.\")\n return Message(text=explanation)\n\n def pass_response(self) -> Message:\n self.status = \"Passing through response.\"\n return Message(text=self.response)\n"},"model":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Cleanlab Evaluation Model","dynamic":false,"external_options":{},"info":"The model Cleanlab uses to evaluate the response. This does NOT need to be the same model that generated the response.","name":"model","options":["gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","o4-mini","o3","gpt-4.5-preview","gpt-4o-mini","gpt-4o","o3-mini","o1","o1-mini","gpt-4","gpt-3.5-turbo-16k","claude-3.7-sonnet","claude-3.5-sonnet-v2","claude-3.5-sonnet","claude-3.5-haiku","claude-3-haiku","nova-micro","nova-lite","nova-pro"],"options_metadata":[],"placeholder":"","required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"gpt-4o-mini"},"prompt":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Prompt","dynamic":false,"info":"The user's query to the model.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"prompt","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"quality_preset":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Quality Preset","dynamic":false,"external_options":{},"info":"This determines the accuracy, latency, and cost of the evaluation. Higher quality is generally slower but more accurate.","name":"quality_preset","options":["base","low","medium","high","best"],"options_metadata":[],"placeholder":"","required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"medium"},"response":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Response","dynamic":false,"info":"The response to the user's query.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"response","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"system_prompt":{"_input_type":"MessageTextInput","advanced":false,"display_name":"System Message","dynamic":false,"info":"System-level instructions prepended to the user query.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"system_prompt","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"CleanlabRAGEvaluator":{"base_classes":["Data","dict","float","Message","number"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Evaluates context, query, and response from a RAG pipeline using Cleanlab and outputs trust metrics.","display_name":"Cleanlab RAG Evaluator","documentation":"","edited":false,"field_order":["api_key","model","quality_preset","context","query","response","run_context_sufficiency","run_response_groundedness","run_response_helpfulness","run_query_ease"],"frozen":false,"icon":"Cleanlab","legacy":false,"metadata":{"code_hash":"f48b57ff7ca3","dependencies":{"dependencies":[{"name":"cleanlab_tlm","version":"1.1.36"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.cleanlab.cleanlab_rag_evaluator.CleanlabRAGEvaluator"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Response","group_outputs":false,"method":"pass_response","name":"response_passthrough","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Trust Score","group_outputs":false,"method":"get_trust_score","name":"trust_score","selected":"number","tool_mode":true,"types":["number","float"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Explanation","group_outputs":false,"method":"get_trust_explanation","name":"trust_explanation","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Other Evals","group_outputs":false,"method":"get_other_scores","name":"other_scores","selected":"Data","tool_mode":true,"types":["Data","dict"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Evaluation Summary","group_outputs":false,"method":"get_evaluation_summary","name":"evaluation_summary","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Cleanlab API Key","dynamic":false,"info":"Your Cleanlab API key.","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from cleanlab_tlm import TrustworthyRAG, get_default_evals\n\nfrom lfx.custom import Component\nfrom lfx.io import (\n BoolInput,\n DropdownInput,\n MessageTextInput,\n Output,\n SecretStrInput,\n)\nfrom lfx.schema.message import Message\n\n\nclass CleanlabRAGEvaluator(Component):\n \"\"\"A component that evaluates the quality of RAG (Retrieval-Augmented Generation) outputs using Cleanlab.\n\n This component takes a query, retrieved context, and generated response from a RAG pipeline,\n and uses Cleanlab's evaluation algorithms to assess various aspects of the RAG system's performance.\n\n The component can evaluate:\n - Overall trustworthiness of the LLM generated response\n - Context sufficiency (whether the retrieved context contains information needed to answer the query)\n - Response groundedness (whether the response is supported directly by the context)\n - Response helpfulness (whether the response effectively addresses the user's query)\n - Query ease (whether the user query seems easy for an AI system to properly handle, useful to diagnose\n queries that are: complex, vague, tricky, or disgruntled-sounding)\n\n Outputs:\n - Trust Score: A score between 0-1 corresponding to the trustworthiness of the response. A higher score\n indicates a higher confidence that the response is correct/good.\n - Explanation: An LLM generated explanation of the trustworthiness assessment\n - Other Evals: Additional evaluation metrics for selected evaluation types in the \"Controls\" tab\n - Evaluation Summary: A comprehensive summary of context, query, response, and selected evaluation results\n\n This component works well in conjunction with the CleanlabRemediator to create a complete trust evaluation\n and remediation pipeline.\n\n More details on the evaluation metrics can be found here: https://help.cleanlab.ai/tlm/use-cases/tlm_rag/\n \"\"\"\n\n display_name = \"Cleanlab RAG Evaluator\"\n description = \"Evaluates context, query, and response from a RAG pipeline using Cleanlab and outputs trust metrics.\"\n icon = \"Cleanlab\"\n name = \"CleanlabRAGEvaluator\"\n\n inputs = [\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Cleanlab API Key\",\n info=\"Your Cleanlab API key.\",\n required=True,\n ),\n DropdownInput(\n name=\"model\",\n display_name=\"Cleanlab Evaluation Model\",\n options=[\n \"gpt-4.1\",\n \"gpt-4.1-mini\",\n \"gpt-4.1-nano\",\n \"o4-mini\",\n \"o3\",\n \"gpt-4.5-preview\",\n \"gpt-4o-mini\",\n \"gpt-4o\",\n \"o3-mini\",\n \"o1\",\n \"o1-mini\",\n \"gpt-4\",\n \"gpt-3.5-turbo-16k\",\n \"claude-3.7-sonnet\",\n \"claude-3.5-sonnet-v2\",\n \"claude-3.5-sonnet\",\n \"claude-3.5-haiku\",\n \"claude-3-haiku\",\n \"nova-micro\",\n \"nova-lite\",\n \"nova-pro\",\n ],\n info=\"The model Cleanlab uses to evaluate the context, query, and response. This does NOT need to be \"\n \"the same model that generated the response.\",\n value=\"gpt-4o-mini\",\n required=True,\n advanced=True,\n ),\n DropdownInput(\n name=\"quality_preset\",\n display_name=\"Quality Preset\",\n options=[\"base\", \"low\", \"medium\"],\n value=\"medium\",\n info=\"This determines the accuracy, latency, and cost of the evaluation. Higher quality is generally \"\n \"slower but more accurate.\",\n required=True,\n advanced=True,\n ),\n MessageTextInput(\n name=\"context\",\n display_name=\"Context\",\n info=\"The context retrieved for the given query.\",\n required=True,\n ),\n MessageTextInput(\n name=\"query\",\n display_name=\"Query\",\n info=\"The user's query.\",\n required=True,\n ),\n MessageTextInput(\n name=\"response\",\n display_name=\"Response\",\n info=\"The response generated by the LLM.\",\n required=True,\n ),\n BoolInput(\n name=\"run_context_sufficiency\",\n display_name=\"Run Context Sufficiency\",\n value=False,\n advanced=True,\n ),\n BoolInput(\n name=\"run_response_groundedness\",\n display_name=\"Run Response Groundedness\",\n value=False,\n advanced=True,\n ),\n BoolInput(\n name=\"run_response_helpfulness\",\n display_name=\"Run Response Helpfulness\",\n value=False,\n advanced=True,\n ),\n BoolInput(\n name=\"run_query_ease\",\n display_name=\"Run Query Ease\",\n value=False,\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Response\", name=\"response_passthrough\", method=\"pass_response\", types=[\"Message\"]),\n Output(display_name=\"Trust Score\", name=\"trust_score\", method=\"get_trust_score\", types=[\"number\"]),\n Output(display_name=\"Explanation\", name=\"trust_explanation\", method=\"get_trust_explanation\", types=[\"Message\"]),\n Output(display_name=\"Other Evals\", name=\"other_scores\", method=\"get_other_scores\", types=[\"Data\"]),\n Output(\n display_name=\"Evaluation Summary\",\n name=\"evaluation_summary\",\n method=\"get_evaluation_summary\",\n types=[\"Message\"],\n ),\n ]\n\n def _evaluate_once(self):\n if not hasattr(self, \"_cached_result\"):\n try:\n self.status = \"Configuring selected evals...\"\n default_evals = get_default_evals()\n enabled_names = []\n if self.run_context_sufficiency:\n enabled_names.append(\"context_sufficiency\")\n if self.run_response_groundedness:\n enabled_names.append(\"response_groundedness\")\n if self.run_response_helpfulness:\n enabled_names.append(\"response_helpfulness\")\n if self.run_query_ease:\n enabled_names.append(\"query_ease\")\n\n selected_evals = [e for e in default_evals if e.name in enabled_names]\n\n validator = TrustworthyRAG(\n api_key=self.api_key,\n quality_preset=self.quality_preset,\n options={\"log\": [\"explanation\"], \"model\": self.model},\n evals=selected_evals,\n )\n\n self.status = f\"Running evals: {[e.name for e in selected_evals]}\"\n self._cached_result = validator.score(\n query=self.query,\n context=self.context,\n response=self.response,\n )\n self.status = \"Evaluation complete.\"\n\n except Exception as e: # noqa: BLE001\n self.status = f\"Evaluation failed: {e!s}\"\n self._cached_result = {}\n return self._cached_result\n\n def pass_response(self) -> Message:\n self.status = \"Passing through response.\"\n return Message(text=self.response)\n\n def get_trust_score(self) -> float:\n score = self._evaluate_once().get(\"trustworthiness\", {}).get(\"score\", 0.0)\n self.status = f\"Trust Score: {score:.3f}\"\n return score\n\n def get_trust_explanation(self) -> Message:\n explanation = self._evaluate_once().get(\"trustworthiness\", {}).get(\"log\", {}).get(\"explanation\", \"\")\n self.status = \"Trust explanation extracted.\"\n return Message(text=explanation)\n\n def get_other_scores(self) -> dict:\n result = self._evaluate_once()\n\n selected = {\n \"context_sufficiency\": self.run_context_sufficiency,\n \"response_groundedness\": self.run_response_groundedness,\n \"response_helpfulness\": self.run_response_helpfulness,\n \"query_ease\": self.run_query_ease,\n }\n\n filtered_scores = {key: result[key][\"score\"] for key, include in selected.items() if include and key in result}\n\n self.status = f\"{len(filtered_scores)} other evals returned.\"\n return filtered_scores\n\n def get_evaluation_summary(self) -> Message:\n result = self._evaluate_once()\n\n query_text = self.query.strip()\n context_text = self.context.strip()\n response_text = self.response.strip()\n\n trust = result.get(\"trustworthiness\", {}).get(\"score\", 0.0)\n trust_exp = result.get(\"trustworthiness\", {}).get(\"log\", {}).get(\"explanation\", \"\")\n\n selected = {\n \"context_sufficiency\": self.run_context_sufficiency,\n \"response_groundedness\": self.run_response_groundedness,\n \"response_helpfulness\": self.run_response_helpfulness,\n \"query_ease\": self.run_query_ease,\n }\n\n other_scores = {key: result[key][\"score\"] for key, include in selected.items() if include and key in result}\n\n metrics = f\"Trustworthiness: {trust:.3f}\"\n if trust_exp:\n metrics += f\"\\nExplanation: {trust_exp}\"\n if other_scores:\n metrics += \"\\n\" + \"\\n\".join(f\"{k.replace('_', ' ').title()}: {v:.3f}\" for k, v in other_scores.items())\n\n summary = (\n f\"Query:\\n{query_text}\\n\"\n \"-----\\n\"\n f\"Context:\\n{context_text}\\n\"\n \"-----\\n\"\n f\"Response:\\n{response_text}\\n\"\n \"------------------------------\\n\"\n f\"{metrics}\"\n )\n\n self.status = \"Evaluation summary built.\"\n return Message(text=summary)\n"},"context":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Context","dynamic":false,"info":"The context retrieved for the given query.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"context","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"model":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Cleanlab Evaluation Model","dynamic":false,"external_options":{},"info":"The model Cleanlab uses to evaluate the context, query, and response. This does NOT need to be the same model that generated the response.","name":"model","options":["gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","o4-mini","o3","gpt-4.5-preview","gpt-4o-mini","gpt-4o","o3-mini","o1","o1-mini","gpt-4","gpt-3.5-turbo-16k","claude-3.7-sonnet","claude-3.5-sonnet-v2","claude-3.5-sonnet","claude-3.5-haiku","claude-3-haiku","nova-micro","nova-lite","nova-pro"],"options_metadata":[],"placeholder":"","required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"gpt-4o-mini"},"quality_preset":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Quality Preset","dynamic":false,"external_options":{},"info":"This determines the accuracy, latency, and cost of the evaluation. Higher quality is generally slower but more accurate.","name":"quality_preset","options":["base","low","medium"],"options_metadata":[],"placeholder":"","required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"medium"},"query":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Query","dynamic":false,"info":"The user's query.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"query","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"response":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Response","dynamic":false,"info":"The response generated by the LLM.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"response","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"run_context_sufficiency":{"_input_type":"BoolInput","advanced":true,"display_name":"Run Context Sufficiency","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"run_context_sufficiency","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"run_query_ease":{"_input_type":"BoolInput","advanced":true,"display_name":"Run Query Ease","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"run_query_ease","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"run_response_groundedness":{"_input_type":"BoolInput","advanced":true,"display_name":"Run Response Groundedness","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"run_response_groundedness","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"run_response_helpfulness":{"_input_type":"BoolInput","advanced":true,"display_name":"Run Response Helpfulness","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"run_response_helpfulness","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false}},"tool_mode":false},"CleanlabRemediator":{"base_classes":["Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Remediates an untrustworthy response based on trust score from the Cleanlab Evaluator, score threshold, and message handling settings.","display_name":"Cleanlab Remediator","documentation":"","edited":false,"field_order":["response","score","explanation","threshold","show_untrustworthy_response","untrustworthy_warning_text","fallback_text"],"frozen":false,"icon":"Cleanlab","legacy":false,"metadata":{"code_hash":"a5b19d338991","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.cleanlab.cleanlab_remediator.CleanlabRemediator"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Remediated Message","group_outputs":false,"method":"remediate_response","name":"remediated_response","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.custom import Component\nfrom lfx.field_typing.range_spec import RangeSpec\nfrom lfx.io import BoolInput, FloatInput, HandleInput, MessageTextInput, Output, PromptInput\nfrom lfx.schema.message import Message\n\n\nclass CleanlabRemediator(Component):\n \"\"\"Remediates potentially untrustworthy LLM responses based on trust scores computed by the Cleanlab Evaluator.\n\n This component takes a response and its associated trust score,\n and applies remediation strategies based on configurable thresholds and settings.\n\n Inputs:\n - response (MessageTextInput): The original LLM-generated response to be evaluated and possibly remediated.\n The CleanlabEvaluator passes this response through.\n - score (HandleInput): The trust score output from CleanlabEvaluator (expected to be a float between 0 and 1).\n - explanation (MessageTextInput): Optional textual explanation for the trust score, to be included in the\n output.\n - threshold (Input[float]): Minimum trust score required to accept the response. If the score is lower, the\n response is remediated.\n - show_untrustworthy_response (BoolInput): If true, returns the original response with a warning; if false,\n returns fallback text.\n - untrustworthy_warning_text (PromptInput): Text warning to append to responses deemed untrustworthy (when\n showing them).\n - fallback_text (PromptInput): Replacement message returned if the response is untrustworthy and should be\n hidden.\n\n Outputs:\n - remediated_response (Message): Either:\n • the original response,\n • the original response with appended warning, or\n • the fallback response,\n depending on the trust score and configuration.\n\n This component is typically used downstream of CleanlabEvaluator or CleanlabRagValidator\n to take appropriate action on low-trust responses and inform users accordingly.\n \"\"\"\n\n display_name = \"Cleanlab Remediator\"\n description = (\n \"Remediates an untrustworthy response based on trust score from the Cleanlab Evaluator, \"\n \"score threshold, and message handling settings.\"\n )\n icon = \"Cleanlab\"\n name = \"CleanlabRemediator\"\n\n inputs = [\n MessageTextInput(\n name=\"response\",\n display_name=\"Response\",\n info=\"The response to the user's query.\",\n required=True,\n ),\n HandleInput(\n name=\"score\",\n display_name=\"Trust Score\",\n info=\"The trustworthiness score output from the Cleanlab Evaluator.\",\n input_types=[\"number\"],\n required=True,\n ),\n MessageTextInput(\n name=\"explanation\",\n display_name=\"Explanation\",\n info=\"The explanation from the Cleanlab Evaluator.\",\n required=False,\n ),\n FloatInput(\n name=\"threshold\",\n display_name=\"Threshold\",\n field_type=\"float\",\n value=0.7,\n range_spec=RangeSpec(min=0.0, max=1.0, step=0.05),\n info=\"Minimum score required to show the response unmodified. Reponses with scores above this threshold \"\n \"are considered trustworthy. Reponses with scores below this threshold are considered untrustworthy and \"\n \"will be remediated based on the settings below.\",\n required=True,\n show=True,\n ),\n BoolInput(\n name=\"show_untrustworthy_response\",\n display_name=\"Show Untrustworthy Response\",\n info=\"If enabled, and the trust score is below the threshold, the original response is shown with the \"\n \"added warning. If disabled, and the trust score is below the threshold, the fallback answer is returned.\",\n value=True,\n ),\n PromptInput(\n name=\"untrustworthy_warning_text\",\n display_name=\"Warning for Untrustworthy Response\",\n info=\"Warning to append to the response if Show Untrustworthy Response is enabled and trust score is \"\n \"below the threshold.\",\n value=\"⚠️ WARNING: The following response is potentially untrustworthy.\",\n ),\n PromptInput(\n name=\"fallback_text\",\n display_name=\"Fallback Answer\",\n info=\"Response returned if the trust score is below the threshold and 'Show Untrustworthy Response' is \"\n \"disabled.\",\n value=\"Based on the available information, I cannot provide a complete answer to this question.\",\n ),\n ]\n\n outputs = [\n Output(\n display_name=\"Remediated Message\",\n name=\"remediated_response\",\n method=\"remediate_response\",\n types=[\"Message\"],\n ),\n ]\n\n def remediate_response(self) -> Message:\n if self.score >= self.threshold:\n self.status = f\"Score {self.score:.2f} ≥ threshold {self.threshold:.2f} → accepted\"\n return Message(\n text=f\"{self.response}\\n\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n**Trust Score:** {self.score:.2f}\"\n )\n\n self.status = f\"Score {self.score:.2f} < threshold {self.threshold:.2f} → flagged\"\n\n if self.show_untrustworthy_response:\n parts = [\n self.response,\n \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\",\n f\"**{self.untrustworthy_warning_text.strip()}**\",\n f\"**Trust Score:** {self.score:.2f}\",\n ]\n if self.explanation:\n parts.append(f\"**Explanation:** {self.explanation}\")\n return Message(text=\"\\n\\n\".join(parts))\n\n return Message(text=self.fallback_text)\n"},"explanation":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Explanation","dynamic":false,"info":"The explanation from the Cleanlab Evaluator.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"explanation","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"fallback_text":{"_input_type":"PromptInput","advanced":false,"display_name":"Fallback Answer","dynamic":false,"info":"Response returned if the trust score is below the threshold and 'Show Untrustworthy Response' is disabled.","list":false,"list_add_label":"Add More","name":"fallback_text","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"prompt","value":"Based on the available information, I cannot provide a complete answer to this question."},"response":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Response","dynamic":false,"info":"The response to the user's query.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"response","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"score":{"_input_type":"HandleInput","advanced":false,"display_name":"Trust Score","dynamic":false,"info":"The trustworthiness score output from the Cleanlab Evaluator.","input_types":["number"],"list":false,"list_add_label":"Add More","name":"score","placeholder":"","required":true,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"show_untrustworthy_response":{"_input_type":"BoolInput","advanced":false,"display_name":"Show Untrustworthy Response","dynamic":false,"info":"If enabled, and the trust score is below the threshold, the original response is shown with the added warning. If disabled, and the trust score is below the threshold, the fallback answer is returned.","list":false,"list_add_label":"Add More","name":"show_untrustworthy_response","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"threshold":{"_input_type":"FloatInput","advanced":false,"display_name":"Threshold","dynamic":false,"info":"Minimum score required to show the response unmodified. Reponses with scores above this threshold are considered trustworthy. Reponses with scores below this threshold are considered untrustworthy and will be remediated based on the settings below.","list":false,"list_add_label":"Add More","name":"threshold","placeholder":"","range_spec":{"max":1.0,"min":0.0,"step":0.05,"step_type":"float"},"required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":0.7},"untrustworthy_warning_text":{"_input_type":"PromptInput","advanced":false,"display_name":"Warning for Untrustworthy Response","dynamic":false,"info":"Warning to append to the response if Show Untrustworthy Response is enabled and trust score is below the threshold.","list":false,"list_add_label":"Add More","name":"untrustworthy_warning_text","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"prompt","value":"⚠️ WARNING: The following response is potentially untrustworthy."}},"tool_mode":false}}],["clickhouse",{"Clickhouse":{"base_classes":["Data","DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"ClickHouse Vector Store with search capabilities","display_name":"ClickHouse","documentation":"","edited":false,"field_order":["host","port","database","table","username","password","index_type","metric","secure","index_param","index_query_params","ingest_data","search_query","should_cache_vector_store","embedding","number_of_results","score_threshold"],"frozen":false,"icon":"Clickhouse","legacy":false,"metadata":{"code_hash":"ab991e83da44","dependencies":{"dependencies":[{"name":"langchain_community","version":"0.3.21"},{"name":"lfx","version":null},{"name":"clickhouse_connect","version":"0.7.19"}],"total_dependencies":3},"module":"lfx.components.clickhouse.clickhouse.ClickhouseVectorStoreComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Search Results","group_outputs":false,"method":"search_documents","name":"search_results","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from langchain_community.vectorstores import Clickhouse, ClickhouseSettings\n\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.helpers.data import docs_to_data\nfrom lfx.inputs.inputs import BoolInput, FloatInput\nfrom lfx.io import (\n DictInput,\n DropdownInput,\n HandleInput,\n IntInput,\n SecretStrInput,\n StrInput,\n)\nfrom lfx.schema.data import Data\n\n\nclass ClickhouseVectorStoreComponent(LCVectorStoreComponent):\n display_name = \"ClickHouse\"\n description = \"ClickHouse Vector Store with search capabilities\"\n name = \"Clickhouse\"\n icon = \"Clickhouse\"\n\n inputs = [\n StrInput(name=\"host\", display_name=\"hostname\", required=True, value=\"localhost\"),\n IntInput(name=\"port\", display_name=\"port\", required=True, value=8123),\n StrInput(name=\"database\", display_name=\"database\", required=True),\n StrInput(name=\"table\", display_name=\"Table name\", required=True),\n StrInput(name=\"username\", display_name=\"The ClickHouse user name.\", required=True),\n SecretStrInput(name=\"password\", display_name=\"Clickhouse Password\", required=True),\n DropdownInput(\n name=\"index_type\",\n display_name=\"index_type\",\n options=[\"annoy\", \"vector_similarity\"],\n info=\"Type of the index.\",\n value=\"annoy\",\n advanced=True,\n ),\n DropdownInput(\n name=\"metric\",\n display_name=\"metric\",\n options=[\"angular\", \"euclidean\", \"manhattan\", \"hamming\", \"dot\"],\n info=\"Metric to compute distance.\",\n value=\"angular\",\n advanced=True,\n ),\n BoolInput(\n name=\"secure\",\n display_name=\"Use https/TLS. This overrides inferred values from the interface or port arguments.\",\n value=False,\n advanced=True,\n ),\n StrInput(name=\"index_param\", display_name=\"Param of the index\", value=\"100,'L2Distance'\", advanced=True),\n DictInput(name=\"index_query_params\", display_name=\"index query params\", advanced=True),\n *LCVectorStoreComponent.inputs,\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 value=4,\n advanced=True,\n ),\n FloatInput(name=\"score_threshold\", display_name=\"Score threshold\", advanced=True),\n ]\n\n @check_cached_vector_store\n def build_vector_store(self) -> Clickhouse:\n try:\n import clickhouse_connect\n except ImportError as e:\n msg = (\n \"Failed to import ClickHouse dependencies. \"\n \"Install it using `uv pip install langflow[clickhouse-connect] --pre`\"\n )\n raise ImportError(msg) from e\n\n try:\n client = clickhouse_connect.get_client(\n host=self.host, port=self.port, username=self.username, password=self.password\n )\n client.command(\"SELECT 1\")\n except Exception as e:\n msg = f\"Failed to connect to Clickhouse: {e}\"\n raise ValueError(msg) from e\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 kwargs = {}\n if self.index_param:\n kwargs[\"index_param\"] = self.index_param.split(\",\")\n if self.index_query_params:\n kwargs[\"index_query_params\"] = self.index_query_params\n\n settings = ClickhouseSettings(\n table=self.table,\n database=self.database,\n host=self.host,\n index_type=self.index_type,\n metric=self.metric,\n password=self.password,\n port=self.port,\n secure=self.secure,\n username=self.username,\n **kwargs,\n )\n if documents:\n clickhouse_vs = Clickhouse.from_documents(documents=documents, embedding=self.embedding, config=settings)\n\n else:\n clickhouse_vs = Clickhouse(embedding=self.embedding, config=settings)\n\n return clickhouse_vs\n\n def search_documents(self) -> list[Data]:\n vector_store = self.build_vector_store()\n\n if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():\n kwargs = {}\n if self.score_threshold:\n kwargs[\"score_threshold\"] = self.score_threshold\n\n docs = vector_store.similarity_search(query=self.search_query, k=self.number_of_results, **kwargs)\n\n data = docs_to_data(docs)\n self.status = data\n return data\n return []\n"},"database":{"_input_type":"StrInput","advanced":false,"display_name":"database","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"database","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"embedding":{"_input_type":"HandleInput","advanced":false,"display_name":"Embedding","dynamic":false,"info":"","input_types":["Embeddings"],"list":false,"list_add_label":"Add More","name":"embedding","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"host":{"_input_type":"StrInput","advanced":false,"display_name":"hostname","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"host","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"localhost"},"index_param":{"_input_type":"StrInput","advanced":true,"display_name":"Param of the index","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"index_param","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"100,'L2Distance'"},"index_query_params":{"_input_type":"DictInput","advanced":true,"display_name":"index query params","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"index_query_params","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"index_type":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"index_type","dynamic":false,"external_options":{},"info":"Type of the index.","name":"index_type","options":["annoy","vector_similarity"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"annoy"},"ingest_data":{"_input_type":"HandleInput","advanced":false,"display_name":"Ingest Data","dynamic":false,"info":"","input_types":["Data","DataFrame"],"list":true,"list_add_label":"Add More","name":"ingest_data","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"metric":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"metric","dynamic":false,"external_options":{},"info":"Metric to compute distance.","name":"metric","options":["angular","euclidean","manhattan","hamming","dot"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"angular"},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Results","dynamic":false,"info":"Number of results to return.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":4},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Clickhouse Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"port":{"_input_type":"IntInput","advanced":false,"display_name":"port","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"port","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":8123},"score_threshold":{"_input_type":"FloatInput","advanced":true,"display_name":"Score threshold","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"score_threshold","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":""},"search_query":{"_input_type":"QueryInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Enter a query to run a similarity search.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"search_query","placeholder":"Enter a query...","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"query","value":""},"secure":{"_input_type":"BoolInput","advanced":true,"display_name":"Use https/TLS. This overrides inferred values from the interface or port arguments.","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"secure","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"should_cache_vector_store":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache Vector Store","dynamic":false,"info":"If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.","list":false,"list_add_label":"Add More","name":"should_cache_vector_store","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"table":{"_input_type":"StrInput","advanced":false,"display_name":"Table name","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"table","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"The ClickHouse user name.","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false}}],["cloudflare",{"CloudflareWorkersAIEmbeddings":{"base_classes":["Embeddings"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate embeddings using Cloudflare Workers AI models.","display_name":"Cloudflare Workers AI Embeddings","documentation":"https://python.langchain.com/docs/integrations/text_embedding/cloudflare_workersai/","edited":false,"field_order":["account_id","api_token","model_name","strip_new_lines","batch_size","api_base_url","headers"],"frozen":false,"icon":"Cloudflare","legacy":false,"metadata":{"code_hash":"1ea6e4857c14","dependencies":{"dependencies":[{"name":"langchain_community","version":"0.3.21"},{"name":"lfx","version":null}],"total_dependencies":2},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.cloudflare.cloudflare.CloudflareWorkersAIEmbeddingsComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Embeddings","group_outputs":false,"method":"build_embeddings","name":"embeddings","selected":"Embeddings","tool_mode":true,"types":["Embeddings"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","account_id":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Cloudflare account ID","dynamic":false,"info":"Find your account ID https://developers.cloudflare.com/fundamentals/setup/find-account-and-zone-ids/#find-account-id-workers-and-pages","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"account_id","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"api_base_url":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Cloudflare API base URL","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"api_base_url","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"https://api.cloudflare.com/client/v4/accounts"},"api_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Cloudflare API token","dynamic":false,"info":"Create an API token https://developers.cloudflare.com/fundamentals/api/get-started/create-token/","input_types":[],"load_from_db":true,"name":"api_token","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"batch_size":{"_input_type":"IntInput","advanced":true,"display_name":"Batch Size","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"batch_size","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":50},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from langchain_community.embeddings.cloudflare_workersai import CloudflareWorkersAIEmbeddings\n\nfrom lfx.base.models.model import LCModelComponent\nfrom lfx.field_typing import Embeddings\nfrom lfx.io import BoolInput, DictInput, IntInput, MessageTextInput, Output, SecretStrInput\n\n\nclass CloudflareWorkersAIEmbeddingsComponent(LCModelComponent):\n display_name: str = \"Cloudflare Workers AI Embeddings\"\n description: str = \"Generate embeddings using Cloudflare Workers AI models.\"\n documentation: str = \"https://python.langchain.com/docs/integrations/text_embedding/cloudflare_workersai/\"\n icon = \"Cloudflare\"\n name = \"CloudflareWorkersAIEmbeddings\"\n\n inputs = [\n MessageTextInput(\n name=\"account_id\",\n display_name=\"Cloudflare account ID\",\n info=\"Find your account ID https://developers.cloudflare.com/fundamentals/setup/find-account-and-zone-ids/#find-account-id-workers-and-pages\",\n required=True,\n ),\n SecretStrInput(\n name=\"api_token\",\n display_name=\"Cloudflare API token\",\n info=\"Create an API token https://developers.cloudflare.com/fundamentals/api/get-started/create-token/\",\n required=True,\n ),\n MessageTextInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n info=\"List of supported models https://developers.cloudflare.com/workers-ai/models/#text-embeddings\",\n required=True,\n value=\"@cf/baai/bge-base-en-v1.5\",\n ),\n BoolInput(\n name=\"strip_new_lines\",\n display_name=\"Strip New Lines\",\n advanced=True,\n value=True,\n ),\n IntInput(\n name=\"batch_size\",\n display_name=\"Batch Size\",\n advanced=True,\n value=50,\n ),\n MessageTextInput(\n name=\"api_base_url\",\n display_name=\"Cloudflare API base URL\",\n advanced=True,\n value=\"https://api.cloudflare.com/client/v4/accounts\",\n ),\n DictInput(\n name=\"headers\",\n display_name=\"Headers\",\n info=\"Additional request headers\",\n is_list=True,\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Embeddings\", name=\"embeddings\", method=\"build_embeddings\"),\n ]\n\n def build_embeddings(self) -> Embeddings:\n try:\n embeddings = CloudflareWorkersAIEmbeddings(\n account_id=self.account_id,\n api_base_url=self.api_base_url,\n api_token=self.api_token,\n batch_size=self.batch_size,\n headers=self.headers,\n model_name=self.model_name,\n strip_new_lines=self.strip_new_lines,\n )\n except Exception as e:\n msg = f\"Could not connect to CloudflareWorkersAIEmbeddings API: {e!s}\"\n raise ValueError(msg) from e\n\n return embeddings\n"},"headers":{"_input_type":"DictInput","advanced":true,"display_name":"Headers","dynamic":false,"info":"Additional request headers","list":true,"list_add_label":"Add More","name":"headers","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"model_name":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Model Name","dynamic":false,"info":"List of supported models https://developers.cloudflare.com/workers-ai/models/#text-embeddings","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"model_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"@cf/baai/bge-base-en-v1.5"},"strip_new_lines":{"_input_type":"BoolInput","advanced":true,"display_name":"Strip New Lines","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"strip_new_lines","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true}},"tool_mode":false}}],["cohere",{"CohereEmbeddings":{"base_classes":["Embeddings"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate embeddings using Cohere models.","display_name":"Cohere Embeddings","documentation":"","edited":false,"field_order":["api_key","model_name","truncate","max_retries","user_agent","request_timeout"],"frozen":false,"icon":"Cohere","legacy":false,"metadata":{"code_hash":"9c0f413a2c64","dependencies":{"dependencies":[{"name":"cohere","version":"5.20.0"},{"name":"langchain_cohere","version":"0.3.3"},{"name":"lfx","version":null}],"total_dependencies":3},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.cohere.cohere_embeddings.CohereEmbeddingsComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Embeddings","group_outputs":false,"method":"build_embeddings","name":"embeddings","selected":"Embeddings","tool_mode":true,"types":["Embeddings"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Cohere API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from typing import Any\n\nimport cohere\nfrom langchain_cohere import CohereEmbeddings\n\nfrom lfx.base.models.model import LCModelComponent\nfrom lfx.field_typing import Embeddings\nfrom lfx.io import DropdownInput, FloatInput, IntInput, MessageTextInput, Output, SecretStrInput\n\nHTTP_STATUS_OK = 200\n\n\nclass CohereEmbeddingsComponent(LCModelComponent):\n display_name = \"Cohere Embeddings\"\n description = \"Generate embeddings using Cohere models.\"\n icon = \"Cohere\"\n name = \"CohereEmbeddings\"\n\n inputs = [\n SecretStrInput(name=\"api_key\", display_name=\"Cohere API Key\", required=True, real_time_refresh=True),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model\",\n advanced=False,\n options=[\n \"embed-english-v2.0\",\n \"embed-multilingual-v2.0\",\n \"embed-english-light-v2.0\",\n \"embed-multilingual-light-v2.0\",\n ],\n value=\"embed-english-v2.0\",\n refresh_button=True,\n combobox=True,\n ),\n MessageTextInput(name=\"truncate\", display_name=\"Truncate\", advanced=True),\n IntInput(name=\"max_retries\", display_name=\"Max Retries\", value=3, advanced=True),\n MessageTextInput(name=\"user_agent\", display_name=\"User Agent\", advanced=True, value=\"langchain\"),\n FloatInput(name=\"request_timeout\", display_name=\"Request Timeout\", advanced=True),\n ]\n\n outputs = [\n Output(display_name=\"Embeddings\", name=\"embeddings\", method=\"build_embeddings\"),\n ]\n\n def build_embeddings(self) -> Embeddings:\n data = None\n try:\n data = CohereEmbeddings(\n cohere_api_key=self.api_key,\n model=self.model_name,\n truncate=self.truncate,\n max_retries=self.max_retries,\n user_agent=self.user_agent,\n request_timeout=self.request_timeout or None,\n )\n except Exception as e:\n msg = (\n \"Unable to create Cohere Embeddings. \",\n \"Please verify the API key and model parameters, and try again.\",\n )\n raise ValueError(msg) from e\n # added status if not the return data would be serialised to create the status\n return data\n\n def get_model(self):\n try:\n co = cohere.ClientV2(self.api_key)\n response = co.models.list(endpoint=\"embed\")\n models = response.models\n return [model.name for model in models]\n except Exception as e:\n msg = f\"Failed to fetch Cohere models. Error: {e}\"\n raise ValueError(msg) from e\n\n async def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None):\n if field_name in {\"model_name\", \"api_key\"}:\n if build_config.get(\"api_key\", {}).get(\"value\", None):\n build_config[\"model_name\"][\"options\"] = self.get_model()\n else:\n build_config[\"model_name\"][\"options\"] = field_value\n return build_config\n"},"max_retries":{"_input_type":"IntInput","advanced":true,"display_name":"Max Retries","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"max_retries","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":3},"model_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{},"display_name":"Model","dynamic":false,"external_options":{},"info":"","name":"model_name","options":["embed-english-v2.0","embed-multilingual-v2.0","embed-english-light-v2.0","embed-multilingual-light-v2.0"],"options_metadata":[],"placeholder":"","refresh_button":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"embed-english-v2.0"},"request_timeout":{"_input_type":"FloatInput","advanced":true,"display_name":"Request Timeout","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"request_timeout","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":""},"truncate":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Truncate","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"truncate","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"user_agent":{"_input_type":"MessageTextInput","advanced":true,"display_name":"User Agent","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"user_agent","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"langchain"}},"tool_mode":false},"CohereModel":{"base_classes":["LanguageModel","Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate text using Cohere LLMs.","display_name":"Cohere Language Models","documentation":"https://python.langchain.com/docs/integrations/llms/cohere/","edited":false,"field_order":["input_value","system_message","stream","cohere_api_key","temperature"],"frozen":false,"icon":"Cohere","legacy":false,"metadata":{"code_hash":"594852e1d706","dependencies":{"dependencies":[{"name":"langchain_cohere","version":"0.3.3"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":3},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.cohere.cohere_models.CohereComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Model Response","group_outputs":false,"method":"text_response","name":"text_output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Language Model","group_outputs":false,"method":"build_model","name":"model_output","selected":"LanguageModel","tool_mode":true,"types":["LanguageModel"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from langchain_cohere import ChatCohere\nfrom pydantic.v1 import SecretStr\n\nfrom lfx.base.models.model import LCModelComponent\nfrom lfx.field_typing import LanguageModel\nfrom lfx.field_typing.range_spec import RangeSpec\nfrom lfx.io import SecretStrInput, SliderInput\n\n\nclass CohereComponent(LCModelComponent):\n display_name = \"Cohere Language Models\"\n description = \"Generate text using Cohere LLMs.\"\n documentation = \"https://python.langchain.com/docs/integrations/llms/cohere/\"\n icon = \"Cohere\"\n name = \"CohereModel\"\n\n inputs = [\n *LCModelComponent.get_base_inputs(),\n SecretStrInput(\n name=\"cohere_api_key\",\n display_name=\"Cohere API Key\",\n info=\"The Cohere API Key to use for the Cohere model.\",\n advanced=False,\n value=\"COHERE_API_KEY\",\n required=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.75,\n range_spec=RangeSpec(min=0, max=2, step=0.01),\n info=\"Controls randomness. Lower values are more deterministic, higher values are more creative.\",\n advanced=True,\n ),\n ]\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n cohere_api_key = self.cohere_api_key\n temperature = self.temperature\n\n api_key = SecretStr(cohere_api_key).get_secret_value() if cohere_api_key else None\n\n return ChatCohere(\n temperature=temperature or 0.75,\n cohere_api_key=api_key,\n )\n"},"cohere_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Cohere API Key","dynamic":false,"info":"The Cohere API Key to use for the Cohere model.","input_types":[],"load_from_db":true,"name":"cohere_api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COHERE_API_KEY"},"input_value":{"_input_type":"MessageInput","advanced":false,"display_name":"Input","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"stream":{"_input_type":"BoolInput","advanced":true,"display_name":"Stream","dynamic":false,"info":"Stream the response from the model. Streaming works only in Chat.","list":false,"list_add_label":"Add More","name":"stream","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"system_message":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"System Message","dynamic":false,"info":"System message to pass to the model.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"system_message","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"temperature":{"_input_type":"SliderInput","advanced":true,"display_name":"Temperature","dynamic":false,"info":"Controls randomness. Lower values are more deterministic, higher values are more creative.","max_label":"","max_label_icon":"","min_label":"","min_label_icon":"","name":"temperature","placeholder":"","range_spec":{"max":2.0,"min":0.0,"step":0.01,"step_type":"float"},"required":false,"show":true,"slider_buttons":false,"slider_buttons_options":[],"slider_input":false,"title_case":false,"tool_mode":false,"track_in_telemetry":false,"type":"slider","value":0.75}},"tool_mode":false},"CohereRerank":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Rerank documents using the Cohere API.","display_name":"Cohere Rerank","documentation":"","edited":false,"field_order":["search_query","search_results","top_n","api_key","model"],"frozen":false,"icon":"Cohere","legacy":false,"metadata":{"code_hash":"a94a0d11eeac","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"langchain_cohere","version":"0.3.3"}],"total_dependencies":2},"module":"lfx.components.cohere.cohere_rerank.CohereRerankComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Reranked Documents","group_outputs":false,"method":"compress_documents","name":"reranked_documents","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Cohere API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.compressors.model import LCCompressorComponent\nfrom lfx.field_typing import BaseDocumentCompressor\nfrom lfx.inputs.inputs import SecretStrInput\nfrom lfx.io import DropdownInput\nfrom lfx.template.field.base import Output\n\n\nclass CohereRerankComponent(LCCompressorComponent):\n display_name = \"Cohere Rerank\"\n description = \"Rerank documents using the Cohere API.\"\n name = \"CohereRerank\"\n icon = \"Cohere\"\n\n inputs = [\n *LCCompressorComponent.inputs,\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Cohere API Key\",\n ),\n DropdownInput(\n name=\"model\",\n display_name=\"Model\",\n options=[\n \"rerank-english-v3.0\",\n \"rerank-multilingual-v3.0\",\n \"rerank-english-v2.0\",\n \"rerank-multilingual-v2.0\",\n ],\n value=\"rerank-english-v3.0\",\n ),\n ]\n\n outputs = [\n Output(\n display_name=\"Reranked Documents\",\n name=\"reranked_documents\",\n method=\"compress_documents\",\n ),\n ]\n\n def build_compressor(self) -> BaseDocumentCompressor: # type: ignore[type-var]\n try:\n from langchain_cohere import CohereRerank\n except ImportError as e:\n msg = \"Please install langchain-cohere to use the Cohere model.\"\n raise ImportError(msg) from e\n return CohereRerank(\n cohere_api_key=self.api_key,\n model=self.model,\n top_n=self.top_n,\n )\n"},"model":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model","dynamic":false,"external_options":{},"info":"","name":"model","options":["rerank-english-v3.0","rerank-multilingual-v3.0","rerank-english-v2.0","rerank-multilingual-v2.0"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"rerank-english-v3.0"},"search_query":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Search Query","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"search_query","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"search_results":{"_input_type":"DataInput","advanced":false,"display_name":"Search Results","dynamic":false,"info":"Search Results from a Vector Store.","input_types":["Data"],"list":true,"list_add_label":"Add More","name":"search_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"top_n":{"_input_type":"IntInput","advanced":true,"display_name":"Top N","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"top_n","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":3}},"tool_mode":false}}],["cometapi",{"CometAPIModel":{"base_classes":["LanguageModel","Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"All AI Models in One API 500+ AI Models","display_name":"CometAPI","documentation":"","edited":false,"field_order":["input_value","system_message","stream","api_key","app_name","model_name","model_kwargs","temperature","max_tokens","seed","json_mode"],"frozen":false,"icon":"CometAPI","legacy":false,"metadata":{"code_hash":"4ec4a8852e9c","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"langchain_openai","version":"0.3.23"},{"name":"pydantic","version":"2.10.6"},{"name":"typing_extensions","version":"4.15.0"},{"name":"lfx","version":null}],"total_dependencies":5},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.cometapi.cometapi.CometAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Model Response","group_outputs":false,"method":"text_response","name":"text_output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Language Model","group_outputs":false,"method":"build_model","name":"model_output","selected":"LanguageModel","tool_mode":true,"types":["LanguageModel"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"CometAPI Key","dynamic":false,"info":"Your CometAPI key","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"app_name":{"_input_type":"StrInput","advanced":true,"display_name":"App Name","dynamic":false,"info":"Your app name for CometAPI rankings","list":false,"list_add_label":"Add More","load_from_db":false,"name":"app_name","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import json\n\nimport requests\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\nfrom typing_extensions import override\n\nfrom lfx.base.models.cometapi_constants import MODEL_NAMES\nfrom lfx.base.models.model import LCModelComponent\nfrom lfx.field_typing import LanguageModel\nfrom lfx.field_typing.range_spec import RangeSpec\nfrom lfx.inputs.inputs import (\n BoolInput,\n DictInput,\n DropdownInput,\n IntInput,\n SecretStrInput,\n SliderInput,\n StrInput,\n)\n\n\nclass CometAPIComponent(LCModelComponent):\n \"\"\"CometAPI component for language models.\"\"\"\n\n display_name = \"CometAPI\"\n description = \"All AI Models in One API 500+ AI Models\"\n icon = \"CometAPI\"\n name = \"CometAPIModel\"\n\n inputs = [\n *LCModelComponent.get_base_inputs(),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"CometAPI Key\",\n required=True,\n info=\"Your CometAPI key\",\n real_time_refresh=True,\n ),\n StrInput(\n name=\"app_name\",\n display_name=\"App Name\",\n info=\"Your app name for CometAPI rankings\",\n advanced=True,\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model\",\n info=\"The model to use for chat completion\",\n options=[\"Select a model\"],\n value=\"Select a model\",\n real_time_refresh=True,\n required=True,\n ),\n DictInput(\n name=\"model_kwargs\",\n display_name=\"Model Kwargs\",\n info=\"Additional keyword arguments to pass to the model.\",\n advanced=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.7,\n range_spec=RangeSpec(min=0, max=2, step=0.01),\n info=\"Controls randomness. Lower values are more deterministic, higher values are more creative.\",\n advanced=True,\n ),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n info=\"Maximum number of tokens to generate\",\n advanced=True,\n ),\n IntInput(\n name=\"seed\",\n display_name=\"Seed\",\n info=\"Seed for reproducible outputs.\",\n value=1,\n advanced=True,\n ),\n BoolInput(\n name=\"json_mode\",\n display_name=\"JSON Mode\",\n info=\"If enabled, the model will be asked to return a JSON object.\",\n advanced=True,\n ),\n ]\n\n def get_models(self, token_override: str | None = None) -> list[str]:\n base_url = \"https://api.cometapi.com/v1\"\n url = f\"{base_url}/models\"\n\n headers = {\"Content-Type\": \"application/json\"}\n # Add Bearer Authorization when API key is available\n api_key_source = token_override if token_override else getattr(self, \"api_key\", None)\n if api_key_source:\n token = api_key_source.get_secret_value() if isinstance(api_key_source, SecretStr) else str(api_key_source)\n headers[\"Authorization\"] = f\"Bearer {token}\"\n\n try:\n response = requests.get(url, headers=headers, timeout=10)\n response.raise_for_status()\n # Safely parse JSON; fallback to defaults on failure\n try:\n model_list = response.json()\n except (json.JSONDecodeError, ValueError) as e:\n self.status = f\"Error decoding models response: {e}\"\n return MODEL_NAMES\n return [model[\"id\"] for model in model_list.get(\"data\", [])]\n except requests.RequestException as e:\n self.status = f\"Error fetching models: {e}\"\n return MODEL_NAMES\n\n @override\n def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None):\n if field_name == \"api_key\":\n models = self.get_models(field_value)\n model_cfg = build_config.get(\"model_name\", {})\n # Preserve placeholder (fallback to existing value or a generic prompt)\n placeholder = model_cfg.get(\"placeholder\", model_cfg.get(\"value\", \"Select a model\"))\n current_value = model_cfg.get(\"value\")\n\n options = list(models) if models else []\n # Ensure current value stays visible even if not present in fetched options\n if current_value and current_value not in options:\n options = [current_value, *options]\n\n model_cfg[\"options\"] = options\n model_cfg[\"placeholder\"] = placeholder\n build_config[\"model_name\"] = model_cfg\n return build_config\n\n def build_model(self) -> LanguageModel: # type: ignore[type-var]\n api_key = self.api_key\n temperature = self.temperature\n model_name: str = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = getattr(self, \"model_kwargs\", {}) or {}\n json_mode = self.json_mode\n seed = self.seed\n # Ensure a valid model was selected\n if not model_name or model_name == \"Select a model\":\n msg = \"Please select a valid CometAPI model.\"\n raise ValueError(msg)\n try:\n # Extract raw API key safely\n _api_key = api_key.get_secret_value() if isinstance(api_key, SecretStr) else api_key\n output = ChatOpenAI(\n model=model_name,\n api_key=_api_key or None,\n max_tokens=max_tokens or None,\n temperature=temperature,\n model_kwargs=model_kwargs,\n streaming=bool(self.stream),\n seed=seed,\n base_url=\"https://api.cometapi.com/v1\",\n )\n except (TypeError, ValueError) as e:\n msg = \"Could not connect to CometAPI.\"\n raise ValueError(msg) from e\n\n if json_mode:\n output = output.bind(response_format={\"type\": \"json_object\"})\n\n return output\n"},"input_value":{"_input_type":"MessageInput","advanced":false,"display_name":"Input","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"json_mode":{"_input_type":"BoolInput","advanced":true,"display_name":"JSON Mode","dynamic":false,"info":"If enabled, the model will be asked to return a JSON object.","list":false,"list_add_label":"Add More","name":"json_mode","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"max_tokens":{"_input_type":"IntInput","advanced":true,"display_name":"Max Tokens","dynamic":false,"info":"Maximum number of tokens to generate","list":false,"list_add_label":"Add More","name":"max_tokens","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"model_kwargs":{"_input_type":"DictInput","advanced":true,"display_name":"Model Kwargs","dynamic":false,"info":"Additional keyword arguments to pass to the model.","list":false,"list_add_label":"Add More","name":"model_kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"model_name":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model","dynamic":false,"external_options":{},"info":"The model to use for chat completion","name":"model_name","options":["Select a model"],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Select a model"},"seed":{"_input_type":"IntInput","advanced":true,"display_name":"Seed","dynamic":false,"info":"Seed for reproducible outputs.","list":false,"list_add_label":"Add More","name":"seed","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":1},"stream":{"_input_type":"BoolInput","advanced":true,"display_name":"Stream","dynamic":false,"info":"Stream the response from the model. Streaming works only in Chat.","list":false,"list_add_label":"Add More","name":"stream","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"system_message":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"System Message","dynamic":false,"info":"System message to pass to the model.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"system_message","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"temperature":{"_input_type":"SliderInput","advanced":true,"display_name":"Temperature","dynamic":false,"info":"Controls randomness. Lower values are more deterministic, higher values are more creative.","max_label":"","max_label_icon":"","min_label":"","min_label_icon":"","name":"temperature","placeholder":"","range_spec":{"max":2.0,"min":0.0,"step":0.01,"step_type":"float"},"required":false,"show":true,"slider_buttons":false,"slider_buttons_options":[],"slider_input":false,"title_case":false,"tool_mode":false,"track_in_telemetry":false,"type":"slider","value":0.7}},"tool_mode":false}}],["composio",{"ComposioAPI":{"base_classes":["Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Use Composio toolset to run actions with your agent","display_name":"Composio Tools","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","tool_name","actions"],"frozen":false,"icon":"Composio","legacy":false,"metadata":{"code_hash":"764255821307","dependencies":{"dependencies":[{"name":"composio","version":"0.9.2"},{"name":"composio_langchain","version":"0.9.2"},{"name":"langchain_core","version":"0.3.79"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.composio.composio_api.ComposioAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Tools","group_outputs":false,"method":"build_tool","name":"tools","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","actions":{"_input_type":"SortableListInput","advanced":false,"display_name":"Actions","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"icon":"OctagonAlert","variant":"destructive"},"info":"The actions to use","limit":1,"name":"actions","options":[],"placeholder":"Select action","required":false,"search_category":[],"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":""},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"Refer to https://docs.composio.dev/faq/api_key/api_key","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"# Standard library imports\nfrom collections.abc import Sequence\nfrom typing import Any\n\nfrom composio import Composio\nfrom composio_langchain import LangchainProvider\n\n# Third-party imports\nfrom langchain_core.tools import Tool\n\n# Local imports\nfrom lfx.base.langchain_utilities.model import LCToolComponent\nfrom lfx.inputs.inputs import (\n ConnectionInput,\n MessageTextInput,\n SecretStrInput,\n SortableListInput,\n)\nfrom lfx.io import Output\nfrom lfx.utils.validate_cloud import raise_error_if_astra_cloud_disable_component\n\n# TODO: We get the list from the API but we need to filter it\nenabled_tools = [\"confluence\", \"discord\", \"dropbox\", \"github\", \"gmail\", \"linkedin\", \"notion\", \"slack\", \"youtube\"]\n\ndisable_component_in_astra_cloud_msg = (\n \"Composio tools are not supported in Astra cloud environment. \"\n \"Please use local storage mode or cloud-based versions of the tools.\"\n)\n\n\nclass ComposioAPIComponent(LCToolComponent):\n display_name: str = \"Composio Tools\"\n description: str = \"Use Composio toolset to run actions with your agent\"\n name = \"ComposioAPI\"\n icon = \"Composio\"\n documentation: str = \"https://docs.composio.dev\"\n\n inputs = [\n # Basic configuration inputs\n MessageTextInput(name=\"entity_id\", display_name=\"Entity ID\", value=\"default\", advanced=True),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Composio API Key\",\n required=True,\n info=\"Refer to https://docs.composio.dev/faq/api_key/api_key\",\n real_time_refresh=True,\n ),\n ConnectionInput(\n name=\"tool_name\",\n display_name=\"Tool Name\",\n placeholder=\"Select a tool...\",\n button_metadata={\"icon\": \"unplug\", \"variant\": \"destructive\"},\n options=[],\n search_category=[],\n value=\"\",\n connection_link=\"\",\n info=\"The name of the tool to use\",\n real_time_refresh=True,\n ),\n SortableListInput(\n name=\"actions\",\n display_name=\"Actions\",\n placeholder=\"Select action\",\n helper_text=\"Please connect before selecting actions.\",\n helper_text_metadata={\"icon\": \"OctagonAlert\", \"variant\": \"destructive\"},\n options=[],\n value=\"\",\n info=\"The actions to use\",\n limit=1,\n show=False,\n ),\n ]\n\n outputs = [\n Output(name=\"tools\", display_name=\"Tools\", method=\"build_tool\"),\n ]\n\n def validate_tool(self, build_config: dict, field_value: Any, tool_name: str | None = None) -> dict:\n # Get the index of the selected tool in the list of options\n selected_tool_index = next(\n (\n ind\n for ind, tool in enumerate(build_config[\"tool_name\"][\"options\"])\n if tool[\"name\"] == field_value\n or (\"validate\" in field_value and tool[\"name\"] == field_value[\"validate\"])\n ),\n None,\n )\n\n # Set the link to be the text 'validated'\n build_config[\"tool_name\"][\"options\"][selected_tool_index][\"link\"] = \"validated\"\n\n # Set the helper text and helper text metadata field of the actions now\n build_config[\"actions\"][\"helper_text\"] = \"\"\n build_config[\"actions\"][\"helper_text_metadata\"] = {\"icon\": \"Check\", \"variant\": \"success\"}\n\n try:\n composio = self._build_wrapper()\n current_tool = tool_name or getattr(self, \"tool_name\", None)\n if not current_tool:\n self.log(\"No tool name available for validate_tool\")\n return build_config\n\n toolkit_slug = current_tool.lower()\n\n tools = composio.tools.get(user_id=self.entity_id, toolkits=[toolkit_slug])\n\n authenticated_actions = []\n for tool in tools:\n if hasattr(tool, \"name\"):\n action_name = tool.name\n display_name = action_name.replace(\"_\", \" \").title()\n authenticated_actions.append({\"name\": action_name, \"display_name\": display_name})\n except (ValueError, ConnectionError, AttributeError) as e:\n self.log(f\"Error getting actions for {current_tool or 'unknown tool'}: {e}\")\n authenticated_actions = []\n\n build_config[\"actions\"][\"options\"] = [\n {\n \"name\": action[\"name\"],\n }\n for action in authenticated_actions\n ]\n\n build_config[\"actions\"][\"show\"] = True\n return build_config\n\n def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:\n if field_name == \"api_key\" or (self.api_key and not build_config[\"tool_name\"][\"options\"]):\n if field_name == \"api_key\" and not field_value:\n build_config[\"tool_name\"][\"options\"] = []\n build_config[\"tool_name\"][\"value\"] = \"\"\n\n # Reset the list of actions\n build_config[\"actions\"][\"show\"] = False\n build_config[\"actions\"][\"options\"] = []\n build_config[\"actions\"][\"value\"] = \"\"\n\n return build_config\n\n # Build the list of available tools\n build_config[\"tool_name\"][\"options\"] = [\n {\n \"name\": app.title(),\n \"icon\": app,\n \"link\": (\n build_config[\"tool_name\"][\"options\"][ind][\"link\"]\n if build_config[\"tool_name\"][\"options\"]\n else \"\"\n ),\n }\n for ind, app in enumerate(enabled_tools)\n ]\n\n return build_config\n\n if field_name == \"tool_name\" and field_value:\n composio = self._build_wrapper()\n\n current_tool_name = (\n field_value\n if isinstance(field_value, str)\n else field_value.get(\"validate\")\n if isinstance(field_value, dict) and \"validate\" in field_value\n else getattr(self, \"tool_name\", None)\n )\n\n if not current_tool_name:\n self.log(\"No tool name available for connection check\")\n return build_config\n\n try:\n toolkit_slug = current_tool_name.lower()\n\n connection_list = composio.connected_accounts.list(\n user_ids=[self.entity_id], toolkit_slugs=[toolkit_slug]\n )\n\n # Check for active connections\n has_active_connections = False\n if (\n connection_list\n and hasattr(connection_list, \"items\")\n and connection_list.items\n and isinstance(connection_list.items, list)\n and len(connection_list.items) > 0\n ):\n for connection in connection_list.items:\n if getattr(connection, \"status\", None) == \"ACTIVE\":\n has_active_connections = True\n break\n\n # Get the index of the selected tool in the list of options\n selected_tool_index = next(\n (\n ind\n for ind, tool in enumerate(build_config[\"tool_name\"][\"options\"])\n if tool[\"name\"] == current_tool_name.title()\n ),\n None,\n )\n\n if has_active_connections:\n # User has active connection\n if selected_tool_index is not None:\n build_config[\"tool_name\"][\"options\"][selected_tool_index][\"link\"] = \"validated\"\n\n # If it's a validation request, validate the tool\n if (isinstance(field_value, dict) and \"validate\" in field_value) or isinstance(field_value, str):\n return self.validate_tool(build_config, field_value, current_tool_name)\n else:\n # No active connection - create OAuth connection\n try:\n connection = composio.toolkits.authorize(user_id=self.entity_id, toolkit=toolkit_slug)\n redirect_url = getattr(connection, \"redirect_url\", None)\n\n if redirect_url and redirect_url.startswith((\"http://\", \"https://\")):\n if selected_tool_index is not None:\n build_config[\"tool_name\"][\"options\"][selected_tool_index][\"link\"] = redirect_url\n elif selected_tool_index is not None:\n build_config[\"tool_name\"][\"options\"][selected_tool_index][\"link\"] = \"error\"\n except (ValueError, ConnectionError, AttributeError) as e:\n self.log(f\"Error creating OAuth connection: {e}\")\n if selected_tool_index is not None:\n build_config[\"tool_name\"][\"options\"][selected_tool_index][\"link\"] = \"error\"\n\n except (ValueError, ConnectionError, AttributeError) as e:\n self.log(f\"Error checking connection status: {e}\")\n\n return build_config\n\n def build_tool(self) -> Sequence[Tool]:\n \"\"\"Build Composio tools based on selected actions.\n\n Returns:\n Sequence[Tool]: List of configured Composio tools.\n \"\"\"\n # Check if we're in Astra cloud environment and raise an error if we are.\n raise_error_if_astra_cloud_disable_component(disable_component_in_astra_cloud_msg)\n composio = self._build_wrapper()\n action_names = [action[\"name\"] for action in self.actions]\n\n # Get toolkits from action names\n toolkits = set()\n for action_name in action_names:\n if \"_\" in action_name:\n toolkit = action_name.split(\"_\")[0].lower()\n toolkits.add(toolkit)\n\n if not toolkits:\n return []\n\n # Get all tools for the relevant toolkits\n all_tools = composio.tools.get(user_id=self.entity_id, toolkits=list(toolkits))\n\n # Filter to only the specific actions we want using list comprehension\n return [tool for tool in all_tools if hasattr(tool, \"name\") and tool.name in action_names]\n\n def _build_wrapper(self) -> Composio:\n \"\"\"Build the Composio wrapper using new SDK.\n\n Returns:\n Composio: The initialized Composio client.\n\n Raises:\n ValueError: If the API key is not found or invalid.\n \"\"\"\n # Check if we're in Astra cloud environment and raise an error if we are.\n raise_error_if_astra_cloud_disable_component(disable_component_in_astra_cloud_msg)\n try:\n if not self.api_key:\n msg = \"Composio API Key is required\"\n raise ValueError(msg)\n return Composio(api_key=self.api_key, provider=LangchainProvider())\n except ValueError as e:\n self.log(f\"Error building Composio wrapper: {e}\")\n msg = \"Please provide a valid Composio API Key in the component settings\"\n raise ValueError(msg) from e\n"},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"tool_name":{"_input_type":"ConnectionInput","advanced":false,"button_metadata":{"icon":"unplug","variant":"destructive"},"connection_link":"","display_name":"Tool Name","dynamic":false,"info":"The name of the tool to use","name":"tool_name","options":[],"placeholder":"Select a tool...","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"connect","value":""}},"tool_mode":false},"ComposioAgentQLAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"AgentQL","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"AgentQL","legacy":false,"metadata":{"code_hash":"cca708a10ab6","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.agentql_composio.ComposioAgentQLAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioAgentQLAPIComponent(ComposioBaseComponent):\n display_name: str = \"AgentQL\"\n icon = \"AgentQL\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"agentql\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for AgentQL component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioAgiledAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Agiled","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Agiled","legacy":false,"metadata":{"code_hash":"3294a951a1a8","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.agiled_composio.ComposioAgiledAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioAgiledAPIComponent(ComposioBaseComponent):\n display_name: str = \"Agiled\"\n icon = \"Agiled\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"agiled\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Agiled component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioAirtableAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Airtable","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Airtable","legacy":false,"metadata":{"code_hash":"e47ad011c33c","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.airtable_composio.ComposioAirtableAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioAirtableAPIComponent(ComposioBaseComponent):\n display_name: str = \"Airtable\"\n icon = \"Airtable\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"airtable\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Airtable component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioApolloAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Apollo","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Apollo","legacy":false,"metadata":{"code_hash":"3af16f5d6ceb","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.apollo_composio.ComposioApolloAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioApolloAPIComponent(ComposioBaseComponent):\n display_name: str = \"Apollo\"\n icon = \"Apollo\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"apollo\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Apollo component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioAsanaAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Asana","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Asana","legacy":false,"metadata":{"code_hash":"290d6d61d049","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.asana_composio.ComposioAsanaAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioAsanaAPIComponent(ComposioBaseComponent):\n display_name: str = \"Asana\"\n icon = \"Asana\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"asana\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Asana component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioAttioAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Attio","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Attio","legacy":false,"metadata":{"code_hash":"de43b3cf5671","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.attio_composio.ComposioAttioAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioAttioAPIComponent(ComposioBaseComponent):\n display_name: str = \"Attio\"\n icon = \"Attio\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"attio\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Attio component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioBitbucketAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Bitbucket","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Bitbucket","legacy":false,"metadata":{"code_hash":"7528a8928646","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.bitbucket_composio.ComposioBitbucketAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioBitbucketAPIComponent(ComposioBaseComponent):\n display_name: str = \"Bitbucket\"\n icon = \"Bitbucket\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"bitbucket\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Bitbucket component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioBolnaAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Bolna","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Bolna","legacy":false,"metadata":{"code_hash":"dde7d2ee80a2","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.bolna_composio.ComposioBolnaAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioBolnaAPIComponent(ComposioBaseComponent):\n display_name: str = \"Bolna\"\n icon = \"Bolna\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"bolna\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Bolna component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioBrightdataAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Brightdata","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Brightdata","legacy":false,"metadata":{"code_hash":"49a04c5a23cb","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.brightdata_composio.ComposioBrightdataAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioBrightdataAPIComponent(ComposioBaseComponent):\n display_name: str = \"Brightdata\"\n icon = \"Brightdata\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"brightdata\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Brightdata component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioCalendlyAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Calendly","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Calendly","legacy":false,"metadata":{"code_hash":"4a282e413d55","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.calendly_composio.ComposioCalendlyAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioCalendlyAPIComponent(ComposioBaseComponent):\n display_name: str = \"Calendly\"\n icon = \"Calendly\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"calendly\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Calendly component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioCanvaAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Canva","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Canva","legacy":false,"metadata":{"code_hash":"d149aa178e80","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.canva_composio.ComposioCanvaAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioCanvaAPIComponent(ComposioBaseComponent):\n display_name: str = \"Canva\"\n icon = \"Canva\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"canva\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Canva component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioCanvasAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Canvas","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Canvas","legacy":false,"metadata":{"code_hash":"6510d212a720","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.canvas_composio.ComposioCanvasAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioCanvasAPIComponent(ComposioBaseComponent):\n display_name: str = \"Canvas\"\n icon = \"Canvas\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"canvas\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Canvaas component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioCodaAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Coda","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Coda","legacy":false,"metadata":{"code_hash":"f7693920313f","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.coda_composio.ComposioCodaAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioCodaAPIComponent(ComposioBaseComponent):\n display_name: str = \"Coda\"\n icon = \"Coda\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"coda\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Coda component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioContentfulAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Contentful","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Contentful","legacy":false,"metadata":{"code_hash":"36befb1ec8fc","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.contentful_composio.ComposioContentfulAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioContentfulAPIComponent(ComposioBaseComponent):\n display_name: str = \"Contentful\"\n icon = \"Contentful\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"contentful\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Contentful component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioDigicertAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Digicert","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Digicert","legacy":false,"metadata":{"code_hash":"0fcbc1b899f8","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.digicert_composio.ComposioDigicertAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioDigicertAPIComponent(ComposioBaseComponent):\n display_name: str = \"Digicert\"\n icon = \"Digicert\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"digicert\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Digicert component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioDiscordAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Discord","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"discord","legacy":false,"metadata":{"code_hash":"2ec988f25784","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.discord_composio.ComposioDiscordAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioDiscordAPIComponent(ComposioBaseComponent):\n display_name: str = \"Discord\"\n icon = \"discord\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"discord\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Discord component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioDropboxAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Dropbox","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Dropbox","legacy":false,"metadata":{"code_hash":"d05825599def","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.dropbox_compnent.ComposioDropboxAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioDropboxAPIComponent(ComposioBaseComponent):\n display_name: str = \"Dropbox\"\n icon = \"Dropbox\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"dropbox\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Dropbox component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioElevenLabsAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"ElevenLabs","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Elevenlabs","legacy":false,"metadata":{"code_hash":"e0c91533558b","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.elevenlabs_composio.ComposioElevenLabsAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioElevenLabsAPIComponent(ComposioBaseComponent):\n display_name: str = \"ElevenLabs\"\n icon = \"Elevenlabs\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"elevenlabs\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for ElevenLabs component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioExaAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Exa","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"ExaComposio","legacy":false,"metadata":{"code_hash":"3b5cecdefab8","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.exa_composio.ComposioExaAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioExaAPIComponent(ComposioBaseComponent):\n display_name: str = \"Exa\"\n icon = \"ExaComposio\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"exa\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Exa component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioFigmaAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Figma","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Figma","legacy":false,"metadata":{"code_hash":"7443d213546b","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.figma_composio.ComposioFigmaAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioFigmaAPIComponent(ComposioBaseComponent):\n display_name: str = \"Figma\"\n icon = \"Figma\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"figma\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Figma component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioFinageAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Finage","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Finage","legacy":false,"metadata":{"code_hash":"50a2bdee4cd1","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.finage_composio.ComposioFinageAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioFinageAPIComponent(ComposioBaseComponent):\n display_name: str = \"Finage\"\n icon = \"Finage\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"finage\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Finage component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioFirecrawlAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Firecrawl","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Firecrawl","legacy":false,"metadata":{"code_hash":"2ab1c4b00071","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.firecrawl_composio.ComposioFirecrawlAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioFirecrawlAPIComponent(ComposioBaseComponent):\n display_name: str = \"Firecrawl\"\n icon = \"Firecrawl\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"firecrawl\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Firecrawl component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioFirefliesAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Fireflies","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Fireflies","legacy":false,"metadata":{"code_hash":"233cd91dbdad","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.fireflies_composio.ComposioFirefliesAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioFirefliesAPIComponent(ComposioBaseComponent):\n display_name: str = \"Fireflies\"\n icon = \"Fireflies\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"fireflies\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Fireflies component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioFixerAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Fixer","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Fixer","legacy":false,"metadata":{"code_hash":"9e4c00f9dcd8","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.fixer_composio.ComposioFixerAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioFixerAPIComponent(ComposioBaseComponent):\n display_name: str = \"Fixer\"\n icon = \"Fixer\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"fixer\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Fixer component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioFlexisignAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Flexisign","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Flexisign","legacy":false,"metadata":{"code_hash":"c69bbee0005d","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.flexisign_composio.ComposioFlexisignAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioFlexisignAPIComponent(ComposioBaseComponent):\n display_name: str = \"Flexisign\"\n icon = \"Flexisign\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"flexisign\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Flexisign component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioFreshdeskAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Freshdesk","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Freshdesk","legacy":false,"metadata":{"code_hash":"1dde03d615ca","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.freshdesk_composio.ComposioFreshdeskAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioFreshdeskAPIComponent(ComposioBaseComponent):\n display_name: str = \"Freshdesk\"\n icon = \"Freshdesk\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"freshdesk\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Freshdesk component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioGitHubAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"GitHub","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Github","legacy":false,"metadata":{"code_hash":"f8abad5de5fd","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.github.amrom.workers.devposio.ComposioGitHubAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioGitHubAPIComponent(ComposioBaseComponent):\n display_name: str = \"GitHub\"\n icon = \"Github\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"github\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for GitHub component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioGmailAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Gmail","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Gmail","legacy":false,"metadata":{"code_hash":"d4b13ac8a3a1","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.gmail_composio.ComposioGmailAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioGmailAPIComponent(ComposioBaseComponent):\n display_name: str = \"Gmail\"\n icon = \"Gmail\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"gmail\"\n\n def __init__(self, **kwargs):\n super().__init__(**kwargs)\n self.post_processors = {\n \"GMAIL_SEND_EMAIL\": self._process_send_email_response,\n \"GMAIL_FETCH_EMAILS\": self._process_fetch_emails_response,\n }\n\n def _process_send_email_response(self, raw_data):\n \"\"\"Post-processor for GMAIL_SEND_EMAIL action.\"\"\"\n if isinstance(raw_data, dict):\n response_data = raw_data.get(\"response_data\", raw_data)\n\n return {\n \"message_id\": response_data.get(\"id\"),\n \"thread_id\": response_data.get(\"threadId\"),\n \"label_ids\": response_data.get(\"labelIds\", []),\n }\n return raw_data\n\n def _process_fetch_emails_response(self, raw_data):\n \"\"\"Post-processor for GMAIL_FETCH_EMAILS action.\"\"\"\n if isinstance(raw_data, dict):\n messages = raw_data.get(\"messages\", [])\n if messages:\n return messages\n return raw_data\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Gmail component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioGoogleBigQueryAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"GoogleBigQuery","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Googlebigquery","legacy":false,"metadata":{"code_hash":"f7d84aaae78f","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.googlebigquery_composio.ComposioGoogleBigQueryAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioGoogleBigQueryAPIComponent(ComposioBaseComponent):\n display_name: str = \"GoogleBigQuery\"\n icon = \"Googlebigquery\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"googlebigquery\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Google BigQuery component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioGoogleCalendarAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"GoogleCalendar","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Googlecalendar","legacy":false,"metadata":{"code_hash":"28adb6fff093","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.googlecalendar_composio.ComposioGoogleCalendarAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioGoogleCalendarAPIComponent(ComposioBaseComponent):\n display_name: str = \"GoogleCalendar\"\n icon = \"Googlecalendar\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"googlecalendar\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Google Calendar component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioGoogleDocsAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"GoogleDocs","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Googledocs","legacy":false,"metadata":{"code_hash":"ac2e88b6f706","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.googledocs_composio.ComposioGoogleDocsAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioGoogleDocsAPIComponent(ComposioBaseComponent):\n display_name: str = \"GoogleDocs\"\n icon = \"Googledocs\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"googledocs\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Google Docs component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioGoogleSheetsAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"GoogleSheets","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Googlesheets","legacy":false,"metadata":{"code_hash":"b0db7a3abe1f","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.googlesheets_composio.ComposioGoogleSheetsAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioGoogleSheetsAPIComponent(ComposioBaseComponent):\n display_name: str = \"GoogleSheets\"\n icon = \"Googlesheets\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"googlesheets\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Google Sheets component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioGoogleTasksAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"GoogleTasks","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"GoogleTasks","legacy":false,"metadata":{"code_hash":"2ba9c1661f41","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.googletasks_composio.ComposioGoogleTasksAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioGoogleTasksAPIComponent(ComposioBaseComponent):\n display_name: str = \"GoogleTasks\"\n icon = \"GoogleTasks\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"googletasks\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioGoogleclassroomAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Google Classroom","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Classroom","legacy":false,"metadata":{"code_hash":"85a5c37c13f6","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.googleclassroom_composio.ComposioGoogleclassroomAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioGoogleclassroomAPIComponent(ComposioBaseComponent):\n display_name: str = \"Google Classroom\"\n icon = \"Classroom\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"GOOGLE_CLASSROOM\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Google Classroom component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioGooglemeetAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"GoogleMeet","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Googlemeet","legacy":false,"metadata":{"code_hash":"cdbf16c4b42f","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.googlemeet_composio.ComposioGooglemeetAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioGooglemeetAPIComponent(ComposioBaseComponent):\n display_name: str = \"GoogleMeet\"\n icon = \"Googlemeet\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"googlemeet\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Google Calendar component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioHeygenAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Heygen","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Heygen","legacy":false,"metadata":{"code_hash":"c72fd5d0350f","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.heygen_composio.ComposioHeygenAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioHeygenAPIComponent(ComposioBaseComponent):\n display_name: str = \"Heygen\"\n icon = \"Heygen\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"heygen\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Heygen component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioInstagramAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Instagram","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Instagram","legacy":false,"metadata":{"code_hash":"a6691c905833","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.instagram_composio.ComposioInstagramAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioInstagramAPIComponent(ComposioBaseComponent):\n display_name: str = \"Instagram\"\n icon = \"Instagram\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"instagram\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Instagram component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioJiraAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Jira","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Jira","legacy":false,"metadata":{"code_hash":"3e62396f3868","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.jira_composio.ComposioJiraAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioJiraAPIComponent(ComposioBaseComponent):\n display_name: str = \"Jira\"\n icon = \"Jira\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"jira\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Jira component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioJotformAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Jotform","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Jotform","legacy":false,"metadata":{"code_hash":"7c1c6a676814","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.jotform_composio.ComposioJotformAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioJotformAPIComponent(ComposioBaseComponent):\n display_name: str = \"Jotform\"\n icon = \"Jotform\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"jotform\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Jotform component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioKlaviyoAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Klaviyo","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Klaviyo","legacy":false,"metadata":{"code_hash":"3be7e8a5e3fe","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.klaviyo_composio.ComposioKlaviyoAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioKlaviyoAPIComponent(ComposioBaseComponent):\n display_name: str = \"Klaviyo\"\n icon = \"Klaviyo\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"klaviyo\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Klaviyo component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioLinearAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Linear","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Linear","legacy":false,"metadata":{"code_hash":"be2b2ebbeea7","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.linear_composio.ComposioLinearAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioLinearAPIComponent(ComposioBaseComponent):\n display_name: str = \"Linear\"\n icon = \"Linear\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"linear\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Linear component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioListennotesAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Listennotes","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Listennotes","legacy":false,"metadata":{"code_hash":"b85f2fe51906","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.listennotes_composio.ComposioListennotesAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioListennotesAPIComponent(ComposioBaseComponent):\n display_name: str = \"Listennotes\"\n icon = \"Listennotes\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"listennotes\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Listennotes component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioMem0APIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Mem0","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Mem0Composio","legacy":false,"metadata":{"code_hash":"68871a483786","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.mem0_composio.ComposioMem0APIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioMem0APIComponent(ComposioBaseComponent):\n display_name: str = \"Mem0\"\n icon = \"Mem0Composio\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"mem0\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Mem0 component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioMiroAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Miro","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Miro","legacy":false,"metadata":{"code_hash":"1e9c421e1ac4","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.miro_composio.ComposioMiroAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioMiroAPIComponent(ComposioBaseComponent):\n display_name: str = \"Miro\"\n icon = \"Miro\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"miro\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Miro component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioMissiveAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Missive","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Missive","legacy":false,"metadata":{"code_hash":"6def944a7739","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.missive_composio.ComposioMissiveAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioMissiveAPIComponent(ComposioBaseComponent):\n display_name: str = \"Missive\"\n icon = \"Missive\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"missive\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Missive component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioNotionAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Notion","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Notion","legacy":false,"metadata":{"code_hash":"590aa6ff30d1","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.notion_composio.ComposioNotionAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioNotionAPIComponent(ComposioBaseComponent):\n display_name: str = \"Notion\"\n icon = \"Notion\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"notion\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Notion component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioOneDriveAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"OneDrive","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"One_Drive","legacy":false,"metadata":{"code_hash":"497cc4625121","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.onedrive_composio.ComposioOneDriveAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioOneDriveAPIComponent(ComposioBaseComponent):\n display_name: str = \"OneDrive\"\n icon = \"One_Drive\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"one_drive\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for OneDrive component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioOutlookAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Outlook","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Outlook","legacy":false,"metadata":{"code_hash":"bf6998d60b63","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.outlook_composio.ComposioOutlookAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioOutlookAPIComponent(ComposioBaseComponent):\n display_name: str = \"Outlook\"\n icon = \"Outlook\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"outlook\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Gmail component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioPandadocAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Pandadoc","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Pandadoc","legacy":false,"metadata":{"code_hash":"21d92aabc1bf","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.pandadoc_composio.ComposioPandadocAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioPandadocAPIComponent(ComposioBaseComponent):\n display_name: str = \"Pandadoc\"\n icon = \"Pandadoc\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"pandadoc\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Pandadoc component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioPeopleDataLabsAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"PeopleDataLabs","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Peopledatalabs","legacy":false,"metadata":{"code_hash":"bd05ce58f55c","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.peopledatalabs_composio.ComposioPeopleDataLabsAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioPeopleDataLabsAPIComponent(ComposioBaseComponent):\n display_name: str = \"PeopleDataLabs\"\n icon = \"Peopledatalabs\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"peopledatalabs\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for PeopleDataLabs component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioPerplexityAIAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"PerplexityAI","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"PerplexityComposio","legacy":false,"metadata":{"code_hash":"e40b0651344f","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.perplexityai_composio.ComposioPerplexityAIAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioPerplexityAIAPIComponent(ComposioBaseComponent):\n display_name: str = \"PerplexityAI\"\n icon = \"PerplexityComposio\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"perplexityai\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for PerplexityAI component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioRedditAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Reddit","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Reddit","legacy":false,"metadata":{"code_hash":"a86794073c22","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.reddit_composio.ComposioRedditAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioRedditAPIComponent(ComposioBaseComponent):\n display_name: str = \"Reddit\"\n icon = \"Reddit\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"reddit\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Reddit component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioSerpAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"SerpAPI","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"SerpSearchComposio","legacy":false,"metadata":{"code_hash":"74b0a07ee54b","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.serpapi_composio.ComposioSerpAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioSerpAPIComponent(ComposioBaseComponent):\n display_name: str = \"SerpAPI\"\n icon = \"SerpSearchComposio\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"serpapi\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for SerpAPI component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioSlackAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Slack","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"SlackComposio","legacy":false,"metadata":{"code_hash":"fa340cae1330","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.slack_composio.ComposioSlackAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioSlackAPIComponent(ComposioBaseComponent):\n display_name: str = \"Slack\"\n icon = \"SlackComposio\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"slack\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Slack component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioSlackbotAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Slackbot","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"SlackComposio","legacy":false,"metadata":{"code_hash":"ddeb26bc04e6","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.slackbot_composio.ComposioSlackbotAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioSlackbotAPIComponent(ComposioBaseComponent):\n display_name: str = \"Slackbot\"\n icon = \"SlackComposio\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"slackbot\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Slackbot component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioSnowflakeAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Snowflake","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Snowflake","legacy":false,"metadata":{"code_hash":"d0d1af5686d2","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.snowflake_composio.ComposioSnowflakeAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioSnowflakeAPIComponent(ComposioBaseComponent):\n display_name: str = \"Snowflake\"\n icon = \"Snowflake\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"snowflake\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Snowflake component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioSupabaseAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Supabase","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Supabase","legacy":false,"metadata":{"code_hash":"7ad58ce34cc0","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.supabase_composio.ComposioSupabaseAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioSupabaseAPIComponent(ComposioBaseComponent):\n display_name: str = \"Supabase\"\n icon = \"Supabase\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"supabase\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Supabase component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioTavilyAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Tavily","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Tavily","legacy":false,"metadata":{"code_hash":"97af05e37911","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.tavily_composio.ComposioTavilyAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioTavilyAPIComponent(ComposioBaseComponent):\n display_name: str = \"Tavily\"\n icon = \"Tavily\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"tavily\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Tavily component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioTimelinesAIAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"TimelinesAI","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Timelinesai","legacy":false,"metadata":{"code_hash":"76e70e2de4d3","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.timelinesai_composio.ComposioTimelinesAIAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioTimelinesAIAPIComponent(ComposioBaseComponent):\n display_name: str = \"TimelinesAI\"\n icon = \"Timelinesai\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"timelinesai\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for TimelinesAI component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioTodoistAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Todoist","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Todoist","legacy":false,"metadata":{"code_hash":"4dd9852f2058","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.todoist_composio.ComposioTodoistAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioTodoistAPIComponent(ComposioBaseComponent):\n display_name: str = \"Todoist\"\n icon = \"Todoist\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"todoist\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Todoist component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioWrikeAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"Wrike","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"Wrike","legacy":false,"metadata":{"code_hash":"a5f2cf00ca08","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.wrike_composio.ComposioWrikeAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioWrikeAPIComponent(ComposioBaseComponent):\n display_name: str = \"Wrike\"\n icon = \"Wrike\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"wrike\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Wrike component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"ComposioYoutubeAPIComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"display_name":"YouTube","documentation":"https://docs.composio.dev","edited":false,"field_order":["entity_id","api_key","auth_mode","auth_link","client_id","client_secret","verification_token","redirect_uri","authorization_url","token_url","api_key_field","generic_api_key","token","access_token","refresh_token","username","password","domain","base_url","bearer_token","authorization_code","scopes","subdomain","instance_url","tenant_id","action_button"],"frozen":false,"icon":"youTube","legacy":false,"metadata":{"code_hash":"463f4015c874","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.composio.youtube_composio.ComposioYoutubeAPIComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataFrame","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","access_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Access Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"access_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"action_button":{"_input_type":"SortableListInput","advanced":false,"display_name":"Action","dynamic":false,"helper_text":"Please connect before selecting actions.","helper_text_metadata":{"variant":"destructive"},"info":"","limit":1,"name":"action_button","options":[],"placeholder":"Select action","real_time_refresh":true,"required":false,"search_category":[],"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"sortableList","value":"disabled"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Composio API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"COMPOSIO_API_KEY"},"api_key_field":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"api_key_field","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"auth_link":{"_input_type":"AuthInput","advanced":false,"auth_tooltip":"Please insert a valid Composio API Key.","dynamic":false,"info":"","name":"auth_link","placeholder":"","required":false,"show":false,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"auth","value":""},"auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Auth Mode","dynamic":false,"external_options":{},"helper_text":"Choose how to authenticate with the toolkit.","info":"","name":"auth_mode","options":[],"options_metadata":[],"placeholder":"Select auth mode","real_time_refresh":true,"required":false,"show":false,"title_case":false,"toggle":true,"toggle_disable":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"authorization_code":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Authorization Code","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"authorization_code","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"authorization_url":{"_input_type":"StrInput","advanced":false,"display_name":"Authorization URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"authorization_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"base_url":{"_input_type":"StrInput","advanced":false,"display_name":"Base URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"base_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"bearer_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Bearer Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"bearer_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client ID","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_id","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"client_secret":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Client Secret","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"client_secret","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.composio.composio_base import ComposioBaseComponent\n\n\nclass ComposioYoutubeAPIComponent(ComposioBaseComponent):\n display_name: str = \"YouTube\"\n icon = \"youTube\"\n documentation: str = \"https://docs.composio.dev\"\n app_name = \"youtube\"\n\n def set_default_tools(self):\n \"\"\"Set the default tools for Youtube component.\"\"\"\n"},"domain":{"_input_type":"StrInput","advanced":false,"display_name":"Domain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"domain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"entity_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Entity ID","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"entity_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default"},"generic_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"API Key","dynamic":false,"info":"Enter API key on Composio page","input_types":[],"load_from_db":true,"name":"generic_api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"instance_url":{"_input_type":"StrInput","advanced":false,"display_name":"Instance URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"instance_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"redirect_uri":{"_input_type":"StrInput","advanced":false,"display_name":"Redirect URI","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"redirect_uri","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"refresh_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Refresh Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"refresh_token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"scopes":{"_input_type":"StrInput","advanced":false,"display_name":"Scopes","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scopes","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"subdomain":{"_input_type":"StrInput","advanced":false,"display_name":"Subdomain","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"subdomain","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tenant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Tenant ID","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tenant_id","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Token","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"token_url":{"_input_type":"StrInput","advanced":false,"display_name":"Token URL","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"token_url","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verification_token":{"_input_type":"StrInput","advanced":false,"display_name":"Verification Token","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"verification_token","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false}}],["confluence",{"Confluence":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Confluence wiki collaboration platform","display_name":"Confluence","documentation":"https://python.langchain.com/v0.2/docs/integrations/document_loaders/confluence/","edited":false,"field_order":["url","username","api_key","space_key","cloud","content_format","max_pages"],"frozen":false,"icon":"Confluence","legacy":false,"metadata":{"code_hash":"8a7ef34b66e4","dependencies":{"dependencies":[{"name":"langchain_community","version":"0.3.21"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.confluence.confluence.ConfluenceComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"load_documents","name":"data","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Confluence API Key","dynamic":false,"info":"Atlassian Key. Create at: https://id.atlassian.com/manage-profile/security/api-tokens","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"cloud":{"_input_type":"BoolInput","advanced":true,"display_name":"Use Cloud?","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"cloud","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from langchain_community.document_loaders import ConfluenceLoader\nfrom langchain_community.document_loaders.confluence import ContentFormat\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import BoolInput, DropdownInput, IntInput, Output, SecretStrInput, StrInput\nfrom lfx.schema.data import Data\n\n\nclass ConfluenceComponent(Component):\n display_name = \"Confluence\"\n description = \"Confluence wiki collaboration platform\"\n documentation = \"https://python.langchain.com/v0.2/docs/integrations/document_loaders/confluence/\"\n trace_type = \"tool\"\n icon = \"Confluence\"\n name = \"Confluence\"\n\n inputs = [\n StrInput(\n name=\"url\",\n display_name=\"Site URL\",\n required=True,\n info=\"The base URL of the Confluence Space. Example: https://.atlassian.net/wiki.\",\n ),\n StrInput(\n name=\"username\",\n display_name=\"Username\",\n required=True,\n info=\"Atlassian User E-mail. Example: email@example.com\",\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Confluence API Key\",\n required=True,\n info=\"Atlassian Key. Create at: https://id.atlassian.com/manage-profile/security/api-tokens\",\n ),\n StrInput(name=\"space_key\", display_name=\"Space Key\", required=True),\n BoolInput(name=\"cloud\", display_name=\"Use Cloud?\", required=True, value=True, advanced=True),\n DropdownInput(\n name=\"content_format\",\n display_name=\"Content Format\",\n options=[\n ContentFormat.EDITOR.value,\n ContentFormat.EXPORT_VIEW.value,\n ContentFormat.ANONYMOUS_EXPORT_VIEW.value,\n ContentFormat.STORAGE.value,\n ContentFormat.VIEW.value,\n ],\n value=ContentFormat.STORAGE.value,\n required=True,\n advanced=True,\n info=\"Specify content format, defaults to ContentFormat.STORAGE\",\n ),\n IntInput(\n name=\"max_pages\",\n display_name=\"Max Pages\",\n required=False,\n value=1000,\n advanced=True,\n info=\"Maximum number of pages to retrieve in total, defaults 1000\",\n ),\n ]\n\n outputs = [\n Output(name=\"data\", display_name=\"Data\", method=\"load_documents\"),\n ]\n\n def build_confluence(self) -> ConfluenceLoader:\n content_format = ContentFormat(self.content_format)\n return ConfluenceLoader(\n url=self.url,\n username=self.username,\n api_key=self.api_key,\n cloud=self.cloud,\n space_key=self.space_key,\n content_format=content_format,\n max_pages=self.max_pages,\n )\n\n def load_documents(self) -> list[Data]:\n confluence = self.build_confluence()\n documents = confluence.load()\n data = [Data.from_document(doc) for doc in documents] # Using the from_document method of Data\n self.status = data\n return data\n"},"content_format":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Content Format","dynamic":false,"external_options":{},"info":"Specify content format, defaults to ContentFormat.STORAGE","name":"content_format","options":["body.editor","body.export_view","body.anonymous_export_view","body.storage","body.view"],"options_metadata":[],"placeholder":"","required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"body.storage"},"max_pages":{"_input_type":"IntInput","advanced":true,"display_name":"Max Pages","dynamic":false,"info":"Maximum number of pages to retrieve in total, defaults 1000","list":false,"list_add_label":"Add More","name":"max_pages","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":1000},"space_key":{"_input_type":"StrInput","advanced":false,"display_name":"Space Key","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"space_key","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"url":{"_input_type":"StrInput","advanced":false,"display_name":"Site URL","dynamic":false,"info":"The base URL of the Confluence Space. Example: https://.atlassian.net/wiki.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"url","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"Atlassian User E-mail. Example: email@example.com","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false}}],["couchbase",{"Couchbase":{"base_classes":["Data","DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Couchbase Vector Store with search capabilities","display_name":"Couchbase","documentation":"","edited":false,"field_order":["couchbase_connection_string","couchbase_username","couchbase_password","bucket_name","scope_name","collection_name","index_name","ingest_data","search_query","should_cache_vector_store","embedding","number_of_results"],"frozen":false,"icon":"Couchbase","legacy":false,"metadata":{"code_hash":"70ed475a6f48","dependencies":{"dependencies":[{"name":"langchain_community","version":"0.3.21"},{"name":"lfx","version":null},{"name":"couchbase","version":null}],"total_dependencies":3},"module":"lfx.components.couchbase.couchbase.CouchbaseVectorStoreComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Search Results","group_outputs":false,"method":"search_documents","name":"search_results","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","bucket_name":{"_input_type":"StrInput","advanced":false,"display_name":"Bucket Name","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"bucket_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from datetime import timedelta\n\nfrom langchain_community.vectorstores import CouchbaseVectorStore\n\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.helpers.data import docs_to_data\nfrom lfx.io import HandleInput, IntInput, SecretStrInput, StrInput\nfrom lfx.schema.data import Data\n\n\nclass CouchbaseVectorStoreComponent(LCVectorStoreComponent):\n display_name = \"Couchbase\"\n description = \"Couchbase Vector Store with search capabilities\"\n name = \"Couchbase\"\n icon = \"Couchbase\"\n\n inputs = [\n SecretStrInput(\n name=\"couchbase_connection_string\", display_name=\"Couchbase Cluster connection string\", required=True\n ),\n StrInput(name=\"couchbase_username\", display_name=\"Couchbase username\", required=True),\n SecretStrInput(name=\"couchbase_password\", display_name=\"Couchbase password\", required=True),\n StrInput(name=\"bucket_name\", display_name=\"Bucket Name\", required=True),\n StrInput(name=\"scope_name\", display_name=\"Scope Name\", required=True),\n StrInput(name=\"collection_name\", display_name=\"Collection Name\", required=True),\n StrInput(name=\"index_name\", display_name=\"Index Name\", required=True),\n *LCVectorStoreComponent.inputs,\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 value=4,\n advanced=True,\n ),\n ]\n\n @check_cached_vector_store\n def build_vector_store(self) -> CouchbaseVectorStore:\n try:\n from couchbase.auth import PasswordAuthenticator\n from couchbase.cluster import Cluster\n from couchbase.options import ClusterOptions\n except ImportError as e:\n msg = \"Failed to import Couchbase dependencies. Install it using `uv pip install langflow[couchbase] --pre`\"\n raise ImportError(msg) from e\n\n try:\n auth = PasswordAuthenticator(self.couchbase_username, self.couchbase_password)\n options = ClusterOptions(auth)\n cluster = Cluster(self.couchbase_connection_string, options)\n\n cluster.wait_until_ready(timedelta(seconds=5))\n except Exception as e:\n msg = f\"Failed to connect to Couchbase: {e}\"\n raise ValueError(msg) from e\n\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 if documents:\n couchbase_vs = CouchbaseVectorStore.from_documents(\n documents=documents,\n cluster=cluster,\n bucket_name=self.bucket_name,\n scope_name=self.scope_name,\n collection_name=self.collection_name,\n embedding=self.embedding,\n index_name=self.index_name,\n )\n\n else:\n couchbase_vs = CouchbaseVectorStore(\n cluster=cluster,\n bucket_name=self.bucket_name,\n scope_name=self.scope_name,\n collection_name=self.collection_name,\n embedding=self.embedding,\n index_name=self.index_name,\n )\n\n return couchbase_vs\n\n def search_documents(self) -> list[Data]:\n vector_store = self.build_vector_store()\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\n data = docs_to_data(docs)\n self.status = data\n return data\n return []\n"},"collection_name":{"_input_type":"StrInput","advanced":false,"display_name":"Collection Name","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"collection_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"couchbase_connection_string":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Couchbase Cluster connection string","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"couchbase_connection_string","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"couchbase_password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Couchbase password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"couchbase_password","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"couchbase_username":{"_input_type":"StrInput","advanced":false,"display_name":"Couchbase username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"couchbase_username","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"embedding":{"_input_type":"HandleInput","advanced":false,"display_name":"Embedding","dynamic":false,"info":"","input_types":["Embeddings"],"list":false,"list_add_label":"Add More","name":"embedding","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"index_name":{"_input_type":"StrInput","advanced":false,"display_name":"Index Name","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"index_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"ingest_data":{"_input_type":"HandleInput","advanced":false,"display_name":"Ingest Data","dynamic":false,"info":"","input_types":["Data","DataFrame"],"list":true,"list_add_label":"Add More","name":"ingest_data","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Results","dynamic":false,"info":"Number of results to return.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":4},"scope_name":{"_input_type":"StrInput","advanced":false,"display_name":"Scope Name","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"scope_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"search_query":{"_input_type":"QueryInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Enter a query to run a similarity search.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"search_query","placeholder":"Enter a query...","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"query","value":""},"should_cache_vector_store":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache Vector Store","dynamic":false,"info":"If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.","list":false,"list_add_label":"Add More","name":"should_cache_vector_store","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true}},"tool_mode":false}}],["crewai",{"CrewAIAgentComponent":{"base_classes":["NoneType"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Represents an agent of CrewAI.","display_name":"CrewAI Agent","documentation":"https://docs.crewai.com/how-to/LLM-Connections/","edited":false,"field_order":["role","goal","backstory","tools","llm","memory","verbose","allow_delegation","allow_code_execution","kwargs"],"frozen":false,"icon":"CrewAI","legacy":true,"metadata":{"code_hash":"a23f0923049d","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"crewai","version":null}],"total_dependencies":2},"module":"lfx.components.crewai.crewai.CrewAIAgentComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Agent","group_outputs":false,"method":"build_output","name":"output","selected":"NoneType","tool_mode":true,"types":["NoneType"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":[],"template":{"_type":"Component","allow_code_execution":{"_input_type":"BoolInput","advanced":true,"display_name":"Allow Code Execution","dynamic":false,"info":"Whether the agent is allowed to execute code.","list":false,"list_add_label":"Add More","name":"allow_code_execution","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"allow_delegation":{"_input_type":"BoolInput","advanced":false,"display_name":"Allow Delegation","dynamic":false,"info":"Whether the agent is allowed to delegate tasks to other agents.","list":false,"list_add_label":"Add More","name":"allow_delegation","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"backstory":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Backstory","dynamic":false,"info":"The backstory of the agent.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"backstory","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.agents.crewai.crew import convert_llm, convert_tools\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import BoolInput, DictInput, HandleInput, MultilineInput, Output\n\n\nclass CrewAIAgentComponent(Component):\n \"\"\"Component for creating a CrewAI agent.\n\n This component allows you to create a CrewAI agent with the specified role, goal, backstory, tools,\n and language model.\n\n Args:\n Component (Component): Base class for all components.\n\n Returns:\n Agent: CrewAI agent.\n \"\"\"\n\n display_name = \"CrewAI Agent\"\n description = \"Represents an agent of CrewAI.\"\n documentation: str = \"https://docs.crewai.com/how-to/LLM-Connections/\"\n icon = \"CrewAI\"\n legacy = True\n replacement = \"agents.Agent\"\n\n inputs = [\n MultilineInput(name=\"role\", display_name=\"Role\", info=\"The role of the agent.\"),\n MultilineInput(name=\"goal\", display_name=\"Goal\", info=\"The objective of the agent.\"),\n MultilineInput(name=\"backstory\", display_name=\"Backstory\", info=\"The backstory of the agent.\"),\n HandleInput(\n name=\"tools\",\n display_name=\"Tools\",\n input_types=[\"Tool\"],\n is_list=True,\n info=\"Tools at agents disposal\",\n value=[],\n ),\n HandleInput(\n name=\"llm\",\n display_name=\"Language Model\",\n info=\"Language model that will run the agent.\",\n input_types=[\"LanguageModel\"],\n ),\n BoolInput(\n name=\"memory\",\n display_name=\"Memory\",\n info=\"Whether the agent should have memory or not\",\n advanced=True,\n value=True,\n ),\n BoolInput(\n name=\"verbose\",\n display_name=\"Verbose\",\n advanced=True,\n value=False,\n ),\n BoolInput(\n name=\"allow_delegation\",\n display_name=\"Allow Delegation\",\n info=\"Whether the agent is allowed to delegate tasks to other agents.\",\n value=True,\n ),\n BoolInput(\n name=\"allow_code_execution\",\n display_name=\"Allow Code Execution\",\n info=\"Whether the agent is allowed to execute code.\",\n value=False,\n advanced=True,\n ),\n DictInput(\n name=\"kwargs\",\n display_name=\"kwargs\",\n info=\"kwargs of agent.\",\n is_list=True,\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Agent\", name=\"output\", method=\"build_output\"),\n ]\n\n def build_output(self):\n try:\n from crewai import Agent\n except ImportError as e:\n msg = \"CrewAI is not installed. Please install it with `uv pip install crewai`.\"\n raise ImportError(msg) from e\n\n kwargs = self.kwargs or {}\n\n # Define the Agent\n agent = Agent(\n role=self.role,\n goal=self.goal,\n backstory=self.backstory,\n llm=convert_llm(self.llm),\n verbose=self.verbose,\n memory=self.memory,\n tools=convert_tools(self.tools),\n allow_delegation=self.allow_delegation,\n allow_code_execution=self.allow_code_execution,\n **kwargs,\n )\n\n self.status = repr(agent)\n\n return agent\n"},"goal":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Goal","dynamic":false,"info":"The objective of the agent.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"goal","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"kwargs":{"_input_type":"DictInput","advanced":true,"display_name":"kwargs","dynamic":false,"info":"kwargs of agent.","list":true,"list_add_label":"Add More","name":"kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"llm":{"_input_type":"HandleInput","advanced":false,"display_name":"Language Model","dynamic":false,"info":"Language model that will run the agent.","input_types":["LanguageModel"],"list":false,"list_add_label":"Add More","name":"llm","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"memory":{"_input_type":"BoolInput","advanced":true,"display_name":"Memory","dynamic":false,"info":"Whether the agent should have memory or not","list":false,"list_add_label":"Add More","name":"memory","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"role":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Role","dynamic":false,"info":"The role of the agent.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"role","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tools":{"_input_type":"HandleInput","advanced":false,"display_name":"Tools","dynamic":false,"info":"Tools at agents disposal","input_types":["Tool"],"list":true,"list_add_label":"Add More","name":"tools","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":[]},"verbose":{"_input_type":"BoolInput","advanced":true,"display_name":"Verbose","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"verbose","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false}},"tool_mode":false},"HierarchicalCrewComponent":{"base_classes":["Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Represents a group of agents, defining how they should collaborate and the tasks they should perform.","display_name":"Hierarchical Crew","documentation":"https://docs.crewai.com/how-to/Hierarchical/","edited":false,"field_order":["verbose","memory","use_cache","max_rpm","share_crew","function_calling_llm","agents","tasks","manager_llm","manager_agent"],"frozen":false,"icon":"CrewAI","legacy":true,"metadata":{"code_hash":"144be482cfb0","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"crewai","version":null}],"total_dependencies":2},"module":"lfx.components.crewai.hierarchical_crew.HierarchicalCrewComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Output","group_outputs":false,"method":"build_output","name":"output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":[],"template":{"_type":"Component","agents":{"_input_type":"HandleInput","advanced":false,"display_name":"Agents","dynamic":false,"info":"","input_types":["Agent"],"list":true,"list_add_label":"Add More","name":"agents","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.agents.crewai.crew import BaseCrewComponent\nfrom lfx.io import HandleInput\n\n\nclass HierarchicalCrewComponent(BaseCrewComponent):\n display_name: str = \"Hierarchical Crew\"\n description: str = (\n \"Represents a group of agents, defining how they should collaborate and the tasks they should perform.\"\n )\n documentation: str = \"https://docs.crewai.com/how-to/Hierarchical/\"\n icon = \"CrewAI\"\n legacy = True\n replacement = \"agents.Agent\"\n\n inputs = [\n *BaseCrewComponent.get_base_inputs(),\n HandleInput(name=\"agents\", display_name=\"Agents\", input_types=[\"Agent\"], is_list=True),\n HandleInput(name=\"tasks\", display_name=\"Tasks\", input_types=[\"HierarchicalTask\"], is_list=True),\n HandleInput(name=\"manager_llm\", display_name=\"Manager LLM\", input_types=[\"LanguageModel\"], required=False),\n HandleInput(name=\"manager_agent\", display_name=\"Manager Agent\", input_types=[\"Agent\"], required=False),\n ]\n\n def build_crew(self):\n try:\n from crewai import Crew, Process\n except ImportError as e:\n msg = \"CrewAI is not installed. Please install it with `uv pip install crewai`.\"\n raise ImportError(msg) from e\n\n tasks, agents = self.get_tasks_and_agents()\n manager_llm = self.get_manager_llm()\n\n return Crew(\n agents=agents,\n tasks=tasks,\n process=Process.hierarchical,\n verbose=self.verbose,\n memory=self.memory,\n cache=self.use_cache,\n max_rpm=self.max_rpm,\n share_crew=self.share_crew,\n function_calling_llm=self.function_calling_llm,\n manager_agent=self.manager_agent,\n manager_llm=manager_llm,\n step_callback=self.get_step_callback(),\n task_callback=self.get_task_callback(),\n )\n"},"function_calling_llm":{"_input_type":"HandleInput","advanced":true,"display_name":"Function Calling LLM","dynamic":false,"info":"Turns the ReAct CrewAI agent into a function-calling agent","input_types":["LanguageModel"],"list":false,"list_add_label":"Add More","name":"function_calling_llm","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"manager_agent":{"_input_type":"HandleInput","advanced":false,"display_name":"Manager Agent","dynamic":false,"info":"","input_types":["Agent"],"list":false,"list_add_label":"Add More","name":"manager_agent","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"manager_llm":{"_input_type":"HandleInput","advanced":false,"display_name":"Manager LLM","dynamic":false,"info":"","input_types":["LanguageModel"],"list":false,"list_add_label":"Add More","name":"manager_llm","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"max_rpm":{"_input_type":"IntInput","advanced":true,"display_name":"Max RPM","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"max_rpm","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":100},"memory":{"_input_type":"BoolInput","advanced":true,"display_name":"Memory","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"memory","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"share_crew":{"_input_type":"BoolInput","advanced":true,"display_name":"Share Crew","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"share_crew","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"tasks":{"_input_type":"HandleInput","advanced":false,"display_name":"Tasks","dynamic":false,"info":"","input_types":["HierarchicalTask"],"list":true,"list_add_label":"Add More","name":"tasks","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"use_cache":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"use_cache","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"verbose":{"_input_type":"IntInput","advanced":true,"display_name":"Verbose","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"verbose","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":0}},"tool_mode":false},"HierarchicalTaskComponent":{"base_classes":["HierarchicalTask"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Each task must have a description, an expected output and an agent responsible for execution.","display_name":"Hierarchical Task","documentation":"","edited":false,"field_order":["task_description","expected_output","tools"],"frozen":false,"icon":"CrewAI","legacy":true,"metadata":{"code_hash":"25071652dc20","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.crewai.hierarchical_task.HierarchicalTaskComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Task","group_outputs":false,"method":"build_task","name":"task_output","selected":"HierarchicalTask","tool_mode":true,"types":["HierarchicalTask"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":[],"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.agents.crewai.tasks import HierarchicalTask\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import HandleInput, MultilineInput, Output\n\n\nclass HierarchicalTaskComponent(Component):\n display_name: str = \"Hierarchical Task\"\n description: str = \"Each task must have a description, an expected output and an agent responsible for execution.\"\n icon = \"CrewAI\"\n legacy = True\n replacement = \"agents.Agent\"\n inputs = [\n MultilineInput(\n name=\"task_description\",\n display_name=\"Description\",\n info=\"Descriptive text detailing task's purpose and execution.\",\n ),\n MultilineInput(\n name=\"expected_output\",\n display_name=\"Expected Output\",\n info=\"Clear definition of expected task outcome.\",\n ),\n HandleInput(\n name=\"tools\",\n display_name=\"Tools\",\n input_types=[\"Tool\"],\n is_list=True,\n info=\"List of tools/resources limited for task execution. Uses the Agent tools by default.\",\n required=False,\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Task\", name=\"task_output\", method=\"build_task\"),\n ]\n\n def build_task(self) -> HierarchicalTask:\n task = HierarchicalTask(\n description=self.task_description,\n expected_output=self.expected_output,\n tools=self.tools or [],\n )\n self.status = task\n return task\n"},"expected_output":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Expected Output","dynamic":false,"info":"Clear definition of expected task outcome.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"expected_output","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"task_description":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Description","dynamic":false,"info":"Descriptive text detailing task's purpose and execution.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"task_description","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tools":{"_input_type":"HandleInput","advanced":true,"display_name":"Tools","dynamic":false,"info":"List of tools/resources limited for task execution. Uses the Agent tools by default.","input_types":["Tool"],"list":true,"list_add_label":"Add More","name":"tools","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""}},"tool_mode":false},"SequentialCrewComponent":{"base_classes":["Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Represents a group of agents with tasks that are executed sequentially.","display_name":"Sequential Crew","documentation":"https://docs.crewai.com/how-to/Sequential/","edited":false,"field_order":["verbose","memory","use_cache","max_rpm","share_crew","function_calling_llm","tasks"],"frozen":false,"icon":"CrewAI","legacy":true,"metadata":{"code_hash":"42e59f6d6572","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"crewai","version":null}],"total_dependencies":2},"module":"lfx.components.crewai.sequential_crew.SequentialCrewComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Output","group_outputs":false,"method":"build_output","name":"output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":[],"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.agents.crewai.crew import BaseCrewComponent\nfrom lfx.io import HandleInput\nfrom lfx.schema.message import Message\n\n\nclass SequentialCrewComponent(BaseCrewComponent):\n display_name: str = \"Sequential Crew\"\n description: str = \"Represents a group of agents with tasks that are executed sequentially.\"\n documentation: str = \"https://docs.crewai.com/how-to/Sequential/\"\n icon = \"CrewAI\"\n legacy = True\n replacement = \"agents.Agent\"\n\n inputs = [\n *BaseCrewComponent.get_base_inputs(),\n HandleInput(name=\"tasks\", display_name=\"Tasks\", input_types=[\"SequentialTask\"], is_list=True),\n ]\n\n @property\n def agents(self: \"SequentialCrewComponent\") -> list:\n # Derive agents directly from linked tasks\n return [task.agent for task in self.tasks if hasattr(task, \"agent\")]\n\n def get_tasks_and_agents(self, agents_list=None) -> tuple[list, list]:\n # Use the agents property to derive agents\n if not agents_list:\n existing_agents = self.agents\n agents_list = existing_agents + (agents_list or [])\n\n return super().get_tasks_and_agents(agents_list=agents_list)\n\n def build_crew(self) -> Message:\n try:\n from crewai import Crew, Process\n except ImportError as e:\n msg = \"CrewAI is not installed. Please install it with `uv pip install crewai`.\"\n raise ImportError(msg) from e\n\n tasks, agents = self.get_tasks_and_agents()\n\n return Crew(\n agents=agents,\n tasks=tasks,\n process=Process.sequential,\n verbose=self.verbose,\n memory=self.memory,\n cache=self.use_cache,\n max_rpm=self.max_rpm,\n share_crew=self.share_crew,\n function_calling_llm=self.function_calling_llm,\n step_callback=self.get_step_callback(),\n task_callback=self.get_task_callback(),\n )\n"},"function_calling_llm":{"_input_type":"HandleInput","advanced":true,"display_name":"Function Calling LLM","dynamic":false,"info":"Turns the ReAct CrewAI agent into a function-calling agent","input_types":["LanguageModel"],"list":false,"list_add_label":"Add More","name":"function_calling_llm","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"max_rpm":{"_input_type":"IntInput","advanced":true,"display_name":"Max RPM","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"max_rpm","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":100},"memory":{"_input_type":"BoolInput","advanced":true,"display_name":"Memory","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"memory","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"share_crew":{"_input_type":"BoolInput","advanced":true,"display_name":"Share Crew","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"share_crew","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"tasks":{"_input_type":"HandleInput","advanced":false,"display_name":"Tasks","dynamic":false,"info":"","input_types":["SequentialTask"],"list":true,"list_add_label":"Add More","name":"tasks","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"use_cache":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"use_cache","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"verbose":{"_input_type":"IntInput","advanced":true,"display_name":"Verbose","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"verbose","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":0}},"tool_mode":false},"SequentialTaskAgentComponent":{"base_classes":["SequentialTask"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Creates a CrewAI Task and its associated Agent.","display_name":"Sequential Task Agent","documentation":"https://docs.crewai.com/how-to/LLM-Connections/","edited":false,"field_order":["role","goal","backstory","tools","llm","memory","verbose","allow_delegation","allow_code_execution","agent_kwargs","task_description","expected_output","async_execution","previous_task"],"frozen":false,"icon":"CrewAI","legacy":true,"metadata":{"code_hash":"0a5483ef82c3","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"crewai","version":null}],"total_dependencies":2},"module":"lfx.components.crewai.sequential_task_agent.SequentialTaskAgentComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Sequential Task","group_outputs":false,"method":"build_agent_and_task","name":"task_output","selected":"SequentialTask","tool_mode":true,"types":["SequentialTask"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":[],"template":{"_type":"Component","agent_kwargs":{"_input_type":"DictInput","advanced":true,"display_name":"Agent kwargs","dynamic":false,"info":"Additional kwargs for the agent.","list":true,"list_add_label":"Add More","name":"agent_kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"allow_code_execution":{"_input_type":"BoolInput","advanced":true,"display_name":"Allow Code Execution","dynamic":false,"info":"Whether the agent is allowed to execute code.","list":false,"list_add_label":"Add More","name":"allow_code_execution","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"allow_delegation":{"_input_type":"BoolInput","advanced":true,"display_name":"Allow Delegation","dynamic":false,"info":"Whether the agent is allowed to delegate tasks to other agents.","list":false,"list_add_label":"Add More","name":"allow_delegation","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"async_execution":{"_input_type":"BoolInput","advanced":true,"display_name":"Async Execution","dynamic":false,"info":"Boolean flag indicating asynchronous task execution.","list":false,"list_add_label":"Add More","name":"async_execution","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"backstory":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Backstory","dynamic":false,"info":"The backstory of the agent.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"backstory","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.agents.crewai.tasks import SequentialTask\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import BoolInput, DictInput, HandleInput, MultilineInput, Output\n\n\nclass SequentialTaskAgentComponent(Component):\n display_name = \"Sequential Task Agent\"\n description = \"Creates a CrewAI Task and its associated Agent.\"\n documentation = \"https://docs.crewai.com/how-to/LLM-Connections/\"\n icon = \"CrewAI\"\n legacy = True\n replacement = \"agents.Agent\"\n\n inputs = [\n # Agent inputs\n MultilineInput(name=\"role\", display_name=\"Role\", info=\"The role of the agent.\"),\n MultilineInput(name=\"goal\", display_name=\"Goal\", info=\"The objective of the agent.\"),\n MultilineInput(\n name=\"backstory\",\n display_name=\"Backstory\",\n info=\"The backstory of the agent.\",\n ),\n HandleInput(\n name=\"tools\",\n display_name=\"Tools\",\n input_types=[\"Tool\"],\n is_list=True,\n info=\"Tools at agent's disposal\",\n value=[],\n ),\n HandleInput(\n name=\"llm\",\n display_name=\"Language Model\",\n info=\"Language model that will run the agent.\",\n input_types=[\"LanguageModel\"],\n ),\n BoolInput(\n name=\"memory\",\n display_name=\"Memory\",\n info=\"Whether the agent should have memory or not\",\n advanced=True,\n value=True,\n ),\n BoolInput(\n name=\"verbose\",\n display_name=\"Verbose\",\n advanced=True,\n value=True,\n ),\n BoolInput(\n name=\"allow_delegation\",\n display_name=\"Allow Delegation\",\n info=\"Whether the agent is allowed to delegate tasks to other agents.\",\n value=False,\n advanced=True,\n ),\n BoolInput(\n name=\"allow_code_execution\",\n display_name=\"Allow Code Execution\",\n info=\"Whether the agent is allowed to execute code.\",\n value=False,\n advanced=True,\n ),\n DictInput(\n name=\"agent_kwargs\",\n display_name=\"Agent kwargs\",\n info=\"Additional kwargs for the agent.\",\n is_list=True,\n advanced=True,\n ),\n # Task inputs\n MultilineInput(\n name=\"task_description\",\n display_name=\"Task Description\",\n info=\"Descriptive text detailing task's purpose and execution.\",\n ),\n MultilineInput(\n name=\"expected_output\",\n display_name=\"Expected Task Output\",\n info=\"Clear definition of expected task outcome.\",\n ),\n BoolInput(\n name=\"async_execution\",\n display_name=\"Async Execution\",\n value=False,\n advanced=True,\n info=\"Boolean flag indicating asynchronous task execution.\",\n ),\n # Chaining input\n HandleInput(\n name=\"previous_task\",\n display_name=\"Previous Task\",\n input_types=[\"SequentialTask\"],\n info=\"The previous task in the sequence (for chaining).\",\n required=False,\n ),\n ]\n\n outputs = [\n Output(\n display_name=\"Sequential Task\",\n name=\"task_output\",\n method=\"build_agent_and_task\",\n ),\n ]\n\n def build_agent_and_task(self) -> list[SequentialTask]:\n try:\n from crewai import Agent, Task\n except ImportError as e:\n msg = \"CrewAI is not installed. Please install it with `uv pip install crewai`.\"\n raise ImportError(msg) from e\n\n # Build the agent\n agent_kwargs = self.agent_kwargs or {}\n agent = Agent(\n role=self.role,\n goal=self.goal,\n backstory=self.backstory,\n llm=self.llm,\n verbose=self.verbose,\n memory=self.memory,\n tools=self.tools or [],\n allow_delegation=self.allow_delegation,\n allow_code_execution=self.allow_code_execution,\n **agent_kwargs,\n )\n\n # Build the task\n task = Task(\n description=self.task_description,\n expected_output=self.expected_output,\n agent=agent,\n async_execution=self.async_execution,\n )\n\n # If there's a previous task, create a list of tasks\n if self.previous_task:\n tasks = [*self.previous_task, task] if isinstance(self.previous_task, list) else [self.previous_task, task]\n else:\n tasks = [task]\n\n self.status = f\"Agent: {agent!r}\\nTask: {task!r}\"\n return tasks\n"},"expected_output":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Expected Task Output","dynamic":false,"info":"Clear definition of expected task outcome.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"expected_output","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"goal":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Goal","dynamic":false,"info":"The objective of the agent.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"goal","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"llm":{"_input_type":"HandleInput","advanced":false,"display_name":"Language Model","dynamic":false,"info":"Language model that will run the agent.","input_types":["LanguageModel"],"list":false,"list_add_label":"Add More","name":"llm","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"memory":{"_input_type":"BoolInput","advanced":true,"display_name":"Memory","dynamic":false,"info":"Whether the agent should have memory or not","list":false,"list_add_label":"Add More","name":"memory","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"previous_task":{"_input_type":"HandleInput","advanced":false,"display_name":"Previous Task","dynamic":false,"info":"The previous task in the sequence (for chaining).","input_types":["SequentialTask"],"list":false,"list_add_label":"Add More","name":"previous_task","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"role":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Role","dynamic":false,"info":"The role of the agent.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"role","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"task_description":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Task Description","dynamic":false,"info":"Descriptive text detailing task's purpose and execution.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"task_description","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tools":{"_input_type":"HandleInput","advanced":false,"display_name":"Tools","dynamic":false,"info":"Tools at agent's disposal","input_types":["Tool"],"list":true,"list_add_label":"Add More","name":"tools","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":[]},"verbose":{"_input_type":"BoolInput","advanced":true,"display_name":"Verbose","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"verbose","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true}},"tool_mode":false},"SequentialTaskComponent":{"base_classes":["SequentialTask"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Each task must have a description, an expected output and an agent responsible for execution.","display_name":"Sequential Task","documentation":"","edited":false,"field_order":["task_description","expected_output","tools","agent","task","async_execution"],"frozen":false,"icon":"CrewAI","legacy":true,"metadata":{"code_hash":"b1f17b8fcc5c","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.crewai.sequential_task.SequentialTaskComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Task","group_outputs":false,"method":"build_task","name":"task_output","selected":"SequentialTask","tool_mode":true,"types":["SequentialTask"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":[],"template":{"_type":"Component","agent":{"_input_type":"HandleInput","advanced":false,"display_name":"Agent","dynamic":false,"info":"CrewAI Agent that will perform the task","input_types":["Agent"],"list":false,"list_add_label":"Add More","name":"agent","placeholder":"","required":true,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"async_execution":{"_input_type":"BoolInput","advanced":true,"display_name":"Async Execution","dynamic":false,"info":"Boolean flag indicating asynchronous task execution.","list":false,"list_add_label":"Add More","name":"async_execution","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.agents.crewai.tasks import SequentialTask\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import BoolInput, HandleInput, MultilineInput, Output\n\n\nclass SequentialTaskComponent(Component):\n display_name: str = \"Sequential Task\"\n description: str = \"Each task must have a description, an expected output and an agent responsible for execution.\"\n icon = \"CrewAI\"\n legacy = True\n replacement = \"agents.Agent\"\n inputs = [\n MultilineInput(\n name=\"task_description\",\n display_name=\"Description\",\n info=\"Descriptive text detailing task's purpose and execution.\",\n ),\n MultilineInput(\n name=\"expected_output\",\n display_name=\"Expected Output\",\n info=\"Clear definition of expected task outcome.\",\n ),\n HandleInput(\n name=\"tools\",\n display_name=\"Tools\",\n input_types=[\"Tool\"],\n is_list=True,\n info=\"List of tools/resources limited for task execution. Uses the Agent tools by default.\",\n required=False,\n advanced=True,\n ),\n HandleInput(\n name=\"agent\",\n display_name=\"Agent\",\n input_types=[\"Agent\"],\n info=\"CrewAI Agent that will perform the task\",\n required=True,\n ),\n HandleInput(\n name=\"task\",\n display_name=\"Task\",\n input_types=[\"SequentialTask\"],\n info=\"CrewAI Task that will perform the task\",\n ),\n BoolInput(\n name=\"async_execution\",\n display_name=\"Async Execution\",\n value=True,\n advanced=True,\n info=\"Boolean flag indicating asynchronous task execution.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Task\", name=\"task_output\", method=\"build_task\"),\n ]\n\n def build_task(self) -> list[SequentialTask]:\n tasks: list[SequentialTask] = []\n task = SequentialTask(\n description=self.task_description,\n expected_output=self.expected_output,\n tools=self.agent.tools,\n async_execution=False,\n agent=self.agent,\n )\n tasks.append(task)\n self.status = task\n if self.task:\n if isinstance(self.task, list) and all(isinstance(task_item, SequentialTask) for task_item in self.task):\n tasks = self.task + tasks\n elif isinstance(self.task, SequentialTask):\n tasks = [self.task, *tasks]\n return tasks\n"},"expected_output":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Expected Output","dynamic":false,"info":"Clear definition of expected task outcome.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"expected_output","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"task":{"_input_type":"HandleInput","advanced":false,"display_name":"Task","dynamic":false,"info":"CrewAI Task that will perform the task","input_types":["SequentialTask"],"list":false,"list_add_label":"Add More","name":"task","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"task_description":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Description","dynamic":false,"info":"Descriptive text detailing task's purpose and execution.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"task_description","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tools":{"_input_type":"HandleInput","advanced":true,"display_name":"Tools","dynamic":false,"info":"List of tools/resources limited for task execution. Uses the Agent tools by default.","input_types":["Tool"],"list":true,"list_add_label":"Add More","name":"tools","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""}},"tool_mode":false}}],["cuga",{"Cuga":{"base_classes":["Data","Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Define the Cuga agent's policies, then assign it a task.","display_name":"Cuga","documentation":"https://docs.langflow.org/agents","edited":false,"field_order":["agent_llm","max_tokens","model_kwargs","model_name","openai_api_base","api_key","temperature","seed","max_retries","timeout","policies","n_messages","format_instructions","output_schema","tools","input_value","handle_parsing_errors","verbose","max_iterations","agent_description","add_current_date_tool","lite_mode","lite_mode_tool_threshold","browser_enabled","web_apps"],"frozen":false,"icon":"bot","legacy":false,"metadata":{"code_hash":"70c39b80cec2","dependencies":{"dependencies":[{"name":"langchain_core","version":"0.3.79"},{"name":"langflow","version":null},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null},{"name":"cuga","version":"0.1.7"}],"total_dependencies":5},"module":"lfx.components.cuga.cuga_agent.CugaComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Response","group_outputs":false,"method":"message_response","name":"response","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Structured Response","group_outputs":false,"method":"json_response","name":"structured_response","selected":"Data","tool_mode":false,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","add_current_date_tool":{"_input_type":"BoolInput","advanced":true,"display_name":"Current Date","dynamic":false,"info":"If true, will add a tool to the agent that returns the current date.","list":false,"list_add_label":"Add More","name":"add_current_date_tool","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"agent_description":{"_input_type":"MultilineInput","advanced":true,"copy_field":false,"display_name":"Agent Description [Deprecated]","dynamic":false,"info":"The description of the agent. This is only used when in Tool Mode. Defaults to 'A helpful assistant with access to the following tools:' and tools are added dynamically. This feature is deprecated and will be removed in future versions.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"agent_description","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"A helpful assistant with access to the following tools:"},"agent_llm":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model Provider","dynamic":false,"external_options":{},"info":"The provider of the language model that the agent will use to generate responses.","input_types":[],"name":"agent_llm","options":["OpenAI","Custom"],"options_metadata":[{"icon":"OpenAI"},{"icon":"brain"}],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"OpenAI"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"OpenAI API Key","dynamic":false,"info":"The OpenAI API Key to use for the OpenAI model.","input_types":[],"load_from_db":false,"name":"api_key","password":true,"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"browser_enabled":{"_input_type":"BoolInput","advanced":false,"display_name":"Enable Browser","dynamic":false,"info":"Toggle to enable a built-in browser tool for web scraping and searching.","list":false,"list_add_label":"Add More","name":"browser_enabled","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import asyncio\nimport json\nimport re\nimport traceback\nimport uuid\nfrom collections.abc import AsyncIterator\nfrom typing import TYPE_CHECKING, Any, cast\n\nfrom langchain_core.agents import AgentFinish\nfrom langchain_core.messages import AIMessage, HumanMessage\nfrom langchain_core.tools import StructuredTool\nfrom langflow.field_typing import Tool\nfrom langflow.io import BoolInput, DropdownInput, IntInput, MultilineInput, Output, TableInput\n\n# from langflow.logging import logger\nfrom langflow.schema.data import Data\nfrom langflow.schema.dotdict import dotdict\nfrom langflow.schema.message import Message\nfrom langflow.schema.table import EditMode\nfrom pydantic import ValidationError\n\nfrom lfx.base.agents.agent import LCToolsAgentComponent\nfrom lfx.base.agents.events import ExceptionWithMessageError\nfrom lfx.base.models.model_input_constants import (\n ALL_PROVIDER_FIELDS,\n MODEL_DYNAMIC_UPDATE_FIELDS,\n MODEL_PROVIDERS,\n MODEL_PROVIDERS_DICT,\n MODELS_METADATA,\n)\nfrom lfx.base.models.model_utils import get_model_name\nfrom lfx.components.helpers import CurrentDateComponent\nfrom lfx.components.langchain_utilities.tool_calling import ToolCallingAgentComponent\nfrom lfx.components.models_and_agents.memory import MemoryComponent\nfrom lfx.custom.custom_component.component import _get_component_toolkit\nfrom lfx.custom.utils import update_component_build_config\nfrom lfx.helpers.base_model import build_model_from_schema\nfrom lfx.log.logger import logger\n\nif TYPE_CHECKING:\n from langflow.schema.log import SendMessageFunctionType\n\n\ndef set_advanced_true(component_input):\n \"\"\"Set the advanced flag to True for a component input.\n\n Args:\n component_input: The component input to modify\n\n Returns:\n The modified component input with advanced=True\n \"\"\"\n component_input.advanced = True\n return component_input\n\n\nMODEL_PROVIDERS_LIST = [\"OpenAI\"]\n\n\nclass CugaComponent(ToolCallingAgentComponent):\n \"\"\"Cuga Agent Component for advanced AI task execution.\n\n The Cuga component is an advanced AI agent that can execute complex tasks using\n various tools, browser automation, and structured output generation. It supports\n custom policies, web applications, and API interactions.\n\n Attributes:\n display_name: Human-readable name for the component\n description: Brief description of the component's purpose\n documentation: URL to component documentation\n icon: Icon identifier for the UI\n name: Internal component name\n \"\"\"\n\n display_name: str = \"Cuga\"\n description: str = \"Define the Cuga agent's policies, then assign it a task.\"\n documentation: str = \"https://docs.langflow.org/agents\"\n icon = \"bot\"\n name = \"Cuga\"\n\n memory_inputs = [set_advanced_true(component_input) for component_input in MemoryComponent().inputs]\n\n # Filter out json_mode from OpenAI inputs since we handle structured output differently\n openai_inputs_filtered = [\n input_field\n for input_field in MODEL_PROVIDERS_DICT[\"OpenAI\"][\"inputs\"]\n if not (hasattr(input_field, \"name\") and input_field.name == \"json_mode\")\n ]\n\n inputs = [\n DropdownInput(\n name=\"agent_llm\",\n display_name=\"Model Provider\",\n info=\"The provider of the language model that the agent will use to generate responses.\",\n options=[*MODEL_PROVIDERS_LIST, \"Custom\"],\n value=\"OpenAI\",\n real_time_refresh=True,\n input_types=[],\n options_metadata=[MODELS_METADATA[key] for key in MODEL_PROVIDERS_LIST] + [{\"icon\": \"brain\"}],\n ),\n *openai_inputs_filtered,\n MultilineInput(\n name=\"policies\",\n display_name=\"Policies\",\n info=(\n \"Custom instructions or policies for the agent to adhere to during its operation.\\n\"\n \"Example:\\n\"\n \"## Plan\\n\"\n \"< planning instructions e.g. which tools and when to use>\\n\"\n \"## Answer\\n\"\n \"< final answer instructions how to answer>\"\n ),\n value=\"\",\n advanced=False,\n ),\n IntInput(\n name=\"n_messages\",\n display_name=\"Number of Chat History Messages\",\n value=100,\n info=\"Number of chat history messages to retrieve.\",\n advanced=True,\n show=True,\n ),\n MultilineInput(\n name=\"format_instructions\",\n display_name=\"Output Format Instructions\",\n info=\"Generic Template for structured output formatting. Valid only with Structured response.\",\n value=(\n \"You are an AI that extracts structured JSON objects from unstructured text. \"\n \"Use a predefined schema with expected types (str, int, float, bool, dict). \"\n \"Extract ALL relevant instances that match the schema - if multiple patterns exist, capture them all. \"\n \"Fill missing or ambiguous values with defaults: null for missing values. \"\n \"Remove exact duplicates but keep variations that have different field values. \"\n \"Always return valid JSON in the expected format, never throw errors. \"\n \"If multiple objects can be extracted, return them all in the structured format.\"\n ),\n advanced=True,\n ),\n TableInput(\n name=\"output_schema\",\n display_name=\"Output Schema\",\n info=(\n \"Schema Validation: Define the structure and data types for structured output. \"\n \"No validation if no output schema.\"\n ),\n advanced=True,\n required=False,\n value=[],\n table_schema=[\n {\n \"name\": \"name\",\n \"display_name\": \"Name\",\n \"type\": \"str\",\n \"description\": \"Specify the name of the output field.\",\n \"default\": \"field\",\n \"edit_mode\": EditMode.INLINE,\n },\n {\n \"name\": \"description\",\n \"display_name\": \"Description\",\n \"type\": \"str\",\n \"description\": \"Describe the purpose of the output field.\",\n \"default\": \"description of field\",\n \"edit_mode\": EditMode.POPOVER,\n },\n {\n \"name\": \"type\",\n \"display_name\": \"Type\",\n \"type\": \"str\",\n \"edit_mode\": EditMode.INLINE,\n \"description\": (\"Indicate the data type of the output field (e.g., str, int, float, bool, dict).\"),\n \"options\": [\"str\", \"int\", \"float\", \"bool\", \"dict\"],\n \"default\": \"str\",\n },\n {\n \"name\": \"multiple\",\n \"display_name\": \"As List\",\n \"type\": \"boolean\",\n \"description\": \"Set to True if this output field should be a list of the specified type.\",\n \"default\": \"False\",\n \"edit_mode\": EditMode.INLINE,\n },\n ],\n ),\n *LCToolsAgentComponent.get_base_inputs(),\n BoolInput(\n name=\"add_current_date_tool\",\n display_name=\"Current Date\",\n advanced=True,\n info=\"If true, will add a tool to the agent that returns the current date.\",\n value=True,\n ),\n BoolInput(\n name=\"lite_mode\",\n display_name=\"Enable CugaLite\",\n info=\"Enable CugaLite for simple API tasks (faster execution).\",\n value=True,\n advanced=False,\n ),\n IntInput(\n name=\"lite_mode_tool_threshold\",\n display_name=\"CugaLite Tool Threshold\",\n info=\"Route to CugaLite if app has fewer than this many tools.\",\n value=25,\n advanced=False,\n ),\n BoolInput(\n name=\"browser_enabled\",\n display_name=\"Enable Browser\",\n info=\"Toggle to enable a built-in browser tool for web scraping and searching.\",\n value=False,\n advanced=False,\n ),\n MultilineInput(\n name=\"web_apps\",\n display_name=\"Web applications\",\n info=(\n \"Define a list of web applications that cuga will open when enable browser is true. \"\n \"Currently only supports one web application. Example: https://example.com\"\n ),\n value=\"\",\n advanced=False,\n ),\n ]\n outputs = [\n Output(name=\"response\", display_name=\"Response\", method=\"message_response\"),\n Output(name=\"structured_response\", display_name=\"Structured Response\", method=\"json_response\", tool_mode=False),\n ]\n\n async def call_agent(\n self, current_input: str, tools: list[Tool], history_messages: list[Message], llm\n ) -> AsyncIterator[dict[str, Any]]:\n \"\"\"Execute the Cuga agent with the given input and tools.\n\n This method initializes and runs the Cuga agent, processing the input through\n the agent's workflow and yielding events for real-time monitoring.\n\n Args:\n current_input: The user input to process\n tools: List of available tools for the agent\n history_messages: Previous conversation history\n llm: The language model instance to use\n\n Yields:\n dict: Agent events including tool usage, thinking, and final results\n\n Raises:\n ValueError: If there's an error in agent initialization\n TypeError: If there's a type error in processing\n RuntimeError: If there's a runtime error during execution\n ConnectionError: If there's a connection issue\n \"\"\"\n yield {\n \"event\": \"on_chain_start\",\n \"run_id\": str(uuid.uuid4()),\n \"name\": \"CUGA_initializing\",\n \"data\": {\"input\": {\"input\": current_input, \"chat_history\": []}},\n }\n logger.debug(f\"LLM MODEL TYPE: {type(llm)}\")\n if current_input:\n # Import settings first\n from cuga.config import settings\n\n # Use Dynaconf's set() method to update settings dynamically\n # This properly updates the settings object without corruption\n logger.debug(\"Updating CUGA settings via Dynaconf set() method\")\n\n settings.advanced_features.registry = False\n settings.advanced_features.lite_mode = self.lite_mode\n settings.advanced_features.lite_mode_tool_threshold = self.lite_mode_tool_threshold\n\n if self.browser_enabled:\n logger.debug(\"browser_enabled is true, setting mode to hybrid\")\n settings.advanced_features.mode = \"hybrid\"\n settings.advanced_features.use_vision = False\n else:\n logger.debug(\"browser_enabled is false, setting mode to api\")\n settings.advanced_features.mode = \"api\"\n\n from cuga.backend.activity_tracker.tracker import ActivityTracker\n from cuga.backend.cuga_graph.nodes.api.variables_manager.manager import VariablesManager\n from cuga.backend.cuga_graph.utils.agent_loop import StreamEvent\n from cuga.backend.cuga_graph.utils.controller import (\n AgentRunner as CugaAgent,\n )\n from cuga.backend.cuga_graph.utils.controller import (\n ExperimentResult as AgentResult,\n )\n from cuga.backend.llm.models import LLMManager\n from cuga.configurations.instructions_manager import InstructionsManager\n\n var_manager = VariablesManager()\n\n # Reset var_manager if this is the first message in history\n logger.debug(f\"[CUGA] Checking history_messages: count={len(history_messages) if history_messages else 0}\")\n if not history_messages or len(history_messages) == 0:\n logger.debug(\"[CUGA] First message in history detected, resetting var_manager\")\n var_manager.reset()\n else:\n logger.debug(f\"[CUGA] Continuing conversation with {len(history_messages)} previous messages\")\n\n llm_manager = LLMManager()\n llm_manager.set_llm(llm)\n instructions_manager = InstructionsManager()\n logger.debug(f\"policies are: {self.policies}\")\n instructions_manager.set_instructions_from_one_file(self.policies)\n tracker = ActivityTracker()\n tracker.set_tools(tools)\n cuga_agent = CugaAgent(browser_enabled=self.browser_enabled)\n if self.browser_enabled:\n await cuga_agent.initialize_freemode_env(start_url=self.web_apps.strip(), interface_mode=\"browser_only\")\n else:\n await cuga_agent.initialize_appworld_env()\n\n yield {\n \"event\": \"on_chain_start\",\n \"run_id\": str(uuid.uuid4()),\n \"name\": \"CUGA_thinking...\",\n \"data\": {\"input\": {\"input\": current_input, \"chat_history\": []}},\n }\n logger.debug(f\"[CUGA] current web apps are {self.web_apps}\")\n logger.debug(f\"[CUGA] Processing input: {current_input}\")\n try:\n # Convert history to LangChain format for the event\n lc_messages = []\n for msg in history_messages:\n if hasattr(msg, \"sender\") and msg.sender == \"Human\":\n lc_messages.append(HumanMessage(content=msg.text))\n else:\n lc_messages.append(AIMessage(content=msg.text))\n\n await asyncio.sleep(0.5)\n\n # 2. Build final response\n response_parts = []\n\n response_parts.append(f\"Processed input: '{current_input}'\")\n response_parts.append(f\"Available tools: {len(tools)}\")\n last_event: StreamEvent | None = None\n tool_run_id: str | None = None\n # 3. Chain end event with AgentFinish\n async for event in cuga_agent.run_task_generic_yield(eval_mode=False, goal=current_input):\n logger.debug(f\"recieved event {event}\")\n if last_event is not None and tool_run_id is not None:\n logger.debug(f\"last event {last_event}\")\n try:\n # TODO: Extract data\n data_dict = json.loads(last_event.data)\n except json.JSONDecodeError:\n data_dict = last_event.data\n if last_event.name == \"CodeAgent\":\n data_dict = data_dict[\"code\"]\n yield {\n \"event\": \"on_tool_end\",\n \"run_id\": tool_run_id,\n \"name\": last_event.name,\n \"data\": {\"output\": data_dict},\n }\n if isinstance(event, StreamEvent):\n tool_run_id = str(uuid.uuid4())\n last_event = StreamEvent(name=event.name, data=event.data)\n tool_event = {\n \"event\": \"on_tool_start\",\n \"run_id\": tool_run_id,\n \"name\": event.name,\n \"data\": {\"input\": {}},\n }\n logger.debug(f\"[CUGA] Yielding tool_start event: {event.name}\")\n yield tool_event\n\n if isinstance(event, AgentResult):\n task_result = event\n end_event = {\n \"event\": \"on_chain_end\",\n \"run_id\": str(uuid.uuid4()),\n \"name\": \"CugaAgent\",\n \"data\": {\"output\": AgentFinish(return_values={\"output\": task_result.answer}, log=\"\")},\n }\n answer_preview = task_result.answer[:100] if task_result.answer else \"None\"\n logger.info(f\"[CUGA] Yielding chain_end event with answer: {answer_preview}...\")\n yield end_event\n\n except (ValueError, TypeError, RuntimeError, ConnectionError) as e:\n logger.error(f\"An error occurred: {e!s}\")\n logger.error(f\"Traceback: {traceback.format_exc()}\")\n error_msg = f\"CUGA Agent error: {e!s}\"\n logger.error(f\"[CUGA] Error occurred: {error_msg}\")\n\n # Emit error event\n yield {\n \"event\": \"on_chain_error\",\n \"run_id\": str(uuid.uuid4()),\n \"name\": \"CugaAgent\",\n \"data\": {\"error\": error_msg},\n }\n\n async def message_response(self) -> Message:\n \"\"\"Generate a message response using the Cuga agent.\n\n This method processes the input through the Cuga agent and returns a structured\n message response. It handles agent initialization, tool setup, and event processing.\n\n Returns:\n Message: The agent's response message\n\n Raises:\n Exception: If there's an error during agent execution\n \"\"\"\n logger.debug(\"[CUGA] Starting Cuga agent run for message_response.\")\n logger.debug(f\"[CUGA] Agent input value: {self.input_value}\")\n\n # Validate input is not empty\n if not self.input_value or not str(self.input_value).strip():\n msg = \"Message cannot be empty. Please provide a valid message.\"\n raise ValueError(msg)\n\n try:\n llm_model, self.chat_history, self.tools = await self.get_agent_requirements()\n\n # Create agent message for event processing\n from lfx.schema.content_block import ContentBlock\n from lfx.schema.message import MESSAGE_SENDER_AI\n\n agent_message = Message(\n sender=MESSAGE_SENDER_AI,\n sender_name=\"Cuga\",\n properties={\"icon\": \"Bot\", \"state\": \"partial\"},\n content_blocks=[ContentBlock(title=\"Agent Steps\", contents=[])],\n session_id=self.graph.session_id,\n )\n\n # Get input text\n input_text = self.input_value.text if hasattr(self.input_value, \"text\") else str(self.input_value)\n\n # Create event iterator from call_agent\n event_iterator = self.call_agent(\n current_input=input_text, tools=self.tools or [], history_messages=self.chat_history, llm=llm_model\n )\n\n # Process events using the existing event processing system\n from lfx.base.agents.events import process_agent_events\n\n # Create a wrapper that forces DB updates for event handlers\n # This ensures the UI can see loading steps in real-time via polling\n async def force_db_update_send_message(message, id_=None, *, skip_db_update=False): # noqa: ARG001\n # Always persist to DB so polling-based UI shows loading steps in real-time\n content_blocks_len = len(message.content_blocks[0].contents) if message.content_blocks else 0\n logger.debug(\n f\"[CUGA] Sending message update - state: {message.properties.state}, \"\n f\"content_blocks: {content_blocks_len}\"\n )\n result = await self.send_message(message, id_=id_, skip_db_update=False)\n logger.debug(f\"[CUGA] Message saved to DB with ID: {result.id if result else 'None'}\")\n return result\n\n result = await process_agent_events(\n event_iterator, agent_message, cast(\"SendMessageFunctionType\", force_db_update_send_message)\n )\n\n logger.info(\"[CUGA] Agent run finished successfully.\")\n logger.info(f\"[CUGA] Agent output: {result}\")\n\n # Store result for potential JSON output\n self._agent_result = result\n\n except Exception as e:\n logger.error(f\"[CUGA] Error in message_response: {e}\")\n logger.error(f\"An error occurred: {e!s}\")\n logger.error(f\"Traceback: {traceback.format_exc()}\")\n\n # Check if error is related to Playwright installation\n error_str = str(e).lower()\n if \"playwright install\" in error_str:\n msg = (\n \"Playwright is not installed. Please install Playwright Chromium using: \"\n \"uv run -m playwright install chromium\"\n )\n raise ValueError(msg) from e\n\n raise\n else:\n return result\n\n async def get_agent_requirements(self):\n \"\"\"Get the agent requirements for the Cuga agent.\n\n This method retrieves and configures all necessary components for the agent\n including the language model, chat history, and tools.\n\n Returns:\n tuple: A tuple containing (llm_model, chat_history, tools)\n\n Raises:\n ValueError: If no language model is selected or if there's an error\n in model initialization\n \"\"\"\n llm_model, display_name = await self.get_llm()\n if llm_model is None:\n msg = \"No language model selected. Please choose a model to proceed.\"\n raise ValueError(msg)\n self.model_name = get_model_name(llm_model, display_name=display_name)\n\n # Get memory data\n self.chat_history = await self.get_memory_data()\n if isinstance(self.chat_history, Message):\n self.chat_history = [self.chat_history]\n\n # Add current date tool if enabled\n if self.add_current_date_tool:\n if not isinstance(self.tools, list):\n self.tools = []\n current_date_tool = (await CurrentDateComponent(**self.get_base_args()).to_toolkit()).pop(0)\n if not isinstance(current_date_tool, StructuredTool):\n msg = \"CurrentDateComponent must be converted to a StructuredTool\"\n raise TypeError(msg)\n self.tools.append(current_date_tool)\n\n # --- ADDED LOGGING START ---\n logger.debug(\"[CUGA] Retrieved agent requirements: LLM, chat history, and tools.\")\n logger.debug(f\"[CUGA] LLM model: {self.model_name}\")\n logger.debug(f\"[CUGA] Number of chat history messages: {len(self.chat_history)}\")\n logger.debug(f\"[CUGA] Tools available: {[tool.name for tool in self.tools]}\")\n logger.debug(f\"[CUGA] metadata: {[tool.metadata for tool in self.tools]}\")\n # --- ADDED LOGGING END ---\n\n return llm_model, self.chat_history, self.tools\n\n def _preprocess_schema(self, schema):\n \"\"\"Preprocess schema to ensure correct data types for build_model_from_schema.\n\n This method validates and normalizes the output schema to ensure it's compatible\n with the Pydantic model building process.\n\n Args:\n schema: List of schema field definitions\n\n Returns:\n list: Processed schema with validated data types\n \"\"\"\n processed_schema = []\n for field in schema:\n processed_field = {\n \"name\": str(field.get(\"name\", \"field\")),\n \"type\": str(field.get(\"type\", \"str\")),\n \"description\": str(field.get(\"description\", \"\")),\n \"multiple\": field.get(\"multiple\", False),\n }\n # Ensure multiple is handled correctly\n if isinstance(processed_field[\"multiple\"], str):\n processed_field[\"multiple\"] = processed_field[\"multiple\"].lower() in [\"true\", \"1\", \"t\", \"y\", \"yes\"]\n processed_schema.append(processed_field)\n return processed_schema\n\n async def build_structured_output_base(self, content: str):\n \"\"\"Build structured output with optional BaseModel validation.\n\n This method parses JSON content from the agent response and optionally validates\n it against a provided schema using Pydantic models.\n\n Args:\n content: The raw content from the agent response\n\n Returns:\n dict or list: Parsed and optionally validated JSON data\n \"\"\"\n # --- ADDED LOGGING START ---\n logger.debug(f\"[CUGA] Attempting to build structured output from content: {content}\")\n # --- ADDED LOGGING END ---\n\n json_pattern = r\"\\{.*\\}\"\n schema_error_msg = \"Try setting an output schema\"\n\n # Try to parse content as JSON first\n json_data = None\n try:\n json_data = json.loads(content)\n except json.JSONDecodeError:\n json_match = re.search(json_pattern, content, re.DOTALL)\n if json_match:\n try:\n json_data = json.loads(json_match.group())\n except json.JSONDecodeError:\n logger.warning(\"[CUGA] Could not parse content as JSON even with regex match.\")\n return {\"content\": content, \"error\": schema_error_msg}\n else:\n logger.warning(\"[CUGA] No JSON pattern found in the content.\")\n return {\"content\": content, \"error\": schema_error_msg}\n\n # If no output schema provided, return parsed JSON without validation\n if not hasattr(self, \"output_schema\") or not self.output_schema or len(self.output_schema) == 0:\n logger.debug(\"[CUGA] No output schema provided. Returning parsed JSON without validation.\")\n return json_data\n\n # Use BaseModel validation with schema\n try:\n logger.debug(\"[CUGA] Output schema detected. Validating structured output against schema.\")\n processed_schema = self._preprocess_schema(self.output_schema)\n output_model = build_model_from_schema(processed_schema)\n\n # Validate against the schema\n if isinstance(json_data, list):\n # Multiple objects\n validated_objects = []\n for item in json_data:\n try:\n validated_obj = output_model.model_validate(item)\n validated_objects.append(validated_obj.model_dump())\n except ValidationError as e:\n await logger.aerror(f\"[CUGA] Validation error for item: {e}\")\n validated_objects.append({\"data\": item, \"validation_error\": str(e)})\n return validated_objects\n\n # Single object\n try:\n validated_obj = output_model.model_validate(json_data)\n return [validated_obj.model_dump()]\n except ValidationError as e:\n await logger.aerror(f\"[CUGA] Validation error: {e}\")\n return [{\"data\": json_data, \"validation_error\": str(e)}]\n\n except (TypeError, ValueError) as e:\n await logger.aerror(f\"[CUGA] Error building structured output: {e}\")\n return json_data\n\n async def json_response(self) -> Data:\n \"\"\"Convert agent response to structured JSON Data output with schema validation.\n\n This method generates a structured JSON response by combining system instructions,\n format instructions, and schema information, then processing the agent's response\n through structured output validation.\n\n Returns:\n Data: Structured data object containing the validated JSON response\n\n Raises:\n ExceptionWithMessageError: If there's an error in structured processing\n ValueError: If there's a validation error\n TypeError: If there's a type error in processing\n \"\"\"\n # --- ADDED LOGGING START ---\n logger.debug(\"[CUGA] Starting Cuga agent run for json_response.\")\n logger.debug(f\"[CUGA] Agent input value: {self.input_value}\")\n # --- ADDED LOGGING END ---\n\n try:\n system_components = []\n\n # 1. Agent Instructions\n agent_instructions = getattr(self, \"instructions\", \"\") or \"\"\n if agent_instructions:\n system_components.append(f\"{agent_instructions}\")\n\n # 3. Format Instructions\n format_instructions = getattr(self, \"format_instructions\", \"\") or \"\"\n if format_instructions:\n system_components.append(f\"Format instructions: {format_instructions}\")\n\n # 4. Schema Information\n if hasattr(self, \"output_schema\") and self.output_schema and len(self.output_schema) > 0:\n try:\n processed_schema = self._preprocess_schema(self.output_schema)\n output_model = build_model_from_schema(processed_schema)\n schema_dict = output_model.model_json_schema()\n schema_info = (\n \"You are given some text that may include format instructions, \"\n \"explanations, or other content alongside a JSON schema.\\n\\n\"\n \"Your task:\\n\"\n \"- Extract only the JSON schema.\\n\"\n \"- Return it as valid JSON.\\n\"\n \"- Do not include format instructions, explanations, or extra text.\\n\\n\"\n \"Input:\\n\"\n f\"{json.dumps(schema_dict, indent=2)}\\n\\n\"\n \"Output (only JSON schema):\"\n )\n system_components.append(schema_info)\n except (ValidationError, ValueError, TypeError, KeyError) as e:\n await logger.aerror(f\"[CUGA] Could not build schema for prompt: {e}\", exc_info=True)\n\n # Combine all components\n combined_instructions = \"\\n\\n\".join(system_components) if system_components else \"\"\n\n llm_model, self.chat_history, self.tools = await self.get_agent_requirements()\n\n # Use call_agent for structured response\n input_text = self.input_value.text if hasattr(self.input_value, \"text\") else str(self.input_value)\n\n # Modify the input to include structured output requirements\n structured_input = (\n f\"{combined_instructions}\\n\\nUser Input: {input_text}\\n\\nPlease provide a structured JSON response.\"\n )\n\n logger.debug(f\"[CUGA] Combined system prompt for structured agent: {combined_instructions}\")\n\n content = await self.call_agent(\n current_input=structured_input,\n tools=self.tools or [],\n history_messages=self.chat_history,\n llm=llm_model,\n )\n\n logger.debug(f\"[CUGA] Structured agent result: {content}\")\n\n except (ExceptionWithMessageError, ValueError, TypeError, NotImplementedError, AttributeError) as e:\n await logger.aerror(f\"[CUGA] Error with structured agent: {e}\")\n content_str = \"No content returned from Cuga agent\"\n return Data(data={\"content\": content_str, \"error\": str(e)})\n\n # Process with structured output validation\n try:\n structured_output = await self.build_structured_output_base(content)\n\n # Handle different output formats\n if isinstance(structured_output, list) and structured_output:\n if len(structured_output) == 1:\n logger.debug(\"[CUGA] Structured output is a single object in a list.\")\n logger.debug(f\"[CUGA] Final structured output: {structured_output[0]}\")\n return Data(data=structured_output[0])\n logger.debug(\"[CUGA] Structured output is a list of multiple objects.\")\n logger.debug(f\"[CUGA] Final structured output: {structured_output}\")\n return Data(data={\"results\": structured_output})\n if isinstance(structured_output, dict):\n logger.debug(\"[CUGA] Structured output is a single dictionary.\")\n logger.debug(f\"[CUGA] Final structured output: {structured_output}\")\n return Data(data=structured_output)\n logger.debug(\"[CUGA] Structured output is not a list or dictionary. Returning raw content.\")\n logger.debug(f\"[CUGA] Final output content: {content}\")\n return Data(data={\"content\": content})\n\n except (ValueError, TypeError) as e:\n await logger.aerror(f\"[CUGA] Error in structured output processing: {e}\")\n return Data(data={\"content\": content, \"error\": str(e)})\n\n async def get_memory_data(self):\n \"\"\"Retrieve chat history messages.\n\n This method fetches the conversation history from memory, excluding the current\n input message to avoid duplication.\n\n Returns:\n list: List of Message objects representing the chat history\n \"\"\"\n logger.debug(\"[CUGA] Retrieving chat history messages.\")\n logger.debug(f\"[CUGA] Session ID: {self.graph.session_id}\")\n messages = (\n await MemoryComponent(**self.get_base_args())\n .set(session_id=self.graph.session_id, order=\"Ascending\", n_messages=self.n_messages)\n .retrieve_messages()\n )\n logger.debug(f\"[CUGA] Retrieved {len(messages)} messages from memory\")\n return [\n message for message in messages if getattr(message, \"id\", None) != getattr(self.input_value, \"id\", None)\n ]\n\n async def get_llm(self):\n \"\"\"Get language model for the Cuga agent.\n\n This method initializes and configures the language model based on the\n selected provider and parameters.\n\n Returns:\n tuple: A tuple containing (llm_model, display_name)\n\n Raises:\n ValueError: If the model provider is invalid or model initialization fails\n \"\"\"\n logger.debug(\"[CUGA] Getting language model for the agent.\")\n logger.debug(f\"[CUGA] Requested LLM provider: {self.agent_llm}\")\n\n if not isinstance(self.agent_llm, str):\n logger.debug(\"[CUGA] Agent LLM is already a model instance.\")\n return self.agent_llm, None\n\n try:\n provider_info = MODEL_PROVIDERS_DICT.get(self.agent_llm)\n if not provider_info:\n msg = f\"Invalid model provider: {self.agent_llm}\"\n raise ValueError(msg)\n\n component_class = provider_info.get(\"component_class\")\n display_name = component_class.display_name\n inputs = provider_info.get(\"inputs\")\n prefix = provider_info.get(\"prefix\", \"\")\n logger.debug(f\"[CUGA] Successfully built LLM model from provider: {self.agent_llm}\")\n return self._build_llm_model(component_class, inputs, prefix), display_name\n\n except (AttributeError, ValueError, TypeError, RuntimeError) as e:\n await logger.aerror(f\"[CUGA] Error building {self.agent_llm} language model: {e!s}\")\n msg = f\"Failed to initialize language model: {e!s}\"\n raise ValueError(msg) from e\n\n def _build_llm_model(self, component, inputs, prefix=\"\"):\n \"\"\"Build LLM model with parameters.\n\n This method constructs a language model instance using the provided component\n class and input parameters.\n\n Args:\n component: The LLM component class to instantiate\n inputs: List of input field definitions\n prefix: Optional prefix for parameter names\n\n Returns:\n The configured LLM model instance\n \"\"\"\n model_kwargs = {}\n for input_ in inputs:\n if hasattr(self, f\"{prefix}{input_.name}\"):\n model_kwargs[input_.name] = getattr(self, f\"{prefix}{input_.name}\")\n return component.set(**model_kwargs).build_model()\n\n def set_component_params(self, component):\n \"\"\"Set component parameters based on provider.\n\n This method configures component parameters according to the selected\n model provider's requirements.\n\n Args:\n component: The component to configure\n\n Returns:\n The configured component\n \"\"\"\n provider_info = MODEL_PROVIDERS_DICT.get(self.agent_llm)\n if provider_info:\n inputs = provider_info.get(\"inputs\")\n prefix = provider_info.get(\"prefix\")\n model_kwargs = {}\n for input_ in inputs:\n if hasattr(self, f\"{prefix}{input_.name}\"):\n model_kwargs[input_.name] = getattr(self, f\"{prefix}{input_.name}\")\n return component.set(**model_kwargs)\n return component\n\n def delete_fields(self, build_config: dotdict, fields: dict | list[str]) -> None:\n \"\"\"Delete specified fields from build_config.\n\n This method removes unwanted fields from the build configuration.\n\n Args:\n build_config: The build configuration dictionary\n fields: Fields to remove (can be dict or list of strings)\n \"\"\"\n for field in fields:\n build_config.pop(field, None)\n\n def update_input_types(self, build_config: dotdict) -> dotdict:\n \"\"\"Update input types for all fields in build_config.\n\n This method ensures all fields in the build configuration have proper\n input types defined.\n\n Args:\n build_config: The build configuration to update\n\n Returns:\n dotdict: Updated build configuration with input types\n \"\"\"\n for key, value in build_config.items():\n if isinstance(value, dict):\n if value.get(\"input_types\") is None:\n build_config[key][\"input_types\"] = []\n elif hasattr(value, \"input_types\") and value.input_types is None:\n value.input_types = []\n return build_config\n\n async def update_build_config(\n self, build_config: dotdict, field_value: str, field_name: str | None = None\n ) -> dotdict:\n \"\"\"Update build configuration based on field changes.\n\n This method dynamically updates the component's build configuration when\n certain fields change, particularly the model provider selection.\n\n Args:\n build_config: The current build configuration\n field_value: The new value for the field\n field_name: The name of the field being changed\n\n Returns:\n dotdict: Updated build configuration\n\n Raises:\n ValueError: If required keys are missing from the configuration\n \"\"\"\n if field_name in (\"agent_llm\",):\n build_config[\"agent_llm\"][\"value\"] = field_value\n provider_info = MODEL_PROVIDERS_DICT.get(field_value)\n if provider_info:\n component_class = provider_info.get(\"component_class\")\n if component_class and hasattr(component_class, \"update_build_config\"):\n build_config = await update_component_build_config(\n component_class, build_config, field_value, \"model_name\"\n )\n\n provider_configs: dict[str, tuple[dict, list[dict]]] = {\n provider: (\n MODEL_PROVIDERS_DICT[provider][\"fields\"],\n [\n MODEL_PROVIDERS_DICT[other_provider][\"fields\"]\n for other_provider in MODEL_PROVIDERS_DICT\n if other_provider != provider\n ],\n )\n for provider in MODEL_PROVIDERS_DICT\n }\n if field_value in provider_configs:\n fields_to_add, fields_to_delete = provider_configs[field_value]\n\n # Delete fields from other providers\n for fields in fields_to_delete:\n self.delete_fields(build_config, fields)\n\n # Add provider-specific fields\n if field_value == \"OpenAI\" and not any(field in build_config for field in fields_to_add):\n build_config.update(fields_to_add)\n else:\n build_config.update(fields_to_add)\n build_config[\"agent_llm\"][\"input_types\"] = []\n elif field_value == \"Custom\":\n # Delete all provider fields\n self.delete_fields(build_config, ALL_PROVIDER_FIELDS)\n # Update with custom component\n custom_component = DropdownInput(\n name=\"agent_llm\",\n display_name=\"Language Model\",\n options=[*sorted(MODEL_PROVIDERS), \"Custom\"],\n value=\"Custom\",\n real_time_refresh=True,\n input_types=[\"LanguageModel\"],\n options_metadata=[MODELS_METADATA[key] for key in sorted(MODELS_METADATA.keys())]\n + [{\"icon\": \"brain\"}],\n )\n build_config.update({\"agent_llm\": custom_component.to_dict()})\n\n # Update input types for all fields\n build_config = self.update_input_types(build_config)\n\n # Validate required keys\n default_keys = [\n \"code\",\n \"_type\",\n \"agent_llm\",\n \"tools\",\n \"input_value\",\n \"add_current_date_tool\",\n \"policies\",\n \"agent_description\",\n \"max_iterations\",\n \"handle_parsing_errors\",\n \"verbose\",\n ]\n missing_keys = [key for key in default_keys if key not in build_config]\n if missing_keys:\n msg = f\"Missing required keys in build_config: {missing_keys}\"\n raise ValueError(msg)\n\n if (\n isinstance(self.agent_llm, str)\n and self.agent_llm in MODEL_PROVIDERS_DICT\n and field_name in MODEL_DYNAMIC_UPDATE_FIELDS\n ):\n provider_info = MODEL_PROVIDERS_DICT.get(self.agent_llm)\n if provider_info:\n component_class = provider_info.get(\"component_class\")\n component_class = self.set_component_params(component_class)\n prefix = provider_info.get(\"prefix\")\n if component_class and hasattr(component_class, \"update_build_config\"):\n if isinstance(field_name, str) and isinstance(prefix, str):\n field_name = field_name.replace(prefix, \"\")\n build_config = await update_component_build_config(\n component_class, build_config, field_value, \"model_name\"\n )\n return dotdict({k: v.to_dict() if hasattr(v, \"to_dict\") else v for k, v in build_config.items()})\n\n async def _get_tools(self) -> list[Tool]:\n \"\"\"Build agent tools.\n\n This method constructs the list of tools available to the Cuga agent,\n including component tools and any additional configured tools.\n\n Returns:\n list[Tool]: List of available tools for the agent\n \"\"\"\n logger.debug(\"[CUGA] Building agent tools.\")\n component_toolkit = _get_component_toolkit()\n tools_names = self._build_tools_names()\n agent_description = self.get_tool_description()\n description = f\"{agent_description}{tools_names}\"\n tools = component_toolkit(component=self).get_tools(\n tool_name=\"Call_CugaAgent\", tool_description=description, callbacks=self.get_langchain_callbacks()\n )\n if hasattr(self, \"tools_metadata\"):\n tools = component_toolkit(component=self, metadata=self.tools_metadata).update_tools_metadata(tools=tools)\n logger.debug(f\"[CUGA] Tools built: {[tool.name for tool in tools]}\")\n return tools\n"},"format_instructions":{"_input_type":"MultilineInput","advanced":true,"copy_field":false,"display_name":"Output Format Instructions","dynamic":false,"info":"Generic Template for structured output formatting. Valid only with Structured response.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"format_instructions","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"You are an AI that extracts structured JSON objects from unstructured text. Use a predefined schema with expected types (str, int, float, bool, dict). Extract ALL relevant instances that match the schema - if multiple patterns exist, capture them all. Fill missing or ambiguous values with defaults: null for missing values. Remove exact duplicates but keep variations that have different field values. Always return valid JSON in the expected format, never throw errors. If multiple objects can be extracted, return them all in the structured format."},"handle_parsing_errors":{"_input_type":"BoolInput","advanced":true,"display_name":"Handle Parse Errors","dynamic":false,"info":"Should the Agent fix errors when reading user input for better processing?","list":false,"list_add_label":"Add More","name":"handle_parsing_errors","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"input_value":{"_input_type":"MessageInput","advanced":false,"display_name":"Input","dynamic":false,"info":"The input provided by the user for the agent to process.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"lite_mode":{"_input_type":"BoolInput","advanced":false,"display_name":"Enable CugaLite","dynamic":false,"info":"Enable CugaLite for simple API tasks (faster execution).","list":false,"list_add_label":"Add More","name":"lite_mode","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"lite_mode_tool_threshold":{"_input_type":"IntInput","advanced":false,"display_name":"CugaLite Tool Threshold","dynamic":false,"info":"Route to CugaLite if app has fewer than this many tools.","list":false,"list_add_label":"Add More","name":"lite_mode_tool_threshold","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":25},"max_iterations":{"_input_type":"IntInput","advanced":true,"display_name":"Max Iterations","dynamic":false,"info":"The maximum number of attempts the agent can make to complete its task before it stops.","list":false,"list_add_label":"Add More","name":"max_iterations","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":15},"max_retries":{"_input_type":"IntInput","advanced":true,"display_name":"Max Retries","dynamic":false,"info":"The maximum number of retries to make when generating.","list":false,"list_add_label":"Add More","name":"max_retries","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":5},"max_tokens":{"_input_type":"IntInput","advanced":true,"display_name":"Max Tokens","dynamic":false,"info":"The maximum number of tokens to generate. Set to 0 for unlimited tokens.","list":false,"list_add_label":"Add More","name":"max_tokens","placeholder":"","range_spec":{"max":128000.0,"min":0.0,"step":0.1,"step_type":"float"},"required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"model_kwargs":{"_input_type":"DictInput","advanced":true,"display_name":"Model Kwargs","dynamic":false,"info":"Additional keyword arguments to pass to the model.","list":false,"list_add_label":"Add More","name":"model_kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"model_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{},"display_name":"Model Name","dynamic":false,"external_options":{},"info":"To see the model names, first choose a provider. Then, enter your API key and click the refresh button next to the model name.","name":"model_name","options":["gpt-4o-mini","gpt-4o","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","gpt-4-turbo","gpt-4-turbo-preview","gpt-4","gpt-3.5-turbo","gpt-5.1","gpt-5","gpt-5-mini","gpt-5-nano","gpt-5-chat-latest","o1","o3-mini","o3","o3-pro","o4-mini","o4-mini-high"],"options_metadata":[],"placeholder":"","real_time_refresh":false,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"gpt-4o-mini"},"n_messages":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Chat History Messages","dynamic":false,"info":"Number of chat history messages to retrieve.","list":false,"list_add_label":"Add More","name":"n_messages","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":100},"openai_api_base":{"_input_type":"StrInput","advanced":true,"display_name":"OpenAI API Base","dynamic":false,"info":"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"openai_api_base","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"output_schema":{"_input_type":"TableInput","advanced":true,"display_name":"Output Schema","dynamic":false,"info":"Schema Validation: Define the structure and data types for structured output. No validation if no output schema.","is_list":true,"list_add_label":"Add More","name":"output_schema","placeholder":"","required":false,"show":true,"table_icon":"Table","table_schema":[{"default":"field","description":"Specify the name of the output field.","display_name":"Name","edit_mode":"inline","name":"name","type":"str"},{"default":"description of field","description":"Describe the purpose of the output field.","display_name":"Description","edit_mode":"popover","name":"description","type":"str"},{"default":"str","description":"Indicate the data type of the output field (e.g., str, int, float, bool, dict).","display_name":"Type","edit_mode":"inline","name":"type","options":["str","int","float","bool","dict"],"type":"str"},{"default":"False","description":"Set to True if this output field should be a list of the specified type.","display_name":"As List","edit_mode":"inline","name":"multiple","type":"boolean"}],"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"trigger_icon":"Table","trigger_text":"Open table","type":"table","value":[]},"policies":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Policies","dynamic":false,"info":"Custom instructions or policies for the agent to adhere to during its operation.\nExample:\n## Plan\n< planning instructions e.g. which tools and when to use>\n## Answer\n< final answer instructions how to answer>","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"policies","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"seed":{"_input_type":"IntInput","advanced":true,"display_name":"Seed","dynamic":false,"info":"The seed controls the reproducibility of the job.","list":false,"list_add_label":"Add More","name":"seed","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":1},"temperature":{"_input_type":"SliderInput","advanced":true,"display_name":"Temperature","dynamic":false,"info":"","max_label":"","max_label_icon":"","min_label":"","min_label_icon":"","name":"temperature","placeholder":"","range_spec":{"max":1.0,"min":0.0,"step":0.01,"step_type":"float"},"required":false,"show":true,"slider_buttons":false,"slider_buttons_options":[],"slider_input":false,"title_case":false,"tool_mode":false,"track_in_telemetry":false,"type":"slider","value":0.1},"timeout":{"_input_type":"IntInput","advanced":true,"display_name":"Timeout","dynamic":false,"info":"The timeout for requests to OpenAI completion API.","list":false,"list_add_label":"Add More","name":"timeout","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":700},"tools":{"_input_type":"HandleInput","advanced":false,"display_name":"Tools","dynamic":false,"info":"These are the tools that the agent can use to help with tasks.","input_types":["Tool"],"list":true,"list_add_label":"Add More","name":"tools","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"verbose":{"_input_type":"BoolInput","advanced":true,"display_name":"Verbose","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"verbose","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"web_apps":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Web applications","dynamic":false,"info":"Define a list of web applications that cuga will open when enable browser is true. Currently only supports one web application. Example: https://example.com","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"web_apps","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false}}],["custom_component",{"CustomComponent":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Use as a template to create your own component.","display_name":"Custom Component","documentation":"https://docs.langflow.org/components-custom-components","edited":false,"field_order":["input_value"],"frozen":false,"icon":"code","legacy":false,"metadata":{"code_hash":"d50a68a6fa57","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.custom_component.custom_component.CustomComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Output","group_outputs":false,"method":"build_output","name":"output","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"# from lfx.field_typing import Data\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import MessageTextInput, Output\nfrom lfx.schema.data import Data\n\n\nclass CustomComponent(Component):\n display_name = \"Custom Component\"\n description = \"Use as a template to create your own component.\"\n documentation: str = \"https://docs.langflow.org/components-custom-components\"\n icon = \"code\"\n name = \"CustomComponent\"\n\n inputs = [\n MessageTextInput(\n name=\"input_value\",\n display_name=\"Input Value\",\n info=\"This is a custom component Input\",\n value=\"Hello, World!\",\n tool_mode=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Output\", name=\"output\", method=\"build_output\"),\n ]\n\n def build_output(self) -> Data:\n data = Data(value=self.input_value)\n self.status = data\n return data\n"},"input_value":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Input Value","dynamic":false,"info":"This is a custom component Input","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"Hello, World!"}},"tool_mode":false}}],["data_source",{"APIRequest":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Make HTTP requests using URL or cURL commands.","display_name":"API Request","documentation":"https://docs.langflow.org/components-data#api-request","edited":false,"field_order":["url_input","curl_input","method","mode","query_params","body","headers","timeout","follow_redirects","save_to_file","include_httpx_metadata"],"frozen":false,"icon":"Globe","legacy":false,"metadata":{"code_hash":"b0a64a4c6c06","dependencies":{"dependencies":[{"name":"aiofiles","version":"24.1.0"},{"name":"httpx","version":"0.28.1"},{"name":"validators","version":"0.34.0"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.data_source.api_request.APIRequestComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"API Response","group_outputs":false,"method":"make_api_request","name":"data","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","body":{"_input_type":"TableInput","advanced":true,"display_name":"Body","dynamic":false,"info":"The body to send with the request as a dictionary (for POST, PATCH, PUT).","input_types":["Data"],"is_list":true,"list_add_label":"Add More","name":"body","placeholder":"","real_time_refresh":true,"required":false,"show":true,"table_icon":"Table","table_schema":[{"description":"Parameter name","display_name":"Key","name":"key","type":"str"},{"description":"Parameter value","display_name":"Value","name":"value"}],"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"trigger_icon":"Table","trigger_text":"Open table","type":"table","value":[]},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import json\nimport re\nimport tempfile\nfrom datetime import datetime, timezone\nfrom pathlib import Path\nfrom typing import Any\nfrom urllib.parse import parse_qsl, urlencode, urlparse, urlunparse\n\nimport aiofiles\nimport aiofiles.os as aiofiles_os\nimport httpx\nimport validators\n\nfrom lfx.base.curl.parse import parse_context\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.inputs.inputs import TabInput\nfrom lfx.io import (\n BoolInput,\n DataInput,\n DropdownInput,\n IntInput,\n MessageTextInput,\n MultilineInput,\n Output,\n TableInput,\n)\nfrom lfx.schema.data import Data\nfrom lfx.schema.dotdict import dotdict\nfrom lfx.utils.component_utils import set_current_fields, set_field_advanced, set_field_display\nfrom lfx.utils.ssrf_protection import SSRFProtectionError, validate_url_for_ssrf\n\n# Define fields for each mode\nMODE_FIELDS = {\n \"URL\": [\n \"url_input\",\n \"method\",\n ],\n \"cURL\": [\"curl_input\"],\n}\n\n# Fields that should always be visible\nDEFAULT_FIELDS = [\"mode\"]\n\n\nclass APIRequestComponent(Component):\n display_name = \"API Request\"\n description = \"Make HTTP requests using URL or cURL commands.\"\n documentation: str = \"https://docs.langflow.org/components-data#api-request\"\n icon = \"Globe\"\n name = \"APIRequest\"\n\n inputs = [\n MessageTextInput(\n name=\"url_input\",\n display_name=\"URL\",\n info=\"Enter the URL for the request.\",\n advanced=False,\n tool_mode=True,\n ),\n MultilineInput(\n name=\"curl_input\",\n display_name=\"cURL\",\n info=(\n \"Paste a curl command to populate the fields. \"\n \"This will fill in the dictionary fields for headers and body.\"\n ),\n real_time_refresh=True,\n tool_mode=True,\n advanced=True,\n show=False,\n ),\n DropdownInput(\n name=\"method\",\n display_name=\"Method\",\n options=[\"GET\", \"POST\", \"PATCH\", \"PUT\", \"DELETE\"],\n value=\"GET\",\n info=\"The HTTP method to use.\",\n real_time_refresh=True,\n ),\n TabInput(\n name=\"mode\",\n display_name=\"Mode\",\n options=[\"URL\", \"cURL\"],\n value=\"URL\",\n info=\"Enable cURL mode to populate fields from a cURL command.\",\n real_time_refresh=True,\n ),\n DataInput(\n name=\"query_params\",\n display_name=\"Query Parameters\",\n info=\"The query parameters to append to the URL.\",\n advanced=True,\n ),\n TableInput(\n name=\"body\",\n display_name=\"Body\",\n info=\"The body to send with the request as a dictionary (for POST, PATCH, PUT).\",\n table_schema=[\n {\n \"name\": \"key\",\n \"display_name\": \"Key\",\n \"type\": \"str\",\n \"description\": \"Parameter name\",\n },\n {\n \"name\": \"value\",\n \"display_name\": \"Value\",\n \"description\": \"Parameter value\",\n },\n ],\n value=[],\n input_types=[\"Data\"],\n advanced=True,\n real_time_refresh=True,\n ),\n TableInput(\n name=\"headers\",\n display_name=\"Headers\",\n info=\"The headers to send with the request\",\n table_schema=[\n {\n \"name\": \"key\",\n \"display_name\": \"Header\",\n \"type\": \"str\",\n \"description\": \"Header name\",\n },\n {\n \"name\": \"value\",\n \"display_name\": \"Value\",\n \"type\": \"str\",\n \"description\": \"Header value\",\n },\n ],\n value=[{\"key\": \"User-Agent\", \"value\": \"Langflow/1.0\"}],\n advanced=True,\n input_types=[\"Data\"],\n real_time_refresh=True,\n ),\n IntInput(\n name=\"timeout\",\n display_name=\"Timeout\",\n value=30,\n info=\"The timeout to use for the request.\",\n advanced=True,\n ),\n BoolInput(\n name=\"follow_redirects\",\n display_name=\"Follow Redirects\",\n value=False,\n info=(\n \"Whether to follow HTTP redirects. \"\n \"WARNING: Enabling redirects may allow SSRF bypass attacks where a public URL \"\n \"redirects to internal resources. Only enable if you trust the target server. \"\n \"See OWASP SSRF Prevention Cheat Sheet for details.\"\n ),\n advanced=True,\n ),\n BoolInput(\n name=\"save_to_file\",\n display_name=\"Save to File\",\n value=False,\n info=\"Save the API response to a temporary file\",\n advanced=True,\n ),\n BoolInput(\n name=\"include_httpx_metadata\",\n display_name=\"Include HTTPx Metadata\",\n value=False,\n info=(\n \"Include properties such as headers, status_code, response_headers, \"\n \"and redirection_history in the output.\"\n ),\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"API Response\", name=\"data\", method=\"make_api_request\"),\n ]\n\n def _parse_json_value(self, value: Any) -> Any:\n \"\"\"Parse a value that might be a JSON string.\"\"\"\n if not isinstance(value, str):\n return value\n\n try:\n parsed = json.loads(value)\n except json.JSONDecodeError:\n return value\n else:\n return parsed\n\n def _process_body(self, body: Any) -> dict:\n \"\"\"Process the body input into a valid dictionary.\"\"\"\n if body is None:\n return {}\n if hasattr(body, \"data\"):\n body = body.data\n if isinstance(body, dict):\n return self._process_dict_body(body)\n if isinstance(body, str):\n return self._process_string_body(body)\n if isinstance(body, list):\n return self._process_list_body(body)\n return {}\n\n def _process_dict_body(self, body: dict) -> dict:\n \"\"\"Process dictionary body by parsing JSON values.\"\"\"\n return {k: self._parse_json_value(v) for k, v in body.items()}\n\n def _process_string_body(self, body: str) -> dict:\n \"\"\"Process string body by attempting JSON parse.\"\"\"\n try:\n return self._process_body(json.loads(body))\n except json.JSONDecodeError:\n return {\"data\": body}\n\n def _process_list_body(self, body: list) -> dict:\n \"\"\"Process list body by converting to key-value dictionary.\"\"\"\n processed_dict = {}\n try:\n for item in body:\n # Unwrap Data objects\n current_item = item\n if hasattr(item, \"data\"):\n unwrapped_data = item.data\n # If the unwrapped data is a dict but not key-value format, use it directly\n if isinstance(unwrapped_data, dict) and not self._is_valid_key_value_item(unwrapped_data):\n return unwrapped_data\n current_item = unwrapped_data\n if not self._is_valid_key_value_item(current_item):\n continue\n key = current_item[\"key\"]\n value = self._parse_json_value(current_item[\"value\"])\n processed_dict[key] = value\n except (KeyError, TypeError, ValueError) as e:\n self.log(f\"Failed to process body list: {e}\")\n return {}\n return processed_dict\n\n def _is_valid_key_value_item(self, item: Any) -> bool:\n \"\"\"Check if an item is a valid key-value dictionary.\"\"\"\n return isinstance(item, dict) and \"key\" in item and \"value\" in item\n\n def parse_curl(self, curl: str, build_config: dotdict) -> dotdict:\n \"\"\"Parse a cURL command and update build configuration.\"\"\"\n try:\n parsed = parse_context(curl)\n\n # Update basic configuration\n url = parsed.url\n # Normalize URL before setting it\n url = self._normalize_url(url)\n\n build_config[\"url_input\"][\"value\"] = url\n build_config[\"method\"][\"value\"] = parsed.method.upper()\n\n # Process headers\n headers_list = [{\"key\": k, \"value\": v} for k, v in parsed.headers.items()]\n build_config[\"headers\"][\"value\"] = headers_list\n\n # Process body data\n if not parsed.data:\n build_config[\"body\"][\"value\"] = []\n elif parsed.data:\n try:\n json_data = json.loads(parsed.data)\n if isinstance(json_data, dict):\n body_list = [\n {\"key\": k, \"value\": json.dumps(v) if isinstance(v, dict | list) else str(v)}\n for k, v in json_data.items()\n ]\n build_config[\"body\"][\"value\"] = body_list\n else:\n build_config[\"body\"][\"value\"] = [{\"key\": \"data\", \"value\": json.dumps(json_data)}]\n except json.JSONDecodeError:\n build_config[\"body\"][\"value\"] = [{\"key\": \"data\", \"value\": parsed.data}]\n\n except Exception as exc:\n msg = f\"Error parsing curl: {exc}\"\n self.log(msg)\n raise ValueError(msg) from exc\n\n return build_config\n\n def _normalize_url(self, url: str) -> str:\n \"\"\"Normalize URL by adding https:// if no protocol is specified.\"\"\"\n if not url or not isinstance(url, str):\n msg = \"URL cannot be empty\"\n raise ValueError(msg)\n\n url = url.strip()\n if url.startswith((\"http://\", \"https://\")):\n return url\n return f\"https://{url}\"\n\n async def make_request(\n self,\n client: httpx.AsyncClient,\n method: str,\n url: str,\n headers: dict | None = None,\n body: Any = None,\n timeout: int = 5,\n *,\n follow_redirects: bool = True,\n save_to_file: bool = False,\n include_httpx_metadata: bool = False,\n ) -> Data:\n method = method.upper()\n if method not in {\"GET\", \"POST\", \"PATCH\", \"PUT\", \"DELETE\"}:\n msg = f\"Unsupported method: {method}\"\n raise ValueError(msg)\n\n processed_body = self._process_body(body)\n redirection_history = []\n\n try:\n # Prepare request parameters\n request_params = {\n \"method\": method,\n \"url\": url,\n \"headers\": headers,\n \"json\": processed_body,\n \"timeout\": timeout,\n \"follow_redirects\": follow_redirects,\n }\n response = await client.request(**request_params)\n\n redirection_history = [\n {\n \"url\": redirect.headers.get(\"Location\", str(redirect.url)),\n \"status_code\": redirect.status_code,\n }\n for redirect in response.history\n ]\n\n is_binary, file_path = await self._response_info(response, with_file_path=save_to_file)\n response_headers = self._headers_to_dict(response.headers)\n\n # Base metadata\n metadata = {\n \"source\": url,\n \"status_code\": response.status_code,\n \"response_headers\": response_headers,\n }\n\n if redirection_history:\n metadata[\"redirection_history\"] = redirection_history\n\n if save_to_file:\n mode = \"wb\" if is_binary else \"w\"\n encoding = response.encoding if mode == \"w\" else None\n if file_path:\n await aiofiles_os.makedirs(file_path.parent, exist_ok=True)\n if is_binary:\n async with aiofiles.open(file_path, \"wb\") as f:\n await f.write(response.content)\n await f.flush()\n else:\n async with aiofiles.open(file_path, \"w\", encoding=encoding) as f:\n await f.write(response.text)\n await f.flush()\n metadata[\"file_path\"] = str(file_path)\n\n if include_httpx_metadata:\n metadata.update({\"headers\": headers})\n return Data(data=metadata)\n\n # Handle response content\n if is_binary:\n result = response.content\n else:\n try:\n result = response.json()\n except json.JSONDecodeError:\n self.log(\"Failed to decode JSON response\")\n result = response.text.encode(\"utf-8\")\n\n metadata[\"result\"] = result\n\n if include_httpx_metadata:\n metadata.update({\"headers\": headers})\n\n return Data(data=metadata)\n except (httpx.HTTPError, httpx.RequestError, httpx.TimeoutException) as exc:\n self.log(f\"Error making request to {url}\")\n return Data(\n data={\n \"source\": url,\n \"headers\": headers,\n \"status_code\": 500,\n \"error\": str(exc),\n **({\"redirection_history\": redirection_history} if redirection_history else {}),\n },\n )\n\n def add_query_params(self, url: str, params: dict) -> str:\n \"\"\"Add query parameters to URL efficiently.\"\"\"\n if not params:\n return url\n url_parts = list(urlparse(url))\n query = dict(parse_qsl(url_parts[4]))\n query.update(params)\n url_parts[4] = urlencode(query)\n return urlunparse(url_parts)\n\n def _headers_to_dict(self, headers: httpx.Headers) -> dict[str, str]:\n \"\"\"Convert HTTP headers to a dictionary with lowercased keys.\"\"\"\n return {k.lower(): v for k, v in headers.items()}\n\n def _process_headers(self, headers: Any) -> dict:\n \"\"\"Process the headers input into a valid dictionary.\"\"\"\n if headers is None:\n return {}\n if isinstance(headers, dict):\n return headers\n if isinstance(headers, list):\n return {item[\"key\"]: item[\"value\"] for item in headers if self._is_valid_key_value_item(item)}\n return {}\n\n async def make_api_request(self) -> Data:\n \"\"\"Make HTTP request with optimized parameter handling.\"\"\"\n method = self.method\n url = self.url_input.strip() if isinstance(self.url_input, str) else \"\"\n headers = self.headers or {}\n body = self.body or {}\n timeout = self.timeout\n follow_redirects = self.follow_redirects\n save_to_file = self.save_to_file\n include_httpx_metadata = self.include_httpx_metadata\n\n # Security warning when redirects are enabled\n if follow_redirects:\n self.log(\n \"Security Warning: HTTP redirects are enabled. This may allow SSRF bypass attacks \"\n \"where a public URL redirects to internal resources (e.g., cloud metadata endpoints). \"\n \"Only enable this if you trust the target server.\"\n )\n\n # if self.mode == \"cURL\" and self.curl_input:\n # self._build_config = self.parse_curl(self.curl_input, dotdict())\n # # After parsing curl, get the normalized URL\n # url = self._build_config[\"url_input\"][\"value\"]\n\n # Normalize URL before validation\n url = self._normalize_url(url)\n\n # Validate URL\n if not validators.url(url):\n msg = f\"Invalid URL provided: {url}\"\n raise ValueError(msg)\n\n # SSRF Protection: Validate URL to prevent access to internal resources\n # TODO: In next major version (2.0), remove warn_only=True to enforce blocking\n try:\n validate_url_for_ssrf(url, warn_only=True)\n except SSRFProtectionError as e:\n # This will only raise if SSRF protection is enabled and warn_only=False\n msg = f\"SSRF Protection: {e}\"\n raise ValueError(msg) from e\n\n # Process query parameters\n if isinstance(self.query_params, str):\n query_params = dict(parse_qsl(self.query_params))\n else:\n query_params = self.query_params.data if self.query_params else {}\n\n # Process headers and body\n headers = self._process_headers(headers)\n body = self._process_body(body)\n url = self.add_query_params(url, query_params)\n\n async with httpx.AsyncClient() as client:\n result = await self.make_request(\n client,\n method,\n url,\n headers,\n body,\n timeout,\n follow_redirects=follow_redirects,\n save_to_file=save_to_file,\n include_httpx_metadata=include_httpx_metadata,\n )\n self.status = result\n return result\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:\n \"\"\"Update the build config based on the selected mode.\"\"\"\n if field_name != \"mode\":\n if field_name == \"curl_input\" and self.mode == \"cURL\" and self.curl_input:\n return self.parse_curl(self.curl_input, build_config)\n return build_config\n\n # print(f\"Current mode: {field_value}\")\n if field_value == \"cURL\":\n set_field_display(build_config, \"curl_input\", value=True)\n if build_config[\"curl_input\"][\"value\"]:\n build_config = self.parse_curl(build_config[\"curl_input\"][\"value\"], build_config)\n else:\n set_field_display(build_config, \"curl_input\", value=False)\n\n return set_current_fields(\n build_config=build_config,\n action_fields=MODE_FIELDS,\n selected_action=field_value,\n default_fields=DEFAULT_FIELDS,\n func=set_field_advanced,\n default_value=True,\n )\n\n async def _response_info(\n self, response: httpx.Response, *, with_file_path: bool = False\n ) -> tuple[bool, Path | None]:\n \"\"\"Determine the file path and whether the response content is binary.\n\n Args:\n response (Response): The HTTP response object.\n with_file_path (bool): Whether to save the response content to a file.\n\n Returns:\n Tuple[bool, Path | None]:\n A tuple containing a boolean indicating if the content is binary and the full file path (if applicable).\n \"\"\"\n content_type = response.headers.get(\"Content-Type\", \"\")\n is_binary = \"application/octet-stream\" in content_type or \"application/binary\" in content_type\n\n if not with_file_path:\n return is_binary, None\n\n component_temp_dir = Path(tempfile.gettempdir()) / self.__class__.__name__\n\n # Create directory asynchronously\n await aiofiles_os.makedirs(component_temp_dir, exist_ok=True)\n\n filename = None\n if \"Content-Disposition\" in response.headers:\n content_disposition = response.headers[\"Content-Disposition\"]\n filename_match = re.search(r'filename=\"(.+?)\"', content_disposition)\n if filename_match:\n extracted_filename = filename_match.group(1)\n filename = extracted_filename\n\n # Step 3: Infer file extension or use part of the request URL if no filename\n if not filename:\n # Extract the last segment of the URL path\n url_path = urlparse(str(response.request.url) if response.request else \"\").path\n base_name = Path(url_path).name # Get the last segment of the path\n if not base_name: # If the path ends with a slash or is empty\n base_name = \"response\"\n\n # Infer file extension\n content_type_to_extension = {\n \"text/plain\": \".txt\",\n \"application/json\": \".json\",\n \"image/jpeg\": \".jpg\",\n \"image/png\": \".png\",\n \"application/octet-stream\": \".bin\",\n }\n extension = content_type_to_extension.get(content_type, \".bin\" if is_binary else \".txt\")\n filename = f\"{base_name}{extension}\"\n\n # Step 4: Define the full file path\n file_path = component_temp_dir / filename\n\n # Step 5: Check if file exists asynchronously and handle accordingly\n try:\n # Try to create the file exclusively (x mode) to check existence\n async with aiofiles.open(file_path, \"x\") as _:\n pass # File created successfully, we can use this path\n except FileExistsError:\n # If file exists, append a timestamp to the filename\n timestamp = datetime.now(timezone.utc).strftime(\"%Y%m%d%H%M%S%f\")\n file_path = component_temp_dir / f\"{timestamp}-{filename}\"\n\n return is_binary, file_path\n"},"curl_input":{"_input_type":"MultilineInput","advanced":true,"copy_field":false,"display_name":"cURL","dynamic":false,"info":"Paste a curl command to populate the fields. This will fill in the dictionary fields for headers and body.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"curl_input","placeholder":"","real_time_refresh":true,"required":false,"show":false,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"follow_redirects":{"_input_type":"BoolInput","advanced":true,"display_name":"Follow Redirects","dynamic":false,"info":"Whether to follow HTTP redirects. WARNING: Enabling redirects may allow SSRF bypass attacks where a public URL redirects to internal resources. Only enable if you trust the target server. See OWASP SSRF Prevention Cheat Sheet for details.","list":false,"list_add_label":"Add More","name":"follow_redirects","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"headers":{"_input_type":"TableInput","advanced":true,"display_name":"Headers","dynamic":false,"info":"The headers to send with the request","input_types":["Data"],"is_list":true,"list_add_label":"Add More","name":"headers","placeholder":"","real_time_refresh":true,"required":false,"show":true,"table_icon":"Table","table_schema":[{"description":"Header name","display_name":"Header","name":"key","type":"str"},{"description":"Header value","display_name":"Value","name":"value","type":"str"}],"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"trigger_icon":"Table","trigger_text":"Open table","type":"table","value":[{"key":"User-Agent","value":"Langflow/1.0"}]},"include_httpx_metadata":{"_input_type":"BoolInput","advanced":true,"display_name":"Include HTTPx Metadata","dynamic":false,"info":"Include properties such as headers, status_code, response_headers, and redirection_history in the output.","list":false,"list_add_label":"Add More","name":"include_httpx_metadata","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"method":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Method","dynamic":false,"external_options":{},"info":"The HTTP method to use.","name":"method","options":["GET","POST","PATCH","PUT","DELETE"],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"GET"},"mode":{"_input_type":"TabInput","advanced":false,"display_name":"Mode","dynamic":false,"info":"Enable cURL mode to populate fields from a cURL command.","name":"mode","options":["URL","cURL"],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"tab","value":"URL"},"query_params":{"_input_type":"DataInput","advanced":true,"display_name":"Query Parameters","dynamic":false,"info":"The query parameters to append to the URL.","input_types":["Data"],"list":false,"list_add_label":"Add More","name":"query_params","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"save_to_file":{"_input_type":"BoolInput","advanced":true,"display_name":"Save to File","dynamic":false,"info":"Save the API response to a temporary file","list":false,"list_add_label":"Add More","name":"save_to_file","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"timeout":{"_input_type":"IntInput","advanced":true,"display_name":"Timeout","dynamic":false,"info":"The timeout to use for the request.","list":false,"list_add_label":"Add More","name":"timeout","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":30},"url_input":{"_input_type":"MessageTextInput","advanced":false,"display_name":"URL","dynamic":false,"info":"Enter the URL for the request.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"url_input","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"CSVtoData":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Load a CSV file, CSV from a file path, or a valid CSV string and convert it to a list of Data","display_name":"Load CSV","documentation":"","edited":false,"field_order":["csv_file","csv_path","csv_string","text_key"],"frozen":false,"icon":"file-spreadsheet","legacy":true,"metadata":{"code_hash":"36c35ef2b65d","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.data_source.csv_to_data.CSVToDataComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data List","group_outputs":false,"method":"load_csv_to_data","name":"data_list","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":["data.File"],"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import csv\nimport io\nfrom pathlib import Path\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import FileInput, MessageTextInput, MultilineInput, Output\nfrom lfx.schema.data import Data\n\n\nclass CSVToDataComponent(Component):\n display_name = \"Load CSV\"\n description = \"Load a CSV file, CSV from a file path, or a valid CSV string and convert it to a list of Data\"\n icon = \"file-spreadsheet\"\n name = \"CSVtoData\"\n legacy = True\n replacement = [\"data.File\"]\n\n inputs = [\n FileInput(\n name=\"csv_file\",\n display_name=\"CSV File\",\n file_types=[\"csv\"],\n info=\"Upload a CSV file to convert to a list of Data objects\",\n ),\n MessageTextInput(\n name=\"csv_path\",\n display_name=\"CSV File Path\",\n info=\"Provide the path to the CSV file as pure text\",\n ),\n MultilineInput(\n name=\"csv_string\",\n display_name=\"CSV String\",\n info=\"Paste a CSV string directly to convert to a list of Data objects\",\n ),\n MessageTextInput(\n name=\"text_key\",\n display_name=\"Text Key\",\n info=\"The key to use for the text column. Defaults to 'text'.\",\n value=\"text\",\n ),\n ]\n\n outputs = [\n Output(name=\"data_list\", display_name=\"Data List\", method=\"load_csv_to_data\"),\n ]\n\n def load_csv_to_data(self) -> list[Data]:\n if sum(bool(field) for field in [self.csv_file, self.csv_path, self.csv_string]) != 1:\n msg = \"Please provide exactly one of: CSV file, file path, or CSV string.\"\n raise ValueError(msg)\n\n csv_data = None\n try:\n if self.csv_file:\n resolved_path = self.resolve_path(self.csv_file)\n file_path = Path(resolved_path)\n if file_path.suffix.lower() != \".csv\":\n self.status = \"The provided file must be a CSV file.\"\n else:\n with file_path.open(newline=\"\", encoding=\"utf-8\") as csvfile:\n csv_data = csvfile.read()\n\n elif self.csv_path:\n file_path = Path(self.csv_path)\n if file_path.suffix.lower() != \".csv\":\n self.status = \"The provided file must be a CSV file.\"\n else:\n with file_path.open(newline=\"\", encoding=\"utf-8\") as csvfile:\n csv_data = csvfile.read()\n\n else:\n csv_data = self.csv_string\n\n if csv_data:\n csv_reader = csv.DictReader(io.StringIO(csv_data))\n result = [Data(data=row, text_key=self.text_key) for row in csv_reader]\n\n if not result:\n self.status = \"The CSV data is empty.\"\n return []\n\n self.status = result\n return result\n\n except csv.Error as e:\n error_message = f\"CSV parsing error: {e}\"\n self.status = error_message\n raise ValueError(error_message) from e\n\n except Exception as e:\n error_message = f\"An error occurred: {e}\"\n self.status = error_message\n raise ValueError(error_message) from e\n\n # An error occurred\n raise ValueError(self.status)\n"},"csv_file":{"_input_type":"FileInput","advanced":false,"display_name":"CSV File","dynamic":false,"fileTypes":["csv"],"file_path":"","info":"Upload a CSV file to convert to a list of Data objects","list":false,"list_add_label":"Add More","name":"csv_file","placeholder":"","required":false,"show":true,"temp_file":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"file","value":""},"csv_path":{"_input_type":"MessageTextInput","advanced":false,"display_name":"CSV File Path","dynamic":false,"info":"Provide the path to the CSV file as pure text","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"csv_path","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"csv_string":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"CSV String","dynamic":false,"info":"Paste a CSV string directly to convert to a list of Data objects","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"csv_string","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"text_key":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Text Key","dynamic":false,"info":"The key to use for the text column. Defaults to 'text'.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"text_key","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"text"}},"tool_mode":false},"JSONtoData":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Convert a JSON file, JSON from a file path, or a JSON string to a Data object or a list of Data objects","display_name":"Load JSON","documentation":"","edited":false,"field_order":["json_file","json_path","json_string"],"frozen":false,"icon":"braces","legacy":true,"metadata":{"code_hash":"a7a30fc94803","dependencies":{"dependencies":[{"name":"json_repair","version":"0.30.3"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.data_source.json_to_data.JSONToDataComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"convert_json_to_data","name":"data","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":["data.File"],"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import json\nfrom pathlib import Path\n\nfrom json_repair import repair_json\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import FileInput, MessageTextInput, MultilineInput, Output\nfrom lfx.schema.data import Data\n\n\nclass JSONToDataComponent(Component):\n display_name = \"Load JSON\"\n description = (\n \"Convert a JSON file, JSON from a file path, or a JSON string to a Data object or a list of Data objects\"\n )\n icon = \"braces\"\n name = \"JSONtoData\"\n legacy = True\n replacement = [\"data.File\"]\n\n inputs = [\n FileInput(\n name=\"json_file\",\n display_name=\"JSON File\",\n file_types=[\"json\"],\n info=\"Upload a JSON file to convert to a Data object or list of Data objects\",\n ),\n MessageTextInput(\n name=\"json_path\",\n display_name=\"JSON File Path\",\n info=\"Provide the path to the JSON file as pure text\",\n ),\n MultilineInput(\n name=\"json_string\",\n display_name=\"JSON String\",\n info=\"Enter a valid JSON string (object or array) to convert to a Data object or list of Data objects\",\n ),\n ]\n\n outputs = [\n Output(name=\"data\", display_name=\"Data\", method=\"convert_json_to_data\"),\n ]\n\n def convert_json_to_data(self) -> Data | list[Data]:\n if sum(bool(field) for field in [self.json_file, self.json_path, self.json_string]) != 1:\n msg = \"Please provide exactly one of: JSON file, file path, or JSON string.\"\n self.status = msg\n raise ValueError(msg)\n\n json_data = None\n\n try:\n if self.json_file:\n resolved_path = self.resolve_path(self.json_file)\n file_path = Path(resolved_path)\n if file_path.suffix.lower() != \".json\":\n self.status = \"The provided file must be a JSON file.\"\n else:\n json_data = file_path.read_text(encoding=\"utf-8\")\n\n elif self.json_path:\n file_path = Path(self.json_path)\n if file_path.suffix.lower() != \".json\":\n self.status = \"The provided file must be a JSON file.\"\n else:\n json_data = file_path.read_text(encoding=\"utf-8\")\n\n else:\n json_data = self.json_string\n\n if json_data:\n # Try to parse the JSON string\n try:\n parsed_data = json.loads(json_data)\n except json.JSONDecodeError:\n # If JSON parsing fails, try to repair the JSON string\n repaired_json_string = repair_json(json_data)\n parsed_data = json.loads(repaired_json_string)\n\n # Check if the parsed data is a list\n if isinstance(parsed_data, list):\n result = [Data(data=item) for item in parsed_data]\n else:\n result = Data(data=parsed_data)\n self.status = result\n return result\n\n except (json.JSONDecodeError, SyntaxError, ValueError) as e:\n error_message = f\"Invalid JSON or Python literal: {e}\"\n self.status = error_message\n raise ValueError(error_message) from e\n\n except Exception as e:\n error_message = f\"An error occurred: {e}\"\n self.status = error_message\n raise ValueError(error_message) from e\n\n # An error occurred\n raise ValueError(self.status)\n"},"json_file":{"_input_type":"FileInput","advanced":false,"display_name":"JSON File","dynamic":false,"fileTypes":["json"],"file_path":"","info":"Upload a JSON file to convert to a Data object or list of Data objects","list":false,"list_add_label":"Add More","name":"json_file","placeholder":"","required":false,"show":true,"temp_file":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"file","value":""},"json_path":{"_input_type":"MessageTextInput","advanced":false,"display_name":"JSON File Path","dynamic":false,"info":"Provide the path to the JSON file as pure text","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"json_path","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"json_string":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"JSON String","dynamic":false,"info":"Enter a valid JSON string (object or array) to convert to a Data object or list of Data objects","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"json_string","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"MockDataGenerator":{"base_classes":["Data","DataFrame","Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate mock data for testing and development.","display_name":"Mock Data","documentation":"","edited":false,"field_order":[],"frozen":false,"icon":"database","legacy":false,"metadata":{"code_hash":"d21dce7b329b","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"pandas","version":"2.2.3"}],"total_dependencies":2},"module":"lfx.components.data_source.mock_data.MockDataGeneratorComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Result","group_outputs":false,"method":"generate_dataframe_output","name":"dataframe_output","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Result","group_outputs":false,"method":"generate_message_output","name":"message_output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Result","group_outputs":false,"method":"generate_data_output","name":"data_output","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import secrets\nfrom datetime import datetime, timedelta, timezone\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import Output\nfrom lfx.schema import Data, DataFrame\nfrom lfx.schema.message import Message\n\n\nclass MockDataGeneratorComponent(Component):\n \"\"\"Mock Data Generator Component.\n\n Generates sample data for testing and development purposes. Supports three main\n Langflow output types: Message (text), Data (JSON), and DataFrame (tabular data).\n\n This component is useful for:\n - Testing workflows without real data sources\n - Prototyping data processing pipelines\n - Creating sample data for demonstrations\n - Development and debugging of Langflow components\n \"\"\"\n\n display_name = \"Mock Data\"\n description = \"Generate mock data for testing and development.\"\n icon = \"database\"\n name = \"MockDataGenerator\"\n\n inputs = []\n\n outputs = [\n Output(display_name=\"Result\", name=\"dataframe_output\", method=\"generate_dataframe_output\"),\n Output(display_name=\"Result\", name=\"message_output\", method=\"generate_message_output\"),\n Output(display_name=\"Result\", name=\"data_output\", method=\"generate_data_output\"),\n ]\n\n def build(self) -> DataFrame:\n \"\"\"Default build method - returns DataFrame when component is standalone.\"\"\"\n return self.generate_dataframe_output()\n\n def generate_message_output(self) -> Message:\n \"\"\"Generate Message output specifically.\n\n Returns:\n Message: A Message object containing Lorem Ipsum text\n \"\"\"\n try:\n self.log(\"Generating Message mock data\")\n message = self._generate_message()\n self.status = f\"Generated Lorem Ipsum message ({len(message.text)} characters)\"\n except (ValueError, TypeError) as e:\n error_msg = f\"Error generating Message data: {e!s}\"\n self.log(error_msg)\n self.status = f\"Error: {error_msg}\"\n return Message(text=f\"Error: {error_msg}\")\n else:\n return message\n\n def generate_data_output(self) -> Data:\n \"\"\"Generate Data output specifically.\n\n Returns:\n Data: A Data object containing sample JSON data (1 record)\n \"\"\"\n try:\n record_count = 1 # Fixed to 1 record for Data output\n self.log(f\"Generating Data mock data with {record_count} record\")\n data = self._generate_data(record_count)\n self.status = f\"Generated JSON data with {len(data.data.get('records', []))} record(s)\"\n except (ValueError, TypeError) as e:\n error_msg = f\"Error generating Data: {e!s}\"\n self.log(error_msg)\n self.status = f\"Error: {error_msg}\"\n return Data(data={\"error\": error_msg, \"success\": False})\n else:\n return data\n\n def generate_dataframe_output(self) -> DataFrame:\n \"\"\"Generate DataFrame output specifically.\n\n Returns:\n DataFrame: A Langflow DataFrame with sample data (50 records)\n \"\"\"\n try:\n record_count = 50 # Fixed to 50 records for DataFrame output\n self.log(f\"Generating DataFrame mock data with {record_count} records\")\n return self._generate_dataframe(record_count)\n except (ValueError, TypeError) as e:\n error_msg = f\"Error generating DataFrame: {e!s}\"\n self.log(error_msg)\n\n try:\n import pandas as pd\n\n error_df = pd.DataFrame({\"error\": [error_msg]})\n return DataFrame(error_df)\n except ImportError:\n # Even without pandas, return DataFrame wrapper\n return DataFrame({\"error\": [error_msg]})\n\n def _generate_message(self) -> Message:\n \"\"\"Generate a sample Message with Lorem Ipsum text.\n\n Returns:\n Message: A Message object containing Lorem Ipsum text\n \"\"\"\n lorem_ipsum_texts = [\n (\n \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor \"\n \"incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud \"\n \"exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\"\n ),\n (\n \"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla \"\n \"pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \"\n \"mollit anim id est laborum.\"\n ),\n (\n \"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, \"\n \"totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto \"\n \"beatae vitae dicta sunt explicabo.\"\n ),\n (\n \"Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, \"\n \"sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\"\n ),\n (\n \"Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, \"\n \"adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore \"\n \"magnam aliquam quaerat voluptatem.\"\n ),\n ]\n\n selected_text = secrets.choice(lorem_ipsum_texts)\n return Message(text=selected_text)\n\n def _generate_data(self, record_count: int) -> Data:\n \"\"\"Generate sample Data with JSON structure.\n\n Args:\n record_count: Number of records to generate\n\n Returns:\n Data: A Data object containing sample JSON data\n \"\"\"\n # Sample data categories\n companies = [\n \"TechCorp\",\n \"DataSystems\",\n \"CloudWorks\",\n \"InnovateLab\",\n \"DigitalFlow\",\n \"SmartSolutions\",\n \"FutureTech\",\n \"NextGen\",\n ]\n departments = [\"Engineering\", \"Sales\", \"Marketing\", \"HR\", \"Finance\", \"Operations\", \"Support\", \"Research\"]\n statuses = [\"active\", \"pending\", \"completed\", \"cancelled\", \"in_progress\"]\n categories = [\"A\", \"B\", \"C\", \"D\"]\n\n # Generate sample records\n records = []\n base_date = datetime.now(tz=timezone.utc) - timedelta(days=365)\n\n for i in range(record_count):\n record = {\n \"id\": f\"REC-{1000 + i}\",\n \"name\": f\"Sample Record {i + 1}\",\n \"company\": secrets.choice(companies),\n \"department\": secrets.choice(departments),\n \"status\": secrets.choice(statuses),\n \"category\": secrets.choice(categories),\n \"value\": round(secrets.randbelow(9901) + 100 + secrets.randbelow(100) / 100, 2),\n \"quantity\": secrets.randbelow(100) + 1,\n \"rating\": round(secrets.randbelow(41) / 10 + 1, 1),\n \"is_active\": secrets.choice([True, False]),\n \"created_date\": (base_date + timedelta(days=secrets.randbelow(366))).isoformat(),\n \"tags\": [\n secrets.choice(\n [\n \"important\",\n \"urgent\",\n \"review\",\n \"approved\",\n \"draft\",\n \"final\",\n ]\n )\n for _ in range(secrets.randbelow(3) + 1)\n ],\n }\n records.append(record)\n\n # Create the main data structure\n data_structure = {\n \"records\": records,\n \"summary\": {\n \"total_count\": record_count,\n \"active_count\": sum(1 for r in records if r[\"is_active\"]),\n \"total_value\": sum(r[\"value\"] for r in records),\n \"average_rating\": round(sum(r[\"rating\"] for r in records) / record_count, 2),\n \"categories\": list({r[\"category\"] for r in records}),\n \"companies\": list({r[\"company\"] for r in records}),\n },\n }\n\n return Data(data=data_structure)\n\n def _generate_dataframe(self, record_count: int) -> DataFrame:\n \"\"\"Generate sample DataFrame with realistic business data.\n\n Args:\n record_count: Number of rows to generate\n\n Returns:\n DataFrame: A Langflow DataFrame with sample data\n \"\"\"\n try:\n import pandas as pd\n\n self.log(f\"pandas imported successfully, version: {pd.__version__}\")\n except ImportError as e:\n self.log(f\"pandas not available: {e!s}, creating simple DataFrame fallback\")\n # Create a simple DataFrame-like structure without pandas\n data_result = self._generate_data(record_count)\n # Convert Data to simple DataFrame format\n try:\n # Create a basic DataFrame structure from the Data\n records = data_result.data.get(\"records\", [])\n if records:\n # Use first record to get column names\n columns = list(records[0].keys()) if records else [\"error\"]\n rows = [list(record.values()) for record in records]\n else:\n columns = [\"error\"]\n rows = [[\"pandas not available\"]]\n\n # Create a simple dict-based DataFrame representation\n simple_df_data = {\n col: [row[i] if i < len(row) else None for row in rows] for i, col in enumerate(columns)\n }\n\n # Return as DataFrame wrapper (Langflow will handle the display)\n return DataFrame(simple_df_data)\n except (ValueError, TypeError):\n # Ultimate fallback - return the Data as DataFrame\n return DataFrame({\"data\": [str(data_result.data)]})\n\n try:\n self.log(f\"Starting DataFrame generation with {record_count} records\")\n\n # Sample data for realistic business dataset\n first_names = [\n \"John\",\n \"Jane\",\n \"Michael\",\n \"Sarah\",\n \"David\",\n \"Emily\",\n \"Robert\",\n \"Lisa\",\n \"William\",\n \"Jennifer\",\n ]\n last_names = [\n \"Smith\",\n \"Johnson\",\n \"Williams\",\n \"Brown\",\n \"Jones\",\n \"Garcia\",\n \"Miller\",\n \"Davis\",\n \"Rodriguez\",\n \"Martinez\",\n ]\n cities = [\n \"New York\",\n \"Los Angeles\",\n \"Chicago\",\n \"Houston\",\n \"Phoenix\",\n \"Philadelphia\",\n \"San Antonio\",\n \"San Diego\",\n \"Dallas\",\n \"San Jose\",\n ]\n countries = [\"USA\", \"Canada\", \"UK\", \"Germany\", \"France\", \"Australia\", \"Japan\", \"Brazil\", \"India\", \"Mexico\"]\n products = [\n \"Product A\",\n \"Product B\",\n \"Product C\",\n \"Product D\",\n \"Product E\",\n \"Service X\",\n \"Service Y\",\n \"Service Z\",\n ]\n\n # Generate DataFrame data\n data = []\n base_date = datetime.now(tz=timezone.utc) - timedelta(days=365)\n\n self.log(\"Generating row data...\")\n for i in range(record_count):\n row = {\n \"customer_id\": f\"CUST-{10000 + i}\",\n \"first_name\": secrets.choice(first_names),\n \"last_name\": secrets.choice(last_names),\n \"email\": f\"user{i + 1}@example.com\",\n \"age\": secrets.randbelow(63) + 18,\n \"city\": secrets.choice(cities),\n \"country\": secrets.choice(countries),\n \"product\": secrets.choice(products),\n \"order_date\": (base_date + timedelta(days=secrets.randbelow(366))).strftime(\"%Y-%m-%d\"),\n \"order_value\": round(secrets.randbelow(991) + 10 + secrets.randbelow(100) / 100, 2),\n \"quantity\": secrets.randbelow(10) + 1,\n \"discount\": round(secrets.randbelow(31) / 100, 2),\n \"is_premium\": secrets.choice([True, False]),\n \"satisfaction_score\": secrets.randbelow(10) + 1,\n \"last_contact\": (base_date + timedelta(days=secrets.randbelow(366))).strftime(\"%Y-%m-%d\"),\n }\n data.append(row)\n # Create DataFrame\n self.log(\"Creating pandas DataFrame...\")\n df = pd.DataFrame(data)\n self.log(f\"DataFrame created with shape: {df.shape}\")\n\n # Add calculated columns\n self.log(\"Adding calculated columns...\")\n df[\"full_name\"] = df[\"first_name\"] + \" \" + df[\"last_name\"]\n df[\"discounted_value\"] = df[\"order_value\"] * (1 - df[\"discount\"])\n df[\"total_value\"] = df[\"discounted_value\"] * df[\"quantity\"]\n\n # Age group boundaries as constants\n age_group_18_25 = 25\n age_group_26_35 = 35\n age_group_36_50 = 50\n age_group_51_65 = 65\n\n # Create age groups with better error handling\n try:\n df[\"age_group\"] = pd.cut(\n df[\"age\"],\n bins=[\n 0,\n age_group_18_25,\n age_group_26_35,\n age_group_36_50,\n age_group_51_65,\n 100,\n ],\n labels=[\n \"18-25\",\n \"26-35\",\n \"36-50\",\n \"51-65\",\n \"65+\",\n ],\n )\n except (ValueError, TypeError) as e:\n self.log(f\"Error creating age groups with pd.cut: {e!s}, using simple categorization\")\n df[\"age_group\"] = df[\"age\"].apply(\n lambda x: \"18-25\"\n if x <= age_group_18_25\n else \"26-35\"\n if x <= age_group_26_35\n else \"36-50\"\n if x <= age_group_36_50\n else \"51-65\"\n if x <= age_group_51_65\n else \"65+\"\n )\n\n self.log(f\"Successfully generated DataFrame with shape: {df.shape}, columns: {list(df.columns)}\")\n # CRITICAL: Use DataFrame wrapper from Langflow\n # DO NOT set self.status when returning DataFrames - it interferes with display\n return DataFrame(df)\n\n except (ValueError, TypeError) as e:\n error_msg = f\"Error generating DataFrame: {e!s}\"\n self.log(error_msg)\n # DO NOT set self.status when returning DataFrames - it interferes with display\n # Return a fallback DataFrame with error info using Langflow wrapper\n try:\n error_df = pd.DataFrame(\n {\n \"error\": [error_msg],\n \"timestamp\": [datetime.now(tz=timezone.utc).isoformat()],\n \"attempted_records\": [record_count],\n }\n )\n return DataFrame(error_df)\n except (ValueError, TypeError) as fallback_error:\n # Last resort: return simple error DataFrame\n self.log(f\"Fallback also failed: {fallback_error!s}\")\n simple_error_df = pd.DataFrame({\"error\": [error_msg]})\n return DataFrame(simple_error_df)\n"}},"tool_mode":false},"NewsSearch":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Searches Google News via RSS. Returns clean article data.","display_name":"News Search","documentation":"https://docs.langflow.org/components-data#news-search","edited":false,"field_order":["query","hl","gl","ceid","topic","location","timeout"],"frozen":false,"icon":"newspaper","legacy":true,"metadata":{"code_hash":"acdef6d4ecde","dependencies":{"dependencies":[{"name":"pandas","version":"2.2.3"},{"name":"requests","version":"2.32.5"},{"name":"bs4","version":"4.12.3"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.data_source.news_search.NewsSearchComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"News Articles","group_outputs":false,"method":"search_news","name":"articles","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":[],"template":{"_type":"Component","ceid":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Country:Language (ceid)","dynamic":false,"info":"e.g. US:en, FR:fr. Default: US:en.","input_types":[],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"ceid","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"US:en"},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from urllib.parse import quote_plus\n\nimport pandas as pd\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom lfx.custom import Component\nfrom lfx.io import IntInput, MessageTextInput, Output\nfrom lfx.schema import DataFrame\n\n\nclass NewsSearchComponent(Component):\n display_name = \"News Search\"\n description = \"Searches Google News via RSS. Returns clean article data.\"\n documentation: str = \"https://docs.langflow.org/components-data#news-search\"\n icon = \"newspaper\"\n name = \"NewsSearch\"\n legacy = True\n replacement = \"data.WebSearch\"\n\n inputs = [\n MessageTextInput(\n name=\"query\",\n display_name=\"Search Query\",\n info=\"Search keywords for news articles.\",\n tool_mode=True,\n required=True,\n ),\n MessageTextInput(\n name=\"hl\",\n display_name=\"Language (hl)\",\n info=\"Language code, e.g. en-US, fr, de. Default: en-US.\",\n tool_mode=False,\n input_types=[],\n required=False,\n advanced=True,\n ),\n MessageTextInput(\n name=\"gl\",\n display_name=\"Country (gl)\",\n info=\"Country code, e.g. US, FR, DE. Default: US.\",\n tool_mode=False,\n input_types=[],\n required=False,\n advanced=True,\n ),\n MessageTextInput(\n name=\"ceid\",\n display_name=\"Country:Language (ceid)\",\n info=\"e.g. US:en, FR:fr. Default: US:en.\",\n tool_mode=False,\n value=\"US:en\",\n input_types=[],\n required=False,\n advanced=True,\n ),\n MessageTextInput(\n name=\"topic\",\n display_name=\"Topic\",\n info=\"One of: WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SCIENCE, SPORTS, HEALTH.\",\n tool_mode=False,\n input_types=[],\n required=False,\n advanced=True,\n ),\n MessageTextInput(\n name=\"location\",\n display_name=\"Location (Geo)\",\n info=\"City, state, or country for location-based news. Leave blank for keyword search.\",\n tool_mode=False,\n input_types=[],\n required=False,\n advanced=True,\n ),\n IntInput(\n name=\"timeout\",\n display_name=\"Timeout\",\n info=\"Timeout for the request in seconds.\",\n value=5,\n required=False,\n advanced=True,\n ),\n ]\n\n outputs = [Output(name=\"articles\", display_name=\"News Articles\", method=\"search_news\")]\n\n def search_news(self) -> DataFrame:\n # Defaults\n hl = getattr(self, \"hl\", None) or \"en-US\"\n gl = getattr(self, \"gl\", None) or \"US\"\n ceid = getattr(self, \"ceid\", None) or f\"{gl}:{hl.split('-')[0]}\"\n topic = getattr(self, \"topic\", None)\n location = getattr(self, \"location\", None)\n query = getattr(self, \"query\", None)\n\n # Build base URL\n if topic:\n # Topic-based feed\n base_url = f\"https://news.google.com/rss/headlines/section/topic/{quote_plus(topic.upper())}\"\n params = f\"?hl={hl}&gl={gl}&ceid={ceid}\"\n rss_url = base_url + params\n elif location:\n # Location-based feed\n base_url = f\"https://news.google.com/rss/headlines/section/geo/{quote_plus(location)}\"\n params = f\"?hl={hl}&gl={gl}&ceid={ceid}\"\n rss_url = base_url + params\n elif query:\n # Keyword search feed\n base_url = \"https://news.google.com/rss/search?q=\"\n query_parts = [query]\n query_encoded = quote_plus(\" \".join(query_parts))\n params = f\"&hl={hl}&gl={gl}&ceid={ceid}\"\n rss_url = f\"{base_url}{query_encoded}{params}\"\n else:\n self.status = \"No search query, topic, or location provided.\"\n self.log(self.status)\n return DataFrame(\n pd.DataFrame(\n [\n {\n \"title\": \"Error\",\n \"link\": \"\",\n \"published\": \"\",\n \"summary\": \"No search query, topic, or location provided.\",\n }\n ]\n )\n )\n\n try:\n response = requests.get(rss_url, timeout=self.timeout)\n response.raise_for_status()\n soup = BeautifulSoup(response.content, \"xml\")\n items = soup.find_all(\"item\")\n except requests.RequestException as e:\n self.status = f\"Failed to fetch news: {e}\"\n self.log(self.status)\n return DataFrame(pd.DataFrame([{\"title\": \"Error\", \"link\": \"\", \"published\": \"\", \"summary\": str(e)}]))\n except (AttributeError, ValueError, TypeError) as e:\n self.status = f\"Unexpected error: {e!s}\"\n self.log(self.status)\n return DataFrame(pd.DataFrame([{\"title\": \"Error\", \"link\": \"\", \"published\": \"\", \"summary\": str(e)}]))\n\n if not items:\n self.status = \"No news articles found.\"\n self.log(self.status)\n return DataFrame(pd.DataFrame([{\"title\": \"No articles found\", \"link\": \"\", \"published\": \"\", \"summary\": \"\"}]))\n\n articles = []\n for item in items:\n try:\n title = self.clean_html(item.title.text if item.title else \"\")\n link = item.link.text if item.link else \"\"\n published = item.pubDate.text if item.pubDate else \"\"\n summary = self.clean_html(item.description.text if item.description else \"\")\n articles.append({\"title\": title, \"link\": link, \"published\": published, \"summary\": summary})\n except (AttributeError, ValueError, TypeError) as e:\n self.log(f\"Error parsing article: {e!s}\")\n continue\n\n df_articles = pd.DataFrame(articles)\n self.log(f\"Found {len(df_articles)} articles.\")\n return DataFrame(df_articles)\n\n def clean_html(self, html_string: str) -> str:\n return BeautifulSoup(html_string, \"html.parser\").get_text(separator=\" \", strip=True)\n"},"gl":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Country (gl)","dynamic":false,"info":"Country code, e.g. US, FR, DE. Default: US.","input_types":[],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"gl","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"hl":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Language (hl)","dynamic":false,"info":"Language code, e.g. en-US, fr, de. Default: en-US.","input_types":[],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"hl","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"location":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Location (Geo)","dynamic":false,"info":"City, state, or country for location-based news. Leave blank for keyword search.","input_types":[],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"location","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"query":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Search keywords for news articles.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"query","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"timeout":{"_input_type":"IntInput","advanced":true,"display_name":"Timeout","dynamic":false,"info":"Timeout for the request in seconds.","list":false,"list_add_label":"Add More","name":"timeout","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":5},"topic":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Topic","dynamic":false,"info":"One of: WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SCIENCE, SPORTS, HEALTH.","input_types":[],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"topic","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"RSSReaderSimple":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Fetches and parses an RSS feed.","display_name":"RSS Reader","documentation":"https://docs.langflow.org/components-data#rss-reader","edited":false,"field_order":["rss_url","timeout"],"frozen":false,"icon":"rss","legacy":true,"metadata":{"code_hash":"27df3344d19b","dependencies":{"dependencies":[{"name":"pandas","version":"2.2.3"},{"name":"requests","version":"2.32.5"},{"name":"bs4","version":"4.12.3"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.data_source.rss.RSSReaderComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Articles","group_outputs":false,"method":"read_rss","name":"articles","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":[],"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import pandas as pd\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom lfx.custom import Component\nfrom lfx.io import IntInput, MessageTextInput, Output\nfrom lfx.log.logger import logger\nfrom lfx.schema import DataFrame\n\n\nclass RSSReaderComponent(Component):\n display_name = \"RSS Reader\"\n description = \"Fetches and parses an RSS feed.\"\n documentation: str = \"https://docs.langflow.org/components-data#rss-reader\"\n icon = \"rss\"\n name = \"RSSReaderSimple\"\n legacy = True\n replacement = \"data.WebSearch\"\n\n inputs = [\n MessageTextInput(\n name=\"rss_url\",\n display_name=\"RSS Feed URL\",\n info=\"URL of the RSS feed to parse.\",\n tool_mode=True,\n required=True,\n ),\n IntInput(\n name=\"timeout\",\n display_name=\"Timeout\",\n info=\"Timeout for the RSS feed request.\",\n value=5,\n advanced=True,\n ),\n ]\n\n outputs = [Output(name=\"articles\", display_name=\"Articles\", method=\"read_rss\")]\n\n def read_rss(self) -> DataFrame:\n try:\n response = requests.get(self.rss_url, timeout=self.timeout)\n response.raise_for_status()\n if not response.content.strip():\n msg = \"Empty response received\"\n raise ValueError(msg)\n # Check if the response is valid XML\n try:\n BeautifulSoup(response.content, \"xml\")\n except Exception as e:\n msg = f\"Invalid XML response: {e}\"\n raise ValueError(msg) from e\n soup = BeautifulSoup(response.content, \"xml\")\n items = soup.find_all(\"item\")\n except (requests.RequestException, ValueError) as e:\n self.status = f\"Failed to fetch RSS: {e}\"\n return DataFrame(pd.DataFrame([{\"title\": \"Error\", \"link\": \"\", \"published\": \"\", \"summary\": str(e)}]))\n\n articles = [\n {\n \"title\": item.title.text if item.title else \"\",\n \"link\": item.link.text if item.link else \"\",\n \"published\": item.pubDate.text if item.pubDate else \"\",\n \"summary\": item.description.text if item.description else \"\",\n }\n for item in items\n ]\n\n # Ensure the DataFrame has the correct columns even if empty\n df_articles = pd.DataFrame(articles, columns=[\"title\", \"link\", \"published\", \"summary\"])\n logger.info(f\"Fetched {len(df_articles)} articles.\")\n return DataFrame(df_articles)\n"},"rss_url":{"_input_type":"MessageTextInput","advanced":false,"display_name":"RSS Feed URL","dynamic":false,"info":"URL of the RSS feed to parse.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"rss_url","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"timeout":{"_input_type":"IntInput","advanced":true,"display_name":"Timeout","dynamic":false,"info":"Timeout for the RSS feed request.","list":false,"list_add_label":"Add More","name":"timeout","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":5}},"tool_mode":false},"URLComponent":{"base_classes":["DataFrame","Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Fetch content from one or more web pages, following links recursively.","display_name":"URL","documentation":"https://docs.langflow.org/components-data#url","edited":false,"field_order":["urls","max_depth","prevent_outside","use_async","format","timeout","headers","filter_text_html","continue_on_failure","check_response_status","autoset_encoding"],"frozen":false,"icon":"layout-template","legacy":false,"metadata":{"code_hash":"cdb7d379306e","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"bs4","version":"4.12.3"},{"name":"langchain_community","version":"0.3.21"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.data_source.url.URLComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Extracted Pages","group_outputs":false,"method":"fetch_content","name":"page_results","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Raw Content","group_outputs":false,"method":"fetch_content_as_message","name":"raw_results","selected":"Message","tool_mode":false,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","autoset_encoding":{"_input_type":"BoolInput","advanced":true,"display_name":"Autoset Encoding","dynamic":false,"info":"If enabled, automatically sets the encoding of the request.","list":false,"list_add_label":"Add More","name":"autoset_encoding","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"check_response_status":{"_input_type":"BoolInput","advanced":true,"display_name":"Check Response Status","dynamic":false,"info":"If enabled, checks the response status of the request.","list":false,"list_add_label":"Add More","name":"check_response_status","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import importlib\nimport re\n\nimport requests\nfrom bs4 import BeautifulSoup\nfrom langchain_community.document_loaders import RecursiveUrlLoader\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.field_typing.range_spec import RangeSpec\nfrom lfx.helpers.data import safe_convert\nfrom lfx.io import BoolInput, DropdownInput, IntInput, MessageTextInput, Output, SliderInput, TableInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.dataframe import DataFrame\nfrom lfx.schema.message import Message\nfrom lfx.utils.request_utils import get_user_agent\n\n# Constants\nDEFAULT_TIMEOUT = 30\nDEFAULT_MAX_DEPTH = 1\nDEFAULT_FORMAT = \"Text\"\n\n\nURL_REGEX = re.compile(\n r\"^(https?:\\/\\/)?\" r\"(www\\.)?\" r\"([a-zA-Z0-9.-]+)\" r\"(\\.[a-zA-Z]{2,})?\" r\"(:\\d+)?\" r\"(\\/[^\\s]*)?$\",\n re.IGNORECASE,\n)\n\nUSER_AGENT = None\n# Check if langflow is installed using importlib.util.find_spec(name))\nif importlib.util.find_spec(\"langflow\"):\n langflow_installed = True\n USER_AGENT = get_user_agent()\nelse:\n langflow_installed = False\n USER_AGENT = \"lfx\"\n\n\nclass URLComponent(Component):\n \"\"\"A component that loads and parses content from web pages recursively.\n\n This component allows fetching content from one or more URLs, with options to:\n - Control crawl depth\n - Prevent crawling outside the root domain\n - Use async loading for better performance\n - Extract either raw HTML or clean text\n - Configure request headers and timeouts\n \"\"\"\n\n display_name = \"URL\"\n description = \"Fetch content from one or more web pages, following links recursively.\"\n documentation: str = \"https://docs.langflow.org/components-data#url\"\n icon = \"layout-template\"\n name = \"URLComponent\"\n\n inputs = [\n MessageTextInput(\n name=\"urls\",\n display_name=\"URLs\",\n info=\"Enter one or more URLs to crawl recursively, by clicking the '+' button.\",\n is_list=True,\n tool_mode=True,\n placeholder=\"Enter a URL...\",\n list_add_label=\"Add URL\",\n input_types=[],\n ),\n SliderInput(\n name=\"max_depth\",\n display_name=\"Depth\",\n info=(\n \"Controls how many 'clicks' away from the initial page the crawler will go:\\n\"\n \"- depth 1: only the initial page\\n\"\n \"- depth 2: initial page + all pages linked directly from it\\n\"\n \"- depth 3: initial page + direct links + links found on those direct link pages\\n\"\n \"Note: This is about link traversal, not URL path depth.\"\n ),\n value=DEFAULT_MAX_DEPTH,\n range_spec=RangeSpec(min=1, max=5, step=1),\n required=False,\n min_label=\" \",\n max_label=\" \",\n min_label_icon=\"None\",\n max_label_icon=\"None\",\n # slider_input=True\n ),\n BoolInput(\n name=\"prevent_outside\",\n display_name=\"Prevent Outside\",\n info=(\n \"If enabled, only crawls URLs within the same domain as the root URL. \"\n \"This helps prevent the crawler from going to external websites.\"\n ),\n value=True,\n required=False,\n advanced=True,\n ),\n BoolInput(\n name=\"use_async\",\n display_name=\"Use Async\",\n info=(\n \"If enabled, uses asynchronous loading which can be significantly faster \"\n \"but might use more system resources.\"\n ),\n value=True,\n required=False,\n advanced=True,\n ),\n DropdownInput(\n name=\"format\",\n display_name=\"Output Format\",\n info=\"Output Format. Use 'Text' to extract the text from the HTML or 'HTML' for the raw HTML content.\",\n options=[\"Text\", \"HTML\"],\n value=DEFAULT_FORMAT,\n advanced=True,\n ),\n IntInput(\n name=\"timeout\",\n display_name=\"Timeout\",\n info=\"Timeout for the request in seconds.\",\n value=DEFAULT_TIMEOUT,\n required=False,\n advanced=True,\n ),\n TableInput(\n name=\"headers\",\n display_name=\"Headers\",\n info=\"The headers to send with the request\",\n table_schema=[\n {\n \"name\": \"key\",\n \"display_name\": \"Header\",\n \"type\": \"str\",\n \"description\": \"Header name\",\n },\n {\n \"name\": \"value\",\n \"display_name\": \"Value\",\n \"type\": \"str\",\n \"description\": \"Header value\",\n },\n ],\n value=[{\"key\": \"User-Agent\", \"value\": USER_AGENT}],\n advanced=True,\n input_types=[\"DataFrame\"],\n ),\n BoolInput(\n name=\"filter_text_html\",\n display_name=\"Filter Text/HTML\",\n info=\"If enabled, filters out text/css content type from the results.\",\n value=True,\n required=False,\n advanced=True,\n ),\n BoolInput(\n name=\"continue_on_failure\",\n display_name=\"Continue on Failure\",\n info=\"If enabled, continues crawling even if some requests fail.\",\n value=True,\n required=False,\n advanced=True,\n ),\n BoolInput(\n name=\"check_response_status\",\n display_name=\"Check Response Status\",\n info=\"If enabled, checks the response status of the request.\",\n value=False,\n required=False,\n advanced=True,\n ),\n BoolInput(\n name=\"autoset_encoding\",\n display_name=\"Autoset Encoding\",\n info=\"If enabled, automatically sets the encoding of the request.\",\n value=True,\n required=False,\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Extracted Pages\", name=\"page_results\", method=\"fetch_content\"),\n Output(display_name=\"Raw Content\", name=\"raw_results\", method=\"fetch_content_as_message\", tool_mode=False),\n ]\n\n @staticmethod\n def validate_url(url: str) -> bool:\n \"\"\"Validates if the given string matches URL pattern.\n\n Args:\n url: The URL string to validate\n\n Returns:\n bool: True if the URL is valid, False otherwise\n \"\"\"\n return bool(URL_REGEX.match(url))\n\n def ensure_url(self, url: str) -> str:\n \"\"\"Ensures the given string is a valid URL.\n\n Args:\n url: The URL string to validate and normalize\n\n Returns:\n str: The normalized URL\n\n Raises:\n ValueError: If the URL is invalid\n \"\"\"\n url = url.strip()\n if not url.startswith((\"http://\", \"https://\")):\n url = \"https://\" + url\n\n if not self.validate_url(url):\n msg = f\"Invalid URL: {url}\"\n raise ValueError(msg)\n\n return url\n\n def _create_loader(self, url: str) -> RecursiveUrlLoader:\n \"\"\"Creates a RecursiveUrlLoader instance with the configured settings.\n\n Args:\n url: The URL to load\n\n Returns:\n RecursiveUrlLoader: Configured loader instance\n \"\"\"\n headers_dict = {header[\"key\"]: header[\"value\"] for header in self.headers if header[\"value\"] is not None}\n extractor = (lambda x: x) if self.format == \"HTML\" else (lambda x: BeautifulSoup(x, \"lxml\").get_text())\n\n return RecursiveUrlLoader(\n url=url,\n max_depth=self.max_depth,\n prevent_outside=self.prevent_outside,\n use_async=self.use_async,\n extractor=extractor,\n timeout=self.timeout,\n headers=headers_dict,\n check_response_status=self.check_response_status,\n continue_on_failure=self.continue_on_failure,\n base_url=url, # Add base_url to ensure consistent domain crawling\n autoset_encoding=self.autoset_encoding, # Enable automatic encoding detection\n exclude_dirs=[], # Allow customization of excluded directories\n link_regex=None, # Allow customization of link filtering\n )\n\n def fetch_url_contents(self) -> list[dict]:\n \"\"\"Load documents from the configured URLs.\n\n Returns:\n List[Data]: List of Data objects containing the fetched content\n\n Raises:\n ValueError: If no valid URLs are provided or if there's an error loading documents\n \"\"\"\n try:\n urls = list({self.ensure_url(url) for url in self.urls if url.strip()})\n logger.debug(f\"URLs: {urls}\")\n if not urls:\n msg = \"No valid URLs provided.\"\n raise ValueError(msg)\n\n all_docs = []\n for url in urls:\n logger.debug(f\"Loading documents from {url}\")\n\n try:\n loader = self._create_loader(url)\n docs = loader.load()\n\n if not docs:\n logger.warning(f\"No documents found for {url}\")\n continue\n\n logger.debug(f\"Found {len(docs)} documents from {url}\")\n all_docs.extend(docs)\n\n except requests.exceptions.RequestException as e:\n logger.exception(f\"Error loading documents from {url}: {e}\")\n continue\n\n if not all_docs:\n msg = \"No documents were successfully loaded from any URL\"\n raise ValueError(msg)\n\n # data = [Data(text=doc.page_content, **doc.metadata) for doc in all_docs]\n data = [\n {\n \"text\": safe_convert(doc.page_content, clean_data=True),\n \"url\": doc.metadata.get(\"source\", \"\"),\n \"title\": doc.metadata.get(\"title\", \"\"),\n \"description\": doc.metadata.get(\"description\", \"\"),\n \"content_type\": doc.metadata.get(\"content_type\", \"\"),\n \"language\": doc.metadata.get(\"language\", \"\"),\n }\n for doc in all_docs\n ]\n except Exception as e:\n error_msg = e.message if hasattr(e, \"message\") else e\n msg = f\"Error loading documents: {error_msg!s}\"\n logger.exception(msg)\n raise ValueError(msg) from e\n return data\n\n def fetch_content(self) -> DataFrame:\n \"\"\"Convert the documents to a DataFrame.\"\"\"\n return DataFrame(data=self.fetch_url_contents())\n\n def fetch_content_as_message(self) -> Message:\n \"\"\"Convert the documents to a Message.\"\"\"\n url_contents = self.fetch_url_contents()\n return Message(text=\"\\n\\n\".join([x[\"text\"] for x in url_contents]), data={\"data\": url_contents})\n"},"continue_on_failure":{"_input_type":"BoolInput","advanced":true,"display_name":"Continue on Failure","dynamic":false,"info":"If enabled, continues crawling even if some requests fail.","list":false,"list_add_label":"Add More","name":"continue_on_failure","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"filter_text_html":{"_input_type":"BoolInput","advanced":true,"display_name":"Filter Text/HTML","dynamic":false,"info":"If enabled, filters out text/css content type from the results.","list":false,"list_add_label":"Add More","name":"filter_text_html","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"format":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Output Format","dynamic":false,"external_options":{},"info":"Output Format. Use 'Text' to extract the text from the HTML or 'HTML' for the raw HTML content.","name":"format","options":["Text","HTML"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Text"},"headers":{"_input_type":"TableInput","advanced":true,"display_name":"Headers","dynamic":false,"info":"The headers to send with the request","input_types":["DataFrame"],"is_list":true,"list_add_label":"Add More","name":"headers","placeholder":"","required":false,"show":true,"table_icon":"Table","table_schema":[{"description":"Header name","display_name":"Header","name":"key","type":"str"},{"description":"Header value","display_name":"Value","name":"value","type":"str"}],"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"trigger_icon":"Table","trigger_text":"Open table","type":"table","value":[{"key":"User-Agent","value":null}]},"max_depth":{"_input_type":"SliderInput","advanced":false,"display_name":"Depth","dynamic":false,"info":"Controls how many 'clicks' away from the initial page the crawler will go:\n- depth 1: only the initial page\n- depth 2: initial page + all pages linked directly from it\n- depth 3: initial page + direct links + links found on those direct link pages\nNote: This is about link traversal, not URL path depth.","max_label":" ","max_label_icon":"None","min_label":" ","min_label_icon":"None","name":"max_depth","placeholder":"","range_spec":{"max":5.0,"min":1.0,"step":1.0,"step_type":"float"},"required":false,"show":true,"slider_buttons":false,"slider_buttons_options":[],"slider_input":false,"title_case":false,"tool_mode":false,"track_in_telemetry":false,"type":"slider","value":1},"prevent_outside":{"_input_type":"BoolInput","advanced":true,"display_name":"Prevent Outside","dynamic":false,"info":"If enabled, only crawls URLs within the same domain as the root URL. This helps prevent the crawler from going to external websites.","list":false,"list_add_label":"Add More","name":"prevent_outside","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"timeout":{"_input_type":"IntInput","advanced":true,"display_name":"Timeout","dynamic":false,"info":"Timeout for the request in seconds.","list":false,"list_add_label":"Add More","name":"timeout","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":30},"urls":{"_input_type":"MessageTextInput","advanced":false,"display_name":"URLs","dynamic":false,"info":"Enter one or more URLs to crawl recursively, by clicking the '+' button.","input_types":[],"list":true,"list_add_label":"Add URL","load_from_db":false,"name":"urls","placeholder":"Enter a URL...","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"use_async":{"_input_type":"BoolInput","advanced":true,"display_name":"Use Async","dynamic":false,"info":"If enabled, uses asynchronous loading which can be significantly faster but might use more system resources.","list":false,"list_add_label":"Add More","name":"use_async","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true}},"tool_mode":false},"UnifiedWebSearch":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Search the web, news, or RSS feeds.","display_name":"Web Search","documentation":"https://docs.langflow.org/components-data#web-search","edited":false,"field_order":["search_mode","query","hl","gl","ceid","topic","location","timeout"],"frozen":false,"icon":"search","legacy":false,"metadata":{"code_hash":"e3c482a7ed88","dependencies":{"dependencies":[{"name":"pandas","version":"2.2.3"},{"name":"requests","version":"2.32.5"},{"name":"bs4","version":"4.12.3"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.data_source.web_search.WebSearchComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Results","group_outputs":false,"method":"perform_search","name":"results","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","ceid":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Country:Language (ceid)","dynamic":false,"info":"e.g. US:en, FR:fr. Default: US:en.","input_types":[],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"ceid","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"US:en"},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"\"\"\"Unified Web Search Component.\n\nThis component consolidates Web Search, News Search, and RSS Reader into a single\ncomponent with tabs for different search modes.\n\"\"\"\n\nimport re\nfrom typing import Any\nfrom urllib.parse import parse_qs, quote_plus, unquote, urlparse\n\nimport pandas as pd\nimport requests\nfrom bs4 import BeautifulSoup\n\nfrom lfx.custom import Component\nfrom lfx.io import IntInput, MessageTextInput, Output, TabInput\nfrom lfx.schema import DataFrame\nfrom lfx.utils.request_utils import get_user_agent\n\n\nclass WebSearchComponent(Component):\n display_name = \"Web Search\"\n description = \"Search the web, news, or RSS feeds.\"\n documentation: str = \"https://docs.langflow.org/components-data#web-search\"\n icon = \"search\"\n name = \"UnifiedWebSearch\"\n\n inputs = [\n TabInput(\n name=\"search_mode\",\n display_name=\"Search Mode\",\n options=[\"Web\", \"News\", \"RSS\"],\n info=\"Choose search mode: Web (DuckDuckGo), News (Google News), or RSS (Feed Reader)\",\n value=\"Web\",\n real_time_refresh=True,\n tool_mode=True,\n ),\n MessageTextInput(\n name=\"query\",\n display_name=\"Search Query\",\n info=\"Search keywords for news articles.\",\n tool_mode=True,\n required=True,\n ),\n MessageTextInput(\n name=\"hl\",\n display_name=\"Language (hl)\",\n info=\"Language code, e.g. en-US, fr, de. Default: en-US.\",\n tool_mode=False,\n input_types=[],\n required=False,\n advanced=True,\n ),\n MessageTextInput(\n name=\"gl\",\n display_name=\"Country (gl)\",\n info=\"Country code, e.g. US, FR, DE. Default: US.\",\n tool_mode=False,\n input_types=[],\n required=False,\n advanced=True,\n ),\n MessageTextInput(\n name=\"ceid\",\n display_name=\"Country:Language (ceid)\",\n info=\"e.g. US:en, FR:fr. Default: US:en.\",\n tool_mode=False,\n value=\"US:en\",\n input_types=[],\n required=False,\n advanced=True,\n ),\n MessageTextInput(\n name=\"topic\",\n display_name=\"Topic\",\n info=\"One of: WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SCIENCE, SPORTS, HEALTH.\",\n tool_mode=False,\n input_types=[],\n required=False,\n advanced=True,\n ),\n MessageTextInput(\n name=\"location\",\n display_name=\"Location (Geo)\",\n info=\"City, state, or country for location-based news. Leave blank for keyword search.\",\n tool_mode=False,\n input_types=[],\n required=False,\n advanced=True,\n ),\n IntInput(\n name=\"timeout\",\n display_name=\"Timeout\",\n info=\"Timeout for the request in seconds.\",\n value=5,\n required=False,\n advanced=True,\n ),\n ]\n\n outputs = [Output(name=\"results\", display_name=\"Results\", method=\"perform_search\")]\n\n def __init__(self, **kwargs):\n super().__init__(**kwargs)\n\n def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:\n \"\"\"Update input visibility based on search mode.\"\"\"\n if field_name == \"search_mode\":\n # Show/hide inputs based on search mode\n is_news = field_value == \"News\"\n is_rss = field_value == \"RSS\"\n\n # Update query field info based on mode\n if is_rss:\n build_config[\"query\"][\"info\"] = \"RSS feed URL to parse\"\n build_config[\"query\"][\"display_name\"] = \"RSS Feed URL\"\n elif is_news:\n build_config[\"query\"][\"info\"] = \"Search keywords for news articles.\"\n build_config[\"query\"][\"display_name\"] = \"Search Query\"\n else: # Web\n build_config[\"query\"][\"info\"] = \"Keywords to search for\"\n build_config[\"query\"][\"display_name\"] = \"Search Query\"\n\n # Keep news-specific fields as advanced (matching original News Search component)\n # They remain advanced=True in all modes, just like in the original component\n\n return build_config\n\n def validate_url(self, string: str) -> bool:\n \"\"\"Validate URL format.\"\"\"\n url_regex = re.compile(\n r\"^(https?:\\/\\/)?\" r\"(www\\.)?\" r\"([a-zA-Z0-9.-]+)\" r\"(\\.[a-zA-Z]{2,})?\" r\"(:\\d+)?\" r\"(\\/[^\\s]*)?$\",\n re.IGNORECASE,\n )\n return bool(url_regex.match(string))\n\n def ensure_url(self, url: str) -> str:\n \"\"\"Ensure URL has proper protocol.\"\"\"\n if not url.startswith((\"http://\", \"https://\")):\n url = \"https://\" + url\n if not self.validate_url(url):\n msg = f\"Invalid URL: {url}\"\n raise ValueError(msg)\n return url\n\n def _sanitize_query(self, query: str) -> str:\n \"\"\"Sanitize search query.\"\"\"\n return re.sub(r'[<>\"\\']', \"\", query.strip())\n\n def clean_html(self, html_string: str) -> str:\n \"\"\"Remove HTML tags from text.\"\"\"\n return BeautifulSoup(html_string, \"html.parser\").get_text(separator=\" \", strip=True)\n\n def perform_web_search(self) -> DataFrame:\n \"\"\"Perform DuckDuckGo web search.\"\"\"\n query = self._sanitize_query(self.query)\n if not query:\n msg = \"Empty search query\"\n raise ValueError(msg)\n\n headers = {\"User-Agent\": get_user_agent()}\n params = {\"q\": query, \"kl\": \"us-en\"}\n url = \"https://html.duckduckgo.com/html/\"\n\n try:\n response = requests.get(url, params=params, headers=headers, timeout=self.timeout)\n response.raise_for_status()\n except requests.RequestException as e:\n self.status = f\"Failed request: {e!s}\"\n return DataFrame(pd.DataFrame([{\"title\": \"Error\", \"link\": \"\", \"snippet\": str(e), \"content\": \"\"}]))\n\n if not response.text or \"text/html\" not in response.headers.get(\"content-type\", \"\").lower():\n self.status = \"No results found\"\n return DataFrame(\n pd.DataFrame([{\"title\": \"Error\", \"link\": \"\", \"snippet\": \"No results found\", \"content\": \"\"}])\n )\n\n soup = BeautifulSoup(response.text, \"html.parser\")\n results = []\n\n for result in soup.select(\"div.result\"):\n title_tag = result.select_one(\"a.result__a\")\n snippet_tag = result.select_one(\"a.result__snippet\")\n if title_tag:\n raw_link = title_tag.get(\"href\", \"\")\n parsed = urlparse(raw_link)\n uddg = parse_qs(parsed.query).get(\"uddg\", [\"\"])[0]\n decoded_link = unquote(uddg) if uddg else raw_link\n\n try:\n final_url = self.ensure_url(decoded_link)\n page = requests.get(final_url, headers=headers, timeout=self.timeout)\n page.raise_for_status()\n content = BeautifulSoup(page.text, \"lxml\").get_text(separator=\" \", strip=True)\n except requests.RequestException as e:\n final_url = decoded_link\n content = f\"(Failed to fetch: {e!s}\"\n\n results.append(\n {\n \"title\": title_tag.get_text(strip=True),\n \"link\": final_url,\n \"snippet\": snippet_tag.get_text(strip=True) if snippet_tag else \"\",\n \"content\": content,\n }\n )\n\n return DataFrame(pd.DataFrame(results))\n\n def perform_news_search(self) -> DataFrame:\n \"\"\"Perform Google News search.\"\"\"\n query = getattr(self, \"query\", \"\")\n hl = getattr(self, \"hl\", \"en-US\") or \"en-US\"\n gl = getattr(self, \"gl\", \"US\") or \"US\"\n topic = getattr(self, \"topic\", None)\n location = getattr(self, \"location\", None)\n\n ceid = f\"{gl}:{hl.split('-')[0]}\"\n\n # Build RSS URL based on parameters\n if topic:\n # Topic-based feed\n base_url = f\"https://news.google.com/rss/headlines/section/topic/{quote_plus(topic.upper())}\"\n params = f\"?hl={hl}&gl={gl}&ceid={ceid}\"\n rss_url = base_url + params\n elif location:\n # Location-based feed\n base_url = f\"https://news.google.com/rss/headlines/section/geo/{quote_plus(location)}\"\n params = f\"?hl={hl}&gl={gl}&ceid={ceid}\"\n rss_url = base_url + params\n elif query:\n # Keyword search feed\n base_url = \"https://news.google.com/rss/search?q=\"\n query_encoded = quote_plus(query)\n params = f\"&hl={hl}&gl={gl}&ceid={ceid}\"\n rss_url = f\"{base_url}{query_encoded}{params}\"\n else:\n self.status = \"No search query, topic, or location provided.\"\n return DataFrame(\n pd.DataFrame(\n [{\"title\": \"Error\", \"link\": \"\", \"published\": \"\", \"summary\": \"No search parameters provided\"}]\n )\n )\n\n try:\n response = requests.get(rss_url, timeout=self.timeout)\n response.raise_for_status()\n soup = BeautifulSoup(response.content, \"xml\")\n items = soup.find_all(\"item\")\n except requests.RequestException as e:\n self.status = f\"Failed to fetch news: {e}\"\n return DataFrame(pd.DataFrame([{\"title\": \"Error\", \"link\": \"\", \"published\": \"\", \"summary\": str(e)}]))\n\n if not items:\n self.status = \"No news articles found.\"\n return DataFrame(pd.DataFrame([{\"title\": \"No articles found\", \"link\": \"\", \"published\": \"\", \"summary\": \"\"}]))\n\n articles = []\n for item in items:\n try:\n title = self.clean_html(item.title.text if item.title else \"\")\n link = item.link.text if item.link else \"\"\n published = item.pubDate.text if item.pubDate else \"\"\n summary = self.clean_html(item.description.text if item.description else \"\")\n articles.append({\"title\": title, \"link\": link, \"published\": published, \"summary\": summary})\n except (AttributeError, ValueError, TypeError) as e:\n self.log(f\"Error parsing article: {e!s}\")\n continue\n\n return DataFrame(pd.DataFrame(articles))\n\n def perform_rss_read(self) -> DataFrame:\n \"\"\"Read RSS feed.\"\"\"\n rss_url = getattr(self, \"query\", \"\")\n if not rss_url:\n return DataFrame(\n pd.DataFrame([{\"title\": \"Error\", \"link\": \"\", \"published\": \"\", \"summary\": \"No RSS URL provided\"}])\n )\n\n try:\n response = requests.get(rss_url, timeout=self.timeout)\n response.raise_for_status()\n if not response.content.strip():\n msg = \"Empty response received\"\n raise ValueError(msg)\n\n # Validate XML\n try:\n BeautifulSoup(response.content, \"xml\")\n except Exception as e:\n msg = f\"Invalid XML response: {e}\"\n raise ValueError(msg) from e\n\n soup = BeautifulSoup(response.content, \"xml\")\n items = soup.find_all(\"item\")\n except (requests.RequestException, ValueError) as e:\n self.status = f\"Failed to fetch RSS: {e}\"\n return DataFrame(pd.DataFrame([{\"title\": \"Error\", \"link\": \"\", \"published\": \"\", \"summary\": str(e)}]))\n\n articles = [\n {\n \"title\": item.title.text if item.title else \"\",\n \"link\": item.link.text if item.link else \"\",\n \"published\": item.pubDate.text if item.pubDate else \"\",\n \"summary\": item.description.text if item.description else \"\",\n }\n for item in items\n ]\n\n # Ensure DataFrame has correct columns even if empty\n df_articles = pd.DataFrame(articles, columns=[\"title\", \"link\", \"published\", \"summary\"])\n self.log(f\"Fetched {len(df_articles)} articles.\")\n return DataFrame(df_articles)\n\n def perform_search(self) -> DataFrame:\n \"\"\"Main search method that routes to appropriate search function based on mode.\"\"\"\n search_mode = getattr(self, \"search_mode\", \"Web\")\n\n if search_mode == \"Web\":\n return self.perform_web_search()\n if search_mode == \"News\":\n return self.perform_news_search()\n if search_mode == \"RSS\":\n return self.perform_rss_read()\n # Fallback to web search\n return self.perform_web_search()\n"},"gl":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Country (gl)","dynamic":false,"info":"Country code, e.g. US, FR, DE. Default: US.","input_types":[],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"gl","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"hl":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Language (hl)","dynamic":false,"info":"Language code, e.g. en-US, fr, de. Default: en-US.","input_types":[],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"hl","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"location":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Location (Geo)","dynamic":false,"info":"City, state, or country for location-based news. Leave blank for keyword search.","input_types":[],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"location","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"query":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Search keywords for news articles.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"query","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"search_mode":{"_input_type":"TabInput","advanced":false,"display_name":"Search Mode","dynamic":false,"info":"Choose search mode: Web (DuckDuckGo), News (Google News), or RSS (Feed Reader)","name":"search_mode","options":["Web","News","RSS"],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_metadata":true,"track_in_telemetry":true,"type":"tab","value":"Web"},"timeout":{"_input_type":"IntInput","advanced":true,"display_name":"Timeout","dynamic":false,"info":"Timeout for the request in seconds.","list":false,"list_add_label":"Add More","name":"timeout","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":5},"topic":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Topic","dynamic":false,"info":"One of: WORLD, NATION, BUSINESS, TECHNOLOGY, ENTERTAINMENT, SCIENCE, SPORTS, HEALTH.","input_types":[],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"topic","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false}}],["datastax",{"AssistantsCreateThread":{"base_classes":["Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Creates a thread and returns the thread id","display_name":"Create Assistant Thread","documentation":"","edited":false,"field_order":["env_set"],"frozen":false,"icon":"AstraDB","legacy":true,"metadata":{"code_hash":"5d40a73accfd","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.datastax.create_thread.AssistantsCreateThread"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Thread ID","group_outputs":false,"method":"process_inputs","name":"thread_id","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.astra_assistants.util import get_patched_openai_client\nfrom lfx.custom.custom_component.component_with_cache import ComponentWithCache\nfrom lfx.inputs.inputs import MultilineInput\nfrom lfx.schema.message import Message\nfrom lfx.template.field.base import Output\n\n\nclass AssistantsCreateThread(ComponentWithCache):\n display_name = \"Create Assistant Thread\"\n description = \"Creates a thread and returns the thread id\"\n icon = \"AstraDB\"\n legacy = True\n inputs = [\n MultilineInput(\n name=\"env_set\",\n display_name=\"Environment Set\",\n info=\"Dummy input to allow chaining with Dotenv Component.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Thread ID\", name=\"thread_id\", method=\"process_inputs\"),\n ]\n\n def __init__(self, **kwargs) -> None:\n super().__init__(**kwargs)\n self.client = get_patched_openai_client(self._shared_component_cache)\n\n def process_inputs(self) -> Message:\n thread = self.client.beta.threads.create()\n thread_id = thread.id\n\n return Message(text=thread_id)\n"},"env_set":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Environment Set","dynamic":false,"info":"Dummy input to allow chaining with Dotenv Component.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"env_set","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"AssistantsGetAssistantName":{"base_classes":["Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Assistant by id","display_name":"Get Assistant name","documentation":"","edited":false,"field_order":["assistant_id","env_set"],"frozen":false,"icon":"AstraDB","legacy":true,"metadata":{"code_hash":"1f60da161fd3","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.datastax.get_assistant.AssistantsGetAssistantName"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Assistant Name","group_outputs":false,"method":"process_inputs","name":"assistant_name","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","assistant_id":{"_input_type":"StrInput","advanced":false,"display_name":"Assistant ID","dynamic":false,"info":"ID of the assistant","list":false,"list_add_label":"Add More","load_from_db":false,"name":"assistant_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.astra_assistants.util import get_patched_openai_client\nfrom lfx.custom.custom_component.component_with_cache import ComponentWithCache\nfrom lfx.inputs.inputs import MultilineInput, StrInput\nfrom lfx.schema.message import Message\nfrom lfx.template.field.base import Output\n\n\nclass AssistantsGetAssistantName(ComponentWithCache):\n display_name = \"Get Assistant name\"\n description = \"Assistant by id\"\n icon = \"AstraDB\"\n legacy = True\n inputs = [\n StrInput(\n name=\"assistant_id\",\n display_name=\"Assistant ID\",\n info=\"ID of the assistant\",\n ),\n MultilineInput(\n name=\"env_set\",\n display_name=\"Environment Set\",\n info=\"Dummy input to allow chaining with Dotenv Component.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Assistant Name\", name=\"assistant_name\", method=\"process_inputs\"),\n ]\n\n def __init__(self, **kwargs) -> None:\n super().__init__(**kwargs)\n self.client = get_patched_openai_client(self._shared_component_cache)\n\n def process_inputs(self) -> Message:\n assistant = self.client.beta.assistants.retrieve(\n assistant_id=self.assistant_id,\n )\n return Message(text=assistant.name)\n"},"env_set":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Environment Set","dynamic":false,"info":"Dummy input to allow chaining with Dotenv Component.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"env_set","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"AssistantsListAssistants":{"base_classes":["Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Returns a list of assistant id's","display_name":"List Assistants","documentation":"","edited":false,"field_order":[],"frozen":false,"icon":"AstraDB","legacy":true,"metadata":{"code_hash":"17e9c5c78a6e","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.datastax.list_assistants.AssistantsListAssistants"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Assistants","group_outputs":false,"method":"process_inputs","name":"assistants","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.astra_assistants.util import get_patched_openai_client\nfrom lfx.custom.custom_component.component_with_cache import ComponentWithCache\nfrom lfx.schema.message import Message\nfrom lfx.template.field.base import Output\n\n\nclass AssistantsListAssistants(ComponentWithCache):\n display_name = \"List Assistants\"\n description = \"Returns a list of assistant id's\"\n icon = \"AstraDB\"\n legacy = True\n outputs = [\n Output(display_name=\"Assistants\", name=\"assistants\", method=\"process_inputs\"),\n ]\n\n def __init__(self, **kwargs) -> None:\n super().__init__(**kwargs)\n self.client = get_patched_openai_client(self._shared_component_cache)\n\n def process_inputs(self) -> Message:\n assistants = self.client.beta.assistants.list().data\n id_list = [assistant.id for assistant in assistants]\n return Message(\n # get text from list\n text=\"\\n\".join(id_list)\n )\n"}},"tool_mode":false},"AssistantsRun":{"base_classes":["Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Executes an Assistant Run against a thread","display_name":"Run Assistant","documentation":"","edited":false,"field_order":["assistant_id","user_message","thread_id","env_set"],"frozen":false,"icon":"AstraDB","legacy":true,"metadata":{"code_hash":"5e219cd290d3","dependencies":{"dependencies":[{"name":"openai","version":"1.82.1"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.datastax.run.AssistantsRun"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Assistant Response","group_outputs":false,"method":"process_inputs","name":"assistant_response","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","assistant_id":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Assistant ID","dynamic":false,"info":"The ID of the assistant to run. \n\nCan be retrieved using the List Assistants component or created with the Create Assistant component.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"assistant_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from typing import Any\n\nfrom openai.lib.streaming import AssistantEventHandler\n\nfrom lfx.base.astra_assistants.util import get_patched_openai_client\nfrom lfx.custom.custom_component.component_with_cache import ComponentWithCache\nfrom lfx.inputs.inputs import MultilineInput\nfrom lfx.schema.dotdict import dotdict\nfrom lfx.schema.message import Message\nfrom lfx.template.field.base import Output\n\n\nclass AssistantsRun(ComponentWithCache):\n display_name = \"Run Assistant\"\n description = \"Executes an Assistant Run against a thread\"\n icon = \"AstraDB\"\n legacy = True\n\n def __init__(self, **kwargs) -> None:\n super().__init__(**kwargs)\n self.client = get_patched_openai_client(self._shared_component_cache)\n self.thread_id = None\n\n def update_build_config(\n self,\n build_config: dotdict,\n field_value: Any,\n field_name: str | None = None,\n ) -> None:\n if field_name == \"thread_id\":\n if field_value is None:\n thread = self.client.beta.threads.create()\n self.thread_id = thread.id\n build_config[\"thread_id\"] = field_value\n\n inputs = [\n MultilineInput(\n name=\"assistant_id\",\n display_name=\"Assistant ID\",\n info=(\n \"The ID of the assistant to run. \\n\\n\"\n \"Can be retrieved using the List Assistants component or created with the Create Assistant component.\"\n ),\n ),\n MultilineInput(\n name=\"user_message\",\n display_name=\"User Message\",\n info=\"User message to pass to the run.\",\n ),\n MultilineInput(\n name=\"thread_id\",\n display_name=\"Thread ID\",\n required=False,\n info=\"Thread ID to use with the run. If not provided, a new thread will be created.\",\n ),\n MultilineInput(\n name=\"env_set\",\n display_name=\"Environment Set\",\n info=\"Dummy input to allow chaining with Dotenv Component.\",\n ),\n ]\n\n outputs = [Output(display_name=\"Assistant Response\", name=\"assistant_response\", method=\"process_inputs\")]\n\n def process_inputs(self) -> Message:\n text = \"\"\n\n if self.thread_id is None:\n thread = self.client.beta.threads.create()\n self.thread_id = thread.id\n\n # add the user message\n self.client.beta.threads.messages.create(thread_id=self.thread_id, role=\"user\", content=self.user_message)\n\n class EventHandler(AssistantEventHandler):\n def __init__(self) -> None:\n super().__init__()\n\n def on_exception(self, exception: Exception) -> None:\n raise exception\n\n event_handler = EventHandler()\n with self.client.beta.threads.runs.create_and_stream(\n thread_id=self.thread_id,\n assistant_id=self.assistant_id,\n event_handler=event_handler,\n ) as stream:\n for part in stream.text_deltas:\n text += part\n return Message(text=text)\n"},"env_set":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Environment Set","dynamic":false,"info":"Dummy input to allow chaining with Dotenv Component.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"env_set","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"thread_id":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Thread ID","dynamic":false,"info":"Thread ID to use with the run. If not provided, a new thread will be created.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"thread_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"user_message":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"User Message","dynamic":false,"info":"User message to pass to the run.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"user_message","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"Astra Assistant Agent":{"base_classes":["Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Manages Assistant Interactions","display_name":"Astra Assistant Agent","documentation":"","edited":false,"field_order":["model_name","instructions","input_tools","user_message","file","input_thread_id","input_assistant_id","env_set"],"frozen":false,"icon":"AstraDB","legacy":true,"metadata":{"code_hash":"8d4ac1cee37a","dependencies":{"dependencies":[{"name":"astra_assistants","version":"2.2.13"},{"name":"langchain_core","version":"0.3.79"},{"name":"lfx","version":null}],"total_dependencies":3},"module":"lfx.components.datastax.astradb_assistant_manager.AstraAssistantManager"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Assistant Response","group_outputs":false,"method":"get_assistant_response","name":"assistant_response","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool output","group_outputs":false,"hidden":true,"method":"get_tool_output","name":"tool_output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Thread Id","group_outputs":false,"hidden":true,"method":"get_thread_id","name":"output_thread_id","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Assistant Id","group_outputs":false,"hidden":true,"method":"get_assistant_id","name":"output_assistant_id","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Vector Store Id","group_outputs":false,"hidden":true,"method":"get_vs_id","name":"output_vs_id","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import asyncio\nfrom asyncio import to_thread\nfrom typing import TYPE_CHECKING, Any, cast\n\nfrom astra_assistants.astra_assistants_manager import AssistantManager\nfrom langchain_core.agents import AgentFinish\n\nfrom lfx.base.agents.events import ExceptionWithMessageError, process_agent_events\nfrom lfx.base.astra_assistants.util import (\n get_patched_openai_client,\n litellm_model_names,\n sync_upload,\n wrap_base_tool_as_tool_interface,\n)\nfrom lfx.custom.custom_component.component_with_cache import ComponentWithCache\nfrom lfx.inputs.inputs import DropdownInput, FileInput, HandleInput, MultilineInput\nfrom lfx.log.logger import logger\nfrom lfx.memory import delete_message\nfrom lfx.schema.content_block import ContentBlock\nfrom lfx.schema.message import Message\nfrom lfx.template.field.base import Output\nfrom lfx.utils.constants import MESSAGE_SENDER_AI\n\nif TYPE_CHECKING:\n from lfx.schema.log import SendMessageFunctionType\n\n\nclass AstraAssistantManager(ComponentWithCache):\n display_name = \"Astra Assistant Agent\"\n name = \"Astra Assistant Agent\"\n description = \"Manages Assistant Interactions\"\n icon = \"AstraDB\"\n legacy = True\n\n inputs = [\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model\",\n advanced=False,\n options=litellm_model_names,\n value=\"gpt-4o-mini\",\n ),\n MultilineInput(\n name=\"instructions\",\n display_name=\"Agent Instructions\",\n info=\"Instructions for the assistant, think of these as the system prompt.\",\n ),\n HandleInput(\n name=\"input_tools\",\n display_name=\"Tools\",\n input_types=[\"Tool\"],\n is_list=True,\n required=False,\n info=\"These are the tools that the agent can use to help with tasks.\",\n ),\n # DropdownInput(\n # display_name=\"Tools\",\n # name=\"tool\",\n # options=tool_names,\n # ),\n MultilineInput(\n name=\"user_message\", display_name=\"User Message\", info=\"User message to pass to the run.\", tool_mode=True\n ),\n FileInput(\n name=\"file\",\n display_name=\"File(s) for retrieval\",\n list=True,\n info=\"Files to be sent with the message.\",\n required=False,\n show=True,\n file_types=[\n \"txt\",\n \"md\",\n \"mdx\",\n \"csv\",\n \"json\",\n \"yaml\",\n \"yml\",\n \"xml\",\n \"html\",\n \"htm\",\n \"pdf\",\n \"docx\",\n \"py\",\n \"sh\",\n \"sql\",\n \"js\",\n \"ts\",\n \"tsx\",\n \"jpg\",\n \"jpeg\",\n \"png\",\n \"bmp\",\n \"image\",\n \"zip\",\n \"tar\",\n \"tgz\",\n \"bz2\",\n \"gz\",\n \"c\",\n \"cpp\",\n \"cs\",\n \"css\",\n \"go\",\n \"java\",\n \"php\",\n \"rb\",\n \"tex\",\n \"doc\",\n \"docx\",\n \"ppt\",\n \"pptx\",\n \"xls\",\n \"xlsx\",\n \"jsonl\",\n ],\n ),\n MultilineInput(\n name=\"input_thread_id\",\n display_name=\"Thread ID (optional)\",\n info=\"ID of the thread\",\n advanced=True,\n ),\n MultilineInput(\n name=\"input_assistant_id\",\n display_name=\"Assistant ID (optional)\",\n info=\"ID of the assistant\",\n advanced=True,\n ),\n MultilineInput(\n name=\"env_set\",\n display_name=\"Environment Set\",\n info=\"Dummy input to allow chaining with Dotenv Component.\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Assistant Response\", name=\"assistant_response\", method=\"get_assistant_response\"),\n Output(display_name=\"Tool output\", name=\"tool_output\", method=\"get_tool_output\", hidden=True),\n Output(display_name=\"Thread Id\", name=\"output_thread_id\", method=\"get_thread_id\", hidden=True),\n Output(display_name=\"Assistant Id\", name=\"output_assistant_id\", method=\"get_assistant_id\", hidden=True),\n Output(display_name=\"Vector Store Id\", name=\"output_vs_id\", method=\"get_vs_id\", hidden=True),\n ]\n\n def __init__(self, **kwargs) -> None:\n super().__init__(**kwargs)\n self.lock = asyncio.Lock()\n self.initialized: bool = False\n self._assistant_response: Message = None # type: ignore[assignment]\n self._tool_output: Message = None # type: ignore[assignment]\n self._thread_id: Message = None # type: ignore[assignment]\n self._assistant_id: Message = None # type: ignore[assignment]\n self._vs_id: Message = None # type: ignore[assignment]\n self.client = get_patched_openai_client(self._shared_component_cache)\n self.input_tools: list[Any]\n\n async def get_assistant_response(self) -> Message:\n await self.initialize()\n self.status = self._assistant_response\n return self._assistant_response\n\n async def get_vs_id(self) -> Message:\n await self.initialize()\n self.status = self._vs_id\n return self._vs_id\n\n async def get_tool_output(self) -> Message:\n await self.initialize()\n self.status = self._tool_output\n return self._tool_output\n\n async def get_thread_id(self) -> Message:\n await self.initialize()\n self.status = self._thread_id\n return self._thread_id\n\n async def get_assistant_id(self) -> Message:\n await self.initialize()\n self.status = self._assistant_id\n return self._assistant_id\n\n async def initialize(self) -> None:\n async with self.lock:\n if not self.initialized:\n await self.process_inputs()\n self.initialized = True\n\n async def process_inputs(self) -> None:\n await logger.ainfo(f\"env_set is {self.env_set}\")\n await logger.ainfo(self.input_tools)\n tools = []\n tool_obj = None\n if self.input_tools is None:\n self.input_tools = []\n for tool in self.input_tools:\n tool_obj = wrap_base_tool_as_tool_interface(tool)\n tools.append(tool_obj)\n\n assistant_id = None\n thread_id = None\n if self.input_assistant_id:\n assistant_id = self.input_assistant_id\n if self.input_thread_id:\n thread_id = self.input_thread_id\n\n if hasattr(self, \"graph\"):\n session_id = self.graph.session_id\n elif hasattr(self, \"_session_id\"):\n session_id = self._session_id\n else:\n session_id = None\n\n agent_message = Message(\n sender=MESSAGE_SENDER_AI,\n sender_name=self.display_name or \"Astra Assistant\",\n properties={\"icon\": \"Bot\", \"state\": \"partial\"},\n content_blocks=[ContentBlock(title=\"Assistant Steps\", contents=[])],\n session_id=session_id,\n )\n\n assistant_manager = AssistantManager(\n instructions=self.instructions,\n model=self.model_name,\n name=\"managed_assistant\",\n tools=tools,\n client=self.client,\n thread_id=thread_id,\n assistant_id=assistant_id,\n )\n\n if self.file:\n file = await to_thread(sync_upload, self.file, assistant_manager.client)\n vector_store = assistant_manager.client.beta.vector_stores.create(name=\"my_vs\", file_ids=[file.id])\n assistant_tools = assistant_manager.assistant.tools\n assistant_tools += [{\"type\": \"file_search\"}]\n assistant = assistant_manager.client.beta.assistants.update(\n assistant_manager.assistant.id,\n tools=assistant_tools,\n tool_resources={\"file_search\": {\"vector_store_ids\": [vector_store.id]}},\n )\n assistant_manager.assistant = assistant\n\n async def step_iterator():\n # Initial event\n yield {\"event\": \"on_chain_start\", \"name\": \"AstraAssistant\", \"data\": {\"input\": {\"text\": self.user_message}}}\n\n content = self.user_message\n result = await assistant_manager.run_thread(content=content, tool=tool_obj)\n\n # Tool usage if present\n if \"output\" in result and \"arguments\" in result:\n yield {\"event\": \"on_tool_start\", \"name\": \"tool\", \"data\": {\"input\": {\"text\": str(result[\"arguments\"])}}}\n yield {\"event\": \"on_tool_end\", \"name\": \"tool\", \"data\": {\"output\": result[\"output\"]}}\n\n if \"file_search\" in result and result[\"file_search\"] is not None:\n yield {\"event\": \"on_tool_start\", \"name\": \"tool\", \"data\": {\"input\": {\"text\": self.user_message}}}\n file_search_str = \"\"\n for chunk in result[\"file_search\"].to_dict().get(\"chunks\", []):\n file_search_str += f\"## Chunk ID: `{chunk['chunk_id']}`\\n\"\n file_search_str += f\"**Content:**\\n\\n```\\n{chunk['content']}\\n```\\n\\n\"\n if \"score\" in chunk:\n file_search_str += f\"**Score:** {chunk['score']}\\n\\n\"\n if \"file_id\" in chunk:\n file_search_str += f\"**File ID:** `{chunk['file_id']}`\\n\\n\"\n if \"file_name\" in chunk:\n file_search_str += f\"**File Name:** `{chunk['file_name']}`\\n\\n\"\n if \"bytes\" in chunk:\n file_search_str += f\"**Bytes:** {chunk['bytes']}\\n\\n\"\n if \"search_string\" in chunk:\n file_search_str += f\"**Search String:** {chunk['search_string']}\\n\\n\"\n yield {\"event\": \"on_tool_end\", \"name\": \"tool\", \"data\": {\"output\": file_search_str}}\n\n if \"text\" not in result:\n msg = f\"No text in result, {result}\"\n raise ValueError(msg)\n\n self._assistant_response = Message(text=result[\"text\"])\n if \"decision\" in result:\n self._tool_output = Message(text=str(result[\"decision\"].is_complete))\n else:\n self._tool_output = Message(text=result[\"text\"])\n self._thread_id = Message(text=assistant_manager.thread.id)\n self._assistant_id = Message(text=assistant_manager.assistant.id)\n\n # Final event - format it like AgentFinish to match the expected format\n yield {\n \"event\": \"on_chain_end\",\n \"name\": \"AstraAssistant\",\n \"data\": {\"output\": AgentFinish(return_values={\"output\": result[\"text\"]}, log=\"\")},\n }\n\n try:\n if hasattr(self, \"send_message\"):\n processed_result = await process_agent_events(\n step_iterator(),\n agent_message,\n cast(\"SendMessageFunctionType\", self.send_message),\n )\n self.status = processed_result\n except ExceptionWithMessageError as e:\n msg_id = e.agent_message.id\n await delete_message(id_=msg_id)\n await self._send_message_event(e.agent_message, category=\"remove_message\")\n raise\n except Exception:\n raise\n"},"env_set":{"_input_type":"MultilineInput","advanced":true,"copy_field":false,"display_name":"Environment Set","dynamic":false,"info":"Dummy input to allow chaining with Dotenv Component.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"env_set","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"file":{"_input_type":"FileInput","advanced":false,"display_name":"File(s) for retrieval","dynamic":false,"fileTypes":["txt","md","mdx","csv","json","yaml","yml","xml","html","htm","pdf","docx","py","sh","sql","js","ts","tsx","jpg","jpeg","png","bmp","image","zip","tar","tgz","bz2","gz","c","cpp","cs","css","go","java","php","rb","tex","doc","docx","ppt","pptx","xls","xlsx","jsonl"],"file_path":"","info":"Files to be sent with the message.","list":true,"list_add_label":"Add More","name":"file","placeholder":"","required":false,"show":true,"temp_file":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"file","value":""},"input_assistant_id":{"_input_type":"MultilineInput","advanced":true,"copy_field":false,"display_name":"Assistant ID (optional)","dynamic":false,"info":"ID of the assistant","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"input_assistant_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"input_thread_id":{"_input_type":"MultilineInput","advanced":true,"copy_field":false,"display_name":"Thread ID (optional)","dynamic":false,"info":"ID of the thread","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"input_thread_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"input_tools":{"_input_type":"HandleInput","advanced":false,"display_name":"Tools","dynamic":false,"info":"These are the tools that the agent can use to help with tasks.","input_types":["Tool"],"list":true,"list_add_label":"Add More","name":"input_tools","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"instructions":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Agent Instructions","dynamic":false,"info":"Instructions for the assistant, think of these as the system prompt.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"instructions","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"model_name":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model","dynamic":false,"external_options":{},"info":"","name":"model_name","options":["1024-x-1024/50-steps/bedrock/amazon.nova-canvas-v1:0","1024-x-1024/50-steps/stability.stable-diffusion-xl-v1","1024-x-1024/dall-e-2","1024-x-1024/max-steps/stability.stable-diffusion-xl-v1","256-x-256/dall-e-2","512-x-512/50-steps/stability.stable-diffusion-xl-v0","512-x-512/dall-e-2","512-x-512/max-steps/stability.stable-diffusion-xl-v0","ai21.j2-mid-v1","ai21.j2-ultra-v1","ai21.jamba-1-5-large-v1:0","ai21.jamba-1-5-mini-v1:0","ai21.jamba-instruct-v1:0","aiml/dall-e-2","aiml/dall-e-3","aiml/flux-pro","aiml/flux-pro/v1.1","aiml/flux-pro/v1.1-ultra","aiml/flux-realism","aiml/flux/dev","aiml/flux/kontext-max/text-to-image","aiml/flux/kontext-pro/text-to-image","aiml/flux/schnell","amazon.nova-lite-v1:0","amazon.nova-micro-v1:0","amazon.nova-pro-v1:0","amazon.rerank-v1:0","amazon.titan-embed-image-v1","amazon.titan-embed-text-v1","amazon.titan-embed-text-v2:0","amazon.titan-image-generator-v1","amazon.titan-image-generator-v2","twelvelabs.marengo-embed-2-7-v1:0","us.twelvelabs.marengo-embed-2-7-v1:0","eu.twelvelabs.marengo-embed-2-7-v1:0","twelvelabs.pegasus-1-2-v1:0","us.twelvelabs.pegasus-1-2-v1:0","eu.twelvelabs.pegasus-1-2-v1:0","amazon.titan-text-express-v1","amazon.titan-text-lite-v1","amazon.titan-text-premier-v1:0","anthropic.claude-3-5-haiku-20241022-v1:0","anthropic.claude-haiku-4-5-20251001-v1:0","anthropic.claude-haiku-4-5@20251001","anthropic.claude-3-5-sonnet-20240620-v1:0","anthropic.claude-3-5-sonnet-20241022-v2:0","anthropic.claude-3-7-sonnet-20240620-v1:0","anthropic.claude-3-7-sonnet-20250219-v1:0","anthropic.claude-3-haiku-20240307-v1:0","anthropic.claude-3-opus-20240229-v1:0","anthropic.claude-3-sonnet-20240229-v1:0","anthropic.claude-instant-v1","anthropic.claude-opus-4-1-20250805-v1:0","anthropic.claude-opus-4-20250514-v1:0","anthropic.claude-sonnet-4-20250514-v1:0","anthropic.claude-v1","anthropic.claude-v2:1","anyscale/HuggingFaceH4/zephyr-7b-beta","anyscale/codellama/CodeLlama-34b-Instruct-hf","anyscale/codellama/CodeLlama-70b-Instruct-hf","anyscale/google/gemma-7b-it","anyscale/meta-llama/Llama-2-13b-chat-hf","anyscale/meta-llama/Llama-2-70b-chat-hf","anyscale/meta-llama/Llama-2-7b-chat-hf","anyscale/meta-llama/Meta-Llama-3-70B-Instruct","anyscale/meta-llama/Meta-Llama-3-8B-Instruct","anyscale/mistralai/Mistral-7B-Instruct-v0.1","anyscale/mistralai/Mixtral-8x22B-Instruct-v0.1","anyscale/mistralai/Mixtral-8x7B-Instruct-v0.1","apac.amazon.nova-lite-v1:0","apac.amazon.nova-micro-v1:0","apac.amazon.nova-pro-v1:0","apac.anthropic.claude-3-5-sonnet-20240620-v1:0","apac.anthropic.claude-3-5-sonnet-20241022-v2:0","apac.anthropic.claude-3-haiku-20240307-v1:0","apac.anthropic.claude-haiku-4-5-20251001-v1:0","apac.anthropic.claude-3-sonnet-20240229-v1:0","apac.anthropic.claude-sonnet-4-20250514-v1:0","assemblyai/best","assemblyai/nano","au.anthropic.claude-sonnet-4-5-20250929-v1:0","azure/ada","azure/codex-mini","azure/command-r-plus","azure/computer-use-preview","azure/container","azure/eu/gpt-4o-2024-08-06","azure/eu/gpt-4o-2024-11-20","azure/eu/gpt-4o-mini-2024-07-18","azure/eu/gpt-4o-mini-realtime-preview-2024-12-17","azure/eu/gpt-4o-realtime-preview-2024-10-01","azure/eu/gpt-4o-realtime-preview-2024-12-17","azure/eu/gpt-5-2025-08-07","azure/eu/gpt-5-mini-2025-08-07","azure/eu/gpt-5.1","azure/eu/gpt-5.1-chat","azure/eu/gpt-5.1-codex","azure/eu/gpt-5.1-codex-mini","azure/eu/gpt-5-nano-2025-08-07","azure/eu/o1-2024-12-17","azure/eu/o1-mini-2024-09-12","azure/eu/o1-preview-2024-09-12","azure/eu/o3-mini-2025-01-31","azure/global-standard/gpt-4o-2024-08-06","azure/global-standard/gpt-4o-2024-11-20","azure/global-standard/gpt-4o-mini","azure/global/gpt-4o-2024-08-06","azure/global/gpt-4o-2024-11-20","azure/global/gpt-5.1","azure/global/gpt-5.1-chat","azure/global/gpt-5.1-codex","azure/global/gpt-5.1-codex-mini","azure/gpt-3.5-turbo","azure/gpt-3.5-turbo-0125","azure/gpt-3.5-turbo-instruct-0914","azure/gpt-35-turbo","azure/gpt-35-turbo-0125","azure/gpt-35-turbo-0301","azure/gpt-35-turbo-0613","azure/gpt-35-turbo-1106","azure/gpt-35-turbo-16k","azure/gpt-35-turbo-16k-0613","azure/gpt-35-turbo-instruct","azure/gpt-35-turbo-instruct-0914","azure/gpt-4","azure/gpt-4-0125-preview","azure/gpt-4-0613","azure/gpt-4-1106-preview","azure/gpt-4-32k","azure/gpt-4-32k-0613","azure/gpt-4-turbo","azure/gpt-4-turbo-2024-04-09","azure/gpt-4-turbo-vision-preview","azure/gpt-4.1","azure/gpt-4.1-2025-04-14","azure/gpt-4.1-mini","azure/gpt-4.1-mini-2025-04-14","azure/gpt-4.1-nano","azure/gpt-4.1-nano-2025-04-14","azure/gpt-4.5-preview","azure/gpt-4o","azure/gpt-4o-2024-05-13","azure/gpt-4o-2024-08-06","azure/gpt-4o-2024-11-20","azure/gpt-audio-2025-08-28","azure/gpt-audio-mini-2025-10-06","azure/gpt-4o-audio-preview-2024-12-17","azure/gpt-4o-mini","azure/gpt-4o-mini-2024-07-18","azure/gpt-4o-mini-audio-preview-2024-12-17","azure/gpt-4o-mini-realtime-preview-2024-12-17","azure/gpt-realtime-2025-08-28","azure/gpt-realtime-mini-2025-10-06","azure/gpt-4o-mini-transcribe","azure/gpt-4o-mini-tts","azure/gpt-4o-realtime-preview-2024-10-01","azure/gpt-4o-realtime-preview-2024-12-17","azure/gpt-4o-transcribe","azure/gpt-4o-transcribe-diarize","azure/gpt-5.1-2025-11-13","azure/gpt-5.1-chat-2025-11-13","azure/gpt-5.1-codex-2025-11-13","azure/gpt-5.1-codex-mini-2025-11-13","azure/gpt-5","azure/gpt-5-2025-08-07","azure/gpt-5-chat","azure/gpt-5-chat-latest","azure/gpt-5-codex","azure/gpt-5-mini","azure/gpt-5-mini-2025-08-07","azure/gpt-5-nano","azure/gpt-5-nano-2025-08-07","azure/gpt-5-pro","azure/gpt-5.1","azure/gpt-5.1-chat","azure/gpt-5.1-codex","azure/gpt-5.1-codex-mini","azure/gpt-image-1","azure/hd/1024-x-1024/dall-e-3","azure/hd/1024-x-1792/dall-e-3","azure/hd/1792-x-1024/dall-e-3","azure/high/1024-x-1024/gpt-image-1","azure/high/1024-x-1536/gpt-image-1","azure/high/1536-x-1024/gpt-image-1","azure/low/1024-x-1024/gpt-image-1","azure/low/1024-x-1536/gpt-image-1","azure/low/1536-x-1024/gpt-image-1","azure/medium/1024-x-1024/gpt-image-1","azure/medium/1024-x-1536/gpt-image-1","azure/medium/1536-x-1024/gpt-image-1","azure/gpt-image-1-mini","azure/low/1024-x-1024/gpt-image-1-mini","azure/low/1024-x-1536/gpt-image-1-mini","azure/low/1536-x-1024/gpt-image-1-mini","azure/medium/1024-x-1024/gpt-image-1-mini","azure/medium/1024-x-1536/gpt-image-1-mini","azure/medium/1536-x-1024/gpt-image-1-mini","azure/high/1024-x-1024/gpt-image-1-mini","azure/high/1024-x-1536/gpt-image-1-mini","azure/high/1536-x-1024/gpt-image-1-mini","azure/mistral-large-2402","azure/mistral-large-latest","azure/o1","azure/o1-2024-12-17","azure/o1-mini","azure/o1-mini-2024-09-12","azure/o1-preview","azure/o1-preview-2024-09-12","azure/o3","azure/o3-2025-04-16","azure/o3-deep-research","azure/o3-mini","azure/o3-mini-2025-01-31","azure/o3-pro","azure/o3-pro-2025-06-10","azure/o4-mini","azure/o4-mini-2025-04-16","azure/standard/1024-x-1024/dall-e-2","azure/standard/1024-x-1024/dall-e-3","azure/standard/1024-x-1792/dall-e-3","azure/standard/1792-x-1024/dall-e-3","azure/text-embedding-3-large","azure/text-embedding-3-small","azure/text-embedding-ada-002","azure/speech/azure-tts","azure/speech/azure-tts-hd","azure/tts-1","azure/tts-1-hd","azure/us/gpt-4.1-2025-04-14","azure/us/gpt-4.1-mini-2025-04-14","azure/us/gpt-4.1-nano-2025-04-14","azure/us/gpt-4o-2024-08-06","azure/us/gpt-4o-2024-11-20","azure/us/gpt-4o-mini-2024-07-18","azure/us/gpt-4o-mini-realtime-preview-2024-12-17","azure/us/gpt-4o-realtime-preview-2024-10-01","azure/us/gpt-4o-realtime-preview-2024-12-17","azure/us/gpt-5-2025-08-07","azure/us/gpt-5-mini-2025-08-07","azure/us/gpt-5-nano-2025-08-07","azure/us/gpt-5.1","azure/us/gpt-5.1-chat","azure/us/gpt-5.1-codex","azure/us/gpt-5.1-codex-mini","azure/us/o1-2024-12-17","azure/us/o1-mini-2024-09-12","azure/us/o1-preview-2024-09-12","azure/us/o3-2025-04-16","azure/us/o3-mini-2025-01-31","azure/us/o4-mini-2025-04-16","azure/whisper-1","azure_ai/Cohere-embed-v3-english","azure_ai/Cohere-embed-v3-multilingual","azure_ai/FLUX-1.1-pro","azure_ai/FLUX.1-Kontext-pro","azure_ai/Llama-3.2-11B-Vision-Instruct","azure_ai/Llama-3.2-90B-Vision-Instruct","azure_ai/Llama-3.3-70B-Instruct","azure_ai/Llama-4-Maverick-17B-128E-Instruct-FP8","azure_ai/Llama-4-Scout-17B-16E-Instruct","azure_ai/Meta-Llama-3-70B-Instruct","azure_ai/Meta-Llama-3.1-405B-Instruct","azure_ai/Meta-Llama-3.1-70B-Instruct","azure_ai/Meta-Llama-3.1-8B-Instruct","azure_ai/Phi-3-medium-128k-instruct","azure_ai/Phi-3-medium-4k-instruct","azure_ai/Phi-3-mini-128k-instruct","azure_ai/Phi-3-mini-4k-instruct","azure_ai/Phi-3-small-128k-instruct","azure_ai/Phi-3-small-8k-instruct","azure_ai/Phi-3.5-MoE-instruct","azure_ai/Phi-3.5-mini-instruct","azure_ai/Phi-3.5-vision-instruct","azure_ai/Phi-4","azure_ai/Phi-4-mini-instruct","azure_ai/Phi-4-multimodal-instruct","azure_ai/Phi-4-mini-reasoning","azure_ai/Phi-4-reasoning","azure_ai/mistral-document-ai-2505","azure_ai/doc-intelligence/prebuilt-read","azure_ai/doc-intelligence/prebuilt-layout","azure_ai/doc-intelligence/prebuilt-document","azure_ai/MAI-DS-R1","azure_ai/cohere-rerank-v3-english","azure_ai/cohere-rerank-v3-multilingual","azure_ai/cohere-rerank-v3.5","azure_ai/deepseek-r1","azure_ai/deepseek-v3","azure_ai/deepseek-v3-0324","azure_ai/embed-v-4-0","azure_ai/global/grok-3","azure_ai/global/grok-3-mini","azure_ai/grok-3","azure_ai/grok-3-mini","azure_ai/grok-4","azure_ai/grok-4-fast-non-reasoning","azure_ai/grok-4-fast-reasoning","azure_ai/grok-code-fast-1","azure_ai/jais-30b-chat","azure_ai/jamba-instruct","azure_ai/ministral-3b","azure_ai/mistral-large","azure_ai/mistral-large-2407","azure_ai/mistral-large-latest","azure_ai/mistral-medium-2505","azure_ai/mistral-nemo","azure_ai/mistral-small","azure_ai/mistral-small-2503","babbage-002","bedrock/*/1-month-commitment/cohere.command-light-text-v14","bedrock/*/1-month-commitment/cohere.command-text-v14","bedrock/*/6-month-commitment/cohere.command-light-text-v14","bedrock/*/6-month-commitment/cohere.command-text-v14","bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-instant-v1","bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-v1","bedrock/ap-northeast-1/1-month-commitment/anthropic.claude-v2:1","bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-instant-v1","bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-v1","bedrock/ap-northeast-1/6-month-commitment/anthropic.claude-v2:1","bedrock/ap-northeast-1/anthropic.claude-instant-v1","bedrock/ap-northeast-1/anthropic.claude-v1","bedrock/ap-northeast-1/anthropic.claude-v2:1","bedrock/ap-south-1/meta.llama3-70b-instruct-v1:0","bedrock/ap-south-1/meta.llama3-8b-instruct-v1:0","bedrock/ca-central-1/meta.llama3-70b-instruct-v1:0","bedrock/ca-central-1/meta.llama3-8b-instruct-v1:0","bedrock/eu-central-1/1-month-commitment/anthropic.claude-instant-v1","bedrock/eu-central-1/1-month-commitment/anthropic.claude-v1","bedrock/eu-central-1/1-month-commitment/anthropic.claude-v2:1","bedrock/eu-central-1/6-month-commitment/anthropic.claude-instant-v1","bedrock/eu-central-1/6-month-commitment/anthropic.claude-v1","bedrock/eu-central-1/6-month-commitment/anthropic.claude-v2:1","bedrock/eu-central-1/anthropic.claude-instant-v1","bedrock/eu-central-1/anthropic.claude-v1","bedrock/eu-central-1/anthropic.claude-v2:1","bedrock/eu-west-1/meta.llama3-70b-instruct-v1:0","bedrock/eu-west-1/meta.llama3-8b-instruct-v1:0","bedrock/eu-west-2/meta.llama3-70b-instruct-v1:0","bedrock/eu-west-2/meta.llama3-8b-instruct-v1:0","bedrock/eu-west-3/mistral.mistral-7b-instruct-v0:2","bedrock/eu-west-3/mistral.mistral-large-2402-v1:0","bedrock/eu-west-3/mistral.mixtral-8x7b-instruct-v0:1","bedrock/invoke/anthropic.claude-3-5-sonnet-20240620-v1:0","bedrock/sa-east-1/meta.llama3-70b-instruct-v1:0","bedrock/sa-east-1/meta.llama3-8b-instruct-v1:0","bedrock/us-east-1/1-month-commitment/anthropic.claude-instant-v1","bedrock/us-east-1/1-month-commitment/anthropic.claude-v1","bedrock/us-east-1/1-month-commitment/anthropic.claude-v2:1","bedrock/us-east-1/6-month-commitment/anthropic.claude-instant-v1","bedrock/us-east-1/6-month-commitment/anthropic.claude-v1","bedrock/us-east-1/6-month-commitment/anthropic.claude-v2:1","bedrock/us-east-1/anthropic.claude-instant-v1","bedrock/us-east-1/anthropic.claude-v1","bedrock/us-east-1/anthropic.claude-v2:1","bedrock/us-east-1/meta.llama3-70b-instruct-v1:0","bedrock/us-east-1/meta.llama3-8b-instruct-v1:0","bedrock/us-east-1/mistral.mistral-7b-instruct-v0:2","bedrock/us-east-1/mistral.mistral-large-2402-v1:0","bedrock/us-east-1/mistral.mixtral-8x7b-instruct-v0:1","bedrock/us-gov-east-1/amazon.nova-pro-v1:0","bedrock/us-gov-east-1/amazon.titan-embed-text-v1","bedrock/us-gov-east-1/amazon.titan-embed-text-v2:0","bedrock/us-gov-east-1/amazon.titan-text-express-v1","bedrock/us-gov-east-1/amazon.titan-text-lite-v1","bedrock/us-gov-east-1/amazon.titan-text-premier-v1:0","bedrock/us-gov-east-1/anthropic.claude-3-5-sonnet-20240620-v1:0","bedrock/us-gov-east-1/anthropic.claude-3-haiku-20240307-v1:0","bedrock/us-gov-east-1/meta.llama3-70b-instruct-v1:0","bedrock/us-gov-east-1/meta.llama3-8b-instruct-v1:0","bedrock/us-gov-west-1/amazon.nova-pro-v1:0","bedrock/us-gov-west-1/amazon.titan-embed-text-v1","bedrock/us-gov-west-1/amazon.titan-embed-text-v2:0","bedrock/us-gov-west-1/amazon.titan-text-express-v1","bedrock/us-gov-west-1/amazon.titan-text-lite-v1","bedrock/us-gov-west-1/amazon.titan-text-premier-v1:0","bedrock/us-gov-west-1/anthropic.claude-3-7-sonnet-20250219-v1:0","bedrock/us-gov-west-1/anthropic.claude-3-5-sonnet-20240620-v1:0","bedrock/us-gov-west-1/anthropic.claude-3-haiku-20240307-v1:0","bedrock/us-gov-west-1/meta.llama3-70b-instruct-v1:0","bedrock/us-gov-west-1/meta.llama3-8b-instruct-v1:0","bedrock/us-west-1/meta.llama3-70b-instruct-v1:0","bedrock/us-west-1/meta.llama3-8b-instruct-v1:0","bedrock/us-west-2/1-month-commitment/anthropic.claude-instant-v1","bedrock/us-west-2/1-month-commitment/anthropic.claude-v1","bedrock/us-west-2/1-month-commitment/anthropic.claude-v2:1","bedrock/us-west-2/6-month-commitment/anthropic.claude-instant-v1","bedrock/us-west-2/6-month-commitment/anthropic.claude-v1","bedrock/us-west-2/6-month-commitment/anthropic.claude-v2:1","bedrock/us-west-2/anthropic.claude-instant-v1","bedrock/us-west-2/anthropic.claude-v1","bedrock/us-west-2/anthropic.claude-v2:1","bedrock/us-west-2/mistral.mistral-7b-instruct-v0:2","bedrock/us-west-2/mistral.mistral-large-2402-v1:0","bedrock/us-west-2/mistral.mixtral-8x7b-instruct-v0:1","bedrock/us.anthropic.claude-3-5-haiku-20241022-v1:0","cerebras/llama-3.3-70b","cerebras/llama3.1-70b","cerebras/llama3.1-8b","cerebras/openai/gpt-oss-120b","cerebras/qwen-3-32b","chat-bison","chat-bison-32k","chat-bison-32k@002","chat-bison@001","chat-bison@002","chatdolphin","chatgpt-4o-latest","claude-3-5-haiku-20241022","claude-3-5-haiku-latest","claude-haiku-4-5-20251001","claude-haiku-4-5","claude-3-5-sonnet-20240620","claude-3-5-sonnet-20241022","claude-3-5-sonnet-latest","claude-3-7-sonnet-20250219","claude-3-7-sonnet-latest","claude-3-haiku-20240307","claude-3-opus-20240229","claude-3-opus-latest","claude-4-opus-20250514","claude-4-sonnet-20250514","claude-sonnet-4-5","claude-sonnet-4-5-20250929","claude-opus-4-1","claude-opus-4-1-20250805","claude-opus-4-20250514","claude-sonnet-4-20250514","cloudflare/@cf/meta/llama-2-7b-chat-fp16","cloudflare/@cf/meta/llama-2-7b-chat-int8","cloudflare/@cf/mistral/mistral-7b-instruct-v0.1","cloudflare/@hf/thebloke/codellama-7b-instruct-awq","code-bison","code-bison-32k@002","code-bison32k","code-bison@001","code-bison@002","code-gecko","code-gecko-latest","code-gecko@001","code-gecko@002","codechat-bison","codechat-bison-32k","codechat-bison-32k@002","codechat-bison@001","codechat-bison@002","codechat-bison@latest","codestral/codestral-2405","codestral/codestral-latest","codex-mini-latest","cohere.command-light-text-v14","cohere.command-r-plus-v1:0","cohere.command-r-v1:0","cohere.command-text-v14","cohere.embed-english-v3","cohere.embed-multilingual-v3","cohere.embed-v4:0","cohere/embed-v4.0","cohere.rerank-v3-5:0","command","command-a-03-2025","command-light","command-nightly","command-r","command-r-08-2024","command-r-plus","command-r-plus-08-2024","command-r7b-12-2024","computer-use-preview","deepseek-chat","deepseek-reasoner","dashscope/qwen-coder","dashscope/qwen-flash","dashscope/qwen-flash-2025-07-28","dashscope/qwen-max","dashscope/qwen-plus","dashscope/qwen-plus-2025-01-25","dashscope/qwen-plus-2025-04-28","dashscope/qwen-plus-2025-07-14","dashscope/qwen-plus-2025-07-28","dashscope/qwen-plus-2025-09-11","dashscope/qwen-plus-latest","dashscope/qwen-turbo","dashscope/qwen-turbo-2024-11-01","dashscope/qwen-turbo-2025-04-28","dashscope/qwen-turbo-latest","dashscope/qwen3-30b-a3b","dashscope/qwen3-coder-flash","dashscope/qwen3-coder-flash-2025-07-28","dashscope/qwen3-coder-plus","dashscope/qwen3-coder-plus-2025-07-22","dashscope/qwen3-max-preview","dashscope/qwq-plus","databricks/databricks-bge-large-en","databricks/databricks-claude-3-7-sonnet","databricks/databricks-gte-large-en","databricks/databricks-llama-2-70b-chat","databricks/databricks-llama-4-maverick","databricks/databricks-meta-llama-3-1-405b-instruct","databricks/databricks-meta-llama-3-3-70b-instruct","databricks/databricks-meta-llama-3-70b-instruct","databricks/databricks-mixtral-8x7b-instruct","databricks/databricks-mpt-30b-instruct","databricks/databricks-mpt-7b-instruct","dataforseo/search","davinci-002","deepgram/base","deepgram/base-conversationalai","deepgram/base-finance","deepgram/base-general","deepgram/base-meeting","deepgram/base-phonecall","deepgram/base-video","deepgram/base-voicemail","deepgram/enhanced","deepgram/enhanced-finance","deepgram/enhanced-general","deepgram/enhanced-meeting","deepgram/enhanced-phonecall","deepgram/nova","deepgram/nova-2","deepgram/nova-2-atc","deepgram/nova-2-automotive","deepgram/nova-2-conversationalai","deepgram/nova-2-drivethru","deepgram/nova-2-finance","deepgram/nova-2-general","deepgram/nova-2-meeting","deepgram/nova-2-phonecall","deepgram/nova-2-video","deepgram/nova-2-voicemail","deepgram/nova-3","deepgram/nova-3-general","deepgram/nova-3-medical","deepgram/nova-general","deepgram/nova-phonecall","deepgram/whisper","deepgram/whisper-base","deepgram/whisper-large","deepgram/whisper-medium","deepgram/whisper-small","deepgram/whisper-tiny","deepinfra/Gryphe/MythoMax-L2-13b","deepinfra/NousResearch/Hermes-3-Llama-3.1-405B","deepinfra/NousResearch/Hermes-3-Llama-3.1-70B","deepinfra/Qwen/QwQ-32B","deepinfra/Qwen/Qwen2.5-72B-Instruct","deepinfra/Qwen/Qwen2.5-7B-Instruct","deepinfra/Qwen/Qwen2.5-VL-32B-Instruct","deepinfra/Qwen/Qwen3-14B","deepinfra/Qwen/Qwen3-235B-A22B","deepinfra/Qwen/Qwen3-235B-A22B-Instruct-2507","deepinfra/Qwen/Qwen3-235B-A22B-Thinking-2507","deepinfra/Qwen/Qwen3-30B-A3B","deepinfra/Qwen/Qwen3-32B","deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct","deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo","deepinfra/Qwen/Qwen3-Next-80B-A3B-Instruct","deepinfra/Qwen/Qwen3-Next-80B-A3B-Thinking","deepinfra/Sao10K/L3-8B-Lunaris-v1-Turbo","deepinfra/Sao10K/L3.1-70B-Euryale-v2.2","deepinfra/Sao10K/L3.3-70B-Euryale-v2.3","deepinfra/allenai/olmOCR-7B-0725-FP8","deepinfra/anthropic/claude-3-7-sonnet-latest","deepinfra/anthropic/claude-4-opus","deepinfra/anthropic/claude-4-sonnet","deepinfra/deepseek-ai/DeepSeek-R1","deepinfra/deepseek-ai/DeepSeek-R1-0528","deepinfra/deepseek-ai/DeepSeek-R1-0528-Turbo","deepinfra/deepseek-ai/DeepSeek-R1-Distill-Llama-70B","deepinfra/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B","deepinfra/deepseek-ai/DeepSeek-R1-Turbo","deepinfra/deepseek-ai/DeepSeek-V3","deepinfra/deepseek-ai/DeepSeek-V3-0324","deepinfra/deepseek-ai/DeepSeek-V3.1","deepinfra/deepseek-ai/DeepSeek-V3.1-Terminus","deepinfra/google/gemini-2.0-flash-001","deepinfra/google/gemini-2.5-flash","deepinfra/google/gemini-2.5-pro","deepinfra/google/gemma-3-12b-it","deepinfra/google/gemma-3-27b-it","deepinfra/google/gemma-3-4b-it","deepinfra/meta-llama/Llama-3.2-11B-Vision-Instruct","deepinfra/meta-llama/Llama-3.2-3B-Instruct","deepinfra/meta-llama/Llama-3.3-70B-Instruct","deepinfra/meta-llama/Llama-3.3-70B-Instruct-Turbo","deepinfra/meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8","deepinfra/meta-llama/Llama-4-Scout-17B-16E-Instruct","deepinfra/meta-llama/Llama-Guard-3-8B","deepinfra/meta-llama/Llama-Guard-4-12B","deepinfra/meta-llama/Meta-Llama-3-8B-Instruct","deepinfra/meta-llama/Meta-Llama-3.1-70B-Instruct","deepinfra/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo","deepinfra/meta-llama/Meta-Llama-3.1-8B-Instruct","deepinfra/meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo","deepinfra/microsoft/WizardLM-2-8x22B","deepinfra/microsoft/phi-4","deepinfra/mistralai/Mistral-Nemo-Instruct-2407","deepinfra/mistralai/Mistral-Small-24B-Instruct-2501","deepinfra/mistralai/Mistral-Small-3.2-24B-Instruct-2506","deepinfra/mistralai/Mixtral-8x7B-Instruct-v0.1","deepinfra/moonshotai/Kimi-K2-Instruct","deepinfra/moonshotai/Kimi-K2-Instruct-0905","deepinfra/nvidia/Llama-3.1-Nemotron-70B-Instruct","deepinfra/nvidia/Llama-3.3-Nemotron-Super-49B-v1.5","deepinfra/nvidia/NVIDIA-Nemotron-Nano-9B-v2","deepinfra/openai/gpt-oss-120b","deepinfra/openai/gpt-oss-20b","deepinfra/zai-org/GLM-4.5","deepseek/deepseek-chat","deepseek/deepseek-coder","deepseek/deepseek-r1","deepseek/deepseek-reasoner","deepseek/deepseek-v3","deepseek.v3-v1:0","dolphin","doubao-embedding","doubao-embedding-large","doubao-embedding-large-text-240915","doubao-embedding-large-text-250515","doubao-embedding-text-240715","exa_ai/search","firecrawl/search","perplexity/search","searxng/search","elevenlabs/scribe_v1","elevenlabs/scribe_v1_experimental","embed-english-light-v2.0","embed-english-light-v3.0","embed-english-v2.0","embed-english-v3.0","embed-multilingual-v2.0","embed-multilingual-v3.0","eu.amazon.nova-lite-v1:0","eu.amazon.nova-micro-v1:0","eu.amazon.nova-pro-v1:0","eu.anthropic.claude-3-5-haiku-20241022-v1:0","eu.anthropic.claude-haiku-4-5-20251001-v1:0","eu.anthropic.claude-3-5-sonnet-20240620-v1:0","eu.anthropic.claude-3-5-sonnet-20241022-v2:0","eu.anthropic.claude-3-7-sonnet-20250219-v1:0","eu.anthropic.claude-3-haiku-20240307-v1:0","eu.anthropic.claude-3-opus-20240229-v1:0","eu.anthropic.claude-3-sonnet-20240229-v1:0","eu.anthropic.claude-opus-4-1-20250805-v1:0","eu.anthropic.claude-opus-4-20250514-v1:0","eu.anthropic.claude-sonnet-4-20250514-v1:0","eu.anthropic.claude-sonnet-4-5-20250929-v1:0","eu.meta.llama3-2-1b-instruct-v1:0","eu.meta.llama3-2-3b-instruct-v1:0","eu.mistral.pixtral-large-2502-v1:0","fal_ai/bria/text-to-image/3.2","fal_ai/fal-ai/flux-pro/v1.1","fal_ai/fal-ai/flux-pro/v1.1-ultra","fal_ai/fal-ai/flux/schnell","fal_ai/fal-ai/bytedance/seedream/v3/text-to-image","fal_ai/fal-ai/bytedance/dreamina/v3.1/text-to-image","fal_ai/fal-ai/ideogram/v3","fal_ai/fal-ai/imagen4/preview","fal_ai/fal-ai/imagen4/preview/fast","fal_ai/fal-ai/imagen4/preview/ultra","fal_ai/fal-ai/recraft/v3/text-to-image","fal_ai/fal-ai/stable-diffusion-v35-medium","featherless_ai/featherless-ai/Qwerky-72B","featherless_ai/featherless-ai/Qwerky-QwQ-32B","fireworks-ai-4.1b-to-16b","fireworks-ai-56b-to-176b","fireworks-ai-above-16b","fireworks-ai-default","fireworks-ai-embedding-150m-to-350m","fireworks-ai-embedding-up-to-150m","fireworks-ai-moe-up-to-56b","fireworks-ai-up-to-4b","fireworks_ai/WhereIsAI/UAE-Large-V1","fireworks_ai/accounts/fireworks/models/deepseek-coder-v2-instruct","fireworks_ai/accounts/fireworks/models/deepseek-r1","fireworks_ai/accounts/fireworks/models/deepseek-r1-0528","fireworks_ai/accounts/fireworks/models/deepseek-r1-basic","fireworks_ai/accounts/fireworks/models/deepseek-v3","fireworks_ai/accounts/fireworks/models/deepseek-v3-0324","fireworks_ai/accounts/fireworks/models/deepseek-v3p1","fireworks_ai/accounts/fireworks/models/deepseek-v3p1-terminus","fireworks_ai/accounts/fireworks/models/firefunction-v2","fireworks_ai/accounts/fireworks/models/glm-4p5","fireworks_ai/accounts/fireworks/models/glm-4p5-air","fireworks_ai/accounts/fireworks/models/gpt-oss-120b","fireworks_ai/accounts/fireworks/models/gpt-oss-20b","fireworks_ai/accounts/fireworks/models/kimi-k2-instruct","fireworks_ai/accounts/fireworks/models/kimi-k2-thinking","fireworks_ai/accounts/fireworks/models/llama-v3p1-405b-instruct","fireworks_ai/accounts/fireworks/models/llama-v3p1-8b-instruct","fireworks_ai/accounts/fireworks/models/llama-v3p2-11b-vision-instruct","fireworks_ai/accounts/fireworks/models/llama-v3p2-1b-instruct","fireworks_ai/accounts/fireworks/models/llama-v3p2-3b-instruct","fireworks_ai/accounts/fireworks/models/llama-v3p2-90b-vision-instruct","fireworks_ai/accounts/fireworks/models/llama4-maverick-instruct-basic","fireworks_ai/accounts/fireworks/models/llama4-scout-instruct-basic","fireworks_ai/accounts/fireworks/models/mixtral-8x22b-instruct-hf","fireworks_ai/accounts/fireworks/models/qwen2-72b-instruct","fireworks_ai/accounts/fireworks/models/qwen2p5-coder-32b-instruct","fireworks_ai/accounts/fireworks/models/yi-large","fireworks_ai/nomic-ai/nomic-embed-text-v1","fireworks_ai/nomic-ai/nomic-embed-text-v1.5","fireworks_ai/thenlper/gte-base","fireworks_ai/thenlper/gte-large","friendliai/meta-llama-3.1-70b-instruct","friendliai/meta-llama-3.1-8b-instruct","ft:babbage-002","ft:davinci-002","ft:gpt-3.5-turbo","ft:gpt-3.5-turbo-0125","ft:gpt-3.5-turbo-0613","ft:gpt-3.5-turbo-1106","ft:gpt-4-0613","ft:gpt-4o-2024-08-06","ft:gpt-4o-2024-11-20","ft:gpt-4o-mini-2024-07-18","gemini-1.0-pro","gemini-1.0-pro-001","gemini-1.0-pro-002","gemini-1.0-pro-vision","gemini-1.0-pro-vision-001","gemini-1.0-ultra","gemini-1.0-ultra-001","gemini-1.5-flash","gemini-1.5-flash-001","gemini-1.5-flash-002","gemini-1.5-flash-exp-0827","gemini-1.5-flash-preview-0514","gemini-1.5-pro","gemini-1.5-pro-001","gemini-1.5-pro-002","gemini-1.5-pro-preview-0215","gemini-1.5-pro-preview-0409","gemini-1.5-pro-preview-0514","gemini-2.0-flash","gemini-2.0-flash-001","gemini-2.0-flash-exp","gemini-2.0-flash-lite","gemini-2.0-flash-lite-001","gemini-2.0-flash-live-preview-04-09","gemini-2.0-flash-preview-image-generation","gemini-2.0-flash-thinking-exp","gemini-2.0-flash-thinking-exp-01-21","gemini-2.0-pro-exp-02-05","gemini-2.5-flash","gemini-2.5-flash-image","gemini-2.5-flash-image-preview","gemini-2.5-flash-lite","gemini-2.5-flash-lite-preview-09-2025","gemini-2.5-flash-preview-09-2025","gemini-live-2.5-flash-preview-native-audio-09-2025","gemini/gemini-live-2.5-flash-preview-native-audio-09-2025","gemini-2.5-flash-lite-preview-06-17","gemini-2.5-flash-preview-04-17","gemini-2.5-flash-preview-05-20","gemini-2.5-pro","gemini-3-pro-preview","vertex_ai/gemini-3-pro-preview","gemini-2.5-pro-exp-03-25","gemini-2.5-pro-preview-03-25","gemini-2.5-pro-preview-05-06","gemini-2.5-pro-preview-06-05","gemini-2.5-pro-preview-tts","gemini-embedding-001","gemini-flash-experimental","gemini-pro","gemini-pro-experimental","gemini-pro-vision","gemini/gemini-embedding-001","gemini/gemini-1.5-flash","gemini/gemini-1.5-flash-001","gemini/gemini-1.5-flash-002","gemini/gemini-1.5-flash-8b","gemini/gemini-1.5-flash-8b-exp-0827","gemini/gemini-1.5-flash-8b-exp-0924","gemini/gemini-1.5-flash-exp-0827","gemini/gemini-1.5-flash-latest","gemini/gemini-1.5-pro","gemini/gemini-1.5-pro-001","gemini/gemini-1.5-pro-002","gemini/gemini-1.5-pro-exp-0801","gemini/gemini-1.5-pro-exp-0827","gemini/gemini-1.5-pro-latest","gemini/gemini-2.0-flash","gemini/gemini-2.0-flash-001","gemini/gemini-2.0-flash-exp","gemini/gemini-2.0-flash-lite","gemini/gemini-2.0-flash-lite-preview-02-05","gemini/gemini-2.0-flash-live-001","gemini/gemini-2.0-flash-preview-image-generation","gemini/gemini-2.0-flash-thinking-exp","gemini/gemini-2.0-flash-thinking-exp-01-21","gemini/gemini-2.0-pro-exp-02-05","gemini/gemini-2.5-flash","gemini/gemini-2.5-flash-image","gemini/gemini-2.5-flash-image-preview","gemini/gemini-2.5-flash-lite","gemini/gemini-2.5-flash-lite-preview-09-2025","gemini/gemini-2.5-flash-preview-09-2025","gemini/gemini-flash-latest","gemini/gemini-flash-lite-latest","gemini/gemini-2.5-flash-lite-preview-06-17","gemini/gemini-2.5-flash-preview-04-17","gemini/gemini-2.5-flash-preview-05-20","gemini/gemini-2.5-flash-preview-tts","gemini/gemini-2.5-pro","gemini/gemini-3-pro-preview","gemini/gemini-2.5-pro-exp-03-25","gemini/gemini-2.5-pro-preview-03-25","gemini/gemini-2.5-pro-preview-05-06","gemini/gemini-2.5-pro-preview-06-05","gemini/gemini-2.5-pro-preview-tts","gemini/gemini-exp-1114","gemini/gemini-exp-1206","gemini/gemini-gemma-2-27b-it","gemini/gemini-gemma-2-9b-it","gemini/gemini-pro","gemini/gemini-pro-vision","gemini/gemma-3-27b-it","gemini/imagen-3.0-fast-generate-001","gemini/imagen-3.0-generate-001","gemini/imagen-3.0-generate-002","gemini/imagen-4.0-fast-generate-001","gemini/imagen-4.0-generate-001","gemini/imagen-4.0-ultra-generate-001","gemini/learnlm-1.5-pro-experimental","gemini/veo-2.0-generate-001","gemini/veo-3.0-fast-generate-preview","gemini/veo-3.0-generate-preview","gemini/veo-3.1-fast-generate-preview","gemini/veo-3.1-generate-preview","google_pse/search","global.anthropic.claude-sonnet-4-5-20250929-v1:0","global.anthropic.claude-sonnet-4-20250514-v1:0","global.anthropic.claude-haiku-4-5-20251001-v1:0","gpt-3.5-turbo","gpt-3.5-turbo-0125","gpt-3.5-turbo-0301","gpt-3.5-turbo-0613","gpt-3.5-turbo-1106","gpt-3.5-turbo-16k","gpt-3.5-turbo-16k-0613","gpt-3.5-turbo-instruct","gpt-3.5-turbo-instruct-0914","gpt-4","gpt-4-0125-preview","gpt-4-0314","gpt-4-0613","gpt-4-1106-preview","gpt-4-1106-vision-preview","gpt-4-32k","gpt-4-32k-0314","gpt-4-32k-0613","gpt-4-turbo","gpt-4-turbo-2024-04-09","gpt-4-turbo-preview","gpt-4-vision-preview","gpt-4.1","gpt-4.1-2025-04-14","gpt-4.1-mini","gpt-4.1-mini-2025-04-14","gpt-4.1-nano","gpt-4.1-nano-2025-04-14","gpt-4.5-preview","gpt-4.5-preview-2025-02-27","gpt-4o","gpt-4o-2024-05-13","gpt-4o-2024-08-06","gpt-4o-2024-11-20","gpt-4o-audio-preview","gpt-4o-audio-preview-2024-10-01","gpt-4o-audio-preview-2024-12-17","gpt-4o-audio-preview-2025-06-03","gpt-4o-mini","gpt-4o-mini-2024-07-18","gpt-4o-mini-audio-preview","gpt-4o-mini-audio-preview-2024-12-17","gpt-4o-mini-realtime-preview","gpt-4o-mini-realtime-preview-2024-12-17","gpt-4o-mini-search-preview","gpt-4o-mini-search-preview-2025-03-11","gpt-4o-mini-transcribe","gpt-4o-mini-tts","gpt-4o-realtime-preview","gpt-4o-realtime-preview-2024-10-01","gpt-4o-realtime-preview-2024-12-17","gpt-4o-realtime-preview-2025-06-03","gpt-4o-search-preview","gpt-4o-search-preview-2025-03-11","gpt-4o-transcribe","gpt-5","gpt-5.1","gpt-5.1-2025-11-13","gpt-5.1-chat-latest","gpt-5-pro","gpt-5-pro-2025-10-06","gpt-5-2025-08-07","gpt-5-chat","gpt-5-chat-latest","gpt-5-codex","gpt-5.1-codex","gpt-5.1-codex-mini","gpt-5-mini","gpt-5-mini-2025-08-07","gpt-5-nano","gpt-5-nano-2025-08-07","gpt-image-1","gpt-image-1-mini","gpt-realtime","gpt-realtime-mini","gpt-realtime-2025-08-28","gradient_ai/alibaba-qwen3-32b","gradient_ai/anthropic-claude-3-opus","gradient_ai/anthropic-claude-3.5-haiku","gradient_ai/anthropic-claude-3.5-sonnet","gradient_ai/anthropic-claude-3.7-sonnet","gradient_ai/deepseek-r1-distill-llama-70b","gradient_ai/llama3-8b-instruct","gradient_ai/llama3.3-70b-instruct","gradient_ai/mistral-nemo-instruct-2407","gradient_ai/openai-gpt-4o","gradient_ai/openai-gpt-4o-mini","gradient_ai/openai-o3","gradient_ai/openai-o3-mini","lemonade/Qwen3-Coder-30B-A3B-Instruct-GGUF","lemonade/gpt-oss-20b-mxfp4-GGUF","lemonade/gpt-oss-120b-mxfp-GGUF","lemonade/Gemma-3-4b-it-GGUF","lemonade/Qwen3-4B-Instruct-2507-GGUF","groq/deepseek-r1-distill-llama-70b","groq/distil-whisper-large-v3-en","groq/gemma-7b-it","groq/gemma2-9b-it","groq/llama-3.1-405b-reasoning","groq/llama-3.1-70b-versatile","groq/llama-3.1-8b-instant","groq/llama-3.2-11b-text-preview","groq/llama-3.2-11b-vision-preview","groq/llama-3.2-1b-preview","groq/llama-3.2-3b-preview","groq/llama-3.2-90b-text-preview","groq/llama-3.2-90b-vision-preview","groq/llama-3.3-70b-specdec","groq/llama-3.3-70b-versatile","groq/llama-guard-3-8b","groq/llama2-70b-4096","groq/llama3-groq-70b-8192-tool-use-preview","groq/llama3-groq-8b-8192-tool-use-preview","groq/meta-llama/llama-4-maverick-17b-128e-instruct","groq/meta-llama/llama-4-scout-17b-16e-instruct","groq/mistral-saba-24b","groq/mixtral-8x7b-32768","groq/moonshotai/kimi-k2-instruct","groq/moonshotai/kimi-k2-instruct-0905","groq/openai/gpt-oss-120b","groq/openai/gpt-oss-20b","groq/playai-tts","groq/qwen/qwen3-32b","groq/whisper-large-v3","groq/whisper-large-v3-turbo","hd/1024-x-1024/dall-e-3","hd/1024-x-1792/dall-e-3","hd/1792-x-1024/dall-e-3","heroku/claude-3-5-haiku","heroku/claude-3-5-sonnet-latest","heroku/claude-3-7-sonnet","heroku/claude-4-sonnet","high/1024-x-1024/gpt-image-1","high/1024-x-1536/gpt-image-1","high/1536-x-1024/gpt-image-1","hyperbolic/NousResearch/Hermes-3-Llama-3.1-70B","hyperbolic/Qwen/QwQ-32B","hyperbolic/Qwen/Qwen2.5-72B-Instruct","hyperbolic/Qwen/Qwen2.5-Coder-32B-Instruct","hyperbolic/Qwen/Qwen3-235B-A22B","hyperbolic/deepseek-ai/DeepSeek-R1","hyperbolic/deepseek-ai/DeepSeek-R1-0528","hyperbolic/deepseek-ai/DeepSeek-V3","hyperbolic/deepseek-ai/DeepSeek-V3-0324","hyperbolic/meta-llama/Llama-3.2-3B-Instruct","hyperbolic/meta-llama/Llama-3.3-70B-Instruct","hyperbolic/meta-llama/Meta-Llama-3-70B-Instruct","hyperbolic/meta-llama/Meta-Llama-3.1-405B-Instruct","hyperbolic/meta-llama/Meta-Llama-3.1-70B-Instruct","hyperbolic/meta-llama/Meta-Llama-3.1-8B-Instruct","hyperbolic/moonshotai/Kimi-K2-Instruct","j2-light","j2-mid","j2-ultra","jamba-1.5","jamba-1.5-large","jamba-1.5-large@001","jamba-1.5-mini","jamba-1.5-mini@001","jamba-large-1.6","jamba-large-1.7","jamba-mini-1.6","jamba-mini-1.7","jina-reranker-v2-base-multilingual","jp.anthropic.claude-sonnet-4-5-20250929-v1:0","jp.anthropic.claude-haiku-4-5-20251001-v1:0","lambda_ai/deepseek-llama3.3-70b","lambda_ai/deepseek-r1-0528","lambda_ai/deepseek-r1-671b","lambda_ai/deepseek-v3-0324","lambda_ai/hermes3-405b","lambda_ai/hermes3-70b","lambda_ai/hermes3-8b","lambda_ai/lfm-40b","lambda_ai/lfm-7b","lambda_ai/llama-4-maverick-17b-128e-instruct-fp8","lambda_ai/llama-4-scout-17b-16e-instruct","lambda_ai/llama3.1-405b-instruct-fp8","lambda_ai/llama3.1-70b-instruct-fp8","lambda_ai/llama3.1-8b-instruct","lambda_ai/llama3.1-nemotron-70b-instruct-fp8","lambda_ai/llama3.2-11b-vision-instruct","lambda_ai/llama3.2-3b-instruct","lambda_ai/llama3.3-70b-instruct-fp8","lambda_ai/qwen25-coder-32b-instruct","lambda_ai/qwen3-32b-fp8","low/1024-x-1024/gpt-image-1","low/1024-x-1536/gpt-image-1","low/1536-x-1024/gpt-image-1","luminous-base","luminous-base-control","luminous-extended","luminous-extended-control","luminous-supreme","luminous-supreme-control","max-x-max/50-steps/stability.stable-diffusion-xl-v0","max-x-max/max-steps/stability.stable-diffusion-xl-v0","medium/1024-x-1024/gpt-image-1","medium/1024-x-1536/gpt-image-1","medium/1536-x-1024/gpt-image-1","low/1024-x-1024/gpt-image-1-mini","low/1024-x-1536/gpt-image-1-mini","low/1536-x-1024/gpt-image-1-mini","medium/1024-x-1024/gpt-image-1-mini","medium/1024-x-1536/gpt-image-1-mini","medium/1536-x-1024/gpt-image-1-mini","medlm-large","medlm-medium","meta.llama2-13b-chat-v1","meta.llama2-70b-chat-v1","meta.llama3-1-405b-instruct-v1:0","meta.llama3-1-70b-instruct-v1:0","meta.llama3-1-8b-instruct-v1:0","meta.llama3-2-11b-instruct-v1:0","meta.llama3-2-1b-instruct-v1:0","meta.llama3-2-3b-instruct-v1:0","meta.llama3-2-90b-instruct-v1:0","meta.llama3-3-70b-instruct-v1:0","meta.llama3-70b-instruct-v1:0","meta.llama3-8b-instruct-v1:0","meta.llama4-maverick-17b-instruct-v1:0","meta.llama4-scout-17b-instruct-v1:0","meta_llama/Llama-3.3-70B-Instruct","meta_llama/Llama-3.3-8B-Instruct","meta_llama/Llama-4-Maverick-17B-128E-Instruct-FP8","meta_llama/Llama-4-Scout-17B-16E-Instruct-FP8","mistral.mistral-7b-instruct-v0:2","mistral.mistral-large-2402-v1:0","mistral.mistral-large-2407-v1:0","mistral.mistral-small-2402-v1:0","mistral.mixtral-8x7b-instruct-v0:1","mistral/codestral-2405","mistral/codestral-latest","mistral/codestral-mamba-latest","mistral/devstral-medium-2507","mistral/devstral-small-2505","mistral/devstral-small-2507","mistral/magistral-medium-2506","mistral/magistral-medium-2509","mistral/mistral-ocr-latest","mistral/mistral-ocr-2505-completion","mistral/magistral-medium-latest","mistral/magistral-small-2506","mistral/magistral-small-latest","mistral/mistral-embed","mistral/codestral-embed","mistral/codestral-embed-2505","mistral/mistral-large-2402","mistral/mistral-large-2407","mistral/mistral-large-2411","mistral/mistral-large-latest","mistral/mistral-medium","mistral/mistral-medium-2312","mistral/mistral-medium-2505","mistral/mistral-medium-latest","mistral/mistral-small","mistral/mistral-small-latest","mistral/mistral-tiny","mistral/open-codestral-mamba","mistral/open-mistral-7b","mistral/open-mistral-nemo","mistral/open-mistral-nemo-2407","mistral/open-mixtral-8x22b","mistral/open-mixtral-8x7b","mistral/pixtral-12b-2409","mistral/pixtral-large-2411","mistral/pixtral-large-latest","moonshot/kimi-k2-0711-preview","moonshot/kimi-latest","moonshot/kimi-latest-128k","moonshot/kimi-latest-32k","moonshot/kimi-latest-8k","moonshot/kimi-thinking-preview","moonshot/kimi-k2-thinking","moonshot/moonshot-v1-128k","moonshot/moonshot-v1-128k-0430","moonshot/moonshot-v1-128k-vision-preview","moonshot/moonshot-v1-32k","moonshot/moonshot-v1-32k-0430","moonshot/moonshot-v1-32k-vision-preview","moonshot/moonshot-v1-8k","moonshot/moonshot-v1-8k-0430","moonshot/moonshot-v1-8k-vision-preview","moonshot/moonshot-v1-auto","morph/morph-v3-fast","morph/morph-v3-large","multimodalembedding","multimodalembedding@001","nscale/Qwen/QwQ-32B","nscale/Qwen/Qwen2.5-Coder-32B-Instruct","nscale/Qwen/Qwen2.5-Coder-3B-Instruct","nscale/Qwen/Qwen2.5-Coder-7B-Instruct","nscale/black-forest-labs/FLUX.1-schnell","nscale/deepseek-ai/DeepSeek-R1-Distill-Llama-70B","nscale/deepseek-ai/DeepSeek-R1-Distill-Llama-8B","nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B","nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-14B","nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B","nscale/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B","nscale/meta-llama/Llama-3.1-8B-Instruct","nscale/meta-llama/Llama-3.3-70B-Instruct","nscale/meta-llama/Llama-4-Scout-17B-16E-Instruct","nscale/mistralai/mixtral-8x22b-instruct-v0.1","nscale/stabilityai/stable-diffusion-xl-base-1.0","o1","o1-2024-12-17","o1-mini","o1-mini-2024-09-12","o1-preview","o1-preview-2024-09-12","o1-pro","o1-pro-2025-03-19","o3","o3-2025-04-16","o3-deep-research","o3-deep-research-2025-06-26","o3-mini","o3-mini-2025-01-31","o3-pro","o3-pro-2025-06-10","o4-mini","o4-mini-2025-04-16","o4-mini-deep-research","o4-mini-deep-research-2025-06-26","oci/meta.llama-3.1-405b-instruct","oci/meta.llama-3.2-90b-vision-instruct","oci/meta.llama-3.3-70b-instruct","oci/meta.llama-4-maverick-17b-128e-instruct-fp8","oci/meta.llama-4-scout-17b-16e-instruct","oci/xai.grok-3","oci/xai.grok-3-fast","oci/xai.grok-3-mini","oci/xai.grok-3-mini-fast","oci/xai.grok-4","oci/cohere.command-latest","oci/cohere.command-a-03-2025","oci/cohere.command-plus-latest","ollama/codegeex4","ollama/codegemma","ollama/codellama","ollama/deepseek-coder-v2-base","ollama/deepseek-coder-v2-instruct","ollama/deepseek-coder-v2-lite-base","ollama/deepseek-coder-v2-lite-instruct","ollama/deepseek-v3.1:671b-cloud","ollama/gpt-oss:120b-cloud","ollama/gpt-oss:20b-cloud","ollama/internlm2_5-20b-chat","ollama/llama2","ollama/llama2-uncensored","ollama/llama2:13b","ollama/llama2:70b","ollama/llama2:7b","ollama/llama3","ollama/llama3.1","ollama/llama3:70b","ollama/llama3:8b","ollama/mistral","ollama/mistral-7B-Instruct-v0.1","ollama/mistral-7B-Instruct-v0.2","ollama/mistral-large-instruct-2407","ollama/mixtral-8x22B-Instruct-v0.1","ollama/mixtral-8x7B-Instruct-v0.1","ollama/orca-mini","ollama/qwen3-coder:480b-cloud","ollama/vicuna","omni-moderation-2024-09-26","omni-moderation-latest","omni-moderation-latest-intents","openai.gpt-oss-120b-1:0","openai.gpt-oss-20b-1:0","openrouter/anthropic/claude-2","openrouter/anthropic/claude-3-5-haiku","openrouter/anthropic/claude-3-5-haiku-20241022","openrouter/anthropic/claude-3-haiku","openrouter/anthropic/claude-3-haiku-20240307","openrouter/anthropic/claude-3-opus","openrouter/anthropic/claude-3-sonnet","openrouter/anthropic/claude-3.5-sonnet","openrouter/anthropic/claude-3.5-sonnet:beta","openrouter/anthropic/claude-3.7-sonnet","openrouter/anthropic/claude-3.7-sonnet:beta","openrouter/anthropic/claude-instant-v1","openrouter/anthropic/claude-opus-4","openrouter/anthropic/claude-opus-4.1","openrouter/anthropic/claude-sonnet-4","openrouter/anthropic/claude-sonnet-4.5","openrouter/anthropic/claude-haiku-4.5","openrouter/bytedance/ui-tars-1.5-7b","openrouter/cognitivecomputations/dolphin-mixtral-8x7b","openrouter/cohere/command-r-plus","openrouter/databricks/dbrx-instruct","openrouter/deepseek/deepseek-chat","openrouter/deepseek/deepseek-chat-v3-0324","openrouter/deepseek/deepseek-chat-v3.1","openrouter/deepseek/deepseek-v3.2-exp","openrouter/deepseek/deepseek-coder","openrouter/deepseek/deepseek-r1","openrouter/deepseek/deepseek-r1-0528","openrouter/fireworks/firellava-13b","openrouter/google/gemini-2.0-flash-001","openrouter/google/gemini-2.5-flash","openrouter/google/gemini-2.5-pro","openrouter/google/gemini-pro-1.5","openrouter/google/gemini-pro-vision","openrouter/google/palm-2-chat-bison","openrouter/google/palm-2-codechat-bison","openrouter/gryphe/mythomax-l2-13b","openrouter/jondurbin/airoboros-l2-70b-2.1","openrouter/mancer/weaver","openrouter/meta-llama/codellama-34b-instruct","openrouter/meta-llama/llama-2-13b-chat","openrouter/meta-llama/llama-2-70b-chat","openrouter/meta-llama/llama-3-70b-instruct","openrouter/meta-llama/llama-3-70b-instruct:nitro","openrouter/meta-llama/llama-3-8b-instruct:extended","openrouter/meta-llama/llama-3-8b-instruct:free","openrouter/microsoft/wizardlm-2-8x22b:nitro","openrouter/minimax/minimax-m2","openrouter/mistralai/mistral-7b-instruct","openrouter/mistralai/mistral-7b-instruct:free","openrouter/mistralai/mistral-large","openrouter/mistralai/mistral-small-3.1-24b-instruct","openrouter/mistralai/mistral-small-3.2-24b-instruct","openrouter/mistralai/mixtral-8x22b-instruct","openrouter/nousresearch/nous-hermes-llama2-13b","openrouter/openai/gpt-3.5-turbo","openrouter/openai/gpt-3.5-turbo-16k","openrouter/openai/gpt-4","openrouter/openai/gpt-4-vision-preview","openrouter/openai/gpt-4.1","openrouter/openai/gpt-4.1-2025-04-14","openrouter/openai/gpt-4.1-mini","openrouter/openai/gpt-4.1-mini-2025-04-14","openrouter/openai/gpt-4.1-nano","openrouter/openai/gpt-4.1-nano-2025-04-14","openrouter/openai/gpt-4o","openrouter/openai/gpt-4o-2024-05-13","openrouter/openai/gpt-5-chat","openrouter/openai/gpt-5-codex","openrouter/openai/gpt-5","openrouter/openai/gpt-5-mini","openrouter/openai/gpt-5-nano","openrouter/openai/gpt-oss-120b","openrouter/openai/gpt-oss-20b","openrouter/openai/o1","openrouter/openai/o1-mini","openrouter/openai/o1-mini-2024-09-12","openrouter/openai/o1-preview","openrouter/openai/o1-preview-2024-09-12","openrouter/openai/o3-mini","openrouter/openai/o3-mini-high","openrouter/pygmalionai/mythalion-13b","openrouter/qwen/qwen-2.5-coder-32b-instruct","openrouter/qwen/qwen-vl-plus","openrouter/qwen/qwen3-coder","openrouter/switchpoint/router","openrouter/undi95/remm-slerp-l2-13b","openrouter/x-ai/grok-4","openrouter/x-ai/grok-4-fast:free","openrouter/z-ai/glm-4.6","openrouter/z-ai/glm-4.6:exacto","ovhcloud/DeepSeek-R1-Distill-Llama-70B","ovhcloud/Llama-3.1-8B-Instruct","ovhcloud/Meta-Llama-3_1-70B-Instruct","ovhcloud/Meta-Llama-3_3-70B-Instruct","ovhcloud/Mistral-7B-Instruct-v0.3","ovhcloud/Mistral-Nemo-Instruct-2407","ovhcloud/Mistral-Small-3.2-24B-Instruct-2506","ovhcloud/Mixtral-8x7B-Instruct-v0.1","ovhcloud/Qwen2.5-Coder-32B-Instruct","ovhcloud/Qwen2.5-VL-72B-Instruct","ovhcloud/Qwen3-32B","ovhcloud/gpt-oss-120b","ovhcloud/gpt-oss-20b","ovhcloud/llava-v1.6-mistral-7b-hf","ovhcloud/mamba-codestral-7B-v0.1","palm/chat-bison","palm/chat-bison-001","palm/text-bison","palm/text-bison-001","palm/text-bison-safety-off","palm/text-bison-safety-recitation-off","parallel_ai/search","parallel_ai/search-pro","perplexity/codellama-34b-instruct","perplexity/codellama-70b-instruct","perplexity/llama-2-70b-chat","perplexity/llama-3.1-70b-instruct","perplexity/llama-3.1-8b-instruct","perplexity/llama-3.1-sonar-huge-128k-online","perplexity/llama-3.1-sonar-large-128k-chat","perplexity/llama-3.1-sonar-large-128k-online","perplexity/llama-3.1-sonar-small-128k-chat","perplexity/llama-3.1-sonar-small-128k-online","perplexity/mistral-7b-instruct","perplexity/mixtral-8x7b-instruct","perplexity/pplx-70b-chat","perplexity/pplx-70b-online","perplexity/pplx-7b-chat","perplexity/pplx-7b-online","perplexity/sonar","perplexity/sonar-deep-research","perplexity/sonar-medium-chat","perplexity/sonar-medium-online","perplexity/sonar-pro","perplexity/sonar-reasoning","perplexity/sonar-reasoning-pro","perplexity/sonar-small-chat","perplexity/sonar-small-online","qwen.qwen3-coder-480b-a35b-v1:0","qwen.qwen3-235b-a22b-2507-v1:0","qwen.qwen3-coder-30b-a3b-v1:0","qwen.qwen3-32b-v1:0","recraft/recraftv2","recraft/recraftv3","replicate/meta/llama-2-13b","replicate/meta/llama-2-13b-chat","replicate/meta/llama-2-70b","replicate/meta/llama-2-70b-chat","replicate/meta/llama-2-7b","replicate/meta/llama-2-7b-chat","replicate/meta/llama-3-70b","replicate/meta/llama-3-70b-instruct","replicate/meta/llama-3-8b","replicate/meta/llama-3-8b-instruct","replicate/mistralai/mistral-7b-instruct-v0.2","replicate/mistralai/mistral-7b-v0.1","replicate/mistralai/mixtral-8x7b-instruct-v0.1","rerank-english-v2.0","rerank-english-v3.0","rerank-multilingual-v2.0","rerank-multilingual-v3.0","rerank-v3.5","nvidia_nim/nvidia/nv-rerankqa-mistral-4b-v3","nvidia_nim/nvidia/llama-3_2-nv-rerankqa-1b-v2","sagemaker/meta-textgeneration-llama-2-13b","sagemaker/meta-textgeneration-llama-2-13b-f","sagemaker/meta-textgeneration-llama-2-70b","sagemaker/meta-textgeneration-llama-2-70b-b-f","sagemaker/meta-textgeneration-llama-2-7b","sagemaker/meta-textgeneration-llama-2-7b-f","sambanova/DeepSeek-R1","sambanova/DeepSeek-R1-Distill-Llama-70B","sambanova/DeepSeek-V3-0324","sambanova/Llama-4-Maverick-17B-128E-Instruct","sambanova/Llama-4-Scout-17B-16E-Instruct","sambanova/Meta-Llama-3.1-405B-Instruct","sambanova/Meta-Llama-3.1-8B-Instruct","sambanova/Meta-Llama-3.2-1B-Instruct","sambanova/Meta-Llama-3.2-3B-Instruct","sambanova/Meta-Llama-3.3-70B-Instruct","sambanova/Meta-Llama-Guard-3-8B","sambanova/QwQ-32B","sambanova/Qwen2-Audio-7B-Instruct","sambanova/Qwen3-32B","sambanova/DeepSeek-V3.1","sambanova/gpt-oss-120b","snowflake/claude-3-5-sonnet","snowflake/deepseek-r1","snowflake/gemma-7b","snowflake/jamba-1.5-large","snowflake/jamba-1.5-mini","snowflake/jamba-instruct","snowflake/llama2-70b-chat","snowflake/llama3-70b","snowflake/llama3-8b","snowflake/llama3.1-405b","snowflake/llama3.1-70b","snowflake/llama3.1-8b","snowflake/llama3.2-1b","snowflake/llama3.2-3b","snowflake/llama3.3-70b","snowflake/mistral-7b","snowflake/mistral-large","snowflake/mistral-large2","snowflake/mixtral-8x7b","snowflake/reka-core","snowflake/reka-flash","snowflake/snowflake-arctic","snowflake/snowflake-llama-3.1-405b","snowflake/snowflake-llama-3.3-70b","stability.sd3-5-large-v1:0","stability.sd3-large-v1:0","stability.stable-image-core-v1:0","stability.stable-image-core-v1:1","stability.stable-image-ultra-v1:0","stability.stable-image-ultra-v1:1","standard/1024-x-1024/dall-e-3","standard/1024-x-1792/dall-e-3","standard/1792-x-1024/dall-e-3","tavily/search","tavily/search-advanced","text-bison","text-bison32k","text-bison32k@002","text-bison@001","text-bison@002","text-completion-codestral/codestral-2405","text-completion-codestral/codestral-latest","text-embedding-004","text-embedding-005","text-embedding-3-large","text-embedding-3-small","text-embedding-ada-002","text-embedding-large-exp-03-07","text-embedding-preview-0409","text-moderation-007","text-moderation-latest","text-moderation-stable","text-multilingual-embedding-002","text-multilingual-embedding-preview-0409","text-unicorn","text-unicorn@001","textembedding-gecko","textembedding-gecko-multilingual","textembedding-gecko-multilingual@001","textembedding-gecko@001","textembedding-gecko@003","together-ai-21.1b-41b","together-ai-4.1b-8b","together-ai-41.1b-80b","together-ai-8.1b-21b","together-ai-81.1b-110b","together-ai-embedding-151m-to-350m","together-ai-embedding-up-to-150m","together_ai/baai/bge-base-en-v1.5","together_ai/BAAI/bge-base-en-v1.5","together-ai-up-to-4b","together_ai/Qwen/Qwen2.5-72B-Instruct-Turbo","together_ai/Qwen/Qwen2.5-7B-Instruct-Turbo","together_ai/Qwen/Qwen3-235B-A22B-Instruct-2507-tput","together_ai/Qwen/Qwen3-235B-A22B-Thinking-2507","together_ai/Qwen/Qwen3-235B-A22B-fp8-tput","together_ai/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8","together_ai/deepseek-ai/DeepSeek-R1","together_ai/deepseek-ai/DeepSeek-R1-0528-tput","together_ai/deepseek-ai/DeepSeek-V3","together_ai/deepseek-ai/DeepSeek-V3.1","together_ai/meta-llama/Llama-3.2-3B-Instruct-Turbo","together_ai/meta-llama/Llama-3.3-70B-Instruct-Turbo","together_ai/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free","together_ai/meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8","together_ai/meta-llama/Llama-4-Scout-17B-16E-Instruct","together_ai/meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo","together_ai/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo","together_ai/meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo","together_ai/mistralai/Mistral-7B-Instruct-v0.1","together_ai/mistralai/Mistral-Small-24B-Instruct-2501","together_ai/mistralai/Mixtral-8x7B-Instruct-v0.1","together_ai/moonshotai/Kimi-K2-Instruct","together_ai/openai/gpt-oss-120b","together_ai/openai/gpt-oss-20b","together_ai/togethercomputer/CodeLlama-34b-Instruct","together_ai/zai-org/GLM-4.5-Air-FP8","together_ai/moonshotai/Kimi-K2-Instruct-0905","together_ai/Qwen/Qwen3-Next-80B-A3B-Instruct","together_ai/Qwen/Qwen3-Next-80B-A3B-Thinking","tts-1","tts-1-hd","us.amazon.nova-lite-v1:0","us.amazon.nova-micro-v1:0","us.amazon.nova-premier-v1:0","us.amazon.nova-pro-v1:0","us.anthropic.claude-3-5-haiku-20241022-v1:0","us.anthropic.claude-haiku-4-5-20251001-v1:0","us.anthropic.claude-3-5-sonnet-20240620-v1:0","us.anthropic.claude-3-5-sonnet-20241022-v2:0","us.anthropic.claude-3-7-sonnet-20250219-v1:0","us.anthropic.claude-3-haiku-20240307-v1:0","us.anthropic.claude-3-opus-20240229-v1:0","us.anthropic.claude-3-sonnet-20240229-v1:0","us.anthropic.claude-opus-4-1-20250805-v1:0","us.anthropic.claude-sonnet-4-5-20250929-v1:0","au.anthropic.claude-haiku-4-5-20251001-v1:0","us.anthropic.claude-opus-4-20250514-v1:0","us.anthropic.claude-sonnet-4-20250514-v1:0","us.deepseek.r1-v1:0","us.meta.llama3-1-405b-instruct-v1:0","us.meta.llama3-1-70b-instruct-v1:0","us.meta.llama3-1-8b-instruct-v1:0","us.meta.llama3-2-11b-instruct-v1:0","us.meta.llama3-2-1b-instruct-v1:0","us.meta.llama3-2-3b-instruct-v1:0","us.meta.llama3-2-90b-instruct-v1:0","us.meta.llama3-3-70b-instruct-v1:0","us.meta.llama4-maverick-17b-instruct-v1:0","us.meta.llama4-scout-17b-instruct-v1:0","us.mistral.pixtral-large-2502-v1:0","v0/v0-1.0-md","v0/v0-1.5-lg","v0/v0-1.5-md","vercel_ai_gateway/alibaba/qwen-3-14b","vercel_ai_gateway/alibaba/qwen-3-235b","vercel_ai_gateway/alibaba/qwen-3-30b","vercel_ai_gateway/alibaba/qwen-3-32b","vercel_ai_gateway/alibaba/qwen3-coder","vercel_ai_gateway/amazon/nova-lite","vercel_ai_gateway/amazon/nova-micro","vercel_ai_gateway/amazon/nova-pro","vercel_ai_gateway/amazon/titan-embed-text-v2","vercel_ai_gateway/anthropic/claude-3-haiku","vercel_ai_gateway/anthropic/claude-3-opus","vercel_ai_gateway/anthropic/claude-3.5-haiku","vercel_ai_gateway/anthropic/claude-3.5-sonnet","vercel_ai_gateway/anthropic/claude-3.7-sonnet","vercel_ai_gateway/anthropic/claude-4-opus","vercel_ai_gateway/anthropic/claude-4-sonnet","vercel_ai_gateway/cohere/command-a","vercel_ai_gateway/cohere/command-r","vercel_ai_gateway/cohere/command-r-plus","vercel_ai_gateway/cohere/embed-v4.0","vercel_ai_gateway/deepseek/deepseek-r1","vercel_ai_gateway/deepseek/deepseek-r1-distill-llama-70b","vercel_ai_gateway/deepseek/deepseek-v3","vercel_ai_gateway/google/gemini-2.0-flash","vercel_ai_gateway/google/gemini-2.0-flash-lite","vercel_ai_gateway/google/gemini-2.5-flash","vercel_ai_gateway/google/gemini-2.5-pro","vercel_ai_gateway/google/gemini-embedding-001","vercel_ai_gateway/google/gemma-2-9b","vercel_ai_gateway/google/text-embedding-005","vercel_ai_gateway/google/text-multilingual-embedding-002","vercel_ai_gateway/inception/mercury-coder-small","vercel_ai_gateway/meta/llama-3-70b","vercel_ai_gateway/meta/llama-3-8b","vercel_ai_gateway/meta/llama-3.1-70b","vercel_ai_gateway/meta/llama-3.1-8b","vercel_ai_gateway/meta/llama-3.2-11b","vercel_ai_gateway/meta/llama-3.2-1b","vercel_ai_gateway/meta/llama-3.2-3b","vercel_ai_gateway/meta/llama-3.2-90b","vercel_ai_gateway/meta/llama-3.3-70b","vercel_ai_gateway/meta/llama-4-maverick","vercel_ai_gateway/meta/llama-4-scout","vercel_ai_gateway/mistral/codestral","vercel_ai_gateway/mistral/codestral-embed","vercel_ai_gateway/mistral/devstral-small","vercel_ai_gateway/mistral/magistral-medium","vercel_ai_gateway/mistral/magistral-small","vercel_ai_gateway/mistral/ministral-3b","vercel_ai_gateway/mistral/ministral-8b","vercel_ai_gateway/mistral/mistral-embed","vercel_ai_gateway/mistral/mistral-large","vercel_ai_gateway/mistral/mistral-saba-24b","vercel_ai_gateway/mistral/mistral-small","vercel_ai_gateway/mistral/mixtral-8x22b-instruct","vercel_ai_gateway/mistral/pixtral-12b","vercel_ai_gateway/mistral/pixtral-large","vercel_ai_gateway/moonshotai/kimi-k2","vercel_ai_gateway/morph/morph-v3-fast","vercel_ai_gateway/morph/morph-v3-large","vercel_ai_gateway/openai/gpt-3.5-turbo","vercel_ai_gateway/openai/gpt-3.5-turbo-instruct","vercel_ai_gateway/openai/gpt-4-turbo","vercel_ai_gateway/openai/gpt-4.1","vercel_ai_gateway/openai/gpt-4.1-mini","vercel_ai_gateway/openai/gpt-4.1-nano","vercel_ai_gateway/openai/gpt-4o","vercel_ai_gateway/openai/gpt-4o-mini","vercel_ai_gateway/openai/o1","vercel_ai_gateway/openai/o3","vercel_ai_gateway/openai/o3-mini","vercel_ai_gateway/openai/o4-mini","vercel_ai_gateway/openai/text-embedding-3-large","vercel_ai_gateway/openai/text-embedding-3-small","vercel_ai_gateway/openai/text-embedding-ada-002","vercel_ai_gateway/perplexity/sonar","vercel_ai_gateway/perplexity/sonar-pro","vercel_ai_gateway/perplexity/sonar-reasoning","vercel_ai_gateway/perplexity/sonar-reasoning-pro","vercel_ai_gateway/vercel/v0-1.0-md","vercel_ai_gateway/vercel/v0-1.5-md","vercel_ai_gateway/xai/grok-2","vercel_ai_gateway/xai/grok-2-vision","vercel_ai_gateway/xai/grok-3","vercel_ai_gateway/xai/grok-3-fast","vercel_ai_gateway/xai/grok-3-mini","vercel_ai_gateway/xai/grok-3-mini-fast","vercel_ai_gateway/xai/grok-4","vercel_ai_gateway/zai/glm-4.5","vercel_ai_gateway/zai/glm-4.5-air","vercel_ai_gateway/zai/glm-4.6","vertex_ai/claude-3-5-haiku","vertex_ai/claude-3-5-haiku@20241022","vertex_ai/claude-haiku-4-5@20251001","vertex_ai/claude-3-5-sonnet","vertex_ai/claude-3-5-sonnet-v2","vertex_ai/claude-3-5-sonnet-v2@20241022","vertex_ai/claude-3-5-sonnet@20240620","vertex_ai/claude-3-7-sonnet@20250219","vertex_ai/claude-3-haiku","vertex_ai/claude-3-haiku@20240307","vertex_ai/claude-3-opus","vertex_ai/claude-3-opus@20240229","vertex_ai/claude-3-sonnet","vertex_ai/claude-3-sonnet@20240229","vertex_ai/claude-opus-4","vertex_ai/claude-opus-4-1","vertex_ai/claude-opus-4-1@20250805","vertex_ai/claude-sonnet-4-5","vertex_ai/claude-sonnet-4-5@20250929","vertex_ai/claude-opus-4@20250514","vertex_ai/claude-sonnet-4","vertex_ai/claude-sonnet-4@20250514","vertex_ai/mistralai/codestral-2@001","vertex_ai/codestral-2","vertex_ai/codestral-2@001","vertex_ai/mistralai/codestral-2","vertex_ai/codestral-2501","vertex_ai/codestral@2405","vertex_ai/codestral@latest","vertex_ai/deepseek-ai/deepseek-v3.1-maas","vertex_ai/deepseek-ai/deepseek-r1-0528-maas","vertex_ai/gemini-2.5-flash-image","vertex_ai/imagegeneration@006","vertex_ai/imagen-3.0-fast-generate-001","vertex_ai/imagen-3.0-generate-001","vertex_ai/imagen-3.0-generate-002","vertex_ai/imagen-3.0-capability-001","vertex_ai/imagen-4.0-fast-generate-001","vertex_ai/imagen-4.0-generate-001","vertex_ai/imagen-4.0-ultra-generate-001","vertex_ai/jamba-1.5","vertex_ai/jamba-1.5-large","vertex_ai/jamba-1.5-large@001","vertex_ai/jamba-1.5-mini","vertex_ai/jamba-1.5-mini@001","vertex_ai/meta/llama-3.1-405b-instruct-maas","vertex_ai/meta/llama-3.1-70b-instruct-maas","vertex_ai/meta/llama-3.1-8b-instruct-maas","vertex_ai/meta/llama-3.2-90b-vision-instruct-maas","vertex_ai/meta/llama-4-maverick-17b-128e-instruct-maas","vertex_ai/meta/llama-4-maverick-17b-16e-instruct-maas","vertex_ai/meta/llama-4-scout-17b-128e-instruct-maas","vertex_ai/meta/llama-4-scout-17b-16e-instruct-maas","vertex_ai/meta/llama3-405b-instruct-maas","vertex_ai/meta/llama3-70b-instruct-maas","vertex_ai/meta/llama3-8b-instruct-maas","vertex_ai/minimaxai/minimax-m2-maas","vertex_ai/moonshotai/kimi-k2-thinking-maas","vertex_ai/mistral-medium-3","vertex_ai/mistral-medium-3@001","vertex_ai/mistralai/mistral-medium-3","vertex_ai/mistralai/mistral-medium-3@001","vertex_ai/mistral-large-2411","vertex_ai/mistral-large@2407","vertex_ai/mistral-large@2411-001","vertex_ai/mistral-large@latest","vertex_ai/mistral-nemo@2407","vertex_ai/mistral-nemo@latest","vertex_ai/mistral-small-2503","vertex_ai/mistral-small-2503@001","vertex_ai/mistral-ocr-2505","vertex_ai/openai/gpt-oss-120b-maas","vertex_ai/openai/gpt-oss-20b-maas","vertex_ai/qwen/qwen3-235b-a22b-instruct-2507-maas","vertex_ai/qwen/qwen3-coder-480b-a35b-instruct-maas","vertex_ai/qwen/qwen3-next-80b-a3b-instruct-maas","vertex_ai/qwen/qwen3-next-80b-a3b-thinking-maas","vertex_ai/veo-2.0-generate-001","vertex_ai/veo-3.0-fast-generate-preview","vertex_ai/veo-3.0-generate-preview","vertex_ai/veo-3.0-fast-generate-001","vertex_ai/veo-3.0-generate-001","vertex_ai/veo-3.1-generate-preview","vertex_ai/veo-3.1-fast-generate-preview","voyage/rerank-2","voyage/rerank-2-lite","voyage/voyage-2","voyage/voyage-3","voyage/voyage-3-large","voyage/voyage-3-lite","voyage/voyage-3.5","voyage/voyage-3.5-lite","voyage/voyage-code-2","voyage/voyage-code-3","voyage/voyage-context-3","voyage/voyage-finance-2","voyage/voyage-large-2","voyage/voyage-law-2","voyage/voyage-lite-01","voyage/voyage-lite-02-instruct","voyage/voyage-multimodal-3","wandb/openai/gpt-oss-120b","wandb/openai/gpt-oss-20b","wandb/zai-org/GLM-4.5","wandb/Qwen/Qwen3-235B-A22B-Instruct-2507","wandb/Qwen/Qwen3-Coder-480B-A35B-Instruct","wandb/Qwen/Qwen3-235B-A22B-Thinking-2507","wandb/moonshotai/Kimi-K2-Instruct","wandb/meta-llama/Llama-3.1-8B-Instruct","wandb/deepseek-ai/DeepSeek-V3.1","wandb/deepseek-ai/DeepSeek-R1-0528","wandb/deepseek-ai/DeepSeek-V3-0324","wandb/meta-llama/Llama-3.3-70B-Instruct","wandb/meta-llama/Llama-4-Scout-17B-16E-Instruct","wandb/microsoft/Phi-4-mini-instruct","watsonx/ibm/granite-3-8b-instruct","watsonx/mistralai/mistral-large","watsonx/bigscience/mt0-xxl-13b","watsonx/core42/jais-13b-chat","watsonx/google/flan-t5-xl-3b","watsonx/ibm/granite-13b-chat-v2","watsonx/ibm/granite-13b-instruct-v2","watsonx/ibm/granite-3-3-8b-instruct","watsonx/ibm/granite-4-h-small","watsonx/ibm/granite-guardian-3-2-2b","watsonx/ibm/granite-guardian-3-3-8b","watsonx/ibm/granite-ttm-1024-96-r2","watsonx/ibm/granite-ttm-1536-96-r2","watsonx/ibm/granite-ttm-512-96-r2","watsonx/ibm/granite-vision-3-2-2b","watsonx/meta-llama/llama-3-2-11b-vision-instruct","watsonx/meta-llama/llama-3-2-1b-instruct","watsonx/meta-llama/llama-3-2-3b-instruct","watsonx/meta-llama/llama-3-2-90b-vision-instruct","watsonx/meta-llama/llama-3-3-70b-instruct","watsonx/meta-llama/llama-4-maverick-17b","watsonx/meta-llama/llama-guard-3-11b-vision","watsonx/mistralai/mistral-medium-2505","watsonx/mistralai/mistral-small-2503","watsonx/mistralai/mistral-small-3-1-24b-instruct-2503","watsonx/mistralai/pixtral-12b-2409","watsonx/openai/gpt-oss-120b","watsonx/sdaia/allam-1-13b-instruct","whisper-1","xai/grok-2","xai/grok-2-1212","xai/grok-2-latest","xai/grok-2-vision","xai/grok-2-vision-1212","xai/grok-2-vision-latest","xai/grok-3","xai/grok-3-beta","xai/grok-3-fast-beta","xai/grok-3-fast-latest","xai/grok-3-latest","xai/grok-3-mini","xai/grok-3-mini-beta","xai/grok-3-mini-fast","xai/grok-3-mini-fast-beta","xai/grok-3-mini-fast-latest","xai/grok-3-mini-latest","xai/grok-4","xai/grok-4-fast-reasoning","xai/grok-4-fast-non-reasoning","xai/grok-4-0709","xai/grok-4-latest","xai/grok-beta","xai/grok-code-fast","xai/grok-code-fast-1","xai/grok-code-fast-1-0825","xai/grok-vision-beta","vertex_ai/search_api","openai/container","openai/sora-2","openai/sora-2-pro","azure/sora-2","azure/sora-2-pro","azure/sora-2-pro-high-res","runwayml/gen4_turbo","runwayml/gen4_aleph","runwayml/gen3a_turbo","runwayml/gen4_image","runwayml/gen4_image_turbo","runwayml/eleven_multilingual_v2"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"gpt-4o-mini"},"user_message":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"User Message","dynamic":false,"info":"User message to pass to the run.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"user_message","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"AstraDB":{"base_classes":["Data","DataFrame","VectorStore"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Ingest and search documents in Astra DB","display_name":"Astra DB","documentation":"https://docs.langflow.org/bundles-datastax#astra-db","edited":false,"field_order":["token","environment","database_name","api_endpoint","keyspace","collection_name","autodetect_collection","ingest_data","search_query","should_cache_vector_store","embedding_model","content_field","deletion_field","ignore_invalid_documents","astradb_vectorstore_kwargs","search_method","reranker","lexical_terms","number_of_results","search_type","search_score_threshold","advanced_search_filter"],"frozen":false,"icon":"AstraDB","legacy":false,"metadata":{"code_hash":"2b12cdb96b67","dependencies":{"dependencies":[{"name":"astrapy","version":"2.1.0"},{"name":"langchain_core","version":"0.3.79"},{"name":"lfx","version":null},{"name":"langchain_astradb","version":"0.6.1"}],"total_dependencies":4},"module":"lfx.components.datastax.astradb_vectorstore.AstraDBVectorStoreComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Search Results","group_outputs":false,"method":"search_documents","name":"search_results","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Vector Store Connection","group_outputs":false,"hidden":false,"method":"as_vector_store","name":"vectorstoreconnection","selected":"VectorStore","tool_mode":true,"types":["VectorStore"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","advanced_search_filter":{"_input_type":"NestedDictInput","advanced":true,"display_name":"Search Metadata Filter","dynamic":false,"info":"Optional dictionary of filters to apply to the search query.","list":false,"list_add_label":"Add More","name":"advanced_search_filter","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"NestedDict","value":{}},"api_endpoint":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Astra DB API Endpoint","dynamic":false,"external_options":{},"info":"The API Endpoint for the Astra DB instance. Supercedes database selection.","name":"api_endpoint","options":[],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"astradb_vectorstore_kwargs":{"_input_type":"NestedDictInput","advanced":true,"display_name":"AstraDBVectorStore Parameters","dynamic":false,"info":"Optional dictionary of additional parameters for the AstraDBVectorStore.","list":false,"list_add_label":"Add More","name":"astradb_vectorstore_kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"NestedDict","value":{}},"autodetect_collection":{"_input_type":"BoolInput","advanced":true,"display_name":"Autodetect Collection","dynamic":false,"info":"Boolean flag to determine whether to autodetect the collection.","list":false,"list_add_label":"Add More","name":"autodetect_collection","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from astrapy import DataAPIClient\nfrom langchain_core.documents import Document\n\nfrom lfx.base.datastax.astradb_base import AstraDBBaseComponent\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.base.vectorstores.vector_store_connection_decorator import vector_store_connection\nfrom lfx.helpers.data import docs_to_data\nfrom lfx.io import BoolInput, DropdownInput, FloatInput, HandleInput, IntInput, NestedDictInput, QueryInput, StrInput\nfrom lfx.schema.data import Data\nfrom lfx.serialization import serialize\nfrom lfx.utils.version import get_version_info\n\n\n@vector_store_connection\nclass AstraDBVectorStoreComponent(AstraDBBaseComponent, LCVectorStoreComponent):\n display_name: str = \"Astra DB\"\n description: str = \"Ingest and search documents in Astra DB\"\n documentation: str = \"https://docs.langflow.org/bundles-datastax#astra-db\"\n name = \"AstraDB\"\n icon: str = \"AstraDB\"\n\n inputs = [\n *AstraDBBaseComponent.inputs,\n *LCVectorStoreComponent.inputs,\n HandleInput(\n name=\"embedding_model\",\n display_name=\"Embedding Model\",\n input_types=[\"Embeddings\"],\n info=\"Specify the Embedding Model. Not required for Astra Vectorize collections.\",\n required=False,\n show=True,\n ),\n StrInput(\n name=\"content_field\",\n display_name=\"Content Field\",\n info=\"Field to use as the text content field for the vector store.\",\n advanced=True,\n ),\n StrInput(\n name=\"deletion_field\",\n display_name=\"Deletion Based On Field\",\n info=\"When this parameter is provided, documents in the target collection with \"\n \"metadata field values matching the input metadata field value will be deleted \"\n \"before new data is loaded.\",\n advanced=True,\n ),\n BoolInput(\n name=\"ignore_invalid_documents\",\n display_name=\"Ignore Invalid Documents\",\n info=\"Boolean flag to determine whether to ignore invalid documents at runtime.\",\n advanced=True,\n ),\n NestedDictInput(\n name=\"astradb_vectorstore_kwargs\",\n display_name=\"AstraDBVectorStore Parameters\",\n info=\"Optional dictionary of additional parameters for the AstraDBVectorStore.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"search_method\",\n display_name=\"Search Method\",\n info=(\n \"Determine how your content is matched: Vector finds semantic similarity, \"\n \"and Hybrid Search (suggested) combines both approaches \"\n \"with a reranker.\"\n ),\n options=[\"Hybrid Search\", \"Vector Search\"], # TODO: Restore Lexical Search?\n options_metadata=[{\"icon\": \"SearchHybrid\"}, {\"icon\": \"SearchVector\"}],\n value=\"Vector Search\",\n advanced=True,\n real_time_refresh=True,\n ),\n DropdownInput(\n name=\"reranker\",\n display_name=\"Reranker\",\n info=\"Post-retrieval model that re-scores results for optimal relevance ranking.\",\n show=False,\n toggle=True,\n ),\n QueryInput(\n name=\"lexical_terms\",\n display_name=\"Lexical Terms\",\n info=\"Add additional terms/keywords to augment search precision.\",\n placeholder=\"Enter terms to search...\",\n separator=\" \",\n show=False,\n value=\"\",\n ),\n IntInput(\n name=\"number_of_results\",\n display_name=\"Number of Search Results\",\n info=\"Number of search results to return.\",\n advanced=True,\n value=4,\n ),\n DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n info=\"Search type to use\",\n options=[\"Similarity\", \"Similarity with score threshold\", \"MMR (Max Marginal Relevance)\"],\n value=\"Similarity\",\n advanced=True,\n ),\n FloatInput(\n name=\"search_score_threshold\",\n display_name=\"Search Score Threshold\",\n info=\"Minimum similarity score threshold for search results. \"\n \"(when using 'Similarity with score threshold')\",\n value=0,\n advanced=True,\n ),\n NestedDictInput(\n name=\"advanced_search_filter\",\n display_name=\"Search Metadata Filter\",\n info=\"Optional dictionary of filters to apply to the search query.\",\n advanced=True,\n ),\n ]\n\n async def update_build_config(\n self,\n build_config: dict,\n field_value: str | dict,\n field_name: str | None = None,\n ) -> dict:\n \"\"\"Update build configuration with proper handling of embedding and search options.\"\"\"\n # Handle base astra db build config updates\n build_config = await super().update_build_config(\n build_config,\n field_value=field_value,\n field_name=field_name,\n )\n\n # Set embedding model display based on provider selection\n if isinstance(field_value, dict) and \"02_embedding_generation_provider\" in field_value:\n embedding_provider = field_value.get(\"02_embedding_generation_provider\")\n is_custom_provider = embedding_provider and embedding_provider != \"Bring your own\"\n provider = embedding_provider.lower() if is_custom_provider and embedding_provider is not None else None\n\n build_config[\"embedding_model\"][\"show\"] = not bool(provider)\n build_config[\"embedding_model\"][\"required\"] = not bool(provider)\n\n # Early return if no API endpoint is configured\n if not self.get_api_endpoint():\n return build_config\n\n # Configure search method and related options\n return self._configure_search_options(build_config)\n\n def _configure_search_options(self, build_config: dict) -> dict:\n \"\"\"Configure hybrid search, reranker, and vector search options.\"\"\"\n # Detect available hybrid search capabilities\n hybrid_capabilities = self._detect_hybrid_capabilities()\n\n # Return if we haven't selected a collection\n if not build_config[\"collection_name\"][\"options\"] or not build_config[\"collection_name\"][\"value\"]:\n return build_config\n\n # Get collection options\n collection_options = self._get_collection_options(build_config)\n\n # Get the selected collection index\n index = build_config[\"collection_name\"][\"options\"].index(build_config[\"collection_name\"][\"value\"])\n provider = build_config[\"collection_name\"][\"options_metadata\"][index][\"provider\"]\n build_config[\"embedding_model\"][\"show\"] = not bool(provider)\n build_config[\"embedding_model\"][\"required\"] = not bool(provider)\n\n # Determine search configuration\n is_vector_search = build_config[\"search_method\"][\"value\"] == \"Vector Search\"\n is_autodetect = build_config[\"autodetect_collection\"][\"value\"]\n\n # Apply hybrid search configuration\n if hybrid_capabilities[\"available\"]:\n build_config[\"search_method\"][\"show\"] = True\n build_config[\"search_method\"][\"options\"] = [\"Hybrid Search\", \"Vector Search\"]\n build_config[\"search_method\"][\"value\"] = build_config[\"search_method\"].get(\"value\", \"Hybrid Search\")\n\n build_config[\"reranker\"][\"options\"] = hybrid_capabilities[\"reranker_models\"]\n build_config[\"reranker\"][\"options_metadata\"] = hybrid_capabilities[\"reranker_metadata\"]\n if hybrid_capabilities[\"reranker_models\"]:\n build_config[\"reranker\"][\"value\"] = hybrid_capabilities[\"reranker_models\"][0]\n else:\n build_config[\"search_method\"][\"show\"] = False\n build_config[\"search_method\"][\"options\"] = [\"Vector Search\"]\n build_config[\"search_method\"][\"value\"] = \"Vector Search\"\n build_config[\"reranker\"][\"options\"] = []\n build_config[\"reranker\"][\"options_metadata\"] = []\n\n # Configure reranker visibility and state\n hybrid_enabled = (\n collection_options[\"rerank_enabled\"] and build_config[\"search_method\"][\"value\"] == \"Hybrid Search\"\n )\n\n build_config[\"reranker\"][\"show\"] = hybrid_enabled\n build_config[\"reranker\"][\"toggle_value\"] = hybrid_enabled\n build_config[\"reranker\"][\"toggle_disable\"] = is_vector_search\n\n # Configure lexical terms\n lexical_visible = collection_options[\"lexical_enabled\"] and not is_vector_search\n build_config[\"lexical_terms\"][\"show\"] = lexical_visible\n build_config[\"lexical_terms\"][\"value\"] = \"\" if is_vector_search else build_config[\"lexical_terms\"][\"value\"]\n\n # Configure search type and score threshold\n build_config[\"search_type\"][\"show\"] = is_vector_search\n build_config[\"search_score_threshold\"][\"show\"] = is_vector_search\n\n # Force similarity search for hybrid mode or autodetect\n if hybrid_enabled or is_autodetect:\n build_config[\"search_type\"][\"value\"] = \"Similarity\"\n\n return build_config\n\n def _detect_hybrid_capabilities(self) -> dict:\n \"\"\"Detect available hybrid search and reranking capabilities.\"\"\"\n environment = self.get_environment(self.environment)\n client = DataAPIClient(environment=environment)\n admin_client = client.get_admin()\n db_admin = admin_client.get_database_admin(self.get_api_endpoint(), token=self.token)\n\n try:\n providers = db_admin.find_reranking_providers()\n reranker_models = [\n model.name for provider_data in providers.reranking_providers.values() for model in provider_data.models\n ]\n reranker_metadata = [\n {\"icon\": self.get_provider_icon(provider_name=model.name.split(\"/\")[0])}\n for provider in providers.reranking_providers.values()\n for model in provider.models\n ]\n except Exception as e: # noqa: BLE001\n self.log(f\"Hybrid search not available: {e}\")\n return {\n \"available\": False,\n \"reranker_models\": [],\n \"reranker_metadata\": [],\n }\n else:\n return {\n \"available\": True,\n \"reranker_models\": reranker_models,\n \"reranker_metadata\": reranker_metadata,\n }\n\n def _get_collection_options(self, build_config: dict) -> dict:\n \"\"\"Retrieve collection-level search options.\"\"\"\n database = self.get_database_object(api_endpoint=build_config[\"api_endpoint\"][\"value\"])\n collection = database.get_collection(\n name=build_config[\"collection_name\"][\"value\"],\n keyspace=build_config[\"keyspace\"][\"value\"],\n )\n\n col_options = collection.options()\n\n return {\n \"rerank_enabled\": bool(col_options.rerank and col_options.rerank.enabled),\n \"lexical_enabled\": bool(col_options.lexical and col_options.lexical.enabled),\n }\n\n @check_cached_vector_store\n def build_vector_store(self):\n try:\n from langchain_astradb import AstraDBVectorStore\n from langchain_astradb.utils.astradb import HybridSearchMode\n except ImportError as e:\n msg = (\n \"Could not import langchain Astra DB integration package. \"\n \"Please install it with `pip install langchain-astradb`.\"\n )\n raise ImportError(msg) from e\n\n # Get the embedding model and additional params\n embedding_params = {\"embedding\": self.embedding_model} if self.embedding_model else {}\n\n # Get the additional parameters\n additional_params = self.astradb_vectorstore_kwargs or {}\n\n # Get Langflow version and platform information\n __version__ = get_version_info()[\"version\"]\n langflow_prefix = \"\"\n # if os.getenv(\"AWS_EXECUTION_ENV\") == \"AWS_ECS_FARGATE\": # TODO: More precise way of detecting\n # langflow_prefix = \"ds-\"\n\n # Get the database object\n database = self.get_database_object()\n autodetect = self.collection_name in database.list_collection_names() and self.autodetect_collection\n\n # Bundle up the auto-detect parameters\n autodetect_params = {\n \"autodetect_collection\": autodetect,\n \"content_field\": (\n self.content_field\n if self.content_field and embedding_params\n else (\n \"page_content\"\n if embedding_params\n and self.collection_data(collection_name=self.collection_name, database=database) == 0\n else None\n )\n ),\n \"ignore_invalid_documents\": self.ignore_invalid_documents,\n }\n\n # Choose HybridSearchMode based on the selected param\n hybrid_search_mode = HybridSearchMode.DEFAULT if self.search_method == \"Hybrid Search\" else HybridSearchMode.OFF\n\n # Attempt to build the Vector Store object\n try:\n vector_store = AstraDBVectorStore(\n # Astra DB Authentication Parameters\n token=self.token,\n api_endpoint=database.api_endpoint,\n namespace=database.keyspace,\n collection_name=self.collection_name,\n environment=self.environment,\n # Hybrid Search Parameters\n hybrid_search=hybrid_search_mode,\n # Astra DB Usage Tracking Parameters\n ext_callers=[(f\"{langflow_prefix}langflow\", __version__)],\n # Astra DB Vector Store Parameters\n **autodetect_params,\n **embedding_params,\n **additional_params,\n )\n except ValueError as e:\n msg = f\"Error initializing AstraDBVectorStore: {e}\"\n raise ValueError(msg) from e\n\n # Add documents to the vector store\n self._add_documents_to_vector_store(vector_store)\n\n return vector_store\n\n def _add_documents_to_vector_store(self, vector_store) -> None:\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 msg = \"Vector Store Inputs must be Data objects.\"\n raise TypeError(msg)\n\n documents = [\n Document(page_content=doc.page_content, metadata=serialize(doc.metadata, to_str=True)) for doc in documents\n ]\n\n if documents and self.deletion_field:\n self.log(f\"Deleting documents where {self.deletion_field}\")\n try:\n database = self.get_database_object()\n collection = database.get_collection(self.collection_name, keyspace=database.keyspace)\n delete_values = list({doc.metadata[self.deletion_field] for doc in documents})\n self.log(f\"Deleting documents where {self.deletion_field} matches {delete_values}.\")\n collection.delete_many({f\"metadata.{self.deletion_field}\": {\"$in\": delete_values}})\n except ValueError as e:\n msg = f\"Error deleting documents from AstraDBVectorStore based on '{self.deletion_field}': {e}\"\n raise ValueError(msg) from e\n\n if documents:\n self.log(f\"Adding {len(documents)} documents to the Vector Store.\")\n try:\n vector_store.add_documents(documents)\n except ValueError as e:\n msg = f\"Error adding documents to AstraDBVectorStore: {e}\"\n raise ValueError(msg) from e\n else:\n self.log(\"No documents to add to the Vector Store.\")\n\n def _map_search_type(self) -> str:\n search_type_mapping = {\n \"Similarity with score threshold\": \"similarity_score_threshold\",\n \"MMR (Max Marginal Relevance)\": \"mmr\",\n }\n\n return search_type_mapping.get(self.search_type, \"similarity\")\n\n def _build_search_args(self):\n # Clean up the search query\n query = self.search_query if isinstance(self.search_query, str) and self.search_query.strip() else None\n lexical_terms = self.lexical_terms or None\n\n # Check if we have a search query, and if so set the args\n if query:\n args = {\n \"query\": query,\n \"search_type\": self._map_search_type(),\n \"k\": self.number_of_results,\n \"score_threshold\": self.search_score_threshold,\n \"lexical_query\": lexical_terms,\n }\n elif self.advanced_search_filter:\n args = {\n \"n\": self.number_of_results,\n }\n else:\n return {}\n\n filter_arg = self.advanced_search_filter or {}\n if filter_arg:\n args[\"filter\"] = filter_arg\n\n return args\n\n def search_documents(self, vector_store=None) -> list[Data]:\n vector_store = vector_store or self.build_vector_store()\n\n self.log(f\"Search input: {self.search_query}\")\n self.log(f\"Search type: {self.search_type}\")\n self.log(f\"Number of results: {self.number_of_results}\")\n self.log(f\"store.hybrid_search: {vector_store.hybrid_search}\")\n self.log(f\"Lexical terms: {self.lexical_terms}\")\n self.log(f\"Reranker: {self.reranker}\")\n\n try:\n search_args = self._build_search_args()\n except ValueError as e:\n msg = f\"Error in AstraDBVectorStore._build_search_args: {e}\"\n raise ValueError(msg) from e\n\n if not search_args:\n self.log(\"No search input or filters provided. Skipping search.\")\n return []\n\n docs = []\n search_method = \"search\" if \"query\" in search_args else \"metadata_search\"\n\n try:\n self.log(f\"Calling vector_store.{search_method} with args: {search_args}\")\n docs = getattr(vector_store, search_method)(**search_args)\n except ValueError as e:\n msg = f\"Error performing {search_method} in AstraDBVectorStore: {e}\"\n raise ValueError(msg) from e\n\n self.log(f\"Retrieved documents: {len(docs)}\")\n\n data = docs_to_data(docs)\n self.log(f\"Converted documents to data: {len(data)}\")\n self.status = data\n\n return data\n\n def get_retriever_kwargs(self):\n search_args = self._build_search_args()\n\n return {\n \"search_type\": self._map_search_type(),\n \"search_kwargs\": search_args,\n }\n"},"collection_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{"fields":{"data":{"node":{"description":"Please allow several seconds for creation to complete.","display_name":"Create new collection","field_order":["01_new_collection_name","02_embedding_generation_provider","03_embedding_generation_model","04_dimension"],"name":"create_collection","template":{"01_new_collection_name":{"_input_type":"StrInput","advanced":false,"display_name":"Name","dynamic":false,"info":"Name of the new collection to create in Astra DB.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"new_collection_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"02_embedding_generation_provider":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Embedding generation method","dynamic":false,"external_options":{},"helper_text":"To create collections with more embedding provider options, go to your database in Astra DB","info":"Provider to use for generating embeddings.","name":"embedding_generation_provider","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"03_embedding_generation_model":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Embedding model","dynamic":false,"external_options":{},"info":"Model to use for generating embeddings.","name":"embedding_generation_model","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"04_dimension":{"_input_type":"IntInput","advanced":false,"display_name":"Dimensions","dynamic":false,"info":"Dimensions of the embeddings to generate.","list":false,"list_add_label":"Add More","name":"dimension","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int"}}}}},"functionality":"create"},"display_name":"Collection","dynamic":false,"external_options":{},"info":"The name of the collection within Astra DB where the vectors will be stored.","name":"collection_name","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"refresh_button":true,"required":true,"show":false,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"content_field":{"_input_type":"StrInput","advanced":true,"display_name":"Content Field","dynamic":false,"info":"Field to use as the text content field for the vector store.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"content_field","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"database_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{"fields":{"data":{"node":{"description":"Please allow several minutes for creation to complete.","display_name":"Create new database","field_order":["01_new_database_name","02_cloud_provider","03_region"],"name":"create_database","template":{"01_new_database_name":{"_input_type":"StrInput","advanced":false,"display_name":"Name","dynamic":false,"info":"Name of the new database to create in Astra DB.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"new_database_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"02_cloud_provider":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Cloud provider","dynamic":false,"external_options":{},"info":"Cloud provider for the new database.","name":"cloud_provider","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"03_region":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Region","dynamic":false,"external_options":{},"info":"Region for the new database.","name":"region","options":[],"options_metadata":[],"placeholder":"","required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""}}}}},"functionality":"create"},"display_name":"Database","dynamic":false,"external_options":{},"info":"The Database name for the Astra DB instance.","name":"database_name","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"refresh_button":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"deletion_field":{"_input_type":"StrInput","advanced":true,"display_name":"Deletion Based On Field","dynamic":false,"info":"When this parameter is provided, documents in the target collection with metadata field values matching the input metadata field value will be deleted before new data is loaded.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"deletion_field","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"embedding_model":{"_input_type":"HandleInput","advanced":false,"display_name":"Embedding Model","dynamic":false,"info":"Specify the Embedding Model. Not required for Astra Vectorize collections.","input_types":["Embeddings"],"list":false,"list_add_label":"Add More","name":"embedding_model","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"environment":{"_input_type":"DropdownInput","advanced":true,"combobox":true,"dialog_inputs":{},"display_name":"Environment","dynamic":false,"external_options":{},"info":"The environment for the Astra DB API Endpoint.","name":"environment","options":["prod","test","dev"],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"prod"},"ignore_invalid_documents":{"_input_type":"BoolInput","advanced":true,"display_name":"Ignore Invalid Documents","dynamic":false,"info":"Boolean flag to determine whether to ignore invalid documents at runtime.","list":false,"list_add_label":"Add More","name":"ignore_invalid_documents","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"ingest_data":{"_input_type":"HandleInput","advanced":false,"display_name":"Ingest Data","dynamic":false,"info":"","input_types":["Data","DataFrame"],"list":true,"list_add_label":"Add More","name":"ingest_data","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"keyspace":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Keyspace","dynamic":false,"external_options":{},"info":"Optional keyspace within Astra DB to use for the collection.","name":"keyspace","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"lexical_terms":{"_input_type":"QueryInput","advanced":false,"display_name":"Lexical Terms","dynamic":false,"info":"Add additional terms/keywords to augment search precision.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"lexical_terms","placeholder":"Enter terms to search...","required":false,"separator":" ","show":false,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"query","value":""},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Search Results","dynamic":false,"info":"Number of search results to return.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":4},"reranker":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Reranker","dynamic":false,"external_options":{},"info":"Post-retrieval model that re-scores results for optimal relevance ranking.","name":"reranker","options":[],"options_metadata":[],"placeholder":"","required":false,"show":false,"title_case":false,"toggle":true,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"search_method":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Search Method","dynamic":false,"external_options":{},"info":"Determine how your content is matched: Vector finds semantic similarity, and Hybrid Search (suggested) combines both approaches with a reranker.","name":"search_method","options":["Hybrid Search","Vector Search"],"options_metadata":[{"icon":"SearchHybrid"},{"icon":"SearchVector"}],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Vector Search"},"search_query":{"_input_type":"QueryInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Enter a query to run a similarity search.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"search_query","placeholder":"Enter a query...","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"query","value":""},"search_score_threshold":{"_input_type":"FloatInput","advanced":true,"display_name":"Search Score Threshold","dynamic":false,"info":"Minimum similarity score threshold for search results. (when using 'Similarity with score threshold')","list":false,"list_add_label":"Add More","name":"search_score_threshold","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":0.0},"search_type":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Search Type","dynamic":false,"external_options":{},"info":"Search type to use","name":"search_type","options":["Similarity","Similarity with score threshold","MMR (Max Marginal Relevance)"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Similarity"},"should_cache_vector_store":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache Vector Store","dynamic":false,"info":"If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.","list":false,"list_add_label":"Add More","name":"should_cache_vector_store","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Astra DB Application Token","dynamic":false,"info":"Authentication token for accessing Astra DB.","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"ASTRA_DB_APPLICATION_TOKEN"}},"tool_mode":false},"AstraDBCQLToolComponent":{"base_classes":["Data","Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Create a tool to get transactional data from DataStax Astra DB CQL Table","display_name":"Astra DB CQL","documentation":"https://docs.langflow.org/bundles-datastax#astra-db-cql","edited":false,"field_order":["token","environment","database_name","api_endpoint","keyspace","collection_name","autodetect_collection","tool_name","tool_description","projection_fields","tools_params","partition_keys","clustering_keys","static_filters","number_of_results"],"frozen":false,"icon":"AstraDB","legacy":false,"metadata":{"code_hash":"310b6119b0af","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"langchain_core","version":"0.3.79"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.datastax.astradb_cql.AstraDBCQLToolComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"run_model","name":"api_run_model","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool","group_outputs":false,"method":"build_tool","name":"api_build_tool","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_endpoint":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Astra DB API Endpoint","dynamic":false,"external_options":{},"info":"The API Endpoint for the Astra DB instance. Supercedes database selection.","name":"api_endpoint","options":[],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"autodetect_collection":{"_input_type":"BoolInput","advanced":true,"display_name":"Autodetect Collection","dynamic":false,"info":"Boolean flag to determine whether to autodetect the collection.","list":false,"list_add_label":"Add More","name":"autodetect_collection","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"clustering_keys":{"_input_type":"DictInput","advanced":true,"display_name":"DEPRECATED: Clustering Keys","dynamic":false,"info":"Field name and description to the model","list":true,"list_add_label":"Add More","name":"clustering_keys","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import json\nimport urllib\nfrom datetime import datetime, timezone\nfrom http import HTTPStatus\nfrom typing import Any\n\nimport requests\nfrom langchain_core.tools import StructuredTool, Tool\nfrom pydantic import BaseModel, Field, create_model\n\nfrom lfx.base.datastax.astradb_base import AstraDBBaseComponent\nfrom lfx.base.langchain_utilities.model import LCToolComponent\nfrom lfx.io import DictInput, IntInput, StrInput, TableInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\nfrom lfx.schema.table import EditMode\n\n\nclass AstraDBCQLToolComponent(AstraDBBaseComponent, LCToolComponent):\n display_name: str = \"Astra DB CQL\"\n description: str = \"Create a tool to get transactional data from DataStax Astra DB CQL Table\"\n documentation: str = \"https://docs.langflow.org/bundles-datastax#astra-db-cql\"\n icon: str = \"AstraDB\"\n\n inputs = [\n *AstraDBBaseComponent.inputs,\n StrInput(name=\"tool_name\", display_name=\"Tool Name\", info=\"The name of the tool.\", required=True),\n StrInput(\n name=\"tool_description\",\n display_name=\"Tool Description\",\n info=\"The tool description to be passed to the model.\",\n required=True,\n ),\n StrInput(\n name=\"projection_fields\",\n display_name=\"Projection fields\",\n info=\"Attributes to return separated by comma.\",\n required=True,\n value=\"*\",\n advanced=True,\n ),\n TableInput(\n name=\"tools_params\",\n display_name=\"Tools Parameters\",\n info=\"Define the structure for the tool parameters. Describe the parameters \"\n \"in a way the LLM can understand how to use them. Add the parameters \"\n \"respecting the table schema (Partition Keys, Clustering Keys and Indexed Fields).\",\n required=False,\n table_schema=[\n {\n \"name\": \"name\",\n \"display_name\": \"Name\",\n \"type\": \"str\",\n \"description\": \"Name of the field/parameter to be used by the model.\",\n \"default\": \"field\",\n \"edit_mode\": EditMode.INLINE,\n },\n {\n \"name\": \"field_name\",\n \"display_name\": \"Field Name\",\n \"type\": \"str\",\n \"description\": \"Specify the column name to be filtered on the table. \"\n \"Leave empty if the attribute name is the same as the name of the field.\",\n \"default\": \"\",\n \"edit_mode\": EditMode.INLINE,\n },\n {\n \"name\": \"description\",\n \"display_name\": \"Description\",\n \"type\": \"str\",\n \"description\": \"Describe the purpose of the parameter.\",\n \"default\": \"description of tool parameter\",\n \"edit_mode\": EditMode.POPOVER,\n },\n {\n \"name\": \"mandatory\",\n \"display_name\": \"Is Mandatory\",\n \"type\": \"boolean\",\n \"edit_mode\": EditMode.INLINE,\n \"description\": (\"Indicate if the field is mandatory.\"),\n \"options\": [\"True\", \"False\"],\n \"default\": \"False\",\n },\n {\n \"name\": \"is_timestamp\",\n \"display_name\": \"Is Timestamp\",\n \"type\": \"boolean\",\n \"edit_mode\": EditMode.INLINE,\n \"description\": (\"Indicate if the field is a timestamp.\"),\n \"options\": [\"True\", \"False\"],\n \"default\": \"False\",\n },\n {\n \"name\": \"operator\",\n \"display_name\": \"Operator\",\n \"type\": \"str\",\n \"description\": \"Set the operator for the field. \"\n \"https://docs.datastax.com/en/astra-db-serverless/api-reference/documents.html#operators\",\n \"default\": \"$eq\",\n \"options\": [\"$gt\", \"$gte\", \"$lt\", \"$lte\", \"$eq\", \"$ne\", \"$in\", \"$nin\", \"$exists\", \"$all\", \"$size\"],\n \"edit_mode\": EditMode.INLINE,\n },\n ],\n value=[],\n ),\n DictInput(\n name=\"partition_keys\",\n display_name=\"DEPRECATED: Partition Keys\",\n is_list=True,\n info=\"Field name and description to the model\",\n required=False,\n advanced=True,\n ),\n DictInput(\n name=\"clustering_keys\",\n display_name=\"DEPRECATED: Clustering Keys\",\n is_list=True,\n info=\"Field name and description to the model\",\n required=False,\n advanced=True,\n ),\n DictInput(\n name=\"static_filters\",\n display_name=\"Static Filters\",\n is_list=True,\n advanced=True,\n info=\"Field name and value. When filled, it will not be generated by the LLM.\",\n ),\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=5,\n ),\n ]\n\n def parse_timestamp(self, timestamp_str: str) -> str:\n \"\"\"Parse a timestamp string into Astra DB REST API format.\n\n Args:\n timestamp_str (str): Input timestamp string\n\n Returns:\n str: Formatted timestamp string in YYYY-MM-DDTHH:MI:SS.000Z format\n\n Raises:\n ValueError: If the timestamp cannot be parsed\n \"\"\"\n # Common datetime formats to try\n formats = [\n \"%Y-%m-%d\", # 2024-03-21\n \"%Y-%m-%dT%H:%M:%S\", # 2024-03-21T15:30:00\n \"%Y-%m-%dT%H:%M:%S%z\", # 2024-03-21T15:30:00+0000\n \"%Y-%m-%d %H:%M:%S\", # 2024-03-21 15:30:00\n \"%d/%m/%Y\", # 21/03/2024\n \"%Y/%m/%d\", # 2024/03/21\n ]\n\n for fmt in formats:\n try:\n # Parse the date string\n date_obj = datetime.strptime(timestamp_str, fmt).astimezone()\n\n # If the parsed date has no timezone info, assume UTC\n if date_obj.tzinfo is None:\n date_obj = date_obj.replace(tzinfo=timezone.utc)\n\n # Convert to UTC and format\n utc_date = date_obj.astimezone(timezone.utc)\n return utc_date.strftime(\"%Y-%m-%dT%H:%M:%S.000Z\")\n except ValueError:\n continue\n\n msg = f\"Could not parse date: {timestamp_str}\"\n logger.error(msg)\n raise ValueError(msg)\n\n def astra_rest(self, args):\n headers = {\"Accept\": \"application/json\", \"X-Cassandra-Token\": f\"{self.token}\"}\n astra_url = f\"{self.get_api_endpoint()}/api/rest/v2/keyspaces/{self.get_keyspace()}/{self.collection_name}/\"\n where = {}\n\n for param in self.tools_params:\n field_name = param[\"field_name\"] if param[\"field_name\"] else param[\"name\"]\n field_value = None\n\n if field_name in self.static_filters:\n field_value = self.static_filters[field_name]\n elif param[\"name\"] in args:\n field_value = args[param[\"name\"]]\n\n if field_value is None:\n continue\n\n if param[\"is_timestamp\"] == True: # noqa: E712\n try:\n field_value = self.parse_timestamp(field_value)\n except ValueError as e:\n msg = f\"Error parsing timestamp: {e} - Use the prompt to specify the date in the correct format\"\n logger.error(msg)\n raise ValueError(msg) from e\n\n if param[\"operator\"] == \"$exists\":\n where[field_name] = {**where.get(field_name, {}), param[\"operator\"]: True}\n elif param[\"operator\"] in [\"$in\", \"$nin\", \"$all\"]:\n where[field_name] = {\n **where.get(field_name, {}),\n param[\"operator\"]: field_value.split(\",\") if isinstance(field_value, str) else field_value,\n }\n else:\n where[field_name] = {**where.get(field_name, {}), param[\"operator\"]: field_value}\n\n url = f\"{astra_url}?page-size={self.number_of_results}\"\n url += f\"&where={json.dumps(where)}\"\n\n if self.projection_fields != \"*\":\n url += f\"&fields={urllib.parse.quote(self.projection_fields.replace(' ', ''))}\"\n\n res = requests.request(\"GET\", url=url, headers=headers, timeout=10)\n\n if int(res.status_code) >= HTTPStatus.BAD_REQUEST:\n msg = f\"Error on Astra DB CQL Tool {self.tool_name} request: {res.text}\"\n logger.error(msg)\n raise ValueError(msg)\n\n try:\n res_data = res.json()\n return res_data[\"data\"]\n except ValueError:\n return res.status_code\n\n def create_args_schema(self) -> dict[str, BaseModel]:\n args: dict[str, tuple[Any, Field]] = {}\n\n for param in self.tools_params:\n field_name = param[\"field_name\"] if param[\"field_name\"] else param[\"name\"]\n if field_name not in self.static_filters:\n if param[\"mandatory\"]:\n args[param[\"name\"]] = (str, Field(description=param[\"description\"]))\n else:\n args[param[\"name\"]] = (str | None, Field(description=param[\"description\"], default=None))\n\n model = create_model(\"ToolInput\", **args, __base__=BaseModel)\n return {\"ToolInput\": model}\n\n def build_tool(self) -> Tool:\n \"\"\"Builds a Astra DB CQL Table tool.\n\n Args:\n name (str, optional): The name of the tool.\n\n Returns:\n Tool: The built Astra DB tool.\n \"\"\"\n schema_dict = self.create_args_schema()\n return StructuredTool.from_function(\n name=self.tool_name,\n args_schema=schema_dict[\"ToolInput\"],\n description=self.tool_description,\n func=self.run_model,\n return_direct=False,\n )\n\n def projection_args(self, input_str: str) -> dict:\n elements = input_str.split(\",\")\n result = {}\n\n for element in elements:\n if element.startswith(\"!\"):\n result[element[1:]] = False\n else:\n result[element] = True\n\n return result\n\n def run_model(self, **args) -> Data | list[Data]:\n results = self.astra_rest(args)\n data: list[Data] = []\n\n if isinstance(results, list):\n data = [Data(data=doc) for doc in results]\n else:\n self.status = results\n return []\n\n self.status = data\n return data\n"},"collection_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{"fields":{"data":{"node":{"description":"Please allow several seconds for creation to complete.","display_name":"Create new collection","field_order":["01_new_collection_name","02_embedding_generation_provider","03_embedding_generation_model","04_dimension"],"name":"create_collection","template":{"01_new_collection_name":{"_input_type":"StrInput","advanced":false,"display_name":"Name","dynamic":false,"info":"Name of the new collection to create in Astra DB.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"new_collection_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"02_embedding_generation_provider":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Embedding generation method","dynamic":false,"external_options":{},"helper_text":"To create collections with more embedding provider options, go to your database in Astra DB","info":"Provider to use for generating embeddings.","name":"embedding_generation_provider","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"03_embedding_generation_model":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Embedding model","dynamic":false,"external_options":{},"info":"Model to use for generating embeddings.","name":"embedding_generation_model","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"04_dimension":{"_input_type":"IntInput","advanced":false,"display_name":"Dimensions","dynamic":false,"info":"Dimensions of the embeddings to generate.","list":false,"list_add_label":"Add More","name":"dimension","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int"}}}}},"functionality":"create"},"display_name":"Collection","dynamic":false,"external_options":{},"info":"The name of the collection within Astra DB where the vectors will be stored.","name":"collection_name","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"refresh_button":true,"required":true,"show":false,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"database_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{"fields":{"data":{"node":{"description":"Please allow several minutes for creation to complete.","display_name":"Create new database","field_order":["01_new_database_name","02_cloud_provider","03_region"],"name":"create_database","template":{"01_new_database_name":{"_input_type":"StrInput","advanced":false,"display_name":"Name","dynamic":false,"info":"Name of the new database to create in Astra DB.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"new_database_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"02_cloud_provider":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Cloud provider","dynamic":false,"external_options":{},"info":"Cloud provider for the new database.","name":"cloud_provider","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"03_region":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Region","dynamic":false,"external_options":{},"info":"Region for the new database.","name":"region","options":[],"options_metadata":[],"placeholder":"","required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""}}}}},"functionality":"create"},"display_name":"Database","dynamic":false,"external_options":{},"info":"The Database name for the Astra DB instance.","name":"database_name","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"refresh_button":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"environment":{"_input_type":"DropdownInput","advanced":true,"combobox":true,"dialog_inputs":{},"display_name":"Environment","dynamic":false,"external_options":{},"info":"The environment for the Astra DB API Endpoint.","name":"environment","options":["prod","test","dev"],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"prod"},"keyspace":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Keyspace","dynamic":false,"external_options":{},"info":"Optional keyspace within Astra DB to use for the collection.","name":"keyspace","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Results","dynamic":false,"info":"Number of results to return.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":5},"partition_keys":{"_input_type":"DictInput","advanced":true,"display_name":"DEPRECATED: Partition Keys","dynamic":false,"info":"Field name and description to the model","list":true,"list_add_label":"Add More","name":"partition_keys","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"projection_fields":{"_input_type":"StrInput","advanced":true,"display_name":"Projection fields","dynamic":false,"info":"Attributes to return separated by comma.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"projection_fields","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"*"},"static_filters":{"_input_type":"DictInput","advanced":true,"display_name":"Static Filters","dynamic":false,"info":"Field name and value. When filled, it will not be generated by the LLM.","list":true,"list_add_label":"Add More","name":"static_filters","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Astra DB Application Token","dynamic":false,"info":"Authentication token for accessing Astra DB.","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"ASTRA_DB_APPLICATION_TOKEN"},"tool_description":{"_input_type":"StrInput","advanced":false,"display_name":"Tool Description","dynamic":false,"info":"The tool description to be passed to the model.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tool_description","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tool_name":{"_input_type":"StrInput","advanced":false,"display_name":"Tool Name","dynamic":false,"info":"The name of the tool.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tool_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tools_params":{"_input_type":"TableInput","advanced":false,"display_name":"Tools Parameters","dynamic":false,"info":"Define the structure for the tool parameters. Describe the parameters in a way the LLM can understand how to use them. Add the parameters respecting the table schema (Partition Keys, Clustering Keys and Indexed Fields).","is_list":true,"list_add_label":"Add More","name":"tools_params","placeholder":"","required":false,"show":true,"table_icon":"Table","table_schema":[{"default":"field","description":"Name of the field/parameter to be used by the model.","display_name":"Name","edit_mode":"inline","name":"name","type":"str"},{"default":"","description":"Specify the column name to be filtered on the table. Leave empty if the attribute name is the same as the name of the field.","display_name":"Field Name","edit_mode":"inline","name":"field_name","type":"str"},{"default":"description of tool parameter","description":"Describe the purpose of the parameter.","display_name":"Description","edit_mode":"popover","name":"description","type":"str"},{"default":"False","description":"Indicate if the field is mandatory.","display_name":"Is Mandatory","edit_mode":"inline","name":"mandatory","options":["True","False"],"type":"boolean"},{"default":"False","description":"Indicate if the field is a timestamp.","display_name":"Is Timestamp","edit_mode":"inline","name":"is_timestamp","options":["True","False"],"type":"boolean"},{"default":"$eq","description":"Set the operator for the field. https://docs.datastax.com/en/astra-db-serverless/api-reference/documents.html#operators","display_name":"Operator","edit_mode":"inline","name":"operator","options":["$gt","$gte","$lt","$lte","$eq","$ne","$in","$nin","$exists","$all","$size"],"type":"str"}],"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"trigger_icon":"Table","trigger_text":"Open table","type":"table","value":[]}},"tool_mode":false},"AstraDBChatMemory":{"base_classes":["Memory"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Retrieves and stores chat messages from Astra DB.","display_name":"Astra DB Chat Memory","documentation":"","edited":false,"field_order":["token","environment","database_name","api_endpoint","keyspace","collection_name","autodetect_collection","session_id"],"frozen":false,"icon":"AstraDB","legacy":false,"metadata":{"code_hash":"bafc81f78c76","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"langchain_astradb","version":"0.6.1"}],"total_dependencies":2},"module":"lfx.components.datastax.astradb_chatmemory.AstraDBChatMemory"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Memory","group_outputs":false,"method":"build_message_history","name":"memory","selected":"Memory","tool_mode":true,"types":["Memory"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_endpoint":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Astra DB API Endpoint","dynamic":false,"external_options":{},"info":"The API Endpoint for the Astra DB instance. Supercedes database selection.","name":"api_endpoint","options":[],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"autodetect_collection":{"_input_type":"BoolInput","advanced":true,"display_name":"Autodetect Collection","dynamic":false,"info":"Boolean flag to determine whether to autodetect the collection.","list":false,"list_add_label":"Add More","name":"autodetect_collection","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.datastax.astradb_base import AstraDBBaseComponent\nfrom lfx.base.memory.model import LCChatMemoryComponent\nfrom lfx.field_typing.constants import Memory\nfrom lfx.inputs.inputs import MessageTextInput\n\n\nclass AstraDBChatMemory(AstraDBBaseComponent, LCChatMemoryComponent):\n display_name = \"Astra DB Chat Memory\"\n description = \"Retrieves and stores chat messages from Astra DB.\"\n name = \"AstraDBChatMemory\"\n icon: str = \"AstraDB\"\n\n inputs = [\n *AstraDBBaseComponent.inputs,\n MessageTextInput(\n name=\"session_id\",\n display_name=\"Session ID\",\n info=\"The session ID of the chat. If empty, the current session ID parameter will be used.\",\n advanced=True,\n ),\n ]\n\n def build_message_history(self) -> Memory:\n try:\n from langchain_astradb.chat_message_histories import AstraDBChatMessageHistory\n except ImportError as e:\n msg = (\n \"Could not import langchain Astra DB integration package. \"\n \"Please install it with `uv pip install langchain-astradb`.\"\n )\n raise ImportError(msg) from e\n\n return AstraDBChatMessageHistory(\n session_id=self.session_id,\n collection_name=self.collection_name,\n token=self.token,\n api_endpoint=self.get_api_endpoint(),\n namespace=self.get_keyspace(),\n environment=self.environment,\n )\n"},"collection_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{"fields":{"data":{"node":{"description":"Please allow several seconds for creation to complete.","display_name":"Create new collection","field_order":["01_new_collection_name","02_embedding_generation_provider","03_embedding_generation_model","04_dimension"],"name":"create_collection","template":{"01_new_collection_name":{"_input_type":"StrInput","advanced":false,"display_name":"Name","dynamic":false,"info":"Name of the new collection to create in Astra DB.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"new_collection_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"02_embedding_generation_provider":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Embedding generation method","dynamic":false,"external_options":{},"helper_text":"To create collections with more embedding provider options, go to your database in Astra DB","info":"Provider to use for generating embeddings.","name":"embedding_generation_provider","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"03_embedding_generation_model":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Embedding model","dynamic":false,"external_options":{},"info":"Model to use for generating embeddings.","name":"embedding_generation_model","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"04_dimension":{"_input_type":"IntInput","advanced":false,"display_name":"Dimensions","dynamic":false,"info":"Dimensions of the embeddings to generate.","list":false,"list_add_label":"Add More","name":"dimension","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int"}}}}},"functionality":"create"},"display_name":"Collection","dynamic":false,"external_options":{},"info":"The name of the collection within Astra DB where the vectors will be stored.","name":"collection_name","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"refresh_button":true,"required":true,"show":false,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"database_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{"fields":{"data":{"node":{"description":"Please allow several minutes for creation to complete.","display_name":"Create new database","field_order":["01_new_database_name","02_cloud_provider","03_region"],"name":"create_database","template":{"01_new_database_name":{"_input_type":"StrInput","advanced":false,"display_name":"Name","dynamic":false,"info":"Name of the new database to create in Astra DB.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"new_database_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"02_cloud_provider":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Cloud provider","dynamic":false,"external_options":{},"info":"Cloud provider for the new database.","name":"cloud_provider","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"03_region":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Region","dynamic":false,"external_options":{},"info":"Region for the new database.","name":"region","options":[],"options_metadata":[],"placeholder":"","required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""}}}}},"functionality":"create"},"display_name":"Database","dynamic":false,"external_options":{},"info":"The Database name for the Astra DB instance.","name":"database_name","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"refresh_button":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"environment":{"_input_type":"DropdownInput","advanced":true,"combobox":true,"dialog_inputs":{},"display_name":"Environment","dynamic":false,"external_options":{},"info":"The environment for the Astra DB API Endpoint.","name":"environment","options":["prod","test","dev"],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"prod"},"keyspace":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Keyspace","dynamic":false,"external_options":{},"info":"Optional keyspace within Astra DB to use for the collection.","name":"keyspace","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"session_id":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Session ID","dynamic":false,"info":"The session ID of the chat. If empty, the current session ID parameter will be used.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"session_id","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Astra DB Application Token","dynamic":false,"info":"Authentication token for accessing Astra DB.","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"ASTRA_DB_APPLICATION_TOKEN"}},"tool_mode":false},"AstraDBGraph":{"base_classes":["Data","DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Implementation of Graph Vector Store using Astra DB","display_name":"Astra DB Graph","documentation":"https://docs.langflow.org/bundles-datastax#astra-db-graph","edited":false,"field_order":["token","environment","database_name","api_endpoint","keyspace","collection_name","autodetect_collection","ingest_data","search_query","should_cache_vector_store","metadata_incoming_links_key","number_of_results","search_type","search_score_threshold","search_filter"],"frozen":false,"icon":"AstraDB","legacy":true,"metadata":{"code_hash":"f8b425c1f535","dependencies":{"dependencies":[{"name":"orjson","version":"3.10.15"},{"name":"lfx","version":null},{"name":"langchain_astradb","version":"0.6.1"}],"total_dependencies":3},"module":"lfx.components.datastax.astradb_graph.AstraDBGraphVectorStoreComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Search Results","group_outputs":false,"method":"search_documents","name":"search_results","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":["datastax.GraphRAG"],"template":{"_type":"Component","api_endpoint":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Astra DB API Endpoint","dynamic":false,"external_options":{},"info":"The API Endpoint for the Astra DB instance. Supercedes database selection.","name":"api_endpoint","options":[],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"autodetect_collection":{"_input_type":"BoolInput","advanced":true,"display_name":"Autodetect Collection","dynamic":false,"info":"Boolean flag to determine whether to autodetect the collection.","list":false,"list_add_label":"Add More","name":"autodetect_collection","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import orjson\n\nfrom lfx.base.datastax.astradb_base import AstraDBBaseComponent\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.helpers.data import docs_to_data\nfrom lfx.inputs.inputs import (\n DictInput,\n DropdownInput,\n FloatInput,\n IntInput,\n StrInput,\n)\nfrom lfx.schema.data import Data\n\n\nclass AstraDBGraphVectorStoreComponent(AstraDBBaseComponent, LCVectorStoreComponent):\n display_name: str = \"Astra DB Graph\"\n description: str = \"Implementation of Graph Vector Store using Astra DB\"\n name = \"AstraDBGraph\"\n documentation: str = \"https://docs.langflow.org/bundles-datastax#astra-db-graph\"\n icon: str = \"AstraDB\"\n legacy: bool = True\n replacement = [\"datastax.GraphRAG\"]\n\n inputs = [\n *AstraDBBaseComponent.inputs,\n *LCVectorStoreComponent.inputs,\n StrInput(\n name=\"metadata_incoming_links_key\",\n display_name=\"Metadata incoming links key\",\n info=\"Metadata key used for incoming links.\",\n advanced=True,\n ),\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 DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n info=\"Search type to use\",\n options=[\n \"Similarity\",\n \"Similarity with score threshold\",\n \"MMR (Max Marginal Relevance)\",\n \"Graph Traversal\",\n \"MMR (Max Marginal Relevance) Graph Traversal\",\n ],\n value=\"MMR (Max Marginal Relevance) Graph Traversal\",\n advanced=True,\n ),\n FloatInput(\n name=\"search_score_threshold\",\n display_name=\"Search Score Threshold\",\n info=\"Minimum similarity score threshold for search results. \"\n \"(when using 'Similarity with score threshold')\",\n value=0,\n advanced=True,\n ),\n DictInput(\n name=\"search_filter\",\n display_name=\"Search Metadata Filter\",\n info=\"Optional dictionary of filters to apply to the search query.\",\n advanced=True,\n is_list=True,\n ),\n ]\n\n @check_cached_vector_store\n def build_vector_store(self):\n try:\n from langchain_astradb import AstraDBGraphVectorStore\n from langchain_astradb.utils.astradb import SetupMode\n except ImportError as e:\n msg = (\n \"Could not import langchain Astra DB integration package. \"\n \"Please install it with `pip install langchain-astradb`.\"\n )\n raise ImportError(msg) from e\n\n try:\n if not self.setup_mode:\n self.setup_mode = self._inputs[\"setup_mode\"].options[0]\n\n setup_mode_value = SetupMode[self.setup_mode.upper()]\n except KeyError as e:\n msg = f\"Invalid setup mode: {self.setup_mode}\"\n raise ValueError(msg) from e\n\n try:\n self.log(f\"Initializing Graph Vector Store {self.collection_name}\")\n\n vector_store = AstraDBGraphVectorStore(\n embedding=self.embedding_model,\n collection_name=self.collection_name,\n metadata_incoming_links_key=self.metadata_incoming_links_key or \"incoming_links\",\n token=self.token,\n api_endpoint=self.get_api_endpoint(),\n namespace=self.get_keyspace(),\n environment=self.environment,\n metric=self.metric or None,\n batch_size=self.batch_size or None,\n bulk_insert_batch_concurrency=self.bulk_insert_batch_concurrency or None,\n bulk_insert_overwrite_concurrency=self.bulk_insert_overwrite_concurrency or None,\n bulk_delete_concurrency=self.bulk_delete_concurrency or None,\n setup_mode=setup_mode_value,\n pre_delete_collection=self.pre_delete_collection,\n metadata_indexing_include=[s for s in self.metadata_indexing_include if s] or None,\n metadata_indexing_exclude=[s for s in self.metadata_indexing_exclude if s] or None,\n collection_indexing_policy=orjson.loads(self.collection_indexing_policy.encode(\"utf-8\"))\n if self.collection_indexing_policy\n else None,\n )\n except Exception as e:\n msg = f\"Error initializing AstraDBGraphVectorStore: {e}\"\n raise ValueError(msg) from e\n\n self.log(f\"Vector Store initialized: {vector_store.astra_env.collection_name}\")\n self._add_documents_to_vector_store(vector_store)\n\n return vector_store\n\n def _add_documents_to_vector_store(self, vector_store) -> None:\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 msg = \"Vector Store Inputs must be Data objects.\"\n raise TypeError(msg)\n\n if documents:\n self.log(f\"Adding {len(documents)} documents to the Vector Store.\")\n try:\n vector_store.add_documents(documents)\n except Exception as e:\n msg = f\"Error adding documents to AstraDBGraphVectorStore: {e}\"\n raise ValueError(msg) from e\n else:\n self.log(\"No documents to add to the Vector Store.\")\n\n def _map_search_type(self) -> str:\n match self.search_type:\n case \"Similarity\":\n return \"similarity\"\n case \"Similarity with score threshold\":\n return \"similarity_score_threshold\"\n case \"MMR (Max Marginal Relevance)\":\n return \"mmr\"\n case \"Graph Traversal\":\n return \"traversal\"\n case \"MMR (Max Marginal Relevance) Graph Traversal\":\n return \"mmr_traversal\"\n case _:\n return \"similarity\"\n\n def _build_search_args(self):\n args = {\n \"k\": self.number_of_results,\n \"score_threshold\": self.search_score_threshold,\n }\n\n if self.search_filter:\n clean_filter = {k: v for k, v in self.search_filter.items() if k and v}\n if len(clean_filter) > 0:\n args[\"filter\"] = clean_filter\n return args\n\n def search_documents(self, vector_store=None) -> list[Data]:\n if not vector_store:\n vector_store = self.build_vector_store()\n\n self.log(\"Searching for documents in AstraDBGraphVectorStore.\")\n self.log(f\"Search query: {self.search_query}\")\n self.log(f\"Search type: {self.search_type}\")\n self.log(f\"Number of results: {self.number_of_results}\")\n\n if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():\n try:\n search_type = self._map_search_type()\n search_args = self._build_search_args()\n\n docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)\n\n # Drop links from the metadata. At this point the links don't add any value for building the\n # context and haven't been restored to json which causes the conversion to fail.\n self.log(\"Removing links from metadata.\")\n for doc in docs:\n if \"links\" in doc.metadata:\n doc.metadata.pop(\"links\")\n\n except Exception as e:\n msg = f\"Error performing search in AstraDBGraphVectorStore: {e}\"\n raise ValueError(msg) from e\n\n self.log(f\"Retrieved documents: {len(docs)}\")\n\n data = docs_to_data(docs)\n\n self.log(f\"Converted documents to data: {len(data)}\")\n\n self.status = data\n return data\n self.log(\"No search input provided. Skipping search.\")\n return []\n\n def get_retriever_kwargs(self):\n search_args = self._build_search_args()\n return {\n \"search_type\": self._map_search_type(),\n \"search_kwargs\": search_args,\n }\n"},"collection_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{"fields":{"data":{"node":{"description":"Please allow several seconds for creation to complete.","display_name":"Create new collection","field_order":["01_new_collection_name","02_embedding_generation_provider","03_embedding_generation_model","04_dimension"],"name":"create_collection","template":{"01_new_collection_name":{"_input_type":"StrInput","advanced":false,"display_name":"Name","dynamic":false,"info":"Name of the new collection to create in Astra DB.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"new_collection_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"02_embedding_generation_provider":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Embedding generation method","dynamic":false,"external_options":{},"helper_text":"To create collections with more embedding provider options, go to your database in Astra DB","info":"Provider to use for generating embeddings.","name":"embedding_generation_provider","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"03_embedding_generation_model":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Embedding model","dynamic":false,"external_options":{},"info":"Model to use for generating embeddings.","name":"embedding_generation_model","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"04_dimension":{"_input_type":"IntInput","advanced":false,"display_name":"Dimensions","dynamic":false,"info":"Dimensions of the embeddings to generate.","list":false,"list_add_label":"Add More","name":"dimension","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int"}}}}},"functionality":"create"},"display_name":"Collection","dynamic":false,"external_options":{},"info":"The name of the collection within Astra DB where the vectors will be stored.","name":"collection_name","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"refresh_button":true,"required":true,"show":false,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"database_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{"fields":{"data":{"node":{"description":"Please allow several minutes for creation to complete.","display_name":"Create new database","field_order":["01_new_database_name","02_cloud_provider","03_region"],"name":"create_database","template":{"01_new_database_name":{"_input_type":"StrInput","advanced":false,"display_name":"Name","dynamic":false,"info":"Name of the new database to create in Astra DB.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"new_database_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"02_cloud_provider":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Cloud provider","dynamic":false,"external_options":{},"info":"Cloud provider for the new database.","name":"cloud_provider","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"03_region":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Region","dynamic":false,"external_options":{},"info":"Region for the new database.","name":"region","options":[],"options_metadata":[],"placeholder":"","required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""}}}}},"functionality":"create"},"display_name":"Database","dynamic":false,"external_options":{},"info":"The Database name for the Astra DB instance.","name":"database_name","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"refresh_button":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"environment":{"_input_type":"DropdownInput","advanced":true,"combobox":true,"dialog_inputs":{},"display_name":"Environment","dynamic":false,"external_options":{},"info":"The environment for the Astra DB API Endpoint.","name":"environment","options":["prod","test","dev"],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"prod"},"ingest_data":{"_input_type":"HandleInput","advanced":false,"display_name":"Ingest Data","dynamic":false,"info":"","input_types":["Data","DataFrame"],"list":true,"list_add_label":"Add More","name":"ingest_data","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"keyspace":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Keyspace","dynamic":false,"external_options":{},"info":"Optional keyspace within Astra DB to use for the collection.","name":"keyspace","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"metadata_incoming_links_key":{"_input_type":"StrInput","advanced":true,"display_name":"Metadata incoming links key","dynamic":false,"info":"Metadata key used for incoming links.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"metadata_incoming_links_key","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Results","dynamic":false,"info":"Number of results to return.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":4},"search_filter":{"_input_type":"DictInput","advanced":true,"display_name":"Search Metadata Filter","dynamic":false,"info":"Optional dictionary of filters to apply to the search query.","list":true,"list_add_label":"Add More","name":"search_filter","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"search_query":{"_input_type":"QueryInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Enter a query to run a similarity search.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"search_query","placeholder":"Enter a query...","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"query","value":""},"search_score_threshold":{"_input_type":"FloatInput","advanced":true,"display_name":"Search Score Threshold","dynamic":false,"info":"Minimum similarity score threshold for search results. (when using 'Similarity with score threshold')","list":false,"list_add_label":"Add More","name":"search_score_threshold","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":0.0},"search_type":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Search Type","dynamic":false,"external_options":{},"info":"Search type to use","name":"search_type","options":["Similarity","Similarity with score threshold","MMR (Max Marginal Relevance)","Graph Traversal","MMR (Max Marginal Relevance) Graph Traversal"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"MMR (Max Marginal Relevance) Graph Traversal"},"should_cache_vector_store":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache Vector Store","dynamic":false,"info":"If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.","list":false,"list_add_label":"Add More","name":"should_cache_vector_store","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Astra DB Application Token","dynamic":false,"info":"Authentication token for accessing Astra DB.","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"ASTRA_DB_APPLICATION_TOKEN"}},"tool_mode":false},"AstraDBTool":{"base_classes":["Data","Tool"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Tool to run hybrid vector and metadata search on DataStax Astra DB Collection","display_name":"Astra DB Tool","documentation":"https://docs.langflow.org/bundles-datastax#astra-db-tool","edited":false,"field_order":["token","environment","database_name","api_endpoint","keyspace","collection_name","autodetect_collection","tool_name","tool_description","projection_attributes","tools_params_v2","tool_params","static_filters","number_of_results","use_search_query","use_vectorize","semantic_search_instruction"],"frozen":false,"icon":"AstraDB","legacy":true,"metadata":{"code_hash":"c0c6d1a87d8e","dependencies":{"dependencies":[{"name":"astrapy","version":"2.1.0"},{"name":"langchain_core","version":"0.3.79"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.datastax.astradb_tool.AstraDBToolComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Data","group_outputs":false,"method":"run_model","name":"api_run_model","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Tool","group_outputs":false,"method":"build_tool","name":"api_build_tool","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":["datastax.AstraDB"],"template":{"_type":"Component","api_endpoint":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Astra DB API Endpoint","dynamic":false,"external_options":{},"info":"The API Endpoint for the Astra DB instance. Supercedes database selection.","name":"api_endpoint","options":[],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"autodetect_collection":{"_input_type":"BoolInput","advanced":true,"display_name":"Autodetect Collection","dynamic":false,"info":"Boolean flag to determine whether to autodetect the collection.","list":false,"list_add_label":"Add More","name":"autodetect_collection","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from datetime import datetime, timezone\nfrom typing import Any\n\nfrom astrapy import Collection, DataAPIClient, Database\nfrom langchain_core.tools import StructuredTool, Tool\nfrom pydantic import BaseModel, Field, create_model\n\nfrom lfx.base.datastax.astradb_base import AstraDBBaseComponent\nfrom lfx.base.langchain_utilities.model import LCToolComponent\nfrom lfx.io import BoolInput, DictInput, IntInput, StrInput, TableInput\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\nfrom lfx.schema.table import EditMode\n\n\nclass AstraDBToolComponent(AstraDBBaseComponent, LCToolComponent):\n display_name: str = \"Astra DB Tool\"\n description: str = \"Tool to run hybrid vector and metadata search on DataStax Astra DB Collection\"\n documentation: str = \"https://docs.langflow.org/bundles-datastax#astra-db-tool\"\n icon: str = \"AstraDB\"\n legacy: bool = True\n name = \"AstraDBTool\"\n replacement = [\"datastax.AstraDB\"]\n\n inputs = [\n *AstraDBBaseComponent.inputs,\n StrInput(\n name=\"tool_name\",\n display_name=\"Tool Name\",\n info=\"The name of the tool to be passed to the LLM.\",\n required=True,\n ),\n StrInput(\n name=\"tool_description\",\n display_name=\"Tool Description\",\n info=\"Describe the tool to LLM. Add any information that can help the LLM to use the tool.\",\n required=True,\n ),\n StrInput(\n name=\"projection_attributes\",\n display_name=\"Projection Attributes\",\n info=\"Attributes to be returned by the tool separated by comma.\",\n required=True,\n value=\"*\",\n advanced=True,\n ),\n TableInput(\n name=\"tools_params_v2\",\n display_name=\"Tools Parameters\",\n info=\"Define the structure for the tool parameters. Describe the parameters \"\n \"in a way the LLM can understand how to use them.\",\n required=False,\n table_schema=[\n {\n \"name\": \"name\",\n \"display_name\": \"Name\",\n \"type\": \"str\",\n \"description\": \"Specify the name of the output field/parameter for the model.\",\n \"default\": \"field\",\n \"edit_mode\": EditMode.INLINE,\n },\n {\n \"name\": \"attribute_name\",\n \"display_name\": \"Attribute Name\",\n \"type\": \"str\",\n \"description\": \"Specify the attribute name to be filtered on the collection. \"\n \"Leave empty if the attribute name is the same as the name of the field.\",\n \"default\": \"\",\n \"edit_mode\": EditMode.INLINE,\n },\n {\n \"name\": \"description\",\n \"display_name\": \"Description\",\n \"type\": \"str\",\n \"description\": \"Describe the purpose of the output field.\",\n \"default\": \"description of field\",\n \"edit_mode\": EditMode.POPOVER,\n },\n {\n \"name\": \"metadata\",\n \"display_name\": \"Is Metadata\",\n \"type\": \"boolean\",\n \"edit_mode\": EditMode.INLINE,\n \"description\": (\"Indicate if the field is included in the metadata field.\"),\n \"options\": [\"True\", \"False\"],\n \"default\": \"False\",\n },\n {\n \"name\": \"mandatory\",\n \"display_name\": \"Is Mandatory\",\n \"type\": \"boolean\",\n \"edit_mode\": EditMode.INLINE,\n \"description\": (\"Indicate if the field is mandatory.\"),\n \"options\": [\"True\", \"False\"],\n \"default\": \"False\",\n },\n {\n \"name\": \"is_timestamp\",\n \"display_name\": \"Is Timestamp\",\n \"type\": \"boolean\",\n \"edit_mode\": EditMode.INLINE,\n \"description\": (\"Indicate if the field is a timestamp.\"),\n \"options\": [\"True\", \"False\"],\n \"default\": \"False\",\n },\n {\n \"name\": \"operator\",\n \"display_name\": \"Operator\",\n \"type\": \"str\",\n \"description\": \"Set the operator for the field. \"\n \"https://docs.datastax.com/en/astra-db-serverless/api-reference/documents.html#operators\",\n \"default\": \"$eq\",\n \"options\": [\"$gt\", \"$gte\", \"$lt\", \"$lte\", \"$eq\", \"$ne\", \"$in\", \"$nin\", \"$exists\", \"$all\", \"$size\"],\n \"edit_mode\": EditMode.INLINE,\n },\n ],\n value=[],\n ),\n DictInput(\n name=\"tool_params\",\n info=\"DEPRECATED: Attributes to filter and description to the model. \"\n \"Add ! for mandatory (e.g: !customerId)\",\n display_name=\"Tool params\",\n is_list=True,\n advanced=True,\n ),\n DictInput(\n name=\"static_filters\",\n info=\"Attributes to filter and correspoding value\",\n display_name=\"Static filters\",\n advanced=True,\n is_list=True,\n ),\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=5,\n ),\n BoolInput(\n name=\"use_search_query\",\n display_name=\"Semantic Search\",\n info=\"When this parameter is activated, the search query parameter will be used to search the collection.\",\n advanced=False,\n value=False,\n ),\n BoolInput(\n name=\"use_vectorize\",\n display_name=\"Use Astra DB Vectorize\",\n info=\"When this parameter is activated, Astra DB Vectorize method will be used to generate the embeddings.\",\n advanced=False,\n value=False,\n ),\n StrInput(\n name=\"semantic_search_instruction\",\n display_name=\"Semantic Search Instruction\",\n info=\"The instruction to use for the semantic search.\",\n required=True,\n value=\"Search query to find relevant documents.\",\n advanced=True,\n ),\n ]\n\n _cached_client: DataAPIClient | None = None\n _cached_db: Database | None = None\n _cached_collection: Collection | None = None\n\n def create_args_schema(self) -> dict[str, BaseModel]:\n \"\"\"DEPRECATED: This method is deprecated. Please use create_args_schema_v2 instead.\n\n It is keep only for backward compatibility.\n \"\"\"\n logger.warning(\"This is the old way to define the tool parameters. Please use the new way.\")\n args: dict[str, tuple[Any, Field] | list[str]] = {}\n\n for key in self.tool_params:\n if key.startswith(\"!\"): # Mandatory\n args[key[1:]] = (str, Field(description=self.tool_params[key]))\n else: # Optional\n args[key] = (str | None, Field(description=self.tool_params[key], default=None))\n\n if self.use_search_query:\n args[\"search_query\"] = (\n str | None,\n Field(description=\"Search query to find relevant documents.\", default=None),\n )\n\n model = create_model(\"ToolInput\", **args, __base__=BaseModel)\n return {\"ToolInput\": model}\n\n def create_args_schema_v2(self) -> dict[str, BaseModel]:\n \"\"\"Create the tool input schema using the new tool parameters configuration.\"\"\"\n args: dict[str, tuple[Any, Field] | list[str]] = {}\n\n for tool_param in self.tools_params_v2:\n if tool_param[\"mandatory\"]:\n args[tool_param[\"name\"]] = (str, Field(description=tool_param[\"description\"]))\n else:\n args[tool_param[\"name\"]] = (str | None, Field(description=tool_param[\"description\"], default=None))\n\n if self.use_search_query:\n args[\"search_query\"] = (\n str,\n Field(description=self.semantic_search_instruction),\n )\n\n model = create_model(\"ToolInput\", **args, __base__=BaseModel)\n return {\"ToolInput\": model}\n\n def build_tool(self) -> Tool:\n \"\"\"Builds an Astra DB Collection tool.\n\n Returns:\n Tool: The built Astra DB tool.\n \"\"\"\n schema_dict = self.create_args_schema() if len(self.tool_params.keys()) > 0 else self.create_args_schema_v2()\n\n tool = StructuredTool.from_function(\n name=self.tool_name,\n args_schema=schema_dict[\"ToolInput\"],\n description=self.tool_description,\n func=self.run_model,\n return_direct=False,\n )\n self.status = \"Astra DB Tool created\"\n\n return tool\n\n def projection_args(self, input_str: str) -> dict | None:\n \"\"\"Build the projection arguments for the Astra DB query.\"\"\"\n elements = input_str.split(\",\")\n result = {}\n\n if elements == [\"*\"]:\n return None\n\n # Force the projection to exclude the $vector field as it is not required by the tool\n result[\"$vector\"] = False\n\n # Fields with ! as prefix should be removed from the projection\n for element in elements:\n if element.startswith(\"!\"):\n result[element[1:]] = False\n else:\n result[element] = True\n\n return result\n\n def parse_timestamp(self, timestamp_str: str) -> datetime:\n \"\"\"Parse a timestamp string into Astra DB REST API format.\n\n Args:\n timestamp_str (str): Input timestamp string\n\n Returns:\n datetime: Datetime object\n\n Raises:\n ValueError: If the timestamp cannot be parsed\n \"\"\"\n # Common datetime formats to try\n formats = [\n \"%Y-%m-%d\", # 2024-03-21\n \"%Y-%m-%dT%H:%M:%S\", # 2024-03-21T15:30:00\n \"%Y-%m-%dT%H:%M:%S%z\", # 2024-03-21T15:30:00+0000\n \"%Y-%m-%d %H:%M:%S\", # 2024-03-21 15:30:00\n \"%d/%m/%Y\", # 21/03/2024\n \"%Y/%m/%d\", # 2024/03/21\n ]\n\n for fmt in formats:\n try:\n # Parse the date string\n date_obj = datetime.strptime(timestamp_str, fmt).astimezone()\n\n # If the parsed date has no timezone info, assume UTC\n if date_obj.tzinfo is None:\n date_obj = date_obj.replace(tzinfo=timezone.utc)\n\n # Convert to UTC and format\n return date_obj.astimezone(timezone.utc)\n\n except ValueError:\n continue\n\n msg = f\"Could not parse date: {timestamp_str}\"\n logger.error(msg)\n raise ValueError(msg)\n\n def build_filter(self, args: dict, filter_settings: list) -> dict:\n \"\"\"Build filter dictionary for Astra DB query.\n\n Args:\n args: Dictionary of arguments from the tool\n filter_settings: List of filter settings from tools_params_v2\n Returns:\n Dictionary containing the filter conditions\n \"\"\"\n filters = {**self.static_filters}\n\n for key, value in args.items():\n # Skip search_query as it's handled separately\n if key == \"search_query\":\n continue\n\n filter_setting = next((x for x in filter_settings if x[\"name\"] == key), None)\n if filter_setting and value is not None:\n field_name = filter_setting[\"attribute_name\"] if filter_setting[\"attribute_name\"] else key\n filter_key = field_name if not filter_setting[\"metadata\"] else f\"metadata.{field_name}\"\n if filter_setting[\"operator\"] == \"$exists\":\n filters[filter_key] = {**filters.get(filter_key, {}), filter_setting[\"operator\"]: True}\n elif filter_setting[\"operator\"] in [\"$in\", \"$nin\", \"$all\"]:\n filters[filter_key] = {\n **filters.get(filter_key, {}),\n filter_setting[\"operator\"]: value.split(\",\") if isinstance(value, str) else value,\n }\n elif filter_setting[\"is_timestamp\"] == True: # noqa: E712\n try:\n filters[filter_key] = {\n **filters.get(filter_key, {}),\n filter_setting[\"operator\"]: self.parse_timestamp(value),\n }\n except ValueError as e:\n msg = f\"Error parsing timestamp: {e} - Use the prompt to specify the date in the correct format\"\n logger.error(msg)\n raise ValueError(msg) from e\n else:\n filters[filter_key] = {**filters.get(filter_key, {}), filter_setting[\"operator\"]: value}\n return filters\n\n def run_model(self, **args) -> Data | list[Data]:\n \"\"\"Run the query to get the data from the Astra DB collection.\"\"\"\n sort = {}\n\n # Build filters using the new method\n filters = self.build_filter(args, self.tools_params_v2)\n\n # Build the vector search on\n if self.use_search_query and args[\"search_query\"] is not None and args[\"search_query\"] != \"\":\n if self.use_vectorize:\n sort[\"$vectorize\"] = args[\"search_query\"]\n else:\n if self.embedding is None:\n msg = \"Embedding model is not set. Please set the embedding model or use Astra DB Vectorize.\"\n logger.error(msg)\n raise ValueError(msg)\n embedding_query = self.embedding.embed_query(args[\"search_query\"])\n sort[\"$vector\"] = embedding_query\n del args[\"search_query\"]\n\n find_options = {\n \"filter\": filters,\n \"limit\": self.number_of_results,\n \"sort\": sort,\n }\n\n projection = self.projection_args(self.projection_attributes)\n if projection and len(projection) > 0:\n find_options[\"projection\"] = projection\n\n try:\n database = self.get_database_object(api_endpoint=self.get_api_endpoint())\n collection = database.get_collection(\n name=self.collection_name,\n keyspace=self.get_keyspace(),\n )\n results = collection.find(**find_options)\n except Exception as e:\n msg = f\"Error on Astra DB Tool {self.tool_name} request: {e}\"\n logger.error(msg)\n raise ValueError(msg) from e\n\n logger.info(f\"Tool {self.tool_name} executed`\")\n\n data: list[Data] = [Data(data=doc) for doc in results]\n self.status = data\n return data\n"},"collection_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{"fields":{"data":{"node":{"description":"Please allow several seconds for creation to complete.","display_name":"Create new collection","field_order":["01_new_collection_name","02_embedding_generation_provider","03_embedding_generation_model","04_dimension"],"name":"create_collection","template":{"01_new_collection_name":{"_input_type":"StrInput","advanced":false,"display_name":"Name","dynamic":false,"info":"Name of the new collection to create in Astra DB.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"new_collection_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"02_embedding_generation_provider":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Embedding generation method","dynamic":false,"external_options":{},"helper_text":"To create collections with more embedding provider options, go to your database in Astra DB","info":"Provider to use for generating embeddings.","name":"embedding_generation_provider","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"03_embedding_generation_model":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Embedding model","dynamic":false,"external_options":{},"info":"Model to use for generating embeddings.","name":"embedding_generation_model","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"04_dimension":{"_input_type":"IntInput","advanced":false,"display_name":"Dimensions","dynamic":false,"info":"Dimensions of the embeddings to generate.","list":false,"list_add_label":"Add More","name":"dimension","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int"}}}}},"functionality":"create"},"display_name":"Collection","dynamic":false,"external_options":{},"info":"The name of the collection within Astra DB where the vectors will be stored.","name":"collection_name","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"refresh_button":true,"required":true,"show":false,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"database_name":{"_input_type":"DropdownInput","advanced":false,"combobox":true,"dialog_inputs":{"fields":{"data":{"node":{"description":"Please allow several minutes for creation to complete.","display_name":"Create new database","field_order":["01_new_database_name","02_cloud_provider","03_region"],"name":"create_database","template":{"01_new_database_name":{"_input_type":"StrInput","advanced":false,"display_name":"Name","dynamic":false,"info":"Name of the new database to create in Astra DB.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"new_database_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"02_cloud_provider":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Cloud provider","dynamic":false,"external_options":{},"info":"Cloud provider for the new database.","name":"cloud_provider","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"03_region":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Region","dynamic":false,"external_options":{},"info":"Region for the new database.","name":"region","options":[],"options_metadata":[],"placeholder":"","required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""}}}}},"functionality":"create"},"display_name":"Database","dynamic":false,"external_options":{},"info":"The Database name for the Astra DB instance.","name":"database_name","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"refresh_button":true,"required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"environment":{"_input_type":"DropdownInput","advanced":true,"combobox":true,"dialog_inputs":{},"display_name":"Environment","dynamic":false,"external_options":{},"info":"The environment for the Astra DB API Endpoint.","name":"environment","options":["prod","test","dev"],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"prod"},"keyspace":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Keyspace","dynamic":false,"external_options":{},"info":"Optional keyspace within Astra DB to use for the collection.","name":"keyspace","options":[],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Results","dynamic":false,"info":"Number of results to return.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":5},"projection_attributes":{"_input_type":"StrInput","advanced":true,"display_name":"Projection Attributes","dynamic":false,"info":"Attributes to be returned by the tool separated by comma.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"projection_attributes","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"*"},"semantic_search_instruction":{"_input_type":"StrInput","advanced":true,"display_name":"Semantic Search Instruction","dynamic":false,"info":"The instruction to use for the semantic search.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"semantic_search_instruction","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"Search query to find relevant documents."},"static_filters":{"_input_type":"DictInput","advanced":true,"display_name":"Static filters","dynamic":false,"info":"Attributes to filter and correspoding value","list":true,"list_add_label":"Add More","name":"static_filters","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Astra DB Application Token","dynamic":false,"info":"Authentication token for accessing Astra DB.","input_types":[],"load_from_db":true,"name":"token","password":true,"placeholder":"","real_time_refresh":true,"required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"ASTRA_DB_APPLICATION_TOKEN"},"tool_description":{"_input_type":"StrInput","advanced":false,"display_name":"Tool Description","dynamic":false,"info":"Describe the tool to LLM. Add any information that can help the LLM to use the tool.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tool_description","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tool_name":{"_input_type":"StrInput","advanced":false,"display_name":"Tool Name","dynamic":false,"info":"The name of the tool to be passed to the LLM.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"tool_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"tool_params":{"_input_type":"DictInput","advanced":true,"display_name":"Tool params","dynamic":false,"info":"DEPRECATED: Attributes to filter and description to the model. Add ! for mandatory (e.g: !customerId)","list":true,"list_add_label":"Add More","name":"tool_params","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"tools_params_v2":{"_input_type":"TableInput","advanced":false,"display_name":"Tools Parameters","dynamic":false,"info":"Define the structure for the tool parameters. Describe the parameters in a way the LLM can understand how to use them.","is_list":true,"list_add_label":"Add More","name":"tools_params_v2","placeholder":"","required":false,"show":true,"table_icon":"Table","table_schema":[{"default":"field","description":"Specify the name of the output field/parameter for the model.","display_name":"Name","edit_mode":"inline","name":"name","type":"str"},{"default":"","description":"Specify the attribute name to be filtered on the collection. Leave empty if the attribute name is the same as the name of the field.","display_name":"Attribute Name","edit_mode":"inline","name":"attribute_name","type":"str"},{"default":"description of field","description":"Describe the purpose of the output field.","display_name":"Description","edit_mode":"popover","name":"description","type":"str"},{"default":"False","description":"Indicate if the field is included in the metadata field.","display_name":"Is Metadata","edit_mode":"inline","name":"metadata","options":["True","False"],"type":"boolean"},{"default":"False","description":"Indicate if the field is mandatory.","display_name":"Is Mandatory","edit_mode":"inline","name":"mandatory","options":["True","False"],"type":"boolean"},{"default":"False","description":"Indicate if the field is a timestamp.","display_name":"Is Timestamp","edit_mode":"inline","name":"is_timestamp","options":["True","False"],"type":"boolean"},{"default":"$eq","description":"Set the operator for the field. https://docs.datastax.com/en/astra-db-serverless/api-reference/documents.html#operators","display_name":"Operator","edit_mode":"inline","name":"operator","options":["$gt","$gte","$lt","$lte","$eq","$ne","$in","$nin","$exists","$all","$size"],"type":"str"}],"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"trigger_icon":"Table","trigger_text":"Open table","type":"table","value":[]},"use_search_query":{"_input_type":"BoolInput","advanced":false,"display_name":"Semantic Search","dynamic":false,"info":"When this parameter is activated, the search query parameter will be used to search the collection.","list":false,"list_add_label":"Add More","name":"use_search_query","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"use_vectorize":{"_input_type":"BoolInput","advanced":false,"display_name":"Use Astra DB Vectorize","dynamic":false,"info":"When this parameter is activated, Astra DB Vectorize method will be used to generate the embeddings.","list":false,"list_add_label":"Add More","name":"use_vectorize","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false}},"tool_mode":false},"AstraVectorize":{"base_classes":["dict"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Configuration options for Astra Vectorize server-side embeddings. ","display_name":"Astra Vectorize","documentation":"https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html","edited":false,"field_order":["provider","model_name","api_key_name","authentication","provider_api_key","authentication","model_parameters"],"frozen":false,"icon":"AstraDB","legacy":true,"metadata":{"code_hash":"3d976690c262","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.datastax.astradb_vectorize.AstraVectorizeComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Vectorize","group_outputs":false,"method":"build_options","name":"config","selected":"dict","tool_mode":true,"types":["dict"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":["datastax.AstraDB"],"template":{"_type":"Component","api_key_name":{"_input_type":"MessageTextInput","advanced":false,"display_name":"API Key name","dynamic":false,"info":"The name of the embeddings provider API key stored on Astra. If set, it will override the 'ProviderKey' in the authentication parameters.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"api_key_name","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"authentication":{"_input_type":"DictInput","advanced":true,"display_name":"Authentication Parameters","dynamic":false,"info":"","list":true,"list_add_label":"Add More","name":"authentication","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from typing import Any\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.inputs.inputs import DictInput, DropdownInput, MessageTextInput, SecretStrInput\nfrom lfx.template.field.base import Output\n\n\nclass AstraVectorizeComponent(Component):\n display_name: str = \"Astra Vectorize\"\n description: str = \"Configuration options for Astra Vectorize server-side embeddings. \"\n documentation: str = \"https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html\"\n legacy = True\n icon = \"AstraDB\"\n name = \"AstraVectorize\"\n replacement = [\"datastax.AstraDB\"]\n\n VECTORIZE_PROVIDERS_MAPPING = {\n \"Azure OpenAI\": [\"azureOpenAI\", [\"text-embedding-3-small\", \"text-embedding-3-large\", \"text-embedding-ada-002\"]],\n \"Hugging Face - Dedicated\": [\"huggingfaceDedicated\", [\"endpoint-defined-model\"]],\n \"Hugging Face - Serverless\": [\n \"huggingface\",\n [\n \"sentence-transformers/all-MiniLM-L6-v2\",\n \"intfloat/multilingual-e5-large\",\n \"intfloat/multilingual-e5-large-instruct\",\n \"BAAI/bge-small-en-v1.5\",\n \"BAAI/bge-base-en-v1.5\",\n \"BAAI/bge-large-en-v1.5\",\n ],\n ],\n \"Jina AI\": [\n \"jinaAI\",\n [\n \"jina-embeddings-v2-base-en\",\n \"jina-embeddings-v2-base-de\",\n \"jina-embeddings-v2-base-es\",\n \"jina-embeddings-v2-base-code\",\n \"jina-embeddings-v2-base-zh\",\n ],\n ],\n \"Mistral AI\": [\"mistral\", [\"mistral-embed\"]],\n \"NVIDIA\": [\"nvidia\", [\"NV-Embed-QA\"]],\n \"OpenAI\": [\"openai\", [\"text-embedding-3-small\", \"text-embedding-3-large\", \"text-embedding-ada-002\"]],\n \"Upstage\": [\"upstageAI\", [\"solar-embedding-1-large\"]],\n \"Voyage AI\": [\n \"voyageAI\",\n [\"voyage-large-2-instruct\", \"voyage-law-2\", \"voyage-code-2\", \"voyage-large-2\", \"voyage-2\"],\n ],\n }\n VECTORIZE_MODELS_STR = \"\\n\\n\".join(\n [provider + \": \" + (\", \".join(models[1])) for provider, models in VECTORIZE_PROVIDERS_MAPPING.items()]\n )\n\n inputs = [\n DropdownInput(\n name=\"provider\",\n display_name=\"Provider\",\n options=VECTORIZE_PROVIDERS_MAPPING.keys(),\n value=\"\",\n required=True,\n ),\n MessageTextInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n info=\"The embedding model to use for the selected provider. Each provider has a different set of models \"\n f\"available (full list at https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html):\\n\\n{VECTORIZE_MODELS_STR}\",\n required=True,\n ),\n MessageTextInput(\n name=\"api_key_name\",\n display_name=\"API Key name\",\n info=\"The name of the embeddings provider API key stored on Astra. \"\n \"If set, it will override the 'ProviderKey' in the authentication parameters.\",\n ),\n DictInput(\n name=\"authentication\",\n display_name=\"Authentication parameters\",\n is_list=True,\n advanced=True,\n ),\n SecretStrInput(\n name=\"provider_api_key\",\n display_name=\"Provider API Key\",\n info=\"An alternative to the Astra Authentication that passes an API key for the provider with each request \"\n \"to Astra DB. \"\n \"This may be used when Vectorize is configured for the collection, \"\n \"but no corresponding provider secret is stored within Astra's key management system.\",\n advanced=True,\n ),\n DictInput(\n name=\"authentication\",\n display_name=\"Authentication Parameters\",\n is_list=True,\n advanced=True,\n ),\n DictInput(\n name=\"model_parameters\",\n display_name=\"Model Parameters\",\n advanced=True,\n is_list=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Vectorize\", name=\"config\", method=\"build_options\", types=[\"dict\"]),\n ]\n\n def build_options(self) -> dict[str, Any]:\n provider_value = self.VECTORIZE_PROVIDERS_MAPPING[self.provider][0]\n authentication = {**(self.authentication or {})}\n api_key_name = self.api_key_name\n if api_key_name:\n authentication[\"providerKey\"] = api_key_name\n return {\n # must match astrapy.info.VectorServiceOptions\n \"collection_vector_service_options\": {\n \"provider\": provider_value,\n \"modelName\": self.model_name,\n \"authentication\": authentication,\n \"parameters\": self.model_parameters or {},\n },\n \"collection_embedding_api_key\": self.provider_api_key,\n }\n"},"model_name":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Model Name","dynamic":false,"info":"The embedding model to use for the selected provider. Each provider has a different set of models available (full list at https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html):\n\nAzure OpenAI: text-embedding-3-small, text-embedding-3-large, text-embedding-ada-002\n\nHugging Face - Dedicated: endpoint-defined-model\n\nHugging Face - Serverless: sentence-transformers/all-MiniLM-L6-v2, intfloat/multilingual-e5-large, intfloat/multilingual-e5-large-instruct, BAAI/bge-small-en-v1.5, BAAI/bge-base-en-v1.5, BAAI/bge-large-en-v1.5\n\nJina AI: jina-embeddings-v2-base-en, jina-embeddings-v2-base-de, jina-embeddings-v2-base-es, jina-embeddings-v2-base-code, jina-embeddings-v2-base-zh\n\nMistral AI: mistral-embed\n\nNVIDIA: NV-Embed-QA\n\nOpenAI: text-embedding-3-small, text-embedding-3-large, text-embedding-ada-002\n\nUpstage: solar-embedding-1-large\n\nVoyage AI: voyage-large-2-instruct, voyage-law-2, voyage-code-2, voyage-large-2, voyage-2","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"model_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"model_parameters":{"_input_type":"DictInput","advanced":true,"display_name":"Model Parameters","dynamic":false,"info":"","list":true,"list_add_label":"Add More","name":"model_parameters","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"provider":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Provider","dynamic":false,"external_options":{},"info":"","name":"provider","options":["Azure OpenAI","Hugging Face - Dedicated","Hugging Face - Serverless","Jina AI","Mistral AI","NVIDIA","OpenAI","Upstage","Voyage AI"],"options_metadata":[],"placeholder":"","required":true,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"provider_api_key":{"_input_type":"SecretStrInput","advanced":true,"display_name":"Provider API Key","dynamic":false,"info":"An alternative to the Astra Authentication that passes an API key for the provider with each request to Astra DB. This may be used when Vectorize is configured for the collection, but no corresponding provider secret is stored within Astra's key management system.","input_types":[],"load_from_db":true,"name":"provider_api_key","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"Dotenv":{"base_classes":["Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Load .env file into env vars","display_name":"Dotenv","documentation":"","edited":false,"field_order":["dotenv_file_content"],"frozen":false,"icon":"AstraDB","legacy":true,"metadata":{"code_hash":"343ea9aaca1b","dependencies":{"dependencies":[{"name":"dotenv","version":"1.2.1"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.datastax.dotenv.Dotenv"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"env_set","group_outputs":false,"method":"process_inputs","name":"env_set","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import io\n\nfrom dotenv import load_dotenv\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.inputs.inputs import MultilineSecretInput\nfrom lfx.schema.message import Message\nfrom lfx.template.field.base import Output\n\n\nclass Dotenv(Component):\n display_name = \"Dotenv\"\n description = \"Load .env file into env vars\"\n icon = \"AstraDB\"\n legacy = True\n inputs = [\n MultilineSecretInput(\n name=\"dotenv_file_content\",\n display_name=\"Dotenv file content\",\n info=\"Paste the content of your .env file directly, since contents are sensitive, \"\n \"using a Global variable set as 'password' is recommended\",\n )\n ]\n\n outputs = [\n Output(display_name=\"env_set\", name=\"env_set\", method=\"process_inputs\"),\n ]\n\n def process_inputs(self) -> Message:\n fake_file = io.StringIO(self.dotenv_file_content)\n result = load_dotenv(stream=fake_file, override=True)\n\n message = Message(text=\"No variables found in .env\")\n if result:\n message = Message(text=\"Loaded .env\")\n return message\n"},"dotenv_file_content":{"_input_type":"MultilineSecretInput","advanced":false,"display_name":"Dotenv file content","dynamic":false,"info":"Paste the content of your .env file directly, since contents are sensitive, using a Global variable set as 'password' is recommended","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"dotenv_file_content","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"GetEnvVar":{"base_classes":["Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Gets the value of an environment variable from the system.","display_name":"Get Environment Variable","documentation":"","edited":false,"field_order":["env_var_name"],"frozen":false,"icon":"AstraDB","legacy":true,"metadata":{"code_hash":"083f0a94f380","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.datastax.getenvvar.GetEnvVar"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Environment Variable Value","group_outputs":false,"method":"process_inputs","name":"env_var_value","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import os\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.inputs.inputs import StrInput\nfrom lfx.schema.message import Message\nfrom lfx.template.field.base import Output\n\n\nclass GetEnvVar(Component):\n display_name = \"Get Environment Variable\"\n description = \"Gets the value of an environment variable from the system.\"\n icon = \"AstraDB\"\n legacy = True\n\n inputs = [\n StrInput(\n name=\"env_var_name\",\n display_name=\"Environment Variable Name\",\n info=\"Name of the environment variable to get\",\n )\n ]\n\n outputs = [\n Output(display_name=\"Environment Variable Value\", name=\"env_var_value\", method=\"process_inputs\"),\n ]\n\n def process_inputs(self) -> Message:\n if self.env_var_name not in os.environ:\n msg = f\"Environment variable {self.env_var_name} not set\"\n raise ValueError(msg)\n return Message(text=os.environ[self.env_var_name])\n"},"env_var_name":{"_input_type":"StrInput","advanced":false,"display_name":"Environment Variable Name","dynamic":false,"info":"Name of the environment variable to get","list":false,"list_add_label":"Add More","load_from_db":false,"name":"env_var_name","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false},"GraphRAG":{"base_classes":["Data","DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Graph RAG traversal for vector store.","display_name":"Graph RAG","documentation":"","edited":false,"field_order":["embedding_model","vector_store","edge_definition","strategy","search_query","graphrag_strategy_kwargs"],"frozen":false,"icon":"AstraDB","legacy":false,"metadata":{"code_hash":"4d83709a5f5f","dependencies":{"dependencies":[{"name":"graph_retriever","version":"0.8.0"},{"name":"langchain_graph_retriever","version":"0.8.0"},{"name":"lfx","version":null}],"total_dependencies":3},"module":"lfx.components.datastax.graph_rag.GraphRAGComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Search Results","group_outputs":false,"method":"search_documents","name":"search_results","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import inspect\nfrom abc import ABC\n\nimport graph_retriever.strategies as strategies_module\nfrom langchain_graph_retriever import GraphRetriever\n\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent\nfrom lfx.helpers.data import docs_to_data\nfrom lfx.inputs.inputs import DropdownInput, HandleInput, MultilineInput, NestedDictInput, StrInput\nfrom lfx.schema.data import Data\n\n\ndef traversal_strategies() -> list[str]:\n \"\"\"Retrieves a list of class names from the strategies_module.\n\n This function uses the `inspect` module to get all the class members\n from the `strategies_module` and returns their names as a list of strings.\n\n Returns:\n list[str]: A list of strategy class names.\n \"\"\"\n classes = inspect.getmembers(strategies_module, inspect.isclass)\n return [name for name, cls in classes if ABC not in cls.__bases__]\n\n\nclass GraphRAGComponent(LCVectorStoreComponent):\n \"\"\"GraphRAGComponent is a component for performing Graph RAG traversal in a vector store.\n\n Attributes:\n display_name (str): The display name of the component.\n description (str): A brief description of the component.\n name (str): The name of the component.\n icon (str): The icon representing the component.\n inputs (list): A list of input configurations for the component.\n\n Methods:\n _build_search_args():\n Builds the arguments required for the search operation.\n search_documents() -> list[Data]:\n Searches for documents using the specified strategy, edge definition, and query.\n _edge_definition_from_input() -> tuple:\n Processes the edge definition input and returns it as a tuple.\n \"\"\"\n\n display_name: str = \"Graph RAG\"\n description: str = \"Graph RAG traversal for vector store.\"\n name = \"GraphRAG\"\n icon: str = \"AstraDB\"\n\n inputs = [\n HandleInput(\n name=\"embedding_model\",\n display_name=\"Embedding Model\",\n input_types=[\"Embeddings\"],\n info=\"Specify the Embedding Model. Not required for Astra Vectorize collections.\",\n required=False,\n ),\n HandleInput(\n name=\"vector_store\",\n display_name=\"Vector Store Connection\",\n input_types=[\"VectorStore\"],\n info=\"Connection to Vector Store.\",\n ),\n StrInput(\n name=\"edge_definition\",\n display_name=\"Edge Definition\",\n info=\"Edge definition for the graph traversal.\",\n ),\n DropdownInput(\n name=\"strategy\",\n display_name=\"Traversal Strategies\",\n options=traversal_strategies(),\n ),\n MultilineInput(\n name=\"search_query\",\n display_name=\"Search Query\",\n tool_mode=True,\n ),\n NestedDictInput(\n name=\"graphrag_strategy_kwargs\",\n display_name=\"Strategy Parameters\",\n info=(\n \"Optional dictionary of additional parameters for the retrieval strategy. \"\n \"Please see https://datastax.github.io/graph-rag/reference/graph_retriever/strategies/ for details.\"\n ),\n advanced=True,\n ),\n ]\n\n def search_documents(self) -> list[Data]:\n \"\"\"Searches for documents using the graph retriever based on the selected strategy, edge definition, and query.\n\n Returns:\n list[Data]: A list of retrieved documents.\n\n Raises:\n AttributeError: If there is an issue with attribute access.\n TypeError: If there is a type mismatch.\n ValueError: If there is a value error.\n \"\"\"\n additional_params = self.graphrag_strategy_kwargs or {}\n\n # Invoke the graph retriever based on the selected strategy, edge definition, and query\n strategy_class = getattr(strategies_module, self.strategy)\n retriever = GraphRetriever(\n store=self.vector_store,\n edges=[self._evaluate_edge_definition_input()],\n strategy=strategy_class(**additional_params),\n )\n\n return docs_to_data(retriever.invoke(self.search_query))\n\n def _edge_definition_from_input(self) -> tuple:\n \"\"\"Generates the edge definition from the input data.\n\n Returns:\n tuple: A tuple representing the edge definition.\n \"\"\"\n values = self.edge_definition.split(\",\")\n values = [value.strip() for value in values]\n\n return tuple(values)\n\n def _evaluate_edge_definition_input(self) -> tuple:\n from graph_retriever.edges.metadata import Id\n\n \"\"\"Evaluates the edge definition, converting any function calls from strings.\n\n Args:\n edge_definition (tuple): The edge definition to evaluate.\n\n Returns:\n tuple: The evaluated edge definition.\n \"\"\"\n evaluated_values = []\n for value in self._edge_definition_from_input():\n if value == \"Id()\":\n evaluated_values.append(Id()) # Evaluate Id() as a function call\n else:\n evaluated_values.append(value)\n return tuple(evaluated_values)\n"},"edge_definition":{"_input_type":"StrInput","advanced":false,"display_name":"Edge Definition","dynamic":false,"info":"Edge definition for the graph traversal.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"edge_definition","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"embedding_model":{"_input_type":"HandleInput","advanced":false,"display_name":"Embedding Model","dynamic":false,"info":"Specify the Embedding Model. Not required for Astra Vectorize collections.","input_types":["Embeddings"],"list":false,"list_add_label":"Add More","name":"embedding_model","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"graphrag_strategy_kwargs":{"_input_type":"NestedDictInput","advanced":true,"display_name":"Strategy Parameters","dynamic":false,"info":"Optional dictionary of additional parameters for the retrieval strategy. Please see https://datastax.github.io/graph-rag/reference/graph_retriever/strategies/ for details.","list":false,"list_add_label":"Add More","name":"graphrag_strategy_kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"NestedDict","value":{}},"search_query":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Search Query","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"search_query","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"strategy":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Traversal Strategies","dynamic":false,"external_options":{},"info":"","name":"strategy","options":["Eager","Mmr","NodeTracker","Scored"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"vector_store":{"_input_type":"HandleInput","advanced":false,"display_name":"Vector Store Connection","dynamic":false,"info":"Connection to Vector Store.","input_types":["VectorStore"],"list":false,"list_add_label":"Add More","name":"vector_store","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""}},"tool_mode":false},"HCD":{"base_classes":["Data","DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Implementation of Vector Store using Hyper-Converged Database (HCD) with search capabilities","display_name":"Hyper-Converged Database","documentation":"https://docs.langflow.org/bundles-datastax#hyper-converged-database-hcd","edited":false,"field_order":["collection_name","username","password","api_endpoint","ingest_data","search_query","should_cache_vector_store","namespace","ca_certificate","metric","batch_size","bulk_insert_batch_concurrency","bulk_insert_overwrite_concurrency","bulk_delete_concurrency","setup_mode","pre_delete_collection","metadata_indexing_include","embedding","metadata_indexing_exclude","collection_indexing_policy","number_of_results","search_type","search_score_threshold","search_filter"],"frozen":false,"icon":"HCD","legacy":false,"metadata":{"code_hash":"7e7469e03bc5","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"langchain_astradb","version":"0.6.1"},{"name":"astrapy","version":"2.1.0"}],"total_dependencies":3},"module":"lfx.components.datastax.hcd.HCDVectorStoreComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Search Results","group_outputs":false,"method":"search_documents","name":"search_results","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_endpoint":{"_input_type":"SecretStrInput","advanced":false,"display_name":"HCD API Endpoint","dynamic":false,"info":"API endpoint URL for the HCD service.","input_types":[],"load_from_db":true,"name":"api_endpoint","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"HCD_API_ENDPOINT"},"batch_size":{"_input_type":"IntInput","advanced":true,"display_name":"Batch Size","dynamic":false,"info":"Optional number of data to process in a single batch.","list":false,"list_add_label":"Add More","name":"batch_size","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"bulk_delete_concurrency":{"_input_type":"IntInput","advanced":true,"display_name":"Bulk Delete Concurrency","dynamic":false,"info":"Optional concurrency level for bulk delete operations.","list":false,"list_add_label":"Add More","name":"bulk_delete_concurrency","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"bulk_insert_batch_concurrency":{"_input_type":"IntInput","advanced":true,"display_name":"Bulk Insert Batch Concurrency","dynamic":false,"info":"Optional concurrency level for bulk insert operations.","list":false,"list_add_label":"Add More","name":"bulk_insert_batch_concurrency","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"bulk_insert_overwrite_concurrency":{"_input_type":"IntInput","advanced":true,"display_name":"Bulk Insert Overwrite Concurrency","dynamic":false,"info":"Optional concurrency level for bulk insert operations that overwrite existing data.","list":false,"list_add_label":"Add More","name":"bulk_insert_overwrite_concurrency","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"ca_certificate":{"_input_type":"MultilineInput","advanced":true,"copy_field":false,"display_name":"CA Certificate","dynamic":false,"info":"Optional CA certificate for TLS connections to HCD.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"ca_certificate","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.helpers.data import docs_to_data\nfrom lfx.inputs.inputs import DictInput, FloatInput\nfrom lfx.io import (\n BoolInput,\n DropdownInput,\n HandleInput,\n IntInput,\n MultilineInput,\n SecretStrInput,\n StrInput,\n)\nfrom lfx.schema.data import Data\n\n\nclass HCDVectorStoreComponent(LCVectorStoreComponent):\n display_name: str = \"Hyper-Converged Database\"\n description: str = \"Implementation of Vector Store using Hyper-Converged Database (HCD) with search capabilities\"\n name = \"HCD\"\n documentation: str = \"https://docs.langflow.org/bundles-datastax#hyper-converged-database-hcd\"\n icon: str = \"HCD\"\n\n inputs = [\n StrInput(\n name=\"collection_name\",\n display_name=\"Collection Name\",\n info=\"The name of the collection within HCD where the vectors will be stored.\",\n required=True,\n ),\n StrInput(\n name=\"username\",\n display_name=\"HCD Username\",\n info=\"Authentication username for accessing HCD.\",\n value=\"hcd-superuser\",\n required=True,\n ),\n SecretStrInput(\n name=\"password\",\n display_name=\"HCD Password\",\n info=\"Authentication password for accessing HCD.\",\n value=\"HCD_PASSWORD\",\n required=True,\n ),\n SecretStrInput(\n name=\"api_endpoint\",\n display_name=\"HCD API Endpoint\",\n info=\"API endpoint URL for the HCD service.\",\n value=\"HCD_API_ENDPOINT\",\n required=True,\n ),\n *LCVectorStoreComponent.inputs,\n StrInput(\n name=\"namespace\",\n display_name=\"Namespace\",\n info=\"Optional namespace within HCD to use for the collection.\",\n value=\"default_namespace\",\n advanced=True,\n ),\n MultilineInput(\n name=\"ca_certificate\",\n display_name=\"CA Certificate\",\n info=\"Optional CA certificate for TLS connections to HCD.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"metric\",\n display_name=\"Metric\",\n info=\"Optional distance metric for vector comparisons in the vector store.\",\n options=[\"cosine\", \"dot_product\", \"euclidean\"],\n advanced=True,\n ),\n IntInput(\n name=\"batch_size\",\n display_name=\"Batch Size\",\n info=\"Optional number of data to process in a single batch.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_insert_batch_concurrency\",\n display_name=\"Bulk Insert Batch Concurrency\",\n info=\"Optional concurrency level for bulk insert operations.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_insert_overwrite_concurrency\",\n display_name=\"Bulk Insert Overwrite Concurrency\",\n info=\"Optional concurrency level for bulk insert operations that overwrite existing data.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_delete_concurrency\",\n display_name=\"Bulk Delete Concurrency\",\n info=\"Optional concurrency level for bulk delete operations.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"setup_mode\",\n display_name=\"Setup Mode\",\n info=\"Configuration mode for setting up the vector store, with options like 'Sync', 'Async', or 'Off'.\",\n options=[\"Sync\", \"Async\", \"Off\"],\n advanced=True,\n value=\"Sync\",\n ),\n BoolInput(\n name=\"pre_delete_collection\",\n display_name=\"Pre Delete Collection\",\n info=\"Boolean flag to determine whether to delete the collection before creating a new one.\",\n advanced=True,\n ),\n StrInput(\n name=\"metadata_indexing_include\",\n display_name=\"Metadata Indexing Include\",\n info=\"Optional list of metadata fields to include in the indexing.\",\n advanced=True,\n ),\n HandleInput(\n name=\"embedding\",\n display_name=\"Embedding or Astra Vectorize\",\n input_types=[\"Embeddings\", \"dict\"],\n # TODO: This should be optional, but need to refactor langchain-astradb first.\n info=\"Allows either an embedding model or an Astra Vectorize configuration.\",\n ),\n StrInput(\n name=\"metadata_indexing_exclude\",\n display_name=\"Metadata Indexing Exclude\",\n info=\"Optional list of metadata fields to exclude from the indexing.\",\n advanced=True,\n ),\n StrInput(\n name=\"collection_indexing_policy\",\n display_name=\"Collection Indexing Policy\",\n info=\"Optional dictionary defining the indexing policy for the collection.\",\n advanced=True,\n ),\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 DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n info=\"Search type to use\",\n options=[\"Similarity\", \"Similarity with score threshold\", \"MMR (Max Marginal Relevance)\"],\n value=\"Similarity\",\n advanced=True,\n ),\n FloatInput(\n name=\"search_score_threshold\",\n display_name=\"Search Score Threshold\",\n info=\"Minimum similarity score threshold for search results. \"\n \"(when using 'Similarity with score threshold')\",\n value=0,\n advanced=True,\n ),\n DictInput(\n name=\"search_filter\",\n display_name=\"Search Metadata Filter\",\n info=\"Optional dictionary of filters to apply to the search query.\",\n advanced=True,\n is_list=True,\n ),\n ]\n\n @check_cached_vector_store\n def build_vector_store(self):\n try:\n from langchain_astradb import AstraDBVectorStore\n from langchain_astradb.utils.astradb import SetupMode\n except ImportError as e:\n msg = (\n \"Could not import langchain Astra DB integration package. \"\n \"Please install it with `pip install langchain-astradb`.\"\n )\n raise ImportError(msg) from e\n\n try:\n from astrapy.authentication import UsernamePasswordTokenProvider\n from astrapy.constants import Environment\n except ImportError as e:\n msg = \"Could not import astrapy integration package. Please install it with `pip install astrapy`.\"\n raise ImportError(msg) from e\n\n try:\n if not self.setup_mode:\n self.setup_mode = self._inputs[\"setup_mode\"].options[0]\n\n setup_mode_value = SetupMode[self.setup_mode.upper()]\n except KeyError as e:\n msg = f\"Invalid setup mode: {self.setup_mode}\"\n raise ValueError(msg) from e\n\n if not isinstance(self.embedding, dict):\n embedding_dict = {\"embedding\": self.embedding}\n else:\n from astrapy.info import VectorServiceOptions\n\n dict_options = self.embedding.get(\"collection_vector_service_options\", {})\n dict_options[\"authentication\"] = {\n k: v for k, v in dict_options.get(\"authentication\", {}).items() if k and v\n }\n dict_options[\"parameters\"] = {k: v for k, v in dict_options.get(\"parameters\", {}).items() if k and v}\n embedding_dict = {\"collection_vector_service_options\": VectorServiceOptions.from_dict(dict_options)}\n collection_embedding_api_key = self.embedding.get(\"collection_embedding_api_key\")\n if collection_embedding_api_key:\n embedding_dict[\"collection_embedding_api_key\"] = collection_embedding_api_key\n\n token_provider = UsernamePasswordTokenProvider(self.username, self.password)\n vector_store_kwargs = {\n **embedding_dict,\n \"collection_name\": self.collection_name,\n \"token\": token_provider,\n \"api_endpoint\": self.api_endpoint,\n \"namespace\": self.namespace,\n \"metric\": self.metric or None,\n \"batch_size\": self.batch_size or None,\n \"bulk_insert_batch_concurrency\": self.bulk_insert_batch_concurrency or None,\n \"bulk_insert_overwrite_concurrency\": self.bulk_insert_overwrite_concurrency or None,\n \"bulk_delete_concurrency\": self.bulk_delete_concurrency or None,\n \"setup_mode\": setup_mode_value,\n \"pre_delete_collection\": self.pre_delete_collection or False,\n \"environment\": Environment.HCD,\n }\n\n if self.metadata_indexing_include:\n vector_store_kwargs[\"metadata_indexing_include\"] = self.metadata_indexing_include\n elif self.metadata_indexing_exclude:\n vector_store_kwargs[\"metadata_indexing_exclude\"] = self.metadata_indexing_exclude\n elif self.collection_indexing_policy:\n vector_store_kwargs[\"collection_indexing_policy\"] = self.collection_indexing_policy\n\n try:\n vector_store = AstraDBVectorStore(**vector_store_kwargs)\n except Exception as e:\n msg = f\"Error initializing AstraDBVectorStore: {e}\"\n raise ValueError(msg) from e\n\n self._add_documents_to_vector_store(vector_store)\n return vector_store\n\n def _add_documents_to_vector_store(self, vector_store) -> None:\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 msg = \"Vector Store Inputs must be Data objects.\"\n raise TypeError(msg)\n\n if documents:\n self.log(f\"Adding {len(documents)} documents to the Vector Store.\")\n try:\n vector_store.add_documents(documents)\n except Exception as e:\n msg = f\"Error adding documents to AstraDBVectorStore: {e}\"\n raise ValueError(msg) from e\n else:\n self.log(\"No documents to add to the Vector Store.\")\n\n def _map_search_type(self) -> str:\n if self.search_type == \"Similarity with score threshold\":\n return \"similarity_score_threshold\"\n if self.search_type == \"MMR (Max Marginal Relevance)\":\n return \"mmr\"\n return \"similarity\"\n\n def _build_search_args(self):\n args = {\n \"k\": self.number_of_results,\n \"score_threshold\": self.search_score_threshold,\n }\n\n if self.search_filter:\n clean_filter = {k: v for k, v in self.search_filter.items() if k and v}\n if len(clean_filter) > 0:\n args[\"filter\"] = clean_filter\n return args\n\n def search_documents(self) -> list[Data]:\n vector_store = self.build_vector_store()\n\n self.log(f\"Search query: {self.search_query}\")\n self.log(f\"Search type: {self.search_type}\")\n self.log(f\"Number of results: {self.number_of_results}\")\n\n if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():\n try:\n search_type = self._map_search_type()\n search_args = self._build_search_args()\n\n docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)\n except Exception as e:\n msg = f\"Error performing search in AstraDBVectorStore: {e}\"\n raise ValueError(msg) from e\n\n self.log(f\"Retrieved documents: {len(docs)}\")\n\n data = docs_to_data(docs)\n self.log(f\"Converted documents to data: {len(data)}\")\n self.status = data\n return data\n self.log(\"No search input provided. Skipping search.\")\n return []\n\n def get_retriever_kwargs(self):\n search_args = self._build_search_args()\n return {\n \"search_type\": self._map_search_type(),\n \"search_kwargs\": search_args,\n }\n"},"collection_indexing_policy":{"_input_type":"StrInput","advanced":true,"display_name":"Collection Indexing Policy","dynamic":false,"info":"Optional dictionary defining the indexing policy for the collection.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"collection_indexing_policy","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"collection_name":{"_input_type":"StrInput","advanced":false,"display_name":"Collection Name","dynamic":false,"info":"The name of the collection within HCD where the vectors will be stored.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"collection_name","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"embedding":{"_input_type":"HandleInput","advanced":false,"display_name":"Embedding or Astra Vectorize","dynamic":false,"info":"Allows either an embedding model or an Astra Vectorize configuration.","input_types":["Embeddings","dict"],"list":false,"list_add_label":"Add More","name":"embedding","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"ingest_data":{"_input_type":"HandleInput","advanced":false,"display_name":"Ingest Data","dynamic":false,"info":"","input_types":["Data","DataFrame"],"list":true,"list_add_label":"Add More","name":"ingest_data","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"metadata_indexing_exclude":{"_input_type":"StrInput","advanced":true,"display_name":"Metadata Indexing Exclude","dynamic":false,"info":"Optional list of metadata fields to exclude from the indexing.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"metadata_indexing_exclude","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"metadata_indexing_include":{"_input_type":"StrInput","advanced":true,"display_name":"Metadata Indexing Include","dynamic":false,"info":"Optional list of metadata fields to include in the indexing.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"metadata_indexing_include","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"metric":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Metric","dynamic":false,"external_options":{},"info":"Optional distance metric for vector comparisons in the vector store.","name":"metric","options":["cosine","dot_product","euclidean"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":""},"namespace":{"_input_type":"StrInput","advanced":true,"display_name":"Namespace","dynamic":false,"info":"Optional namespace within HCD to use for the collection.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"namespace","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"default_namespace"},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Results","dynamic":false,"info":"Number of results to return.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":4},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"HCD Password","dynamic":false,"info":"Authentication password for accessing HCD.","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"HCD_PASSWORD"},"pre_delete_collection":{"_input_type":"BoolInput","advanced":true,"display_name":"Pre Delete Collection","dynamic":false,"info":"Boolean flag to determine whether to delete the collection before creating a new one.","list":false,"list_add_label":"Add More","name":"pre_delete_collection","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"search_filter":{"_input_type":"DictInput","advanced":true,"display_name":"Search Metadata Filter","dynamic":false,"info":"Optional dictionary of filters to apply to the search query.","list":true,"list_add_label":"Add More","name":"search_filter","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"search_query":{"_input_type":"QueryInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Enter a query to run a similarity search.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"search_query","placeholder":"Enter a query...","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"query","value":""},"search_score_threshold":{"_input_type":"FloatInput","advanced":true,"display_name":"Search Score Threshold","dynamic":false,"info":"Minimum similarity score threshold for search results. (when using 'Similarity with score threshold')","list":false,"list_add_label":"Add More","name":"search_score_threshold","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":0.0},"search_type":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Search Type","dynamic":false,"external_options":{},"info":"Search type to use","name":"search_type","options":["Similarity","Similarity with score threshold","MMR (Max Marginal Relevance)"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Similarity"},"setup_mode":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Setup Mode","dynamic":false,"external_options":{},"info":"Configuration mode for setting up the vector store, with options like 'Sync', 'Async', or 'Off'.","name":"setup_mode","options":["Sync","Async","Off"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Sync"},"should_cache_vector_store":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache Vector Store","dynamic":false,"info":"If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.","list":false,"list_add_label":"Add More","name":"should_cache_vector_store","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"username":{"_input_type":"StrInput","advanced":false,"display_name":"HCD Username","dynamic":false,"info":"Authentication username for accessing HCD.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"hcd-superuser"}},"tool_mode":false}}],["deepseek",{"DeepSeekModelComponent":{"base_classes":["LanguageModel","Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate text using DeepSeek LLMs.","display_name":"DeepSeek","documentation":"","edited":false,"field_order":["input_value","system_message","stream","max_tokens","model_kwargs","json_mode","model_name","api_base","api_key","temperature","seed"],"frozen":false,"icon":"DeepSeek","legacy":false,"metadata":{"code_hash":"c8dac7a258d7","dependencies":{"dependencies":[{"name":"requests","version":"2.32.5"},{"name":"pydantic","version":"2.10.6"},{"name":"typing_extensions","version":"4.15.0"},{"name":"lfx","version":null},{"name":"langchain_openai","version":"0.3.23"},{"name":"openai","version":"1.82.1"}],"total_dependencies":6},"keywords":["model","llm","language model","large language model"],"module":"lfx.components.deepseek.deepseek.DeepSeekModelComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Model Response","group_outputs":false,"method":"text_response","name":"text_output","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Language Model","group_outputs":false,"method":"build_model","name":"model_output","selected":"LanguageModel","tool_mode":true,"types":["LanguageModel"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_base":{"_input_type":"StrInput","advanced":true,"display_name":"DeepSeek API Base","dynamic":false,"info":"Base URL for API requests. Defaults to https://api.deepseek.com","list":false,"list_add_label":"Add More","load_from_db":false,"name":"api_base","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"https://api.deepseek.com"},"api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"DeepSeek API Key","dynamic":false,"info":"The DeepSeek API Key","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":true,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import requests\nfrom pydantic.v1 import SecretStr\nfrom typing_extensions import override\n\nfrom lfx.base.models.model import LCModelComponent\nfrom lfx.field_typing import LanguageModel\nfrom lfx.field_typing.range_spec import RangeSpec\nfrom lfx.inputs.inputs import BoolInput, DictInput, DropdownInput, IntInput, SecretStrInput, SliderInput, StrInput\n\nDEEPSEEK_MODELS = [\"deepseek-chat\"]\n\n\nclass DeepSeekModelComponent(LCModelComponent):\n display_name = \"DeepSeek\"\n description = \"Generate text using DeepSeek LLMs.\"\n icon = \"DeepSeek\"\n\n inputs = [\n *LCModelComponent.get_base_inputs(),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"Maximum number of tokens to generate. Set to 0 for unlimited.\",\n range_spec=RangeSpec(min=0, max=128000),\n ),\n DictInput(\n name=\"model_kwargs\",\n display_name=\"Model Kwargs\",\n advanced=True,\n info=\"Additional keyword arguments to pass to the model.\",\n ),\n BoolInput(\n name=\"json_mode\",\n display_name=\"JSON Mode\",\n advanced=True,\n info=\"If True, it will output JSON regardless of passing a schema.\",\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n info=\"DeepSeek model to use\",\n options=DEEPSEEK_MODELS,\n value=\"deepseek-chat\",\n refresh_button=True,\n ),\n StrInput(\n name=\"api_base\",\n display_name=\"DeepSeek API Base\",\n advanced=True,\n info=\"Base URL for API requests. Defaults to https://api.deepseek.com\",\n value=\"https://api.deepseek.com\",\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"DeepSeek API Key\",\n info=\"The DeepSeek API Key\",\n advanced=False,\n required=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n info=\"Controls randomness in responses\",\n value=1.0,\n range_spec=RangeSpec(min=0, max=2, step=0.01),\n advanced=True,\n ),\n IntInput(\n name=\"seed\",\n display_name=\"Seed\",\n info=\"The seed controls the reproducibility of the job.\",\n advanced=True,\n value=1,\n ),\n ]\n\n def get_models(self) -> list[str]:\n if not self.api_key:\n return DEEPSEEK_MODELS\n\n url = f\"{self.api_base}/models\"\n headers = {\"Authorization\": f\"Bearer {self.api_key}\", \"Accept\": \"application/json\"}\n\n try:\n response = requests.get(url, headers=headers, timeout=10)\n response.raise_for_status()\n model_list = response.json()\n return [model[\"id\"] for model in model_list.get(\"data\", [])]\n except requests.RequestException as e:\n self.status = f\"Error fetching models: {e}\"\n return DEEPSEEK_MODELS\n\n @override\n def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None):\n if field_name in {\"api_key\", \"api_base\", \"model_name\"}:\n models = self.get_models()\n build_config[\"model_name\"][\"options\"] = models\n return build_config\n\n def build_model(self) -> LanguageModel:\n try:\n from langchain_openai import ChatOpenAI\n except ImportError as e:\n msg = \"langchain-openai not installed. Please install with `pip install langchain-openai`\"\n raise ImportError(msg) from e\n\n api_key = SecretStr(self.api_key).get_secret_value() if self.api_key else None\n output = ChatOpenAI(\n model=self.model_name,\n temperature=self.temperature if self.temperature is not None else 0.1,\n max_tokens=self.max_tokens or None,\n model_kwargs=self.model_kwargs or {},\n base_url=self.api_base,\n api_key=api_key,\n streaming=self.stream if hasattr(self, \"stream\") else False,\n seed=self.seed,\n )\n\n if self.json_mode:\n output = output.bind(response_format={\"type\": \"json_object\"})\n\n return output\n\n def _get_exception_message(self, e: Exception):\n \"\"\"Get message from DeepSeek API exception.\"\"\"\n try:\n from openai import BadRequestError\n\n if isinstance(e, BadRequestError):\n message = e.body.get(\"message\")\n if message:\n return message\n except ImportError:\n pass\n return None\n"},"input_value":{"_input_type":"MessageInput","advanced":false,"display_name":"Input","dynamic":false,"info":"","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"json_mode":{"_input_type":"BoolInput","advanced":true,"display_name":"JSON Mode","dynamic":false,"info":"If True, it will output JSON regardless of passing a schema.","list":false,"list_add_label":"Add More","name":"json_mode","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"max_tokens":{"_input_type":"IntInput","advanced":true,"display_name":"Max Tokens","dynamic":false,"info":"Maximum number of tokens to generate. Set to 0 for unlimited.","list":false,"list_add_label":"Add More","name":"max_tokens","placeholder":"","range_spec":{"max":128000.0,"min":0.0,"step":0.1,"step_type":"float"},"required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"model_kwargs":{"_input_type":"DictInput","advanced":true,"display_name":"Model Kwargs","dynamic":false,"info":"Additional keyword arguments to pass to the model.","list":false,"list_add_label":"Add More","name":"model_kwargs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"track_in_telemetry":false,"type":"dict","value":{}},"model_name":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Model Name","dynamic":false,"external_options":{},"info":"DeepSeek model to use","name":"model_name","options":["deepseek-chat"],"options_metadata":[],"placeholder":"","refresh_button":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"deepseek-chat"},"seed":{"_input_type":"IntInput","advanced":true,"display_name":"Seed","dynamic":false,"info":"The seed controls the reproducibility of the job.","list":false,"list_add_label":"Add More","name":"seed","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":1},"stream":{"_input_type":"BoolInput","advanced":true,"display_name":"Stream","dynamic":false,"info":"Stream the response from the model. Streaming works only in Chat.","list":false,"list_add_label":"Add More","name":"stream","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"system_message":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"System Message","dynamic":false,"info":"System message to pass to the model.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"system_message","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"temperature":{"_input_type":"SliderInput","advanced":true,"display_name":"Temperature","dynamic":false,"info":"Controls randomness in responses","max_label":"","max_label_icon":"","min_label":"","min_label_icon":"","name":"temperature","placeholder":"","range_spec":{"max":2.0,"min":0.0,"step":0.01,"step_type":"float"},"required":false,"show":true,"slider_buttons":false,"slider_buttons_options":[],"slider_input":false,"title_case":false,"tool_mode":false,"track_in_telemetry":false,"type":"slider","value":1.0}},"tool_mode":false}}],["docling",{"ChunkDoclingDocument":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Use the DocumentDocument chunkers to split the document into chunks.","display_name":"Chunk DoclingDocument","documentation":"https://docling-project.github.io/docling/concepts/chunking/","edited":false,"field_order":["data_inputs","chunker","provider","hf_model_name","openai_model_name","max_tokens","doc_key"],"frozen":false,"icon":"Docling","legacy":false,"metadata":{"code_hash":"397fa38f89d7","dependencies":{"dependencies":[{"name":"tiktoken","version":"0.12.0"},{"name":"docling_core","version":"2.49.0"},{"name":"lfx","version":null}],"total_dependencies":3},"module":"lfx.components.docling.chunk_docling_document.ChunkDoclingDocumentComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"chunk_documents","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","chunker":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Chunker","dynamic":false,"external_options":{},"info":"Which chunker to use.","name":"chunker","options":["HybridChunker","HierarchicalChunker"],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"HybridChunker"},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import json\n\nimport tiktoken\nfrom docling_core.transforms.chunker import BaseChunker, DocMeta\nfrom docling_core.transforms.chunker.hierarchical_chunker import HierarchicalChunker\n\nfrom lfx.base.data.docling_utils import extract_docling_documents\nfrom lfx.custom import Component\nfrom lfx.io import DropdownInput, HandleInput, IntInput, MessageTextInput, Output, StrInput\nfrom lfx.schema import Data, DataFrame\n\n\nclass ChunkDoclingDocumentComponent(Component):\n display_name: str = \"Chunk DoclingDocument\"\n description: str = \"Use the DocumentDocument chunkers to split the document into chunks.\"\n documentation = \"https://docling-project.github.io/docling/concepts/chunking/\"\n icon = \"Docling\"\n name = \"ChunkDoclingDocument\"\n\n inputs = [\n HandleInput(\n name=\"data_inputs\",\n display_name=\"Data or DataFrame\",\n info=\"The data with documents to split in chunks.\",\n input_types=[\"Data\", \"DataFrame\"],\n required=True,\n ),\n DropdownInput(\n name=\"chunker\",\n display_name=\"Chunker\",\n options=[\"HybridChunker\", \"HierarchicalChunker\"],\n info=(\"Which chunker to use.\"),\n value=\"HybridChunker\",\n real_time_refresh=True,\n ),\n DropdownInput(\n name=\"provider\",\n display_name=\"Provider\",\n options=[\"Hugging Face\", \"OpenAI\"],\n info=(\"Which tokenizer provider.\"),\n value=\"Hugging Face\",\n show=True,\n real_time_refresh=True,\n advanced=True,\n dynamic=True,\n ),\n StrInput(\n name=\"hf_model_name\",\n display_name=\"HF model name\",\n info=(\n \"Model name of the tokenizer to use with the HybridChunker when Hugging Face is chosen as a tokenizer.\"\n ),\n value=\"sentence-transformers/all-MiniLM-L6-v2\",\n show=True,\n advanced=True,\n dynamic=True,\n ),\n StrInput(\n name=\"openai_model_name\",\n display_name=\"OpenAI model name\",\n info=(\"Model name of the tokenizer to use with the HybridChunker when OpenAI is chosen as a tokenizer.\"),\n value=\"gpt-4o\",\n show=False,\n advanced=True,\n dynamic=True,\n ),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Maximum tokens\",\n info=(\"Maximum number of tokens for the HybridChunker.\"),\n show=True,\n required=False,\n advanced=True,\n dynamic=True,\n ),\n MessageTextInput(\n name=\"doc_key\",\n display_name=\"Doc Key\",\n info=\"The key to use for the DoclingDocument column.\",\n value=\"doc\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"DataFrame\", name=\"dataframe\", method=\"chunk_documents\"),\n ]\n\n def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None) -> dict:\n if field_name == \"chunker\":\n provider_type = build_config[\"provider\"][\"value\"]\n is_hf = provider_type == \"Hugging Face\"\n is_openai = provider_type == \"OpenAI\"\n if field_value == \"HybridChunker\":\n build_config[\"provider\"][\"show\"] = True\n build_config[\"hf_model_name\"][\"show\"] = is_hf\n build_config[\"openai_model_name\"][\"show\"] = is_openai\n build_config[\"max_tokens\"][\"show\"] = True\n else:\n build_config[\"provider\"][\"show\"] = False\n build_config[\"hf_model_name\"][\"show\"] = False\n build_config[\"openai_model_name\"][\"show\"] = False\n build_config[\"max_tokens\"][\"show\"] = False\n elif field_name == \"provider\" and build_config[\"chunker\"][\"value\"] == \"HybridChunker\":\n if field_value == \"Hugging Face\":\n build_config[\"hf_model_name\"][\"show\"] = True\n build_config[\"openai_model_name\"][\"show\"] = False\n elif field_value == \"OpenAI\":\n build_config[\"hf_model_name\"][\"show\"] = False\n build_config[\"openai_model_name\"][\"show\"] = True\n\n return build_config\n\n def _docs_to_data(self, docs) -> list[Data]:\n return [Data(text=doc.page_content, data=doc.metadata) for doc in docs]\n\n def chunk_documents(self) -> DataFrame:\n documents = extract_docling_documents(self.data_inputs, self.doc_key)\n\n chunker: BaseChunker\n if self.chunker == \"HybridChunker\":\n try:\n from docling_core.transforms.chunker.hybrid_chunker import HybridChunker\n except ImportError as e:\n msg = (\n \"HybridChunker is not installed. Please install it with `uv pip install docling-core[chunking] \"\n \"or `uv pip install transformers`\"\n )\n raise ImportError(msg) from e\n max_tokens: int | None = self.max_tokens if self.max_tokens else None\n if self.provider == \"Hugging Face\":\n try:\n from docling_core.transforms.chunker.tokenizer.huggingface import HuggingFaceTokenizer\n except ImportError as e:\n msg = (\n \"HuggingFaceTokenizer is not installed.\"\n \" Please install it with `uv pip install docling-core[chunking]`\"\n )\n raise ImportError(msg) from e\n tokenizer = HuggingFaceTokenizer.from_pretrained(\n model_name=self.hf_model_name,\n max_tokens=max_tokens,\n )\n elif self.provider == \"OpenAI\":\n try:\n from docling_core.transforms.chunker.tokenizer.openai import OpenAITokenizer\n except ImportError as e:\n msg = (\n \"OpenAITokenizer is not installed.\"\n \" Please install it with `uv pip install docling-core[chunking]`\"\n \" or `uv pip install transformers`\"\n )\n raise ImportError(msg) from e\n if max_tokens is None:\n max_tokens = 128 * 1024 # context window length required for OpenAI tokenizers\n tokenizer = OpenAITokenizer(\n tokenizer=tiktoken.encoding_for_model(self.openai_model_name), max_tokens=max_tokens\n )\n chunker = HybridChunker(\n tokenizer=tokenizer,\n )\n elif self.chunker == \"HierarchicalChunker\":\n chunker = HierarchicalChunker()\n\n results: list[Data] = []\n try:\n for doc in documents:\n for chunk in chunker.chunk(dl_doc=doc):\n enriched_text = chunker.contextualize(chunk=chunk)\n meta = DocMeta.model_validate(chunk.meta)\n\n results.append(\n Data(\n data={\n \"text\": enriched_text,\n \"document_id\": f\"{doc.origin.binary_hash}\",\n \"doc_items\": json.dumps([item.self_ref for item in meta.doc_items]),\n }\n )\n )\n\n except Exception as e:\n msg = f\"Error splitting text: {e}\"\n raise TypeError(msg) from e\n\n return DataFrame(results)\n"},"data_inputs":{"_input_type":"HandleInput","advanced":false,"display_name":"Data or DataFrame","dynamic":false,"info":"The data with documents to split in chunks.","input_types":["Data","DataFrame"],"list":false,"list_add_label":"Add More","name":"data_inputs","placeholder":"","required":true,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"doc_key":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Doc Key","dynamic":false,"info":"The key to use for the DoclingDocument column.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"doc_key","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"doc"},"hf_model_name":{"_input_type":"StrInput","advanced":true,"display_name":"HF model name","dynamic":true,"info":"Model name of the tokenizer to use with the HybridChunker when Hugging Face is chosen as a tokenizer.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"hf_model_name","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"sentence-transformers/all-MiniLM-L6-v2"},"max_tokens":{"_input_type":"IntInput","advanced":true,"display_name":"Maximum tokens","dynamic":true,"info":"Maximum number of tokens for the HybridChunker.","list":false,"list_add_label":"Add More","name":"max_tokens","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":""},"openai_model_name":{"_input_type":"StrInput","advanced":true,"display_name":"OpenAI model name","dynamic":true,"info":"Model name of the tokenizer to use with the HybridChunker when OpenAI is chosen as a tokenizer.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"openai_model_name","placeholder":"","required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"gpt-4o"},"provider":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Provider","dynamic":true,"external_options":{},"info":"Which tokenizer provider.","name":"provider","options":["Hugging Face","OpenAI"],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Hugging Face"}},"tool_mode":false},"DoclingInline":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Uses Docling to process input documents running the Docling models locally.","display_name":"Docling","documentation":"https://docling-project.github.io/docling/","edited":false,"field_order":["path","file_path","separator","silent_errors","delete_server_file_after_processing","ignore_unsupported_extensions","ignore_unspecified_files","pipeline","ocr_engine","do_picture_classification","pic_desc_llm","pic_desc_prompt"],"frozen":false,"icon":"Docling","legacy":false,"metadata":{"code_hash":"d76b3853ceb4","dependencies":{"dependencies":[{"name":"lfx","version":null},{"name":"docling","version":"2.58.0"}],"total_dependencies":2},"module":"lfx.components.docling.docling_inline.DoclingInlineComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Files","group_outputs":false,"method":"load_files","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import time\nfrom multiprocessing import Queue, get_context\nfrom queue import Empty\n\nfrom lfx.base.data import BaseFileComponent\nfrom lfx.base.data.docling_utils import _serialize_pydantic_model, docling_worker\nfrom lfx.inputs import BoolInput, DropdownInput, HandleInput, StrInput\nfrom lfx.schema import Data\n\n\nclass DoclingInlineComponent(BaseFileComponent):\n display_name = \"Docling\"\n description = \"Uses Docling to process input documents running the Docling models locally.\"\n documentation = \"https://docling-project.github.io/docling/\"\n trace_type = \"tool\"\n icon = \"Docling\"\n name = \"DoclingInline\"\n\n # https://docling-project.github.io/docling/usage/supported_formats/\n VALID_EXTENSIONS = [\n \"adoc\",\n \"asciidoc\",\n \"asc\",\n \"bmp\",\n \"csv\",\n \"dotx\",\n \"dotm\",\n \"docm\",\n \"docx\",\n \"htm\",\n \"html\",\n \"jpeg\",\n \"json\",\n \"md\",\n \"pdf\",\n \"png\",\n \"potx\",\n \"ppsx\",\n \"pptm\",\n \"potm\",\n \"ppsm\",\n \"pptx\",\n \"tiff\",\n \"txt\",\n \"xls\",\n \"xlsx\",\n \"xhtml\",\n \"xml\",\n \"webp\",\n ]\n\n inputs = [\n *BaseFileComponent.get_base_inputs(),\n DropdownInput(\n name=\"pipeline\",\n display_name=\"Pipeline\",\n info=\"Docling pipeline to use\",\n options=[\"standard\", \"vlm\"],\n value=\"standard\",\n ),\n DropdownInput(\n name=\"ocr_engine\",\n display_name=\"OCR Engine\",\n info=\"OCR engine to use. None will disable OCR.\",\n options=[\"None\", \"easyocr\", \"tesserocr\", \"rapidocr\", \"ocrmac\"],\n value=\"None\",\n ),\n BoolInput(\n name=\"do_picture_classification\",\n display_name=\"Picture classification\",\n info=\"If enabled, the Docling pipeline will classify the pictures type.\",\n value=False,\n ),\n HandleInput(\n name=\"pic_desc_llm\",\n display_name=\"Picture description LLM\",\n info=\"If connected, the model to use for running the picture description task.\",\n input_types=[\"LanguageModel\"],\n required=False,\n ),\n StrInput(\n name=\"pic_desc_prompt\",\n display_name=\"Picture description prompt\",\n value=\"Describe the image in three sentences. Be concise and accurate.\",\n info=\"The user prompt to use when invoking the model.\",\n advanced=True,\n ),\n # TODO: expose more Docling options\n ]\n\n outputs = [\n *BaseFileComponent.get_base_outputs(),\n ]\n\n def _wait_for_result_with_process_monitoring(self, queue: Queue, proc, timeout: int = 300):\n \"\"\"Wait for result from queue while monitoring process health.\n\n Handles cases where process crashes without sending result.\n \"\"\"\n start_time = time.time()\n\n while time.time() - start_time < timeout:\n # Check if process is still alive\n if not proc.is_alive():\n # Process died, try to get any result it might have sent\n try:\n result = queue.get_nowait()\n except Empty:\n # Process died without sending result\n msg = f\"Worker process crashed unexpectedly without producing result. Exit code: {proc.exitcode}\"\n raise RuntimeError(msg) from None\n else:\n self.log(\"Process completed and result retrieved\")\n return result\n\n # Poll the queue instead of blocking\n try:\n result = queue.get(timeout=1)\n except Empty:\n # No result yet, continue monitoring\n continue\n else:\n self.log(\"Result received from worker process\")\n return result\n\n # Overall timeout reached\n msg = f\"Process timed out after {timeout} seconds\"\n raise TimeoutError(msg)\n\n def _terminate_process_gracefully(self, proc, timeout_terminate: int = 10, timeout_kill: int = 5):\n \"\"\"Terminate process gracefully with escalating signals.\n\n First tries SIGTERM, then SIGKILL if needed.\n \"\"\"\n if not proc.is_alive():\n return\n\n self.log(\"Attempting graceful process termination with SIGTERM\")\n proc.terminate() # Send SIGTERM\n proc.join(timeout=timeout_terminate)\n\n if proc.is_alive():\n self.log(\"Process didn't respond to SIGTERM, using SIGKILL\")\n proc.kill() # Send SIGKILL\n proc.join(timeout=timeout_kill)\n\n if proc.is_alive():\n self.log(\"Warning: Process still alive after SIGKILL\")\n\n def process_files(self, file_list: list[BaseFileComponent.BaseFile]) -> list[BaseFileComponent.BaseFile]:\n try:\n from docling.document_converter import DocumentConverter # noqa: F401\n except ImportError as e:\n msg = (\n \"Docling is an optional dependency. Install with `uv pip install 'langflow[docling]'` or refer to the \"\n \"documentation on how to install optional dependencies.\"\n )\n raise ImportError(msg) from e\n\n file_paths = [file.path for file in file_list if file.path]\n\n if not file_paths:\n self.log(\"No files to process.\")\n return file_list\n\n pic_desc_config: dict | None = None\n if self.pic_desc_llm is not None:\n pic_desc_config = _serialize_pydantic_model(self.pic_desc_llm)\n\n ctx = get_context(\"spawn\")\n queue: Queue = ctx.Queue()\n proc = ctx.Process(\n target=docling_worker,\n kwargs={\n \"file_paths\": file_paths,\n \"queue\": queue,\n \"pipeline\": self.pipeline,\n \"ocr_engine\": self.ocr_engine,\n \"do_picture_classification\": self.do_picture_classification,\n \"pic_desc_config\": pic_desc_config,\n \"pic_desc_prompt\": self.pic_desc_prompt,\n },\n )\n\n result = None\n proc.start()\n\n try:\n result = self._wait_for_result_with_process_monitoring(queue, proc, timeout=300)\n except KeyboardInterrupt:\n self.log(\"Docling process cancelled by user\")\n result = []\n except Exception as e:\n self.log(f\"Error during processing: {e}\")\n raise\n finally:\n # Improved cleanup with graceful termination\n try:\n self._terminate_process_gracefully(proc)\n finally:\n # Always close and cleanup queue resources\n try:\n queue.close()\n queue.join_thread()\n except Exception as e: # noqa: BLE001\n # Ignore cleanup errors, but log them\n self.log(f\"Warning: Error during queue cleanup - {e}\")\n\n # Enhanced error checking with dependency-specific handling\n if isinstance(result, dict) and \"error\" in result:\n error_msg = result[\"error\"]\n\n # Handle dependency errors specifically\n if result.get(\"error_type\") == \"dependency_error\":\n dependency_name = result.get(\"dependency_name\", \"Unknown dependency\")\n install_command = result.get(\"install_command\", \"Please check documentation\")\n\n # Create a user-friendly error message\n user_message = (\n f\"Missing OCR dependency: {dependency_name}. \"\n f\"{install_command} \"\n f\"Alternatively, you can set OCR Engine to 'None' to disable OCR processing.\"\n )\n raise ImportError(user_message)\n\n # Handle other specific errors\n if error_msg.startswith(\"Docling is not installed\"):\n raise ImportError(error_msg)\n\n # Handle graceful shutdown\n if \"Worker interrupted by SIGINT\" in error_msg or \"shutdown\" in result:\n self.log(\"Docling process cancelled by user\")\n result = []\n else:\n raise RuntimeError(error_msg)\n\n processed_data = [Data(data={\"doc\": r[\"document\"], \"file_path\": r[\"file_path\"]}) if r else None for r in result]\n return self.rollup_data(file_list, processed_data)\n"},"delete_server_file_after_processing":{"_input_type":"BoolInput","advanced":true,"display_name":"Delete Server File After Processing","dynamic":false,"info":"If true, the Server File Path will be deleted after processing.","list":false,"list_add_label":"Add More","name":"delete_server_file_after_processing","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"do_picture_classification":{"_input_type":"BoolInput","advanced":false,"display_name":"Picture classification","dynamic":false,"info":"If enabled, the Docling pipeline will classify the pictures type.","list":false,"list_add_label":"Add More","name":"do_picture_classification","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"file_path":{"_input_type":"HandleInput","advanced":true,"display_name":"Server File Path","dynamic":false,"info":"Data object with a 'file_path' property pointing to server file or a Message object with a path to the file. Supercedes 'Path' but supports same file types.","input_types":["Data","Message"],"list":true,"list_add_label":"Add More","name":"file_path","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"ignore_unspecified_files":{"_input_type":"BoolInput","advanced":true,"display_name":"Ignore Unspecified Files","dynamic":false,"info":"If true, Data with no 'file_path' property will be ignored.","list":false,"list_add_label":"Add More","name":"ignore_unspecified_files","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"ignore_unsupported_extensions":{"_input_type":"BoolInput","advanced":true,"display_name":"Ignore Unsupported Extensions","dynamic":false,"info":"If true, files with unsupported extensions will not be processed.","list":false,"list_add_label":"Add More","name":"ignore_unsupported_extensions","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"ocr_engine":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"OCR Engine","dynamic":false,"external_options":{},"info":"OCR engine to use. None will disable OCR.","name":"ocr_engine","options":["None","easyocr","tesserocr","rapidocr","ocrmac"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"None"},"path":{"_input_type":"FileInput","advanced":false,"display_name":"Files","dynamic":false,"fileTypes":["adoc","asciidoc","asc","bmp","csv","dotx","dotm","docm","docx","htm","html","jpeg","json","md","pdf","png","potx","ppsx","pptm","potm","ppsm","pptx","tiff","txt","xls","xlsx","xhtml","xml","webp","zip","tar","tgz","bz2","gz"],"file_path":"","info":"Supported file extensions: adoc, asciidoc, asc, bmp, csv, dotx, dotm, docm, docx, htm, html, jpeg, json, md, pdf, png, potx, ppsx, pptm, potm, ppsm, pptx, tiff, txt, xls, xlsx, xhtml, xml, webp; optionally bundled in file extensions: zip, tar, tgz, bz2, gz","list":true,"list_add_label":"Add More","name":"path","placeholder":"","required":false,"show":true,"temp_file":false,"title_case":false,"tool_mode":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"file","value":[]},"pic_desc_llm":{"_input_type":"HandleInput","advanced":false,"display_name":"Picture description LLM","dynamic":false,"info":"If connected, the model to use for running the picture description task.","input_types":["LanguageModel"],"list":false,"list_add_label":"Add More","name":"pic_desc_llm","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"pic_desc_prompt":{"_input_type":"StrInput","advanced":true,"display_name":"Picture description prompt","dynamic":false,"info":"The user prompt to use when invoking the model.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"pic_desc_prompt","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"Describe the image in three sentences. Be concise and accurate."},"pipeline":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Pipeline","dynamic":false,"external_options":{},"info":"Docling pipeline to use","name":"pipeline","options":["standard","vlm"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"standard"},"separator":{"_input_type":"StrInput","advanced":true,"display_name":"Separator","dynamic":false,"info":"Specify the separator to use between multiple outputs in Message format.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"separator","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"\n\n"},"silent_errors":{"_input_type":"BoolInput","advanced":true,"display_name":"Silent Errors","dynamic":false,"info":"If true, errors will not raise an exception.","list":false,"list_add_label":"Add More","name":"silent_errors","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false}},"tool_mode":false},"DoclingRemote":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Uses Docling to process input documents connecting to your instance of Docling Serve.","display_name":"Docling Serve","documentation":"https://docling-project.github.io/docling/","edited":false,"field_order":["path","file_path","separator","silent_errors","delete_server_file_after_processing","ignore_unsupported_extensions","ignore_unspecified_files","api_url","max_concurrency","max_poll_timeout","api_headers","docling_serve_opts"],"frozen":false,"icon":"Docling","legacy":false,"metadata":{"code_hash":"26eeb513dded","dependencies":{"dependencies":[{"name":"httpx","version":"0.28.1"},{"name":"docling_core","version":"2.49.0"},{"name":"pydantic","version":"2.10.6"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.docling.docling_remote.DoclingRemoteComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Files","group_outputs":false,"method":"load_files","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_headers":{"_input_type":"NestedDictInput","advanced":true,"display_name":"HTTP headers","dynamic":false,"info":"Optional dictionary of additional headers required for connecting to Docling Serve.","list":false,"list_add_label":"Add More","name":"api_headers","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"NestedDict","value":{}},"api_url":{"_input_type":"StrInput","advanced":false,"display_name":"Server address","dynamic":false,"info":"URL of the Docling Serve instance.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"api_url","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"import base64\nimport time\nfrom concurrent.futures import Future, ThreadPoolExecutor\nfrom pathlib import Path\nfrom typing import Any\n\nimport httpx\nfrom docling_core.types.doc import DoclingDocument\nfrom pydantic import ValidationError\n\nfrom lfx.base.data import BaseFileComponent\nfrom lfx.inputs import IntInput, NestedDictInput, StrInput\nfrom lfx.inputs.inputs import FloatInput\nfrom lfx.schema import Data\nfrom lfx.utils.util import transform_localhost_url\n\n\nclass DoclingRemoteComponent(BaseFileComponent):\n display_name = \"Docling Serve\"\n description = \"Uses Docling to process input documents connecting to your instance of Docling Serve.\"\n documentation = \"https://docling-project.github.io/docling/\"\n trace_type = \"tool\"\n icon = \"Docling\"\n name = \"DoclingRemote\"\n\n MAX_500_RETRIES = 5\n\n # https://docling-project.github.io/docling/usage/supported_formats/\n VALID_EXTENSIONS = [\n \"adoc\",\n \"asciidoc\",\n \"asc\",\n \"bmp\",\n \"csv\",\n \"dotx\",\n \"dotm\",\n \"docm\",\n \"docx\",\n \"htm\",\n \"html\",\n \"jpeg\",\n \"json\",\n \"md\",\n \"pdf\",\n \"png\",\n \"potx\",\n \"ppsx\",\n \"pptm\",\n \"potm\",\n \"ppsm\",\n \"pptx\",\n \"tiff\",\n \"txt\",\n \"xls\",\n \"xlsx\",\n \"xhtml\",\n \"xml\",\n \"webp\",\n ]\n\n inputs = [\n *BaseFileComponent.get_base_inputs(),\n StrInput(\n name=\"api_url\",\n display_name=\"Server address\",\n info=\"URL of the Docling Serve instance.\",\n required=True,\n ),\n IntInput(\n name=\"max_concurrency\",\n display_name=\"Concurrency\",\n info=\"Maximum number of concurrent requests for the server.\",\n advanced=True,\n value=2,\n ),\n FloatInput(\n name=\"max_poll_timeout\",\n display_name=\"Maximum poll time\",\n info=\"Maximum waiting time for the document conversion to complete.\",\n advanced=True,\n value=3600,\n ),\n NestedDictInput(\n name=\"api_headers\",\n display_name=\"HTTP headers\",\n advanced=True,\n required=False,\n info=(\"Optional dictionary of additional headers required for connecting to Docling Serve.\"),\n ),\n NestedDictInput(\n name=\"docling_serve_opts\",\n display_name=\"Docling options\",\n advanced=True,\n required=False,\n info=(\n \"Optional dictionary of additional options. \"\n \"See https://github.com/docling-project/docling-serve/blob/main/docs/usage.md for more information.\"\n ),\n ),\n ]\n\n outputs = [\n *BaseFileComponent.get_base_outputs(),\n ]\n\n def process_files(self, file_list: list[BaseFileComponent.BaseFile]) -> list[BaseFileComponent.BaseFile]:\n # Transform localhost URLs to container-accessible hosts when running in a container\n transformed_url = transform_localhost_url(self.api_url)\n base_url = f\"{transformed_url}/v1\"\n\n def _convert_document(client: httpx.Client, file_path: Path, options: dict[str, Any]) -> Data | None:\n encoded_doc = base64.b64encode(file_path.read_bytes()).decode()\n payload = {\n \"options\": options,\n \"sources\": [{\"kind\": \"file\", \"base64_string\": encoded_doc, \"filename\": file_path.name}],\n }\n\n response = client.post(f\"{base_url}/convert/source/async\", json=payload)\n response.raise_for_status()\n task = response.json()\n\n http_failures = 0\n retry_status_start = 500\n retry_status_end = 600\n start_wait_time = time.monotonic()\n while task[\"task_status\"] not in (\"success\", \"failure\"):\n # Check if processing exceeds the maximum poll timeout\n processing_time = time.monotonic() - start_wait_time\n if processing_time >= self.max_poll_timeout:\n msg = (\n f\"Processing time {processing_time=} exceeds the maximum poll timeout {self.max_poll_timeout=}.\"\n \"Please increase the max_poll_timeout parameter or review why the processing \"\n \"takes long on the server.\"\n )\n self.log(msg)\n raise RuntimeError(msg)\n\n # Call for a new status update\n time.sleep(2)\n response = client.get(f\"{base_url}/status/poll/{task['task_id']}\")\n\n # Check if the status call gets into 5xx errors and retry\n if retry_status_start <= response.status_code < retry_status_end:\n http_failures += 1\n if http_failures > self.MAX_500_RETRIES:\n self.log(f\"The status requests got a http response {response.status_code} too many times.\")\n return None\n continue\n\n # Update task status\n task = response.json()\n\n result_resp = client.get(f\"{base_url}/result/{task['task_id']}\")\n result_resp.raise_for_status()\n result = result_resp.json()\n\n if \"json_content\" not in result[\"document\"] or result[\"document\"][\"json_content\"] is None:\n self.log(\"No JSON DoclingDocument found in the result.\")\n return None\n\n try:\n doc = DoclingDocument.model_validate(result[\"document\"][\"json_content\"])\n return Data(data={\"doc\": doc, \"file_path\": str(file_path)})\n except ValidationError as e:\n self.log(f\"Error validating the document. {e}\")\n return None\n\n docling_options = {\n \"to_formats\": [\"json\"],\n \"image_export_mode\": \"placeholder\",\n **(self.docling_serve_opts or {}),\n }\n\n processed_data: list[Data | None] = []\n with (\n httpx.Client(headers=self.api_headers) as client,\n ThreadPoolExecutor(max_workers=self.max_concurrency) as executor,\n ):\n futures: list[tuple[int, Future]] = []\n for i, file in enumerate(file_list):\n if file.path is None:\n processed_data.append(None)\n continue\n\n futures.append((i, executor.submit(_convert_document, client, file.path, docling_options)))\n\n for _index, future in futures:\n try:\n result_data = future.result()\n processed_data.append(result_data)\n except (httpx.HTTPStatusError, httpx.RequestError, KeyError, ValueError) as exc:\n self.log(f\"Docling remote processing failed: {exc}\")\n raise\n\n return self.rollup_data(file_list, processed_data)\n"},"delete_server_file_after_processing":{"_input_type":"BoolInput","advanced":true,"display_name":"Delete Server File After Processing","dynamic":false,"info":"If true, the Server File Path will be deleted after processing.","list":false,"list_add_label":"Add More","name":"delete_server_file_after_processing","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"docling_serve_opts":{"_input_type":"NestedDictInput","advanced":true,"display_name":"Docling options","dynamic":false,"info":"Optional dictionary of additional options. See https://github.com/docling-project/docling-serve/blob/main/docs/usage.md for more information.","list":false,"list_add_label":"Add More","name":"docling_serve_opts","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"NestedDict","value":{}},"file_path":{"_input_type":"HandleInput","advanced":true,"display_name":"Server File Path","dynamic":false,"info":"Data object with a 'file_path' property pointing to server file or a Message object with a path to the file. Supercedes 'Path' but supports same file types.","input_types":["Data","Message"],"list":true,"list_add_label":"Add More","name":"file_path","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"ignore_unspecified_files":{"_input_type":"BoolInput","advanced":true,"display_name":"Ignore Unspecified Files","dynamic":false,"info":"If true, Data with no 'file_path' property will be ignored.","list":false,"list_add_label":"Add More","name":"ignore_unspecified_files","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"ignore_unsupported_extensions":{"_input_type":"BoolInput","advanced":true,"display_name":"Ignore Unsupported Extensions","dynamic":false,"info":"If true, files with unsupported extensions will not be processed.","list":false,"list_add_label":"Add More","name":"ignore_unsupported_extensions","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"max_concurrency":{"_input_type":"IntInput","advanced":true,"display_name":"Concurrency","dynamic":false,"info":"Maximum number of concurrent requests for the server.","list":false,"list_add_label":"Add More","name":"max_concurrency","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":2},"max_poll_timeout":{"_input_type":"FloatInput","advanced":true,"display_name":"Maximum poll time","dynamic":false,"info":"Maximum waiting time for the document conversion to complete.","list":false,"list_add_label":"Add More","name":"max_poll_timeout","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":3600.0},"path":{"_input_type":"FileInput","advanced":false,"display_name":"Files","dynamic":false,"fileTypes":["adoc","asciidoc","asc","bmp","csv","dotx","dotm","docm","docx","htm","html","jpeg","json","md","pdf","png","potx","ppsx","pptm","potm","ppsm","pptx","tiff","txt","xls","xlsx","xhtml","xml","webp","zip","tar","tgz","bz2","gz"],"file_path":"","info":"Supported file extensions: adoc, asciidoc, asc, bmp, csv, dotx, dotm, docm, docx, htm, html, jpeg, json, md, pdf, png, potx, ppsx, pptm, potm, ppsm, pptx, tiff, txt, xls, xlsx, xhtml, xml, webp; optionally bundled in file extensions: zip, tar, tgz, bz2, gz","list":true,"list_add_label":"Add More","name":"path","placeholder":"","required":false,"show":true,"temp_file":false,"title_case":false,"tool_mode":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"file","value":[]},"separator":{"_input_type":"StrInput","advanced":true,"display_name":"Separator","dynamic":false,"info":"Specify the separator to use between multiple outputs in Message format.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"separator","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"\n\n"},"silent_errors":{"_input_type":"BoolInput","advanced":true,"display_name":"Silent Errors","dynamic":false,"info":"If true, errors will not raise an exception.","list":false,"list_add_label":"Add More","name":"silent_errors","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false}},"tool_mode":false},"ExportDoclingDocument":{"base_classes":["Data","DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Export DoclingDocument to markdown, html or other formats.","display_name":"Export DoclingDocument","documentation":"https://docling-project.github.io/docling/","edited":false,"field_order":["data_inputs","export_format","image_mode","md_image_placeholder","md_page_break_placeholder","doc_key"],"frozen":false,"icon":"Docling","legacy":false,"metadata":{"code_hash":"4de16ddd37ac","dependencies":{"dependencies":[{"name":"docling_core","version":"2.49.0"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.docling.export_docling_document.ExportDoclingDocumentComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Exported data","group_outputs":false,"method":"export_document","name":"data","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from typing import Any\n\nfrom docling_core.types.doc import ImageRefMode\n\nfrom lfx.base.data.docling_utils import extract_docling_documents\nfrom lfx.custom import Component\nfrom lfx.io import DropdownInput, HandleInput, MessageTextInput, Output, StrInput\nfrom lfx.schema import Data, DataFrame\n\n\nclass ExportDoclingDocumentComponent(Component):\n display_name: str = \"Export DoclingDocument\"\n description: str = \"Export DoclingDocument to markdown, html or other formats.\"\n documentation = \"https://docling-project.github.io/docling/\"\n icon = \"Docling\"\n name = \"ExportDoclingDocument\"\n\n inputs = [\n HandleInput(\n name=\"data_inputs\",\n display_name=\"Data or DataFrame\",\n info=\"The data with documents to export.\",\n input_types=[\"Data\", \"DataFrame\"],\n required=True,\n ),\n DropdownInput(\n name=\"export_format\",\n display_name=\"Export format\",\n options=[\"Markdown\", \"HTML\", \"Plaintext\", \"DocTags\"],\n info=\"Select the export format to convert the input.\",\n value=\"Markdown\",\n real_time_refresh=True,\n ),\n DropdownInput(\n name=\"image_mode\",\n display_name=\"Image export mode\",\n options=[\"placeholder\", \"embedded\"],\n info=(\n \"Specify how images are exported in the output. Placeholder will replace the images with a string, \"\n \"whereas Embedded will include them as base64 encoded images.\"\n ),\n value=\"placeholder\",\n ),\n StrInput(\n name=\"md_image_placeholder\",\n display_name=\"Image placeholder\",\n info=\"Specify the image placeholder for markdown exports.\",\n value=\"\",\n advanced=True,\n ),\n StrInput(\n name=\"md_page_break_placeholder\",\n display_name=\"Page break placeholder\",\n info=\"Add this placeholder betweek pages in the markdown output.\",\n value=\"\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"doc_key\",\n display_name=\"Doc Key\",\n info=\"The key to use for the DoclingDocument column.\",\n value=\"doc\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Exported data\", name=\"data\", method=\"export_document\"),\n Output(display_name=\"DataFrame\", name=\"dataframe\", method=\"as_dataframe\"),\n ]\n\n def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:\n if field_name == \"export_format\" and field_value == \"Markdown\":\n build_config[\"md_image_placeholder\"][\"show\"] = True\n build_config[\"md_page_break_placeholder\"][\"show\"] = True\n build_config[\"image_mode\"][\"show\"] = True\n elif field_name == \"export_format\" and field_value == \"HTML\":\n build_config[\"md_image_placeholder\"][\"show\"] = False\n build_config[\"md_page_break_placeholder\"][\"show\"] = False\n build_config[\"image_mode\"][\"show\"] = True\n elif field_name == \"export_format\" and field_value in {\"Plaintext\", \"DocTags\"}:\n build_config[\"md_image_placeholder\"][\"show\"] = False\n build_config[\"md_page_break_placeholder\"][\"show\"] = False\n build_config[\"image_mode\"][\"show\"] = False\n\n return build_config\n\n def export_document(self) -> list[Data]:\n documents = extract_docling_documents(self.data_inputs, self.doc_key)\n\n results: list[Data] = []\n try:\n image_mode = ImageRefMode(self.image_mode)\n for doc in documents:\n content = \"\"\n if self.export_format == \"Markdown\":\n content = doc.export_to_markdown(\n image_mode=image_mode,\n image_placeholder=self.md_image_placeholder,\n page_break_placeholder=self.md_page_break_placeholder,\n )\n elif self.export_format == \"HTML\":\n content = doc.export_to_html(image_mode=image_mode)\n elif self.export_format == \"Plaintext\":\n content = doc.export_to_text()\n elif self.export_format == \"DocTags\":\n content = doc.export_to_doctags()\n\n results.append(Data(text=content))\n except Exception as e:\n msg = f\"Error splitting text: {e}\"\n raise TypeError(msg) from e\n\n return results\n\n def as_dataframe(self) -> DataFrame:\n return DataFrame(self.export_document())\n"},"data_inputs":{"_input_type":"HandleInput","advanced":false,"display_name":"Data or DataFrame","dynamic":false,"info":"The data with documents to export.","input_types":["Data","DataFrame"],"list":false,"list_add_label":"Add More","name":"data_inputs","placeholder":"","required":true,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"doc_key":{"_input_type":"MessageTextInput","advanced":true,"display_name":"Doc Key","dynamic":false,"info":"The key to use for the DoclingDocument column.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"doc_key","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"doc"},"export_format":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Export format","dynamic":false,"external_options":{},"info":"Select the export format to convert the input.","name":"export_format","options":["Markdown","HTML","Plaintext","DocTags"],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Markdown"},"image_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Image export mode","dynamic":false,"external_options":{},"info":"Specify how images are exported in the output. Placeholder will replace the images with a string, whereas Embedded will include them as base64 encoded images.","name":"image_mode","options":["placeholder","embedded"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"placeholder"},"md_image_placeholder":{"_input_type":"StrInput","advanced":true,"display_name":"Image placeholder","dynamic":false,"info":"Specify the image placeholder for markdown exports.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"md_image_placeholder","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"md_page_break_placeholder":{"_input_type":"StrInput","advanced":true,"display_name":"Page break placeholder","dynamic":false,"info":"Add this placeholder betweek pages in the markdown output.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"md_page_break_placeholder","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false}}],["duckduckgo",{"DuckDuckGoSearchComponent":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Search the web using DuckDuckGo with customizable result limits","display_name":"DuckDuckGo Search","documentation":"https://python.langchain.com/docs/integrations/tools/ddg","edited":false,"field_order":["input_value","max_results","max_snippet_length"],"frozen":false,"icon":"DuckDuckGo","legacy":false,"metadata":{"code_hash":"2e522a5a4389","dependencies":{"dependencies":[{"name":"langchain_community","version":"0.3.21"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.duckduckgo.duck_duck_go_search_run.DuckDuckGoSearchComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"fetch_content_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from langchain_community.tools import DuckDuckGoSearchRun\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.inputs.inputs import IntInput, MessageTextInput\nfrom lfx.schema.data import Data\nfrom lfx.schema.dataframe import DataFrame\nfrom lfx.template.field.base import Output\n\n\nclass DuckDuckGoSearchComponent(Component):\n \"\"\"Component for performing web searches using DuckDuckGo.\"\"\"\n\n display_name = \"DuckDuckGo Search\"\n description = \"Search the web using DuckDuckGo with customizable result limits\"\n documentation = \"https://python.langchain.com/docs/integrations/tools/ddg\"\n icon = \"DuckDuckGo\"\n\n inputs = [\n MessageTextInput(\n name=\"input_value\",\n display_name=\"Search Query\",\n required=True,\n info=\"The search query to execute with DuckDuckGo\",\n tool_mode=True,\n ),\n IntInput(\n name=\"max_results\",\n display_name=\"Max Results\",\n value=5,\n required=False,\n advanced=True,\n info=\"Maximum number of search results to return\",\n ),\n IntInput(\n name=\"max_snippet_length\",\n display_name=\"Max Snippet Length\",\n value=100,\n required=False,\n advanced=True,\n info=\"Maximum length of each result snippet\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"DataFrame\", name=\"dataframe\", method=\"fetch_content_dataframe\"),\n ]\n\n def _build_wrapper(self) -> DuckDuckGoSearchRun:\n \"\"\"Build the DuckDuckGo search wrapper.\"\"\"\n return DuckDuckGoSearchRun()\n\n def run_model(self) -> DataFrame:\n return self.fetch_content_dataframe()\n\n def fetch_content(self) -> list[Data]:\n \"\"\"Execute the search and return results as Data objects.\"\"\"\n try:\n wrapper = self._build_wrapper()\n\n full_results = wrapper.run(f\"{self.input_value} (site:*)\")\n\n result_list = full_results.split(\"\\n\")[: self.max_results]\n\n data_results = []\n for result in result_list:\n if result.strip():\n snippet = result[: self.max_snippet_length]\n data_results.append(\n Data(\n text=snippet,\n data={\n \"content\": result,\n \"snippet\": snippet,\n },\n )\n )\n except (ValueError, AttributeError) as e:\n error_data = [Data(text=str(e), data={\"error\": str(e)})]\n self.status = error_data\n return error_data\n else:\n self.status = data_results\n return data_results\n\n def fetch_content_dataframe(self) -> DataFrame:\n \"\"\"Convert the search results to a DataFrame.\n\n Returns:\n DataFrame: A DataFrame containing the search results.\n \"\"\"\n data = self.fetch_content()\n return DataFrame(data)\n"},"input_value":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"The search query to execute with DuckDuckGo","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"input_value","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"max_results":{"_input_type":"IntInput","advanced":true,"display_name":"Max Results","dynamic":false,"info":"Maximum number of search results to return","list":false,"list_add_label":"Add More","name":"max_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":5},"max_snippet_length":{"_input_type":"IntInput","advanced":true,"display_name":"Max Snippet Length","dynamic":false,"info":"Maximum length of each result snippet","list":false,"list_add_label":"Add More","name":"max_snippet_length","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":100}},"tool_mode":false}}],["elastic",{"Elasticsearch":{"base_classes":["Data","DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Elasticsearch Vector Store with with advanced, customizable search capabilities.","display_name":"Elasticsearch","documentation":"","edited":false,"field_order":["elasticsearch_url","cloud_id","index_name","ingest_data","search_query","should_cache_vector_store","username","password","embedding","search_type","number_of_results","search_score_threshold","api_key","verify_certs"],"frozen":false,"icon":"ElasticsearchStore","legacy":false,"metadata":{"code_hash":"b66e56d813fa","dependencies":{"dependencies":[{"name":"elasticsearch","version":"8.16.0"},{"name":"langchain","version":"0.3.23"},{"name":"langchain_elasticsearch","version":"0.3.0"},{"name":"lfx","version":null}],"total_dependencies":4},"module":"lfx.components.elastic.elasticsearch.ElasticsearchVectorStoreComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Search Results","group_outputs":false,"method":"search_documents","name":"search_results","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","api_key":{"_input_type":"SecretStrInput","advanced":true,"display_name":"Elastic API Key","dynamic":false,"info":"API Key for Elastic Cloud authentication. If used, 'username' and 'password' are not required.","input_types":[],"load_from_db":true,"name":"api_key","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"cloud_id":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Elastic Cloud ID","dynamic":false,"info":"Use this for Elastic Cloud deployments. Do not use together with 'Elasticsearch URL'.","input_types":[],"load_from_db":true,"name":"cloud_id","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from typing import Any\n\nfrom elasticsearch import Elasticsearch\nfrom langchain.schema import Document\nfrom langchain_elasticsearch import ElasticsearchStore\n\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.io import (\n BoolInput,\n DropdownInput,\n FloatInput,\n HandleInput,\n IntInput,\n SecretStrInput,\n StrInput,\n)\nfrom lfx.schema.data import Data\n\n\nclass ElasticsearchVectorStoreComponent(LCVectorStoreComponent):\n \"\"\"Elasticsearch Vector Store with with advanced, customizable search capabilities.\"\"\"\n\n display_name: str = \"Elasticsearch\"\n description: str = \"Elasticsearch Vector Store with with advanced, customizable search capabilities.\"\n name = \"Elasticsearch\"\n icon = \"ElasticsearchStore\"\n\n inputs = [\n StrInput(\n name=\"elasticsearch_url\",\n display_name=\"Elasticsearch URL\",\n value=\"http://localhost:9200\",\n info=\"URL for self-managed Elasticsearch deployments (e.g., http://localhost:9200). \"\n \"Do not use with Elastic Cloud deployments, use Elastic Cloud ID instead.\",\n ),\n SecretStrInput(\n name=\"cloud_id\",\n display_name=\"Elastic Cloud ID\",\n value=\"\",\n info=\"Use this for Elastic Cloud deployments. Do not use together with 'Elasticsearch URL'.\",\n ),\n StrInput(\n name=\"index_name\",\n display_name=\"Index Name\",\n value=\"langflow\",\n info=\"The index name where the vectors will be stored in Elasticsearch cluster.\",\n ),\n *LCVectorStoreComponent.inputs,\n StrInput(\n name=\"username\",\n display_name=\"Username\",\n value=\"\",\n advanced=False,\n info=(\n \"Elasticsearch username (e.g., 'elastic'). \"\n \"Required for both local and Elastic Cloud setups unless API keys are used.\"\n ),\n ),\n SecretStrInput(\n name=\"password\",\n display_name=\"Elasticsearch Password\",\n value=\"\",\n advanced=False,\n info=(\n \"Elasticsearch password for the specified user. \"\n \"Required for both local and Elastic Cloud setups unless API keys are used.\"\n ),\n ),\n HandleInput(\n name=\"embedding\",\n display_name=\"Embedding\",\n input_types=[\"Embeddings\"],\n ),\n DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n options=[\"similarity\", \"mmr\"],\n value=\"similarity\",\n advanced=True,\n ),\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 FloatInput(\n name=\"search_score_threshold\",\n display_name=\"Search Score Threshold\",\n info=\"Minimum similarity score threshold for search results.\",\n value=0.0,\n advanced=True,\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"Elastic API Key\",\n value=\"\",\n advanced=True,\n info=\"API Key for Elastic Cloud authentication. If used, 'username' and 'password' are not required.\",\n ),\n BoolInput(\n name=\"verify_certs\",\n display_name=\"Verify SSL Certificates\",\n value=True,\n advanced=True,\n info=\"Whether to verify SSL certificates when connecting to Elasticsearch.\",\n ),\n ]\n\n @check_cached_vector_store\n def build_vector_store(self) -> ElasticsearchStore:\n \"\"\"Builds the Elasticsearch Vector Store object.\"\"\"\n if self.cloud_id and self.elasticsearch_url:\n msg = (\n \"Both 'cloud_id' and 'elasticsearch_url' provided. \"\n \"Please use only one based on your deployment (Cloud or Local).\"\n )\n raise ValueError(msg)\n\n es_params = {\n \"index_name\": self.index_name,\n \"embedding\": self.embedding,\n \"es_user\": self.username or None,\n \"es_password\": self.password or None,\n }\n\n if self.cloud_id:\n es_params[\"es_cloud_id\"] = self.cloud_id\n else:\n es_params[\"es_url\"] = self.elasticsearch_url\n\n if self.api_key:\n es_params[\"api_key\"] = self.api_key\n\n # Check if we need to verify SSL certificates\n if self.verify_certs is False:\n # Build client parameters for Elasticsearch constructor\n client_params: dict[str, Any] = {}\n client_params[\"verify_certs\"] = False\n\n if self.cloud_id:\n client_params[\"cloud_id\"] = self.cloud_id\n else:\n client_params[\"hosts\"] = [self.elasticsearch_url]\n\n if self.api_key:\n client_params[\"api_key\"] = self.api_key\n elif self.username and self.password:\n client_params[\"basic_auth\"] = (self.username, self.password)\n\n es_client = Elasticsearch(**client_params)\n es_params[\"es_connection\"] = es_client\n\n elasticsearch = ElasticsearchStore(**es_params)\n\n # If documents are provided, add them to the store\n if self.ingest_data:\n documents = self._prepare_documents()\n if documents:\n elasticsearch.add_documents(documents)\n\n return elasticsearch\n\n def _prepare_documents(self) -> list[Document]:\n \"\"\"Prepares documents from the input data to add to the vector store.\"\"\"\n self.ingest_data = self._prepare_ingest_data()\n\n documents = []\n for data in self.ingest_data:\n if isinstance(data, Data):\n documents.append(data.to_lc_document())\n else:\n error_message = \"Vector Store Inputs must be Data objects.\"\n self.log(error_message)\n raise TypeError(error_message)\n return documents\n\n def _add_documents_to_vector_store(self, vector_store: \"ElasticsearchStore\") -> None:\n \"\"\"Adds documents to the Vector Store.\"\"\"\n documents = self._prepare_documents()\n if documents and self.embedding:\n self.log(f\"Adding {len(documents)} documents to the Vector Store.\")\n vector_store.add_documents(documents)\n else:\n self.log(\"No documents to add to the Vector Store.\")\n\n def search(self, query: str | None = None) -> list[dict[str, Any]]:\n \"\"\"Search for similar documents in the vector store or retrieve all documents if no query is provided.\"\"\"\n vector_store = self.build_vector_store()\n search_kwargs = {\n \"k\": self.number_of_results,\n \"score_threshold\": self.search_score_threshold,\n }\n\n if query:\n search_type = self.search_type.lower()\n if search_type not in {\"similarity\", \"mmr\"}:\n msg = f\"Invalid search type: {self.search_type}\"\n self.log(msg)\n raise ValueError(msg)\n try:\n if search_type == \"similarity\":\n results = vector_store.similarity_search_with_score(query, **search_kwargs)\n elif search_type == \"mmr\":\n results = vector_store.max_marginal_relevance_search(query, **search_kwargs)\n except Exception as e:\n msg = (\n \"Error occurred while querying the Elasticsearch VectorStore,\"\n \" there is no Data into the VectorStore.\"\n )\n self.log(msg)\n raise ValueError(msg) from e\n return [\n {\"page_content\": doc.page_content, \"metadata\": doc.metadata, \"score\": score} for doc, score in results\n ]\n results = self.get_all_documents(vector_store, **search_kwargs)\n return [{\"page_content\": doc.page_content, \"metadata\": doc.metadata, \"score\": score} for doc, score in results]\n\n def get_all_documents(self, vector_store: ElasticsearchStore, **kwargs) -> list[tuple[Document, float]]:\n \"\"\"Retrieve all documents from the vector store.\"\"\"\n client = vector_store.client\n index_name = self.index_name\n\n query = {\n \"query\": {\"match_all\": {}},\n \"size\": kwargs.get(\"k\", self.number_of_results),\n }\n\n response = client.search(index=index_name, body=query)\n\n results = []\n for hit in response[\"hits\"][\"hits\"]:\n doc = Document(\n page_content=hit[\"_source\"].get(\"text\", \"\"),\n metadata=hit[\"_source\"].get(\"metadata\", {}),\n )\n score = hit[\"_score\"]\n results.append((doc, score))\n\n return results\n\n def search_documents(self) -> list[Data]:\n \"\"\"Search for documents in the vector store based on the search input.\n\n If no search input is provided, retrieve all documents.\n \"\"\"\n results = self.search(self.search_query)\n retrieved_data = [\n Data(\n text=result[\"page_content\"],\n file_path=result[\"metadata\"].get(\"file_path\", \"\"),\n )\n for result in results\n ]\n self.status = retrieved_data\n return retrieved_data\n\n def get_retriever_kwargs(self):\n \"\"\"Get the keyword arguments for the retriever.\"\"\"\n return {\n \"search_type\": self.search_type.lower(),\n \"search_kwargs\": {\n \"k\": self.number_of_results,\n \"score_threshold\": self.search_score_threshold,\n },\n }\n"},"elasticsearch_url":{"_input_type":"StrInput","advanced":false,"display_name":"Elasticsearch URL","dynamic":false,"info":"URL for self-managed Elasticsearch deployments (e.g., http://localhost:9200). Do not use with Elastic Cloud deployments, use Elastic Cloud ID instead.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"elasticsearch_url","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"http://localhost:9200"},"embedding":{"_input_type":"HandleInput","advanced":false,"display_name":"Embedding","dynamic":false,"info":"","input_types":["Embeddings"],"list":false,"list_add_label":"Add More","name":"embedding","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"index_name":{"_input_type":"StrInput","advanced":false,"display_name":"Index Name","dynamic":false,"info":"The index name where the vectors will be stored in Elasticsearch cluster.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"index_name","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"langflow"},"ingest_data":{"_input_type":"HandleInput","advanced":false,"display_name":"Ingest Data","dynamic":false,"info":"","input_types":["Data","DataFrame"],"list":true,"list_add_label":"Add More","name":"ingest_data","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Number of Results","dynamic":false,"info":"Number of results to return.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":4},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Elasticsearch Password","dynamic":false,"info":"Elasticsearch password for the specified user. Required for both local and Elastic Cloud setups unless API keys are used.","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"search_query":{"_input_type":"QueryInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Enter a query to run a similarity search.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"search_query","placeholder":"Enter a query...","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"query","value":""},"search_score_threshold":{"_input_type":"FloatInput","advanced":true,"display_name":"Search Score Threshold","dynamic":false,"info":"Minimum similarity score threshold for search results.","list":false,"list_add_label":"Add More","name":"search_score_threshold","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"float","value":0.0},"search_type":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Search Type","dynamic":false,"external_options":{},"info":"","name":"search_type","options":["similarity","mmr"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"similarity"},"should_cache_vector_store":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache Vector Store","dynamic":false,"info":"If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.","list":false,"list_add_label":"Add More","name":"should_cache_vector_store","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"Elasticsearch username (e.g., 'elastic'). Required for both local and Elastic Cloud setups unless API keys are used.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"verify_certs":{"_input_type":"BoolInput","advanced":true,"display_name":"Verify SSL Certificates","dynamic":false,"info":"Whether to verify SSL certificates when connecting to Elasticsearch.","list":false,"list_add_label":"Add More","name":"verify_certs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true}},"tool_mode":false},"OpenSearchVectorStoreComponent":{"base_classes":["Data","DataFrame","VectorStore"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Store and search documents using OpenSearch with hybrid semantic and keyword search capabilities.","display_name":"OpenSearch","documentation":"","edited":false,"field_order":["docs_metadata","opensearch_url","index_name","engine","space_type","ef_construction","m","ingest_data","search_query","should_cache_vector_store","embedding","vector_field","number_of_results","filter_expression","auth_mode","username","password","jwt_token","jwt_header","bearer_prefix","use_ssl","verify_certs"],"frozen":false,"icon":"OpenSearch","legacy":false,"metadata":{"code_hash":"77834dd0fa75","dependencies":{"dependencies":[{"name":"opensearchpy","version":"2.8.0"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.elastic.opensearch.OpenSearchVectorStoreComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Search Results","group_outputs":false,"method":"search_documents","name":"search_results","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"DataFrame","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"},{"allows_loop":false,"cache":true,"display_name":"Vector Store Connection","group_outputs":false,"hidden":false,"method":"as_vector_store","name":"vectorstoreconnection","selected":"VectorStore","tool_mode":true,"types":["VectorStore"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","auth_mode":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Authentication Mode","dynamic":false,"external_options":{},"info":"Authentication method: 'basic' for username/password authentication, or 'jwt' for JSON Web Token (Bearer) authentication.","name":"auth_mode","options":["basic","jwt"],"options_metadata":[],"placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"basic"},"bearer_prefix":{"_input_type":"BoolInput","advanced":true,"display_name":"Prefix 'Bearer '","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"bearer_prefix","placeholder":"","required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from __future__ import annotations\n\nimport json\nimport uuid\nfrom typing import Any\n\nfrom opensearchpy import OpenSearch, helpers\n\nfrom lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store\nfrom lfx.base.vectorstores.vector_store_connection_decorator import vector_store_connection\nfrom lfx.io import BoolInput, DropdownInput, HandleInput, IntInput, MultilineInput, SecretStrInput, StrInput, TableInput\nfrom lfx.log import logger\nfrom lfx.schema.data import Data\n\n\n@vector_store_connection\nclass OpenSearchVectorStoreComponent(LCVectorStoreComponent):\n \"\"\"OpenSearch Vector Store Component with Hybrid Search Capabilities.\n\n This component provides vector storage and retrieval using OpenSearch, combining semantic\n similarity search (KNN) with keyword-based search for optimal results. It supports document\n ingestion, vector embeddings, and advanced filtering with authentication options.\n\n Features:\n - Vector storage with configurable engines (jvector, nmslib, faiss, lucene)\n - Hybrid search combining KNN vector similarity and keyword matching\n - Flexible authentication (Basic auth, JWT tokens)\n - Advanced filtering and aggregations\n - Metadata injection during document ingestion\n \"\"\"\n\n display_name: str = \"OpenSearch\"\n icon: str = \"OpenSearch\"\n description: str = (\n \"Store and search documents using OpenSearch with hybrid semantic and keyword search capabilities.\"\n )\n\n # Keys we consider baseline\n default_keys: list[str] = [\n \"opensearch_url\",\n \"index_name\",\n *[i.name for i in LCVectorStoreComponent.inputs], # search_query, add_documents, etc.\n \"embedding\",\n \"vector_field\",\n \"number_of_results\",\n \"auth_mode\",\n \"username\",\n \"password\",\n \"jwt_token\",\n \"jwt_header\",\n \"bearer_prefix\",\n \"use_ssl\",\n \"verify_certs\",\n \"filter_expression\",\n \"engine\",\n \"space_type\",\n \"ef_construction\",\n \"m\",\n \"docs_metadata\",\n ]\n\n inputs = [\n TableInput(\n name=\"docs_metadata\",\n display_name=\"Document Metadata\",\n info=(\n \"Additional metadata key-value pairs to be added to all ingested documents. \"\n \"Useful for tagging documents with source information, categories, or other custom attributes.\"\n ),\n table_schema=[\n {\n \"name\": \"key\",\n \"display_name\": \"Key\",\n \"type\": \"str\",\n \"description\": \"Key name\",\n },\n {\n \"name\": \"value\",\n \"display_name\": \"Value\",\n \"type\": \"str\",\n \"description\": \"Value of the metadata\",\n },\n ],\n value=[],\n input_types=[\"Data\"],\n ),\n StrInput(\n name=\"opensearch_url\",\n display_name=\"OpenSearch URL\",\n value=\"http://localhost:9200\",\n info=(\n \"The connection URL for your OpenSearch cluster \"\n \"(e.g., http://localhost:9200 for local development or your cloud endpoint).\"\n ),\n ),\n StrInput(\n name=\"index_name\",\n display_name=\"Index Name\",\n value=\"langflow\",\n info=(\n \"The OpenSearch index name where documents will be stored and searched. \"\n \"Will be created automatically if it doesn't exist.\"\n ),\n ),\n DropdownInput(\n name=\"engine\",\n display_name=\"Vector Engine\",\n options=[\"jvector\", \"nmslib\", \"faiss\", \"lucene\"],\n value=\"jvector\",\n info=(\n \"Vector search engine for similarity calculations. 'jvector' is recommended for most use cases. \"\n \"Note: Amazon OpenSearch Serverless only supports 'nmslib' or 'faiss'.\"\n ),\n advanced=True,\n ),\n DropdownInput(\n name=\"space_type\",\n display_name=\"Distance Metric\",\n options=[\"l2\", \"l1\", \"cosinesimil\", \"linf\", \"innerproduct\"],\n value=\"l2\",\n info=(\n \"Distance metric for calculating vector similarity. 'l2' (Euclidean) is most common, \"\n \"'cosinesimil' for cosine similarity, 'innerproduct' for dot product.\"\n ),\n advanced=True,\n ),\n IntInput(\n name=\"ef_construction\",\n display_name=\"EF Construction\",\n value=512,\n info=(\n \"Size of the dynamic candidate list during index construction. \"\n \"Higher values improve recall but increase indexing time and memory usage.\"\n ),\n advanced=True,\n ),\n IntInput(\n name=\"m\",\n display_name=\"M Parameter\",\n value=16,\n info=(\n \"Number of bidirectional connections for each vector in the HNSW graph. \"\n \"Higher values improve search quality but increase memory usage and indexing time.\"\n ),\n advanced=True,\n ),\n *LCVectorStoreComponent.inputs, # includes search_query, add_documents, etc.\n HandleInput(name=\"embedding\", display_name=\"Embedding\", input_types=[\"Embeddings\"]),\n StrInput(\n name=\"vector_field\",\n display_name=\"Vector Field Name\",\n value=\"chunk_embedding\",\n advanced=True,\n info=\"Name of the field in OpenSearch documents that stores the vector embeddings for similarity search.\",\n ),\n IntInput(\n name=\"number_of_results\",\n display_name=\"Default Result Limit\",\n value=10,\n advanced=True,\n info=(\n \"Default maximum number of search results to return when no limit is \"\n \"specified in the filter expression.\"\n ),\n ),\n MultilineInput(\n name=\"filter_expression\",\n display_name=\"Search Filters (JSON)\",\n value=\"\",\n info=(\n \"Optional JSON configuration for search filtering, result limits, and score thresholds.\\n\\n\"\n \"Format 1 - Explicit filters:\\n\"\n '{\"filter\": [{\"term\": {\"filename\":\"doc.pdf\"}}, '\n '{\"terms\":{\"owner\":[\"user1\",\"user2\"]}}], \"limit\": 10, \"score_threshold\": 1.6}\\n\\n'\n \"Format 2 - Context-style mapping:\\n\"\n '{\"data_sources\":[\"file.pdf\"], \"document_types\":[\"application/pdf\"], \"owners\":[\"user123\"]}\\n\\n'\n \"Use __IMPOSSIBLE_VALUE__ as placeholder to ignore specific filters.\"\n ),\n ),\n # ----- Auth controls (dynamic) -----\n DropdownInput(\n name=\"auth_mode\",\n display_name=\"Authentication Mode\",\n value=\"basic\",\n options=[\"basic\", \"jwt\"],\n info=(\n \"Authentication method: 'basic' for username/password authentication, \"\n \"or 'jwt' for JSON Web Token (Bearer) authentication.\"\n ),\n real_time_refresh=True,\n advanced=False,\n ),\n StrInput(\n name=\"username\",\n display_name=\"Username\",\n value=\"admin\",\n show=False,\n ),\n SecretStrInput(\n name=\"password\",\n display_name=\"OpenSearch Password\",\n value=\"admin\",\n show=False,\n ),\n SecretStrInput(\n name=\"jwt_token\",\n display_name=\"JWT Token\",\n value=\"JWT\",\n load_from_db=False,\n show=True,\n info=(\n \"Valid JSON Web Token for authentication. \"\n \"Will be sent in the Authorization header (with optional 'Bearer ' prefix).\"\n ),\n ),\n StrInput(\n name=\"jwt_header\",\n display_name=\"JWT Header Name\",\n value=\"Authorization\",\n show=False,\n advanced=True,\n ),\n BoolInput(\n name=\"bearer_prefix\",\n display_name=\"Prefix 'Bearer '\",\n value=True,\n show=False,\n advanced=True,\n ),\n # ----- TLS -----\n BoolInput(\n name=\"use_ssl\",\n display_name=\"Use SSL/TLS\",\n value=True,\n advanced=True,\n info=\"Enable SSL/TLS encryption for secure connections to OpenSearch.\",\n ),\n BoolInput(\n name=\"verify_certs\",\n display_name=\"Verify SSL Certificates\",\n value=False,\n advanced=True,\n info=(\n \"Verify SSL certificates when connecting. \"\n \"Disable for self-signed certificates in development environments.\"\n ),\n ),\n ]\n\n # ---------- helper functions for index management ----------\n def _default_text_mapping(\n self,\n dim: int,\n engine: str = \"jvector\",\n space_type: str = \"l2\",\n ef_search: int = 512,\n ef_construction: int = 100,\n m: int = 16,\n vector_field: str = \"vector_field\",\n ) -> dict[str, Any]:\n \"\"\"Create the default OpenSearch index mapping for vector search.\n\n This method generates the index configuration with k-NN settings optimized\n for approximate nearest neighbor search using the specified vector engine.\n\n Args:\n dim: Dimensionality of the vector embeddings\n engine: Vector search engine (jvector, nmslib, faiss, lucene)\n space_type: Distance metric for similarity calculation\n ef_search: Size of dynamic list used during search\n ef_construction: Size of dynamic list used during index construction\n m: Number of bidirectional links for each vector\n vector_field: Name of the field storing vector embeddings\n\n Returns:\n Dictionary containing OpenSearch index mapping configuration\n \"\"\"\n return {\n \"settings\": {\"index\": {\"knn\": True, \"knn.algo_param.ef_search\": ef_search}},\n \"mappings\": {\n \"properties\": {\n vector_field: {\n \"type\": \"knn_vector\",\n \"dimension\": dim,\n \"method\": {\n \"name\": \"disk_ann\",\n \"space_type\": space_type,\n \"engine\": engine,\n \"parameters\": {\"ef_construction\": ef_construction, \"m\": m},\n },\n }\n }\n },\n }\n\n def _validate_aoss_with_engines(self, *, is_aoss: bool, engine: str) -> None:\n \"\"\"Validate engine compatibility with Amazon OpenSearch Serverless (AOSS).\n\n Amazon OpenSearch Serverless has restrictions on which vector engines\n can be used. This method ensures the selected engine is compatible.\n\n Args:\n is_aoss: Whether the connection is to Amazon OpenSearch Serverless\n engine: The selected vector search engine\n\n Raises:\n ValueError: If AOSS is used with an incompatible engine\n \"\"\"\n if is_aoss and engine not in {\"nmslib\", \"faiss\"}:\n msg = \"Amazon OpenSearch Service Serverless only supports `nmslib` or `faiss` engines\"\n raise ValueError(msg)\n\n def _is_aoss_enabled(self, http_auth: Any) -> bool:\n \"\"\"Determine if Amazon OpenSearch Serverless (AOSS) is being used.\n\n Args:\n http_auth: The HTTP authentication object\n\n Returns:\n True if AOSS is enabled, False otherwise\n \"\"\"\n return http_auth is not None and hasattr(http_auth, \"service\") and http_auth.service == \"aoss\"\n\n def _bulk_ingest_embeddings(\n self,\n client: OpenSearch,\n index_name: str,\n embeddings: list[list[float]],\n texts: list[str],\n metadatas: list[dict] | None = None,\n ids: list[str] | None = None,\n vector_field: str = \"vector_field\",\n text_field: str = \"text\",\n mapping: dict | None = None,\n max_chunk_bytes: int | None = 1 * 1024 * 1024,\n *,\n is_aoss: bool = False,\n ) -> list[str]:\n \"\"\"Efficiently ingest multiple documents with embeddings into OpenSearch.\n\n This method uses bulk operations to insert documents with their vector\n embeddings and metadata into the specified OpenSearch index.\n\n Args:\n client: OpenSearch client instance\n index_name: Target index for document storage\n embeddings: List of vector embeddings for each document\n texts: List of document texts\n metadatas: Optional metadata dictionaries for each document\n ids: Optional document IDs (UUIDs generated if not provided)\n vector_field: Field name for storing vector embeddings\n text_field: Field name for storing document text\n mapping: Optional index mapping configuration\n max_chunk_bytes: Maximum size per bulk request chunk\n is_aoss: Whether using Amazon OpenSearch Serverless\n\n Returns:\n List of document IDs that were successfully ingested\n \"\"\"\n if not mapping:\n mapping = {}\n\n requests = []\n return_ids = []\n\n for i, text in enumerate(texts):\n metadata = metadatas[i] if metadatas else {}\n _id = ids[i] if ids else str(uuid.uuid4())\n request = {\n \"_op_type\": \"index\",\n \"_index\": index_name,\n vector_field: embeddings[i],\n text_field: text,\n **metadata,\n }\n if is_aoss:\n request[\"id\"] = _id\n else:\n request[\"_id\"] = _id\n requests.append(request)\n return_ids.append(_id)\n if metadatas:\n self.log(f\"Sample metadata: {metadatas[0] if metadatas else {}}\")\n helpers.bulk(client, requests, max_chunk_bytes=max_chunk_bytes)\n return return_ids\n\n # ---------- auth / client ----------\n def _build_auth_kwargs(self) -> dict[str, Any]:\n \"\"\"Build authentication configuration for OpenSearch client.\n\n Constructs the appropriate authentication parameters based on the\n selected auth mode (basic username/password or JWT token).\n\n Returns:\n Dictionary containing authentication configuration\n\n Raises:\n ValueError: If required authentication parameters are missing\n \"\"\"\n mode = (self.auth_mode or \"basic\").strip().lower()\n if mode == \"jwt\":\n token = (self.jwt_token or \"\").strip()\n if not token:\n msg = \"Auth Mode is 'jwt' but no jwt_token was provided.\"\n raise ValueError(msg)\n header_name = (self.jwt_header or \"Authorization\").strip()\n header_value = f\"Bearer {token}\" if self.bearer_prefix else token\n return {\"headers\": {header_name: header_value}}\n user = (self.username or \"\").strip()\n pwd = (self.password or \"\").strip()\n if not user or not pwd:\n msg = \"Auth Mode is 'basic' but username/password are missing.\"\n raise ValueError(msg)\n return {\"http_auth\": (user, pwd)}\n\n def build_client(self) -> OpenSearch:\n \"\"\"Create and configure an OpenSearch client instance.\n\n Returns:\n Configured OpenSearch client ready for operations\n \"\"\"\n auth_kwargs = self._build_auth_kwargs()\n return OpenSearch(\n hosts=[self.opensearch_url],\n use_ssl=self.use_ssl,\n verify_certs=self.verify_certs,\n ssl_assert_hostname=False,\n ssl_show_warn=False,\n **auth_kwargs,\n )\n\n @check_cached_vector_store\n def build_vector_store(self) -> OpenSearch:\n # Return raw OpenSearch client as our “vector store.”\n self.log(self.ingest_data)\n client = self.build_client()\n self._add_documents_to_vector_store(client=client)\n return client\n\n # ---------- ingest ----------\n def _add_documents_to_vector_store(self, client: OpenSearch) -> None:\n \"\"\"Process and ingest documents into the OpenSearch vector store.\n\n This method handles the complete document ingestion pipeline:\n - Prepares document data and metadata\n - Generates vector embeddings\n - Creates appropriate index mappings\n - Bulk inserts documents with vectors\n\n Args:\n client: OpenSearch client for performing operations\n \"\"\"\n # Convert DataFrame to Data if needed using parent's method\n self.ingest_data = self._prepare_ingest_data()\n\n docs = self.ingest_data or []\n if not docs:\n self.log(\"No documents to ingest.\")\n return\n\n # Extract texts and metadata from documents\n texts = []\n metadatas = []\n # Process docs_metadata table input into a dict\n additional_metadata = {}\n if hasattr(self, \"docs_metadata\") and self.docs_metadata:\n logger.debug(f\"[LF] Docs metadata {self.docs_metadata}\")\n if isinstance(self.docs_metadata[-1], Data):\n logger.debug(f\"[LF] Docs metadata is a Data object {self.docs_metadata}\")\n self.docs_metadata = self.docs_metadata[-1].data\n logger.debug(f\"[LF] Docs metadata is a Data object {self.docs_metadata}\")\n additional_metadata.update(self.docs_metadata)\n else:\n for item in self.docs_metadata:\n if isinstance(item, dict) and \"key\" in item and \"value\" in item:\n additional_metadata[item[\"key\"]] = item[\"value\"]\n # Replace string \"None\" values with actual None\n for key, value in additional_metadata.items():\n if value == \"None\":\n additional_metadata[key] = None\n logger.debug(f\"[LF] Additional metadata {additional_metadata}\")\n for doc_obj in docs:\n data_copy = json.loads(doc_obj.model_dump_json())\n text = data_copy.pop(doc_obj.text_key, doc_obj.default_value)\n texts.append(text)\n\n # Merge additional metadata from table input\n data_copy.update(additional_metadata)\n\n metadatas.append(data_copy)\n self.log(metadatas)\n if not self.embedding:\n msg = \"Embedding handle is required to embed documents.\"\n raise ValueError(msg)\n\n # Generate embeddings\n vectors = self.embedding.embed_documents(texts)\n\n if not vectors:\n self.log(\"No vectors generated from documents.\")\n return\n\n # Get vector dimension for mapping\n dim = len(vectors[0]) if vectors else 768 # default fallback\n\n # Check for AOSS\n auth_kwargs = self._build_auth_kwargs()\n is_aoss = self._is_aoss_enabled(auth_kwargs.get(\"http_auth\"))\n\n # Validate engine with AOSS\n engine = getattr(self, \"engine\", \"jvector\")\n self._validate_aoss_with_engines(is_aoss=is_aoss, engine=engine)\n\n # Create mapping with proper KNN settings\n space_type = getattr(self, \"space_type\", \"l2\")\n ef_construction = getattr(self, \"ef_construction\", 512)\n m = getattr(self, \"m\", 16)\n\n mapping = self._default_text_mapping(\n dim=dim,\n engine=engine,\n space_type=space_type,\n ef_construction=ef_construction,\n m=m,\n vector_field=self.vector_field,\n )\n\n self.log(f\"Indexing {len(texts)} documents into '{self.index_name}' with proper KNN mapping...\")\n\n # Use the LangChain-style bulk ingestion\n return_ids = self._bulk_ingest_embeddings(\n client=client,\n index_name=self.index_name,\n embeddings=vectors,\n texts=texts,\n metadatas=metadatas,\n vector_field=self.vector_field,\n text_field=\"text\",\n mapping=mapping,\n is_aoss=is_aoss,\n )\n self.log(metadatas)\n\n self.log(f\"Successfully indexed {len(return_ids)} documents.\")\n\n # ---------- helpers for filters ----------\n def _is_placeholder_term(self, term_obj: dict) -> bool:\n # term_obj like {\"filename\": \"__IMPOSSIBLE_VALUE__\"}\n return any(v == \"__IMPOSSIBLE_VALUE__\" for v in term_obj.values())\n\n def _coerce_filter_clauses(self, filter_obj: dict | None) -> list[dict]:\n \"\"\"Convert filter expressions into OpenSearch-compatible filter clauses.\n\n This method accepts two filter formats and converts them to standardized\n OpenSearch query clauses:\n\n Format A - Explicit filters:\n {\"filter\": [{\"term\": {\"field\": \"value\"}}, {\"terms\": {\"field\": [\"val1\", \"val2\"]}}],\n \"limit\": 10, \"score_threshold\": 1.5}\n\n Format B - Context-style mapping:\n {\"data_sources\": [\"file1.pdf\"], \"document_types\": [\"pdf\"], \"owners\": [\"user1\"]}\n\n Args:\n filter_obj: Filter configuration dictionary or None\n\n Returns:\n List of OpenSearch filter clauses (term/terms objects)\n Placeholder values with \"__IMPOSSIBLE_VALUE__\" are ignored\n \"\"\"\n if not filter_obj:\n return []\n\n # If it is a string, try to parse it once\n if isinstance(filter_obj, str):\n try:\n filter_obj = json.loads(filter_obj)\n except json.JSONDecodeError:\n # Not valid JSON - treat as no filters\n return []\n\n # Case A: already an explicit list/dict under \"filter\"\n if \"filter\" in filter_obj:\n raw = filter_obj[\"filter\"]\n if isinstance(raw, dict):\n raw = [raw]\n explicit_clauses: list[dict] = []\n for f in raw or []:\n if \"term\" in f and isinstance(f[\"term\"], dict) and not self._is_placeholder_term(f[\"term\"]):\n explicit_clauses.append(f)\n elif \"terms\" in f and isinstance(f[\"terms\"], dict):\n field, vals = next(iter(f[\"terms\"].items()))\n if isinstance(vals, list) and len(vals) > 0:\n explicit_clauses.append(f)\n return explicit_clauses\n\n # Case B: convert context-style maps into clauses\n field_mapping = {\n \"data_sources\": \"filename\",\n \"document_types\": \"mimetype\",\n \"owners\": \"owner\",\n }\n context_clauses: list[dict] = []\n for k, values in filter_obj.items():\n if not isinstance(values, list):\n continue\n field = field_mapping.get(k, k)\n if len(values) == 0:\n # Match-nothing placeholder (kept to mirror your tool semantics)\n context_clauses.append({\"term\": {field: \"__IMPOSSIBLE_VALUE__\"}})\n elif len(values) == 1:\n if values[0] != \"__IMPOSSIBLE_VALUE__\":\n context_clauses.append({\"term\": {field: values[0]}})\n else:\n context_clauses.append({\"terms\": {field: values}})\n return context_clauses\n\n # ---------- search (single hybrid path matching your tool) ----------\n def search(self, query: str | None = None) -> list[dict[str, Any]]:\n \"\"\"Perform hybrid search combining vector similarity and keyword matching.\n\n This method executes a sophisticated search that combines:\n - K-nearest neighbor (KNN) vector similarity search (70% weight)\n - Multi-field keyword search with fuzzy matching (30% weight)\n - Optional filtering and score thresholds\n - Aggregations for faceted search results\n\n Args:\n query: Search query string (used for both vector embedding and keyword search)\n\n Returns:\n List of search results with page_content, metadata, and relevance scores\n\n Raises:\n ValueError: If embedding component is not provided or filter JSON is invalid\n \"\"\"\n logger.info(self.ingest_data)\n client = self.build_client()\n q = (query or \"\").strip()\n\n # Parse optional filter expression (can be either A or B shape; see _coerce_filter_clauses)\n filter_obj = None\n if getattr(self, \"filter_expression\", \"\") and self.filter_expression.strip():\n try:\n filter_obj = json.loads(self.filter_expression)\n except json.JSONDecodeError as e:\n msg = f\"Invalid filter_expression JSON: {e}\"\n raise ValueError(msg) from e\n\n if not self.embedding:\n msg = \"Embedding is required to run hybrid search (KNN + keyword).\"\n raise ValueError(msg)\n\n # Embed the query\n vec = self.embedding.embed_query(q)\n\n # Build filter clauses (accept both shapes)\n filter_clauses = self._coerce_filter_clauses(filter_obj)\n\n # Respect the tool's limit/threshold defaults\n limit = (filter_obj or {}).get(\"limit\", self.number_of_results)\n score_threshold = (filter_obj or {}).get(\"score_threshold\", 0)\n\n # Build the same hybrid body as your SearchService\n body = {\n \"query\": {\n \"bool\": {\n \"should\": [\n {\n \"knn\": {\n self.vector_field: {\n \"vector\": vec,\n \"k\": 10, # fixed to match the tool\n \"boost\": 0.7,\n }\n }\n },\n {\n \"multi_match\": {\n \"query\": q,\n \"fields\": [\"text^2\", \"filename^1.5\"],\n \"type\": \"best_fields\",\n \"fuzziness\": \"AUTO\",\n \"boost\": 0.3,\n }\n },\n ],\n \"minimum_should_match\": 1,\n }\n },\n \"aggs\": {\n \"data_sources\": {\"terms\": {\"field\": \"filename\", \"size\": 20}},\n \"document_types\": {\"terms\": {\"field\": \"mimetype\", \"size\": 10}},\n \"owners\": {\"terms\": {\"field\": \"owner\", \"size\": 10}},\n },\n \"_source\": [\n \"filename\",\n \"mimetype\",\n \"page\",\n \"text\",\n \"source_url\",\n \"owner\",\n \"allowed_users\",\n \"allowed_groups\",\n ],\n \"size\": limit,\n }\n if filter_clauses:\n body[\"query\"][\"bool\"][\"filter\"] = filter_clauses\n\n if isinstance(score_threshold, (int, float)) and score_threshold > 0:\n # top-level min_score (matches your tool)\n body[\"min_score\"] = score_threshold\n\n resp = client.search(index=self.index_name, body=body)\n hits = resp.get(\"hits\", {}).get(\"hits\", [])\n return [\n {\n \"page_content\": hit[\"_source\"].get(\"text\", \"\"),\n \"metadata\": {k: v for k, v in hit[\"_source\"].items() if k != \"text\"},\n \"score\": hit.get(\"_score\"),\n }\n for hit in hits\n ]\n\n def search_documents(self) -> list[Data]:\n \"\"\"Search documents and return results as Data objects.\n\n This is the main interface method that performs the search using the\n configured search_query and returns results in Langflow's Data format.\n\n Returns:\n List of Data objects containing search results with text and metadata\n\n Raises:\n Exception: If search operation fails\n \"\"\"\n try:\n raw = self.search(self.search_query or \"\")\n return [Data(text=hit[\"page_content\"], **hit[\"metadata\"]) for hit in raw]\n self.log(self.ingest_data)\n except Exception as e:\n self.log(f\"search_documents error: {e}\")\n raise\n\n # -------- dynamic UI handling (auth switch) --------\n async def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None) -> dict:\n \"\"\"Dynamically update component configuration based on field changes.\n\n This method handles real-time UI updates, particularly for authentication\n mode changes that show/hide relevant input fields.\n\n Args:\n build_config: Current component configuration\n field_value: New value for the changed field\n field_name: Name of the field that changed\n\n Returns:\n Updated build configuration with appropriate field visibility\n \"\"\"\n try:\n if field_name == \"auth_mode\":\n mode = (field_value or \"basic\").strip().lower()\n is_basic = mode == \"basic\"\n is_jwt = mode == \"jwt\"\n\n build_config[\"username\"][\"show\"] = is_basic\n build_config[\"password\"][\"show\"] = is_basic\n\n build_config[\"jwt_token\"][\"show\"] = is_jwt\n build_config[\"jwt_header\"][\"show\"] = is_jwt\n build_config[\"bearer_prefix\"][\"show\"] = is_jwt\n\n build_config[\"username\"][\"required\"] = is_basic\n build_config[\"password\"][\"required\"] = is_basic\n\n build_config[\"jwt_token\"][\"required\"] = is_jwt\n build_config[\"jwt_header\"][\"required\"] = is_jwt\n build_config[\"bearer_prefix\"][\"required\"] = False\n\n if is_basic:\n build_config[\"jwt_token\"][\"value\"] = \"\"\n\n return build_config\n\n except (KeyError, ValueError) as e:\n self.log(f\"update_build_config error: {e}\")\n\n return build_config\n"},"docs_metadata":{"_input_type":"TableInput","advanced":false,"display_name":"Document Metadata","dynamic":false,"info":"Additional metadata key-value pairs to be added to all ingested documents. Useful for tagging documents with source information, categories, or other custom attributes.","input_types":["Data"],"is_list":true,"list_add_label":"Add More","name":"docs_metadata","placeholder":"","required":false,"show":true,"table_icon":"Table","table_schema":[{"description":"Key name","display_name":"Key","name":"key","type":"str"},{"description":"Value of the metadata","display_name":"Value","name":"value","type":"str"}],"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"trigger_icon":"Table","trigger_text":"Open table","type":"table","value":[]},"ef_construction":{"_input_type":"IntInput","advanced":true,"display_name":"EF Construction","dynamic":false,"info":"Size of the dynamic candidate list during index construction. Higher values improve recall but increase indexing time and memory usage.","list":false,"list_add_label":"Add More","name":"ef_construction","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":512},"embedding":{"_input_type":"HandleInput","advanced":false,"display_name":"Embedding","dynamic":false,"info":"","input_types":["Embeddings"],"list":false,"list_add_label":"Add More","name":"embedding","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"engine":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Vector Engine","dynamic":false,"external_options":{},"info":"Vector search engine for similarity calculations. 'jvector' is recommended for most use cases. Note: Amazon OpenSearch Serverless only supports 'nmslib' or 'faiss'.","name":"engine","options":["jvector","nmslib","faiss","lucene"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"jvector"},"filter_expression":{"_input_type":"MultilineInput","advanced":false,"copy_field":false,"display_name":"Search Filters (JSON)","dynamic":false,"info":"Optional JSON configuration for search filtering, result limits, and score thresholds.\n\nFormat 1 - Explicit filters:\n{\"filter\": [{\"term\": {\"filename\":\"doc.pdf\"}}, {\"terms\":{\"owner\":[\"user1\",\"user2\"]}}], \"limit\": 10, \"score_threshold\": 1.6}\n\nFormat 2 - Context-style mapping:\n{\"data_sources\":[\"file.pdf\"], \"document_types\":[\"application/pdf\"], \"owners\":[\"user123\"]}\n\nUse __IMPOSSIBLE_VALUE__ as placeholder to ignore specific filters.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"multiline":true,"name":"filter_expression","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""},"index_name":{"_input_type":"StrInput","advanced":false,"display_name":"Index Name","dynamic":false,"info":"The OpenSearch index name where documents will be stored and searched. Will be created automatically if it doesn't exist.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"index_name","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"langflow"},"ingest_data":{"_input_type":"HandleInput","advanced":false,"display_name":"Ingest Data","dynamic":false,"info":"","input_types":["Data","DataFrame"],"list":true,"list_add_label":"Add More","name":"ingest_data","placeholder":"","required":false,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"jwt_header":{"_input_type":"StrInput","advanced":true,"display_name":"JWT Header Name","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"jwt_header","placeholder":"","required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"Authorization"},"jwt_token":{"_input_type":"SecretStrInput","advanced":false,"display_name":"JWT Token","dynamic":false,"info":"Valid JSON Web Token for authentication. Will be sent in the Authorization header (with optional 'Bearer ' prefix).","input_types":[],"load_from_db":false,"name":"jwt_token","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":"JWT"},"m":{"_input_type":"IntInput","advanced":true,"display_name":"M Parameter","dynamic":false,"info":"Number of bidirectional connections for each vector in the HNSW graph. Higher values improve search quality but increase memory usage and indexing time.","list":false,"list_add_label":"Add More","name":"m","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":16},"number_of_results":{"_input_type":"IntInput","advanced":true,"display_name":"Default Result Limit","dynamic":false,"info":"Default maximum number of search results to return when no limit is specified in the filter expression.","list":false,"list_add_label":"Add More","name":"number_of_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":10},"opensearch_url":{"_input_type":"StrInput","advanced":false,"display_name":"OpenSearch URL","dynamic":false,"info":"The connection URL for your OpenSearch cluster (e.g., http://localhost:9200 for local development or your cloud endpoint).","list":false,"list_add_label":"Add More","load_from_db":false,"name":"opensearch_url","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"http://localhost:9200"},"password":{"_input_type":"SecretStrInput","advanced":false,"display_name":"OpenSearch Password","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"password","password":true,"placeholder":"","required":false,"show":false,"title_case":false,"track_in_telemetry":false,"type":"str","value":"admin"},"search_query":{"_input_type":"QueryInput","advanced":false,"display_name":"Search Query","dynamic":false,"info":"Enter a query to run a similarity search.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"search_query","placeholder":"Enter a query...","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"query","value":""},"should_cache_vector_store":{"_input_type":"BoolInput","advanced":true,"display_name":"Cache Vector Store","dynamic":false,"info":"If True, the vector store will be cached for the current build of the component. This is useful for components that have multiple output methods and want to share the same vector store.","list":false,"list_add_label":"Add More","name":"should_cache_vector_store","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"space_type":{"_input_type":"DropdownInput","advanced":true,"combobox":false,"dialog_inputs":{},"display_name":"Distance Metric","dynamic":false,"external_options":{},"info":"Distance metric for calculating vector similarity. 'l2' (Euclidean) is most common, 'cosinesimil' for cosine similarity, 'innerproduct' for dot product.","name":"space_type","options":["l2","l1","cosinesimil","linf","innerproduct"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"l2"},"use_ssl":{"_input_type":"BoolInput","advanced":true,"display_name":"Use SSL/TLS","dynamic":false,"info":"Enable SSL/TLS encryption for secure connections to OpenSearch.","list":false,"list_add_label":"Add More","name":"use_ssl","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true},"username":{"_input_type":"StrInput","advanced":false,"display_name":"Username","dynamic":false,"info":"","list":false,"list_add_label":"Add More","load_from_db":false,"name":"username","placeholder":"","required":false,"show":false,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"admin"},"vector_field":{"_input_type":"StrInput","advanced":true,"display_name":"Vector Field Name","dynamic":false,"info":"Name of the field in OpenSearch documents that stores the vector embeddings for similarity search.","list":false,"list_add_label":"Add More","load_from_db":false,"name":"vector_field","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"chunk_embedding"},"verify_certs":{"_input_type":"BoolInput","advanced":true,"display_name":"Verify SSL Certificates","dynamic":false,"info":"Verify SSL certificates when connecting. Disable for self-signed certificates in development environments.","list":false,"list_add_label":"Add More","name":"verify_certs","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false}},"tool_mode":false}}],["embeddings",{"EmbeddingSimilarityComponent":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Compute selected form of similarity between two embedding vectors.","display_name":"Embedding Similarity","documentation":"","edited":false,"field_order":["embedding_vectors","similarity_metric"],"frozen":false,"icon":"equal","legacy":true,"metadata":{"code_hash":"d94c7d791f69","dependencies":{"dependencies":[{"name":"numpy","version":"2.2.6"},{"name":"lfx","version":null}],"total_dependencies":2},"module":"lfx.components.embeddings.similarity.EmbeddingSimilarityComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Similarity Data","group_outputs":false,"method":"compute_similarity","name":"similarity_data","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":["datastax.AstraDB"],"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from typing import Any\n\nimport numpy as np\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import DataInput, DropdownInput, Output\nfrom lfx.schema.data import Data\n\n\nclass EmbeddingSimilarityComponent(Component):\n display_name: str = \"Embedding Similarity\"\n description: str = \"Compute selected form of similarity between two embedding vectors.\"\n icon = \"equal\"\n legacy: bool = True\n replacement = [\"datastax.AstraDB\"]\n\n inputs = [\n DataInput(\n name=\"embedding_vectors\",\n display_name=\"Embedding Vectors\",\n info=\"A list containing exactly two data objects with embedding vectors to compare.\",\n is_list=True,\n required=True,\n ),\n DropdownInput(\n name=\"similarity_metric\",\n display_name=\"Similarity Metric\",\n info=\"Select the similarity metric to use.\",\n options=[\"Cosine Similarity\", \"Euclidean Distance\", \"Manhattan Distance\"],\n value=\"Cosine Similarity\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Similarity Data\", name=\"similarity_data\", method=\"compute_similarity\"),\n ]\n\n def compute_similarity(self) -> Data:\n embedding_vectors: list[Data] = self.embedding_vectors\n\n # Assert that the list contains exactly two Data objects\n if len(embedding_vectors) != 2: # noqa: PLR2004\n msg = \"Exactly two embedding vectors are required.\"\n raise ValueError(msg)\n\n embedding_1 = np.array(embedding_vectors[0].data[\"embeddings\"])\n embedding_2 = np.array(embedding_vectors[1].data[\"embeddings\"])\n\n if embedding_1.shape != embedding_2.shape:\n similarity_score: dict[str, Any] = {\"error\": \"Embeddings must have the same dimensions.\"}\n else:\n similarity_metric = self.similarity_metric\n\n if similarity_metric == \"Cosine Similarity\":\n score = np.dot(embedding_1, embedding_2) / (np.linalg.norm(embedding_1) * np.linalg.norm(embedding_2))\n similarity_score = {\"cosine_similarity\": score}\n\n elif similarity_metric == \"Euclidean Distance\":\n score = np.linalg.norm(embedding_1 - embedding_2)\n similarity_score = {\"euclidean_distance\": score}\n\n elif similarity_metric == \"Manhattan Distance\":\n score = np.sum(np.abs(embedding_1 - embedding_2))\n similarity_score = {\"manhattan_distance\": score}\n\n # Create a Data object to encapsulate the similarity score and additional information\n similarity_data = Data(\n data={\n \"embedding_1\": embedding_vectors[0].data[\"embeddings\"],\n \"embedding_2\": embedding_vectors[1].data[\"embeddings\"],\n \"similarity_score\": similarity_score,\n },\n text_key=\"similarity_score\",\n )\n\n self.status = similarity_data\n return similarity_data\n"},"embedding_vectors":{"_input_type":"DataInput","advanced":false,"display_name":"Embedding Vectors","dynamic":false,"info":"A list containing exactly two data objects with embedding vectors to compare.","input_types":["Data"],"list":true,"list_add_label":"Add More","name":"embedding_vectors","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"similarity_metric":{"_input_type":"DropdownInput","advanced":false,"combobox":false,"dialog_inputs":{},"display_name":"Similarity Metric","dynamic":false,"external_options":{},"info":"Select the similarity metric to use.","name":"similarity_metric","options":["Cosine Similarity","Euclidean Distance","Manhattan Distance"],"options_metadata":[],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"str","value":"Cosine Similarity"}},"tool_mode":false},"TextEmbedderComponent":{"base_classes":["Data"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Generate embeddings for a given message using the specified embedding model.","display_name":"Text Embedder","documentation":"","edited":false,"field_order":["embedding_model","message"],"frozen":false,"icon":"binary","legacy":true,"metadata":{"code_hash":"541a2fb78066","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.embeddings.text_embedder.TextEmbedderComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Embedding Data","group_outputs":false,"method":"generate_embeddings","name":"embeddings","selected":"Data","tool_mode":true,"types":["Data"],"value":"__UNDEFINED__"}],"pinned":false,"replacement":["models.EmbeddingModel"],"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from typing import TYPE_CHECKING\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import HandleInput, MessageInput, Output\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\n\nif TYPE_CHECKING:\n from lfx.field_typing import Embeddings\n from lfx.schema.message import Message\n\n\nclass TextEmbedderComponent(Component):\n display_name: str = \"Text Embedder\"\n description: str = \"Generate embeddings for a given message using the specified embedding model.\"\n icon = \"binary\"\n legacy: bool = True\n replacement = [\"models.EmbeddingModel\"]\n inputs = [\n HandleInput(\n name=\"embedding_model\",\n display_name=\"Embedding Model\",\n info=\"The embedding model to use for generating embeddings.\",\n input_types=[\"Embeddings\"],\n required=True,\n ),\n MessageInput(\n name=\"message\",\n display_name=\"Message\",\n info=\"The message to generate embeddings for.\",\n required=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Embedding Data\", name=\"embeddings\", method=\"generate_embeddings\"),\n ]\n\n def generate_embeddings(self) -> Data:\n try:\n embedding_model: Embeddings = self.embedding_model\n message: Message = self.message\n\n # Combine validation checks to reduce nesting\n if not embedding_model or not hasattr(embedding_model, \"embed_documents\"):\n msg = \"Invalid or incompatible embedding model\"\n raise ValueError(msg)\n\n text_content = message.text if message and message.text else \"\"\n if not text_content:\n msg = \"No text content found in message\"\n raise ValueError(msg)\n\n embeddings = embedding_model.embed_documents([text_content])\n if not embeddings or not isinstance(embeddings, list):\n msg = \"Invalid embeddings generated\"\n raise ValueError(msg)\n\n embedding_vector = embeddings[0]\n self.status = {\"text\": text_content, \"embeddings\": embedding_vector}\n return Data(data={\"text\": text_content, \"embeddings\": embedding_vector})\n except Exception as e: # noqa: BLE001\n logger.exception(\"Error generating embeddings\")\n error_data = Data(data={\"text\": \"\", \"embeddings\": [], \"error\": str(e)})\n self.status = {\"error\": str(e)}\n return error_data\n"},"embedding_model":{"_input_type":"HandleInput","advanced":false,"display_name":"Embedding Model","dynamic":false,"info":"The embedding model to use for generating embeddings.","input_types":["Embeddings"],"list":false,"list_add_label":"Add More","name":"embedding_model","placeholder":"","required":true,"show":true,"title_case":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"other","value":""},"message":{"_input_type":"MessageInput","advanced":false,"display_name":"Message","dynamic":false,"info":"The message to generate embeddings for.","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"message","placeholder":"","required":true,"show":true,"title_case":false,"tool_mode":false,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":""}},"tool_mode":false}}],["exa",{"ExaSearch":{"base_classes":["Tool"],"beta":true,"conditional_paths":[],"custom_fields":{},"description":"Exa Search toolkit for search and content retrieval","display_name":"Exa Search","documentation":"https://python.langchain.com/docs/integrations/tools/metaphor_search","edited":false,"field_order":["metaphor_api_key","use_autoprompt","search_num_results","similar_num_results"],"frozen":false,"icon":"ExaSearch","legacy":false,"metadata":{"code_hash":"26039e2a8b78","dependencies":{"dependencies":[{"name":"langchain_core","version":"0.3.79"},{"name":"metaphor_python","version":"0.1.23"},{"name":"lfx","version":null}],"total_dependencies":3},"module":"lfx.components.exa.exa_search.ExaSearchToolkit"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Tools","group_outputs":false,"method":"build_toolkit","name":"tools","selected":"Tool","tool_mode":true,"types":["Tool"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from langchain_core.tools import tool\nfrom metaphor_python import Metaphor\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.field_typing import Tool\nfrom lfx.io import BoolInput, IntInput, Output, SecretStrInput\n\n\nclass ExaSearchToolkit(Component):\n display_name = \"Exa Search\"\n description = \"Exa Search toolkit for search and content retrieval\"\n documentation = \"https://python.langchain.com/docs/integrations/tools/metaphor_search\"\n beta = True\n name = \"ExaSearch\"\n icon = \"ExaSearch\"\n\n inputs = [\n SecretStrInput(\n name=\"metaphor_api_key\",\n display_name=\"Exa Search API Key\",\n password=True,\n ),\n BoolInput(\n name=\"use_autoprompt\",\n display_name=\"Use Autoprompt\",\n value=True,\n ),\n IntInput(\n name=\"search_num_results\",\n display_name=\"Search Number of Results\",\n value=5,\n ),\n IntInput(\n name=\"similar_num_results\",\n display_name=\"Similar Number of Results\",\n value=5,\n ),\n ]\n\n outputs = [\n Output(name=\"tools\", display_name=\"Tools\", method=\"build_toolkit\"),\n ]\n\n def build_toolkit(self) -> Tool:\n client = Metaphor(api_key=self.metaphor_api_key)\n\n @tool\n def search(query: str):\n \"\"\"Call search engine with a query.\"\"\"\n return client.search(query, use_autoprompt=self.use_autoprompt, num_results=self.search_num_results)\n\n @tool\n def get_contents(ids: list[str]):\n \"\"\"Get contents of a webpage.\n\n The ids passed in should be a list of ids as fetched from `search`.\n \"\"\"\n return client.get_contents(ids)\n\n @tool\n def find_similar(url: str):\n \"\"\"Get search results similar to a given URL.\n\n The url passed in should be a URL returned from `search`\n \"\"\"\n return client.find_similar(url, num_results=self.similar_num_results)\n\n return [search, get_contents, find_similar]\n"},"metaphor_api_key":{"_input_type":"SecretStrInput","advanced":false,"display_name":"Exa Search API Key","dynamic":false,"info":"","input_types":[],"load_from_db":true,"name":"metaphor_api_key","password":true,"placeholder":"","required":false,"show":true,"title_case":false,"track_in_telemetry":false,"type":"str","value":""},"search_num_results":{"_input_type":"IntInput","advanced":false,"display_name":"Search Number of Results","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"search_num_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":5},"similar_num_results":{"_input_type":"IntInput","advanced":false,"display_name":"Similar Number of Results","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"similar_num_results","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":5},"use_autoprompt":{"_input_type":"BoolInput","advanced":false,"display_name":"Use Autoprompt","dynamic":false,"info":"","list":false,"list_add_label":"Add More","name":"use_autoprompt","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":true}},"tool_mode":false}}],["files_and_knowledge",{"Directory":{"base_classes":["DataFrame"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Recursively load files from a directory.","display_name":"Directory","documentation":"https://docs.langflow.org/components-data#directory","edited":false,"field_order":["path","types","depth","max_concurrency","load_hidden","recursive","silent_errors","use_multithreading"],"frozen":false,"icon":"folder","legacy":false,"metadata":{"code_hash":"8aa20dc71cb9","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.files_and_knowledge.directory.DirectoryComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Loaded Files","group_outputs":false,"method":"as_dataframe","name":"dataframe","selected":"DataFrame","tool_mode":true,"types":["DataFrame"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"from lfx.base.data.utils import TEXT_FILE_TYPES, parallel_load_data, parse_text_file_to_data, retrieve_file_paths\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.io import BoolInput, IntInput, MessageTextInput, MultiselectInput\nfrom lfx.schema.data import Data\nfrom lfx.schema.dataframe import DataFrame\nfrom lfx.template.field.base import Output\n\n\nclass DirectoryComponent(Component):\n display_name = \"Directory\"\n description = \"Recursively load files from a directory.\"\n documentation: str = \"https://docs.langflow.org/components-data#directory\"\n icon = \"folder\"\n name = \"Directory\"\n\n inputs = [\n MessageTextInput(\n name=\"path\",\n display_name=\"Path\",\n info=\"Path to the directory to load files from. Defaults to current directory ('.')\",\n value=\".\",\n tool_mode=True,\n ),\n MultiselectInput(\n name=\"types\",\n display_name=\"File Types\",\n info=\"File types to load. Select one or more types or leave empty to load all supported types.\",\n options=TEXT_FILE_TYPES,\n value=[],\n ),\n IntInput(\n name=\"depth\",\n display_name=\"Depth\",\n info=\"Depth to search for files.\",\n value=0,\n ),\n IntInput(\n name=\"max_concurrency\",\n display_name=\"Max Concurrency\",\n advanced=True,\n info=\"Maximum concurrency for loading files.\",\n value=2,\n ),\n BoolInput(\n name=\"load_hidden\",\n display_name=\"Load Hidden\",\n advanced=True,\n info=\"If true, hidden files will be loaded.\",\n ),\n BoolInput(\n name=\"recursive\",\n display_name=\"Recursive\",\n advanced=True,\n info=\"If true, the search will be recursive.\",\n ),\n BoolInput(\n name=\"silent_errors\",\n display_name=\"Silent Errors\",\n advanced=True,\n info=\"If true, errors will not raise an exception.\",\n ),\n BoolInput(\n name=\"use_multithreading\",\n display_name=\"Use Multithreading\",\n advanced=True,\n info=\"If true, multithreading will be used.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Loaded Files\", name=\"dataframe\", method=\"as_dataframe\"),\n ]\n\n def load_directory(self) -> list[Data]:\n path = self.path\n types = self.types\n depth = self.depth\n max_concurrency = self.max_concurrency\n load_hidden = self.load_hidden\n recursive = self.recursive\n silent_errors = self.silent_errors\n use_multithreading = self.use_multithreading\n\n resolved_path = self.resolve_path(path)\n\n # If no types are specified, use all supported types\n if not types:\n types = TEXT_FILE_TYPES\n\n # Check if all specified types are valid\n invalid_types = [t for t in types if t not in TEXT_FILE_TYPES]\n if invalid_types:\n msg = f\"Invalid file types specified: {invalid_types}. Valid types are: {TEXT_FILE_TYPES}\"\n raise ValueError(msg)\n\n valid_types = types\n\n file_paths = retrieve_file_paths(\n resolved_path, load_hidden=load_hidden, recursive=recursive, depth=depth, types=valid_types\n )\n\n loaded_data = []\n if use_multithreading:\n loaded_data = parallel_load_data(file_paths, silent_errors=silent_errors, max_concurrency=max_concurrency)\n else:\n loaded_data = [parse_text_file_to_data(file_path, silent_errors=silent_errors) for file_path in file_paths]\n\n valid_data = [x for x in loaded_data if x is not None and isinstance(x, Data)]\n self.status = valid_data\n return valid_data\n\n def as_dataframe(self) -> DataFrame:\n return DataFrame(self.load_directory())\n"},"depth":{"_input_type":"IntInput","advanced":false,"display_name":"Depth","dynamic":false,"info":"Depth to search for files.","list":false,"list_add_label":"Add More","name":"depth","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":0},"load_hidden":{"_input_type":"BoolInput","advanced":true,"display_name":"Load Hidden","dynamic":false,"info":"If true, hidden files will be loaded.","list":false,"list_add_label":"Add More","name":"load_hidden","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"max_concurrency":{"_input_type":"IntInput","advanced":true,"display_name":"Max Concurrency","dynamic":false,"info":"Maximum concurrency for loading files.","list":false,"list_add_label":"Add More","name":"max_concurrency","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"int","value":2},"path":{"_input_type":"MessageTextInput","advanced":false,"display_name":"Path","dynamic":false,"info":"Path to the directory to load files from. Defaults to current directory ('.')","input_types":["Message"],"list":false,"list_add_label":"Add More","load_from_db":false,"name":"path","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":true,"trace_as_input":true,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":"."},"recursive":{"_input_type":"BoolInput","advanced":true,"display_name":"Recursive","dynamic":false,"info":"If true, the search will be recursive.","list":false,"list_add_label":"Add More","name":"recursive","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"silent_errors":{"_input_type":"BoolInput","advanced":true,"display_name":"Silent Errors","dynamic":false,"info":"If true, errors will not raise an exception.","list":false,"list_add_label":"Add More","name":"silent_errors","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"types":{"_input_type":"MultiselectInput","advanced":false,"combobox":false,"display_name":"File Types","dynamic":false,"info":"File types to load. Select one or more types or leave empty to load all supported types.","list":true,"list_add_label":"Add More","name":"types","options":["csv","json","pdf","txt","md","mdx","yaml","yml","xml","html","htm","docx","py","sh","sql","js","ts","tsx"],"placeholder":"","required":false,"show":true,"title_case":false,"toggle":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":false,"type":"str","value":[]},"use_multithreading":{"_input_type":"BoolInput","advanced":true,"display_name":"Use Multithreading","dynamic":false,"info":"If true, multithreading will be used.","list":false,"list_add_label":"Add More","name":"use_multithreading","placeholder":"","required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false}},"tool_mode":false},"File":{"base_classes":["Message"],"beta":false,"conditional_paths":[],"custom_fields":{},"description":"Loads content from one or more files.","display_name":"Read File","documentation":"https://docs.langflow.org/components-data#file","edited":false,"field_order":["path","file_path","separator","silent_errors","delete_server_file_after_processing","ignore_unsupported_extensions","ignore_unspecified_files","advanced_mode","pipeline","ocr_engine","md_image_placeholder","md_page_break_placeholder","doc_key","use_multithreading","concurrency_multithreading","markdown"],"frozen":false,"icon":"file-text","legacy":false,"metadata":{"code_hash":"85abc1094130","dependencies":{"dependencies":[{"name":"lfx","version":null}],"total_dependencies":1},"module":"lfx.components.files_and_knowledge.file.FileComponent"},"minimized":false,"output_types":[],"outputs":[{"allows_loop":false,"cache":true,"display_name":"Raw Content","group_outputs":false,"method":"load_files_message","name":"message","selected":"Message","tool_mode":true,"types":["Message"],"value":"__UNDEFINED__"}],"pinned":false,"template":{"_type":"Component","advanced_mode":{"_input_type":"BoolInput","advanced":false,"display_name":"Advanced Parser","dynamic":false,"info":"Enable advanced document processing and export with Docling for PDFs, images, and office documents. Note that advanced document processing can consume significant resources.","list":false,"list_add_label":"Add More","name":"advanced_mode","placeholder":"","real_time_refresh":true,"required":false,"show":true,"title_case":false,"tool_mode":false,"trace_as_metadata":true,"track_in_telemetry":true,"type":"bool","value":false},"code":{"advanced":true,"dynamic":true,"fileTypes":[],"file_path":"","info":"","list":false,"load_from_db":false,"multiline":true,"name":"code","password":false,"placeholder":"","required":true,"show":true,"title_case":false,"type":"code","value":"\"\"\"Enhanced file component with Docling support and process isolation.\n\nNotes:\n-----\n- ALL Docling parsing/export runs in a separate OS process to prevent memory\n growth and native library state from impacting the main Langflow process.\n- Standard text/structured parsing continues to use existing BaseFileComponent\n utilities (and optional threading via `parallel_load_data`).\n\"\"\"\n\nfrom __future__ import annotations\n\nimport json\nimport subprocess\nimport sys\nimport textwrap\nfrom copy import deepcopy\nfrom typing import Any\n\nfrom lfx.base.data.base_file import BaseFileComponent\nfrom lfx.base.data.utils import TEXT_FILE_TYPES, parallel_load_data, parse_text_file_to_data\nfrom lfx.inputs.inputs import DropdownInput, MessageTextInput, StrInput\nfrom lfx.io import BoolInput, FileInput, IntInput, Output\nfrom lfx.schema.data import Data\nfrom lfx.schema.dataframe import DataFrame # noqa: TC001\nfrom lfx.schema.message import Message\n\n\nclass FileComponent(BaseFileComponent):\n \"\"\"File component with optional Docling processing (isolated in a subprocess).\"\"\"\n\n display_name = \"Read File\"\n description = \"Loads content from one or more files.\"\n documentation: str = \"https://docs.langflow.org/components-data#file\"\n icon = \"file-text\"\n name = \"File\"\n\n # Docling-supported/compatible extensions; TEXT_FILE_TYPES are supported by the base loader.\n VALID_EXTENSIONS = [\n *TEXT_FILE_TYPES,\n \"adoc\",\n \"asciidoc\",\n \"asc\",\n \"bmp\",\n \"dotx\",\n \"dotm\",\n \"docm\",\n \"jpg\",\n \"jpeg\",\n \"png\",\n \"potx\",\n \"ppsx\",\n \"pptm\",\n \"potm\",\n \"ppsm\",\n \"pptx\",\n \"tiff\",\n \"xls\",\n \"xlsx\",\n \"xhtml\",\n \"webp\",\n ]\n\n # Fixed export settings used when markdown export is requested.\n EXPORT_FORMAT = \"Markdown\"\n IMAGE_MODE = \"placeholder\"\n\n _base_inputs = deepcopy(BaseFileComponent.get_base_inputs())\n\n for input_item in _base_inputs:\n if isinstance(input_item, FileInput) and input_item.name == \"path\":\n input_item.real_time_refresh = True\n break\n\n inputs = [\n *_base_inputs,\n BoolInput(\n name=\"advanced_mode\",\n display_name=\"Advanced Parser\",\n value=False,\n real_time_refresh=True,\n info=(\n \"Enable advanced document processing and export with Docling for PDFs, images, and office documents. \"\n \"Note that advanced document processing can consume significant resources.\"\n ),\n show=True,\n ),\n DropdownInput(\n name=\"pipeline\",\n display_name=\"Pipeline\",\n info=\"Docling pipeline to use\",\n options=[\"standard\", \"vlm\"],\n value=\"standard\",\n advanced=True,\n real_time_refresh=True,\n ),\n DropdownInput(\n name=\"ocr_engine\",\n display_name=\"OCR Engine\",\n info=\"OCR engine to use. Only available when pipeline is set to 'standard'.\",\n options=[\"None\", \"easyocr\"],\n value=\"easyocr\",\n show=False,\n advanced=True,\n ),\n StrInput(\n name=\"md_image_placeholder\",\n display_name=\"Image placeholder\",\n info=\"Specify the image placeholder for markdown exports.\",\n value=\"\",\n advanced=True,\n show=False,\n ),\n StrInput(\n name=\"md_page_break_placeholder\",\n display_name=\"Page break placeholder\",\n info=\"Add this placeholder between pages in the markdown output.\",\n value=\"\",\n advanced=True,\n show=False,\n ),\n MessageTextInput(\n name=\"doc_key\",\n display_name=\"Doc Key\",\n info=\"The key to use for the DoclingDocument column.\",\n value=\"doc\",\n advanced=True,\n show=False,\n ),\n # Deprecated input retained for backward-compatibility.\n BoolInput(\n name=\"use_multithreading\",\n display_name=\"[Deprecated] Use Multithreading\",\n advanced=True,\n value=True,\n info=\"Set 'Processing Concurrency' greater than 1 to enable multithreading.\",\n ),\n IntInput(\n name=\"concurrency_multithreading\",\n display_name=\"Processing Concurrency\",\n advanced=True,\n info=\"When multiple files are being processed, the number of files to process concurrently.\",\n value=1,\n ),\n BoolInput(\n name=\"markdown\",\n display_name=\"Markdown Export\",\n info=\"Export processed documents to Markdown format. Only available when advanced mode is enabled.\",\n value=False,\n show=False,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Raw Content\", name=\"message\", method=\"load_files_message\"),\n ]\n\n # ------------------------------ UI helpers --------------------------------------\n\n def _path_value(self, template: dict) -> list[str]:\n \"\"\"Return the list of currently selected file paths from the template.\"\"\"\n return template.get(\"path\", {}).get(\"file_path\", [])\n\n def update_build_config(\n self,\n build_config: dict[str, Any],\n field_value: Any,\n field_name: str | None = None,\n ) -> dict[str, Any]:\n \"\"\"Show/hide Advanced Parser and related fields based on selection context.\"\"\"\n if field_name == \"path\":\n paths = self._path_value(build_config)\n\n # If all files can be processed by docling, do so\n allow_advanced = all(not file_path.endswith((\".csv\", \".xlsx\", \".parquet\")) for file_path in paths)\n build_config[\"advanced_mode\"][\"show\"] = allow_advanced\n if not allow_advanced:\n build_config[\"advanced_mode\"][\"value\"] = False\n for f in (\"pipeline\", \"ocr_engine\", \"doc_key\", \"md_image_placeholder\", \"md_page_break_placeholder\"):\n if f in build_config:\n build_config[f][\"show\"] = False\n\n # Docling Processing\n elif field_name == \"advanced_mode\":\n for f in (\"pipeline\", \"ocr_engine\", \"doc_key\", \"md_image_placeholder\", \"md_page_break_placeholder\"):\n if f in build_config:\n build_config[f][\"show\"] = bool(field_value)\n if f == \"pipeline\":\n build_config[f][\"advanced\"] = not bool(field_value)\n\n elif field_name == \"pipeline\":\n if field_value == \"standard\":\n build_config[\"ocr_engine\"][\"show\"] = True\n build_config[\"ocr_engine\"][\"value\"] = \"easyocr\"\n else:\n build_config[\"ocr_engine\"][\"show\"] = False\n build_config[\"ocr_engine\"][\"value\"] = \"None\"\n\n return build_config\n\n def update_outputs(self, frontend_node: dict[str, Any], field_name: str, field_value: Any) -> dict[str, Any]: # noqa: ARG002\n \"\"\"Dynamically show outputs based on file count/type and advanced mode.\"\"\"\n if field_name not in [\"path\", \"advanced_mode\", \"pipeline\"]:\n return frontend_node\n\n template = frontend_node.get(\"template\", {})\n paths = self._path_value(template)\n if not paths:\n return frontend_node\n\n frontend_node[\"outputs\"] = []\n if len(paths) == 1:\n file_path = paths[0] if field_name == \"path\" else frontend_node[\"template\"][\"path\"][\"file_path\"][0]\n if file_path.endswith((\".csv\", \".xlsx\", \".parquet\")):\n frontend_node[\"outputs\"].append(\n Output(display_name=\"Structured Content\", name=\"dataframe\", method=\"load_files_structured\"),\n )\n elif file_path.endswith(\".json\"):\n frontend_node[\"outputs\"].append(\n Output(display_name=\"Structured Content\", name=\"json\", method=\"load_files_json\"),\n )\n\n advanced_mode = frontend_node.get(\"template\", {}).get(\"advanced_mode\", {}).get(\"value\", False)\n if advanced_mode:\n frontend_node[\"outputs\"].append(\n Output(display_name=\"Structured Output\", name=\"advanced_dataframe\", method=\"load_files_dataframe\"),\n )\n frontend_node[\"outputs\"].append(\n Output(display_name=\"Markdown\", name=\"advanced_markdown\", method=\"load_files_markdown\"),\n )\n frontend_node[\"outputs\"].append(\n Output(display_name=\"File Path\", name=\"path\", method=\"load_files_path\"),\n )\n else:\n frontend_node[\"outputs\"].append(\n Output(display_name=\"Raw Content\", name=\"message\", method=\"load_files_message\"),\n )\n frontend_node[\"outputs\"].append(\n Output(display_name=\"File Path\", name=\"path\", method=\"load_files_path\"),\n )\n else:\n # Multiple files => DataFrame output; advanced parser disabled\n frontend_node[\"outputs\"].append(Output(display_name=\"Files\", name=\"dataframe\", method=\"load_files\"))\n\n return frontend_node\n\n # ------------------------------ Core processing ----------------------------------\n\n def _is_docling_compatible(self, file_path: str) -> bool:\n \"\"\"Lightweight extension gate for Docling-compatible types.\"\"\"\n docling_exts = (\n \".adoc\",\n \".asciidoc\",\n \".asc\",\n \".bmp\",\n \".csv\",\n \".dotx\",\n \".dotm\",\n \".docm\",\n \".docx\",\n \".htm\",\n \".html\",\n \".jpg\",\n \".jpeg\",\n \".json\",\n \".md\",\n \".pdf\",\n \".png\",\n \".potx\",\n \".ppsx\",\n \".pptm\",\n \".potm\",\n \".ppsm\",\n \".pptx\",\n \".tiff\",\n \".txt\",\n \".xls\",\n \".xlsx\",\n \".xhtml\",\n \".xml\",\n \".webp\",\n )\n return file_path.lower().endswith(docling_exts)\n\n def _process_docling_in_subprocess(self, file_path: str) -> Data | None:\n \"\"\"Run Docling in a separate OS process and map the result to a Data object.\n\n We avoid multiprocessing pickling by launching `python -c \"