lfx-nightly 0.1.12.dev38__py3-none-any.whl → 0.1.12.dev39__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of lfx-nightly might be problematic. Click here for more details.
- lfx/_assets/component_index.json +1 -0
- lfx/base/composio/composio_base.py +170 -73
- lfx/cli/run.py +7 -3
- lfx/components/agents/agent.py +1 -0
- lfx/components/composio/slack_composio.py +2 -573
- lfx/components/helpers/current_date.py +1 -1
- lfx/components/lmstudio/lmstudiomodel.py +9 -5
- lfx/components/nvidia/nvidia.py +3 -3
- lfx/components/processing/__init__.py +3 -0
- lfx/components/processing/dynamic_create_data.py +357 -0
- lfx/custom/validate.py +12 -3
- lfx/interface/components.py +336 -8
- lfx/services/settings/base.py +7 -0
- {lfx_nightly-0.1.12.dev38.dist-info → lfx_nightly-0.1.12.dev39.dist-info}/METADATA +1 -1
- {lfx_nightly-0.1.12.dev38.dist-info → lfx_nightly-0.1.12.dev39.dist-info}/RECORD +17 -15
- {lfx_nightly-0.1.12.dev38.dist-info → lfx_nightly-0.1.12.dev39.dist-info}/WHEEL +0 -0
- {lfx_nightly-0.1.12.dev38.dist-info → lfx_nightly-0.1.12.dev39.dist-info}/entry_points.txt +0 -0
lfx/interface/components.py
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
import hashlib
|
|
2
3
|
import importlib
|
|
4
|
+
import inspect
|
|
3
5
|
import json
|
|
6
|
+
import os
|
|
4
7
|
import pkgutil
|
|
8
|
+
import time
|
|
5
9
|
from pathlib import Path
|
|
6
10
|
from typing import TYPE_CHECKING, Any, Optional
|
|
7
11
|
|
|
12
|
+
import orjson
|
|
13
|
+
|
|
8
14
|
from lfx.constants import BASE_COMPONENTS_PATH
|
|
9
15
|
from lfx.custom.utils import abuild_custom_components, create_component_template
|
|
10
16
|
from lfx.log.logger import logger
|
|
@@ -31,16 +37,306 @@ class ComponentCache:
|
|
|
31
37
|
component_cache = ComponentCache()
|
|
32
38
|
|
|
33
39
|
|
|
34
|
-
|
|
40
|
+
def _parse_dev_mode() -> tuple[bool, list[str] | None]:
|
|
41
|
+
"""Parse LFX_DEV to determine dev mode and which modules to load.
|
|
42
|
+
|
|
43
|
+
Development mode must be explicitly enabled via the LFX_DEV environment variable.
|
|
44
|
+
When enabled, components are always rebuilt dynamically to reflect code changes.
|
|
45
|
+
When disabled or not set, the prebuilt index is used for fast startup.
|
|
46
|
+
|
|
47
|
+
Supports two modes:
|
|
48
|
+
- Boolean mode: LFX_DEV=1/true/yes loads all modules dynamically
|
|
49
|
+
- List mode: LFX_DEV=mistral,openai,anthropic loads only specified modules
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
Tuple of (dev_mode_enabled, module_list)
|
|
53
|
+
- If module_list is None, load all modules
|
|
54
|
+
- If module_list is a list, only load those specific modules
|
|
55
|
+
"""
|
|
56
|
+
lfx_dev = os.getenv("LFX_DEV", "").strip()
|
|
57
|
+
if not lfx_dev:
|
|
58
|
+
return (False, None)
|
|
59
|
+
|
|
60
|
+
# Boolean mode: "1", "true", "yes" enables dev mode
|
|
61
|
+
if lfx_dev.lower() in {"1", "true", "yes"}:
|
|
62
|
+
return (True, None) # Load all modules
|
|
63
|
+
|
|
64
|
+
# Boolean mode: "0", "false", "no" explicitly disables dev mode
|
|
65
|
+
if lfx_dev.lower() in {"0", "false", "no"}:
|
|
66
|
+
return (False, None)
|
|
67
|
+
|
|
68
|
+
# List mode: comma-separated values
|
|
69
|
+
modules = [m.strip().lower() for m in lfx_dev.split(",") if m.strip()]
|
|
70
|
+
if modules:
|
|
71
|
+
return (True, modules)
|
|
72
|
+
|
|
73
|
+
return (False, None)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _read_component_index(custom_path: str | None = None) -> dict | None:
|
|
77
|
+
"""Read and validate the prebuilt component index.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
custom_path: Optional custom path or URL to index file. If None, uses built-in index.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
The index dictionary if valid, None otherwise
|
|
84
|
+
"""
|
|
85
|
+
try:
|
|
86
|
+
import lfx
|
|
87
|
+
|
|
88
|
+
# Determine index location
|
|
89
|
+
if custom_path:
|
|
90
|
+
# Check if it's a URL
|
|
91
|
+
if custom_path.startswith(("http://", "https://")):
|
|
92
|
+
# Fetch from URL
|
|
93
|
+
import httpx
|
|
94
|
+
|
|
95
|
+
try:
|
|
96
|
+
response = httpx.get(custom_path, timeout=10.0)
|
|
97
|
+
response.raise_for_status()
|
|
98
|
+
blob = orjson.loads(response.content)
|
|
99
|
+
except httpx.HTTPError as e:
|
|
100
|
+
logger.warning(f"Failed to fetch component index from {custom_path}: {e}")
|
|
101
|
+
return None
|
|
102
|
+
except orjson.JSONDecodeError as e:
|
|
103
|
+
logger.warning(f"Component index from {custom_path} is corrupted or invalid JSON: {e}")
|
|
104
|
+
return None
|
|
105
|
+
else:
|
|
106
|
+
# Load from file path
|
|
107
|
+
index_path = Path(custom_path)
|
|
108
|
+
if not index_path.exists():
|
|
109
|
+
logger.warning(f"Custom component index not found at {custom_path}")
|
|
110
|
+
return None
|
|
111
|
+
try:
|
|
112
|
+
blob = orjson.loads(index_path.read_bytes())
|
|
113
|
+
except orjson.JSONDecodeError as e:
|
|
114
|
+
logger.warning(f"Component index at {custom_path} is corrupted or invalid JSON: {e}")
|
|
115
|
+
return None
|
|
116
|
+
else:
|
|
117
|
+
# Use built-in index
|
|
118
|
+
pkg_dir = Path(inspect.getfile(lfx)).parent
|
|
119
|
+
index_path = pkg_dir / "_assets" / "component_index.json"
|
|
120
|
+
|
|
121
|
+
if not index_path.exists():
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
try:
|
|
125
|
+
blob = orjson.loads(index_path.read_bytes())
|
|
126
|
+
except orjson.JSONDecodeError as e:
|
|
127
|
+
logger.warning(f"Built-in component index is corrupted or invalid JSON: {e}")
|
|
128
|
+
return None
|
|
129
|
+
|
|
130
|
+
# Integrity check: verify SHA256
|
|
131
|
+
tmp = dict(blob)
|
|
132
|
+
sha = tmp.pop("sha256", None)
|
|
133
|
+
if not sha:
|
|
134
|
+
logger.warning("Component index missing SHA256 hash - index may be tampered")
|
|
135
|
+
return None
|
|
136
|
+
|
|
137
|
+
# Use orjson for hash calculation to match build script
|
|
138
|
+
calc = hashlib.sha256(orjson.dumps(tmp, option=orjson.OPT_SORT_KEYS)).hexdigest()
|
|
139
|
+
if sha != calc:
|
|
140
|
+
logger.warning(
|
|
141
|
+
"Component index integrity check failed - SHA256 mismatch (file may be corrupted or tampered)"
|
|
142
|
+
)
|
|
143
|
+
return None
|
|
144
|
+
|
|
145
|
+
# Version check: ensure index matches installed langflow version
|
|
146
|
+
from importlib.metadata import version
|
|
147
|
+
|
|
148
|
+
installed_version = version("langflow")
|
|
149
|
+
if blob.get("version") != installed_version:
|
|
150
|
+
logger.debug(
|
|
151
|
+
f"Component index version mismatch: index={blob.get('version')}, installed={installed_version}"
|
|
152
|
+
)
|
|
153
|
+
return None
|
|
154
|
+
except Exception as e: # noqa: BLE001
|
|
155
|
+
logger.warning(f"Unexpected error reading component index: {type(e).__name__}: {e}")
|
|
156
|
+
return None
|
|
157
|
+
return blob
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def _get_cache_path() -> Path:
|
|
161
|
+
"""Get the path for the cached component index in the user's cache directory."""
|
|
162
|
+
from platformdirs import user_cache_dir
|
|
163
|
+
|
|
164
|
+
cache_dir = Path(user_cache_dir("lfx", "langflow"))
|
|
165
|
+
cache_dir.mkdir(parents=True, exist_ok=True)
|
|
166
|
+
return cache_dir / "component_index.json"
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _save_generated_index(modules_dict: dict) -> None:
|
|
170
|
+
"""Save a dynamically generated component index to cache for future use.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
modules_dict: Dictionary of components by category
|
|
174
|
+
"""
|
|
175
|
+
try:
|
|
176
|
+
cache_path = _get_cache_path()
|
|
177
|
+
|
|
178
|
+
# Convert modules_dict to entries format
|
|
179
|
+
entries = [[top_level, components] for top_level, components in modules_dict.items()]
|
|
180
|
+
|
|
181
|
+
# Calculate metadata
|
|
182
|
+
num_modules = len(modules_dict)
|
|
183
|
+
num_components = sum(len(components) for components in modules_dict.values())
|
|
184
|
+
|
|
185
|
+
# Get version
|
|
186
|
+
from importlib.metadata import version
|
|
187
|
+
|
|
188
|
+
langflow_version = version("langflow")
|
|
189
|
+
|
|
190
|
+
# Build index structure
|
|
191
|
+
index = {
|
|
192
|
+
"version": langflow_version,
|
|
193
|
+
"metadata": {
|
|
194
|
+
"num_modules": num_modules,
|
|
195
|
+
"num_components": num_components,
|
|
196
|
+
},
|
|
197
|
+
"entries": entries,
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
# Calculate hash
|
|
201
|
+
payload = orjson.dumps(index, option=orjson.OPT_SORT_KEYS)
|
|
202
|
+
index["sha256"] = hashlib.sha256(payload).hexdigest()
|
|
203
|
+
|
|
204
|
+
# Write to cache
|
|
205
|
+
json_bytes = orjson.dumps(index, option=orjson.OPT_SORT_KEYS | orjson.OPT_INDENT_2)
|
|
206
|
+
cache_path.write_bytes(json_bytes)
|
|
207
|
+
|
|
208
|
+
logger.debug(f"Saved generated component index to cache: {cache_path}")
|
|
209
|
+
except Exception as e: # noqa: BLE001
|
|
210
|
+
logger.debug(f"Failed to save generated index to cache: {e}")
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
async def _send_telemetry(
|
|
214
|
+
telemetry_service: Any,
|
|
215
|
+
index_source: str,
|
|
216
|
+
modules_dict: dict,
|
|
217
|
+
dev_mode: bool, # noqa: FBT001
|
|
218
|
+
target_modules: list[str] | None,
|
|
219
|
+
start_time_ms: int,
|
|
220
|
+
) -> None:
|
|
221
|
+
"""Send telemetry about component index loading.
|
|
222
|
+
|
|
223
|
+
Args:
|
|
224
|
+
telemetry_service: Telemetry service instance (optional)
|
|
225
|
+
index_source: Source of the index ("builtin", "cache", or "dynamic")
|
|
226
|
+
modules_dict: Dictionary of loaded components
|
|
227
|
+
dev_mode: Whether dev mode is enabled
|
|
228
|
+
target_modules: List of filtered modules if any
|
|
229
|
+
start_time_ms: Start time in milliseconds
|
|
230
|
+
"""
|
|
231
|
+
if not telemetry_service:
|
|
232
|
+
return
|
|
233
|
+
|
|
234
|
+
try:
|
|
235
|
+
# Calculate metrics
|
|
236
|
+
num_modules = len(modules_dict)
|
|
237
|
+
num_components = sum(len(components) for components in modules_dict.values())
|
|
238
|
+
load_time_ms = int(time.time() * 1000) - start_time_ms
|
|
239
|
+
filtered_modules = ",".join(target_modules) if target_modules else None
|
|
240
|
+
|
|
241
|
+
# Import the payload class dynamically to avoid circular imports
|
|
242
|
+
from langflow.services.telemetry.schema import ComponentIndexPayload
|
|
243
|
+
|
|
244
|
+
payload = ComponentIndexPayload(
|
|
245
|
+
index_source=index_source,
|
|
246
|
+
num_modules=num_modules,
|
|
247
|
+
num_components=num_components,
|
|
248
|
+
dev_mode=dev_mode,
|
|
249
|
+
filtered_modules=filtered_modules,
|
|
250
|
+
load_time_ms=load_time_ms,
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
await telemetry_service.log_component_index(payload)
|
|
254
|
+
except Exception as e: # noqa: BLE001
|
|
255
|
+
# Don't fail component loading if telemetry fails
|
|
256
|
+
await logger.adebug(f"Failed to send component index telemetry: {e}")
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
async def import_langflow_components(
|
|
260
|
+
settings_service: Optional["SettingsService"] = None, telemetry_service: Any | None = None
|
|
261
|
+
):
|
|
35
262
|
"""Asynchronously discovers and loads all built-in Langflow components with module-level parallelization.
|
|
36
263
|
|
|
264
|
+
In production mode (non-dev), attempts to load components from a prebuilt static index for instant startup.
|
|
265
|
+
Falls back to dynamic module scanning if index is unavailable or invalid. When dynamic loading is used,
|
|
266
|
+
the generated index is cached for future use.
|
|
267
|
+
|
|
37
268
|
Scans the `lfx.components` package and its submodules in parallel, instantiates classes that are subclasses
|
|
38
269
|
of `Component` or `CustomComponent`, and generates their templates. Components are grouped by their
|
|
39
270
|
top-level subpackage name.
|
|
40
271
|
|
|
272
|
+
Args:
|
|
273
|
+
settings_service: Optional settings service to get custom index path
|
|
274
|
+
telemetry_service: Optional telemetry service to log component loading metrics
|
|
275
|
+
|
|
41
276
|
Returns:
|
|
42
277
|
A dictionary with a "components" key mapping top-level package names to their component templates.
|
|
43
278
|
"""
|
|
279
|
+
# Start timer for telemetry
|
|
280
|
+
start_time_ms = int(time.time() * 1000)
|
|
281
|
+
index_source = None
|
|
282
|
+
|
|
283
|
+
# Track if we need to save the index after building
|
|
284
|
+
should_save_index = False
|
|
285
|
+
|
|
286
|
+
# Fast path: load from prebuilt index if not in dev mode
|
|
287
|
+
dev_mode_enabled, target_modules = _parse_dev_mode()
|
|
288
|
+
if not dev_mode_enabled:
|
|
289
|
+
# Get custom index path from settings if available
|
|
290
|
+
custom_index_path = None
|
|
291
|
+
if settings_service and settings_service.settings.components_index_path:
|
|
292
|
+
custom_index_path = settings_service.settings.components_index_path
|
|
293
|
+
await logger.adebug(f"Using custom component index: {custom_index_path}")
|
|
294
|
+
|
|
295
|
+
index = _read_component_index(custom_index_path)
|
|
296
|
+
if index and "entries" in index:
|
|
297
|
+
source = custom_index_path or "built-in index"
|
|
298
|
+
await logger.adebug(f"Loading components from {source}")
|
|
299
|
+
index_source = "builtin"
|
|
300
|
+
# Reconstruct modules_dict from index entries
|
|
301
|
+
modules_dict = {}
|
|
302
|
+
for top_level, components in index["entries"]:
|
|
303
|
+
if top_level not in modules_dict:
|
|
304
|
+
modules_dict[top_level] = {}
|
|
305
|
+
modules_dict[top_level].update(components)
|
|
306
|
+
await logger.adebug(f"Loaded {len(modules_dict)} component categories from index")
|
|
307
|
+
await _send_telemetry(
|
|
308
|
+
telemetry_service, index_source, modules_dict, dev_mode_enabled, target_modules, start_time_ms
|
|
309
|
+
)
|
|
310
|
+
return {"components": modules_dict}
|
|
311
|
+
|
|
312
|
+
# Index failed to load in production - try cache before building
|
|
313
|
+
await logger.adebug("Prebuilt index not available, checking cache")
|
|
314
|
+
try:
|
|
315
|
+
cache_path = _get_cache_path()
|
|
316
|
+
if cache_path.exists():
|
|
317
|
+
await logger.adebug(f"Attempting to load from cache: {cache_path}")
|
|
318
|
+
index = _read_component_index(str(cache_path))
|
|
319
|
+
if index and "entries" in index:
|
|
320
|
+
await logger.adebug("Loading components from cached index")
|
|
321
|
+
index_source = "cache"
|
|
322
|
+
modules_dict = {}
|
|
323
|
+
for top_level, components in index["entries"]:
|
|
324
|
+
if top_level not in modules_dict:
|
|
325
|
+
modules_dict[top_level] = {}
|
|
326
|
+
modules_dict[top_level].update(components)
|
|
327
|
+
await logger.adebug(f"Loaded {len(modules_dict)} component categories from cache")
|
|
328
|
+
await _send_telemetry(
|
|
329
|
+
telemetry_service, index_source, modules_dict, dev_mode_enabled, target_modules, start_time_ms
|
|
330
|
+
)
|
|
331
|
+
return {"components": modules_dict}
|
|
332
|
+
except Exception as e: # noqa: BLE001
|
|
333
|
+
await logger.adebug(f"Cache load failed: {e}")
|
|
334
|
+
|
|
335
|
+
# No cache available, will build and save
|
|
336
|
+
await logger.adebug("Falling back to dynamic loading")
|
|
337
|
+
should_save_index = True
|
|
338
|
+
|
|
339
|
+
# Fallback: dynamic loading (dev mode or index unavailable)
|
|
44
340
|
modules_dict = {}
|
|
45
341
|
try:
|
|
46
342
|
import lfx.components as components_pkg
|
|
@@ -52,8 +348,21 @@ async def import_langflow_components():
|
|
|
52
348
|
module_names = []
|
|
53
349
|
for _, modname, _ in pkgutil.walk_packages(components_pkg.__path__, prefix=components_pkg.__name__ + "."):
|
|
54
350
|
# Skip if the module is in the deactivated folder
|
|
55
|
-
if "deactivated"
|
|
56
|
-
|
|
351
|
+
if "deactivated" in modname:
|
|
352
|
+
continue
|
|
353
|
+
|
|
354
|
+
# If specific modules requested, filter by top-level module name
|
|
355
|
+
if target_modules:
|
|
356
|
+
# Extract top-level: "lfx.components.mistral.xyz" -> "mistral"
|
|
357
|
+
parts = modname.split(".")
|
|
358
|
+
if len(parts) > MIN_MODULE_PARTS and parts[2].lower() not in target_modules:
|
|
359
|
+
continue
|
|
360
|
+
|
|
361
|
+
module_names.append(modname)
|
|
362
|
+
|
|
363
|
+
if target_modules:
|
|
364
|
+
await logger.adebug(f"LFX_DEV module filter active: loading only {target_modules}")
|
|
365
|
+
await logger.adebug(f"Found {len(module_names)} modules matching filter")
|
|
57
366
|
|
|
58
367
|
if not module_names:
|
|
59
368
|
return {"components": modules_dict}
|
|
@@ -81,6 +390,17 @@ async def import_langflow_components():
|
|
|
81
390
|
modules_dict[top_level] = {}
|
|
82
391
|
modules_dict[top_level].update(components)
|
|
83
392
|
|
|
393
|
+
# Save the generated index to cache if needed (production mode with missing index)
|
|
394
|
+
if should_save_index and modules_dict:
|
|
395
|
+
await logger.adebug("Saving generated component index to cache")
|
|
396
|
+
_save_generated_index(modules_dict)
|
|
397
|
+
|
|
398
|
+
# Send telemetry for dynamic loading
|
|
399
|
+
index_source = "dynamic"
|
|
400
|
+
await _send_telemetry(
|
|
401
|
+
telemetry_service, index_source, modules_dict, dev_mode_enabled, target_modules, start_time_ms
|
|
402
|
+
)
|
|
403
|
+
|
|
84
404
|
return {"components": modules_dict}
|
|
85
405
|
|
|
86
406
|
|
|
@@ -100,8 +420,8 @@ def _process_single_module(modname: str) -> tuple[str, dict] | None:
|
|
|
100
420
|
# TODO: Surface these errors to the UI in a friendly manner
|
|
101
421
|
logger.error(f"Failed to import module {modname}: {e}", exc_info=True)
|
|
102
422
|
return None
|
|
103
|
-
# Extract the top-level subpackage name after "
|
|
104
|
-
# e.g., "
|
|
423
|
+
# Extract the top-level subpackage name after "lfx.components."
|
|
424
|
+
# e.g., "lfx.components.Notion.add_content_to_page" -> "Notion"
|
|
105
425
|
mod_parts = modname.split(".")
|
|
106
426
|
if len(mod_parts) <= MIN_MODULE_PARTS:
|
|
107
427
|
return None
|
|
@@ -184,6 +504,7 @@ async def _determine_loading_strategy(settings_service: "SettingsService") -> di
|
|
|
184
504
|
|
|
185
505
|
async def get_and_cache_all_types_dict(
|
|
186
506
|
settings_service: "SettingsService",
|
|
507
|
+
telemetry_service: Any | None = None,
|
|
187
508
|
):
|
|
188
509
|
"""Retrieves and caches the complete dictionary of component types and templates.
|
|
189
510
|
|
|
@@ -191,17 +512,24 @@ async def get_and_cache_all_types_dict(
|
|
|
191
512
|
components and either fully loads all components or loads only their metadata, depending on the
|
|
192
513
|
lazy loading setting. Merges built-in and custom components into the cache and returns the
|
|
193
514
|
resulting dictionary.
|
|
515
|
+
|
|
516
|
+
Args:
|
|
517
|
+
settings_service: Settings service instance
|
|
518
|
+
telemetry_service: Optional telemetry service for tracking component loading metrics
|
|
194
519
|
"""
|
|
195
520
|
if component_cache.all_types_dict is None:
|
|
196
521
|
await logger.adebug("Building components cache")
|
|
197
522
|
|
|
198
|
-
langflow_components = await import_langflow_components()
|
|
523
|
+
langflow_components = await import_langflow_components(settings_service, telemetry_service)
|
|
199
524
|
custom_components_dict = await _determine_loading_strategy(settings_service)
|
|
200
525
|
|
|
201
|
-
#
|
|
526
|
+
# Flatten custom dict if it has a "components" wrapper
|
|
527
|
+
custom_flat = custom_components_dict.get("components", custom_components_dict) or {}
|
|
528
|
+
|
|
529
|
+
# Merge built-in and custom components (no wrapper at cache level)
|
|
202
530
|
component_cache.all_types_dict = {
|
|
203
531
|
**langflow_components["components"],
|
|
204
|
-
**
|
|
532
|
+
**custom_flat,
|
|
205
533
|
}
|
|
206
534
|
component_count = sum(len(comps) for comps in component_cache.all_types_dict.values())
|
|
207
535
|
await logger.adebug(f"Loaded {component_count} components")
|
lfx/services/settings/base.py
CHANGED
|
@@ -158,6 +158,13 @@ class Settings(BaseSettings):
|
|
|
158
158
|
disable_track_apikey_usage: bool = False
|
|
159
159
|
remove_api_keys: bool = False
|
|
160
160
|
components_path: list[str] = []
|
|
161
|
+
components_index_path: str | None = None
|
|
162
|
+
"""Path or URL to a prebuilt component index JSON file.
|
|
163
|
+
|
|
164
|
+
If None, uses the built-in index at lfx/_assets/component_index.json.
|
|
165
|
+
Set to a file path (e.g., '/path/to/index.json') or URL (e.g., 'https://example.com/index.json')
|
|
166
|
+
to use a custom index.
|
|
167
|
+
"""
|
|
161
168
|
langchain_cache: str = "InMemoryCache"
|
|
162
169
|
load_flows_path: str | None = None
|
|
163
170
|
bundle_urls: list[str] = []
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lfx-nightly
|
|
3
|
-
Version: 0.1.12.
|
|
3
|
+
Version: 0.1.12.dev39
|
|
4
4
|
Summary: Langflow Executor - A lightweight CLI tool for executing and serving Langflow AI flows
|
|
5
5
|
Author-email: Gabriel Luiz Freitas Almeida <gabriel@langflow.org>
|
|
6
6
|
Requires-Python: <3.14,>=3.10
|
|
@@ -4,6 +4,7 @@ lfx/constants.py,sha256=Ert_SpwXhutgcTKEvtDArtkONXgyE5x68opMoQfukMA,203
|
|
|
4
4
|
lfx/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
lfx/settings.py,sha256=wnx4zkOLQ8mvampYsnnvVV9GvEnRUuWQpKFSbFTCIp4,181
|
|
6
6
|
lfx/type_extraction.py,sha256=eCZNl9nAQivKdaPv_9BK71N0JV9Rtr--veAht0dnQ4A,2921
|
|
7
|
+
lfx/_assets/component_index.json,sha256=sEndsouwcZA59wQYbyM-HfO4FOK-VegNQ_gNQSmkyFM,3434315
|
|
7
8
|
lfx/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
9
|
lfx/base/constants.py,sha256=v9vo0Ifg8RxDu__XqgGzIXHlsnUFyWM-SSux0uHHoz8,1187
|
|
9
10
|
lfx/base/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -22,7 +23,7 @@ lfx/base/astra_assistants/util.py,sha256=T_W44VFoOXBF3m-0eCSrHvzbKx1gdyBF9IAWKMX
|
|
|
22
23
|
lfx/base/chains/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
24
|
lfx/base/chains/model.py,sha256=QSYJBc0Ygpx2Ko273u1idL_gPK2xpvRQgJb4oTx8x8s,766
|
|
24
25
|
lfx/base/composio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
|
-
lfx/base/composio/composio_base.py,sha256
|
|
26
|
+
lfx/base/composio/composio_base.py,sha256=-E98PGHB4YK7Amt9duZvxiAWCPPn3vvR-KBj-N5VRZA,118459
|
|
26
27
|
lfx/base/compressors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
28
|
lfx/base/compressors/model.py,sha256=-FFBAPAy9bAgvklIo7x_uwShZR5NoMHakF6f_hNnLHg,2098
|
|
28
29
|
lfx/base/curl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -90,7 +91,7 @@ lfx/base/vectorstores/vector_store_connection_decorator.py,sha256=2gh3DMhcMsCgVY
|
|
|
90
91
|
lfx/cli/__init__.py,sha256=Oy17zrnwBlwJn80sMGyRJXos2n2eQGvSsh9CS_-v2R4,113
|
|
91
92
|
lfx/cli/commands.py,sha256=IR4leAtfQUjsc9wI6q1LRx--u4sW-i5ixtKdMYju-hI,11912
|
|
92
93
|
lfx/cli/common.py,sha256=SvszBhWoOttM27rButhBOpvE8lO5UGMYL0NaG_OW8bc,22060
|
|
93
|
-
lfx/cli/run.py,sha256=
|
|
94
|
+
lfx/cli/run.py,sha256=U4oKC21-jOu1mBTkWI4aASnvKuzi_ak3egZEci51ofU,21593
|
|
94
95
|
lfx/cli/script_loader.py,sha256=xWSpx57cBeX0UHmUgAk97aye9-hhD2Y6nKh68A-xaTA,8997
|
|
95
96
|
lfx/cli/serve_app.py,sha256=3U0QsoCkf-1DxSpxfNOr8ap7Giaxm_MfuLrii5GpIHM,22485
|
|
96
97
|
lfx/cli/validation.py,sha256=xZfL-rKt_Y-Lek19GMZffyxhPIyYMQHBIpR0Hwa_Ji8,2615
|
|
@@ -110,7 +111,7 @@ lfx/components/Notion/update_page_property.py,sha256=tgmPMbD1eX58dQQNXv1w5FzDec7
|
|
|
110
111
|
lfx/components/agentql/__init__.py,sha256=Erl669Dzsk-SegsDPWTtkKbprMXVuv8UTCo5REzZGTc,56
|
|
111
112
|
lfx/components/agentql/agentql_api.py,sha256=N94yEK7ZuQCIsFBlr_8dqrJY-K1-KNb6QEEYfDIsDME,5569
|
|
112
113
|
lfx/components/agents/__init__.py,sha256=u1PH9Ui0dUgTdTZVP7cdVysCv4extdusKS_brcbE7Eg,1049
|
|
113
|
-
lfx/components/agents/agent.py,sha256=
|
|
114
|
+
lfx/components/agents/agent.py,sha256=cv8CqEvLKpTsR9YAg09rqjxEXbW0_GzW8oUxeWc4pHY,26681
|
|
114
115
|
lfx/components/agents/mcp_component.py,sha256=mE2HvbHcdkuWWylxmaNNZobbtgBRktOOakeGwUYs7Qs,25586
|
|
115
116
|
lfx/components/aiml/__init__.py,sha256=DNKB-HMFGFYmsdkON-s8557ttgBXVXADmS-BcuSQiIQ,1087
|
|
116
117
|
lfx/components/aiml/aiml.py,sha256=23Ineg1ajlCoqXgWgp50I20OnQbaleRNsw1c6IzPu3A,3877
|
|
@@ -182,7 +183,7 @@ lfx/components/composio/notion_composio.py,sha256=WQqm_zDRxMtiqomYuzH0Q4hM2ceNJH
|
|
|
182
183
|
lfx/components/composio/onedrive_composio.py,sha256=SXzEYlEhyHNxPu_1_GuQF0FykO5twCpkDy-G3hHlcOQ,359
|
|
183
184
|
lfx/components/composio/outlook_composio.py,sha256=v2mY1gtjUYsTDBD2TdKAUo8E-Y_2YT4ZOBLrv2qrkww,350
|
|
184
185
|
lfx/components/composio/reddit_composio.py,sha256=qGeUBzwiUlk_ojDhuMfXpK2pPUXdLPLOA9LXq8W-zE4,347
|
|
185
|
-
lfx/components/composio/slack_composio.py,sha256=
|
|
186
|
+
lfx/components/composio/slack_composio.py,sha256=AtvmGTu-nzaahIvg9J1QcQSVR8datd6iTLTy2WpuuOE,342
|
|
186
187
|
lfx/components/composio/slackbot_composio.py,sha256=sTL6VbzuW-Y0rbLEP8O6ypAWoT7pNUC35JhnvP5f4mQ,354
|
|
187
188
|
lfx/components/composio/supabase_composio.py,sha256=etWM40zAwrCmLQrQeN-Pa4i9YU8hr7VIf0BhYKNH1Cg,357
|
|
188
189
|
lfx/components/composio/todoist_composio.py,sha256=TdmFLyBYBxTa88Hq18ZaFmS1_UjPXp2I-lRvEJcbEyI,352
|
|
@@ -299,7 +300,7 @@ lfx/components/groq/groq.py,sha256=7rIzaocX_QYVAOTU04q4xkniu6mVejVwVatuq_UaVvU,5
|
|
|
299
300
|
lfx/components/helpers/__init__.py,sha256=3qCWxz3ZDzq-HXhEMXTWQxLEVtlh0G1UZgqG595gGEk,1808
|
|
300
301
|
lfx/components/helpers/calculator_core.py,sha256=X8-ia-d91DDFnTgomG-CvReheMve_y06W9JeeO7i3JU,3353
|
|
301
302
|
lfx/components/helpers/create_list.py,sha256=nsdw0DMQ6ZLyvJ0mQasB0ACkYE6I8avCbXCIv34Ba14,1146
|
|
302
|
-
lfx/components/helpers/current_date.py,sha256=
|
|
303
|
+
lfx/components/helpers/current_date.py,sha256=hznwtkoFTMy-HpHWEAC6FdVlf52oaFXCYLFh_5ud13o,1561
|
|
303
304
|
lfx/components/helpers/id_generator.py,sha256=zduLTtvDX9WfHISGhSvY5sCTGfqomIVe5gu6KGQ_q9k,1203
|
|
304
305
|
lfx/components/helpers/memory.py,sha256=79EfrCQWyroMaNcQN3kuNSDBKGKLq4FmwhrgmaHgDG4,9756
|
|
305
306
|
lfx/components/helpers/output_parser.py,sha256=m-tio-j7M2Ipjmgb37wy5JPIQBROTxku0QaHLAs7vUY,1574
|
|
@@ -367,7 +368,7 @@ lfx/components/langwatch/langwatch.py,sha256=bbO8zVlF7YVCcC6iaHc10Cu45mixMJptewP
|
|
|
367
368
|
lfx/components/link_extractors/__init__.py,sha256=dL4pKVepOSxdKYRggng-sz9eVL-7Rg7g70-w4hP1xEM,68
|
|
368
369
|
lfx/components/lmstudio/__init__.py,sha256=IcaH0L89DrXILWtUyc0mRVfpy6u0fBxjm1f8vggVCs0,1136
|
|
369
370
|
lfx/components/lmstudio/lmstudioembeddings.py,sha256=7NWEt6SG3FOigrxLZ5-TIOSvX4CvCF2zUDa5FmOGyNo,3175
|
|
370
|
-
lfx/components/lmstudio/lmstudiomodel.py,sha256=
|
|
371
|
+
lfx/components/lmstudio/lmstudiomodel.py,sha256=2ks7FV3E2neKS9LO9R78UISIUJLe2C4YdQ8XzkoPWrU,4839
|
|
371
372
|
lfx/components/logic/__init__.py,sha256=nHxJDynHNaHDhdckwa8Y6UCyjlsoO0QcNaSPq51OuUM,1802
|
|
372
373
|
lfx/components/logic/conditional_router.py,sha256=RQaoM9FF63vXw6rebKA_j4-Hl2YRNvHRtwEq5eT48yY,8692
|
|
373
374
|
lfx/components/logic/data_conditional_router.py,sha256=b6G_QWajQqoFCQM-614QbrPoU2AVzkgMHA6AMUZybl0,5054
|
|
@@ -400,7 +401,7 @@ lfx/components/notdiamond/notdiamond.py,sha256=om6_UB9n5rt1T-yXxgMFBPBEP2tJtnGC2
|
|
|
400
401
|
lfx/components/novita/__init__.py,sha256=i8RrVPX00S3RupAlZ078-mdGB7VHwvpdnL7IfsWWPIo,937
|
|
401
402
|
lfx/components/novita/novita.py,sha256=IULE3StkQwECxOR3HMJsEyE7cN5hwslxovvhMmquuNo,4368
|
|
402
403
|
lfx/components/nvidia/__init__.py,sha256=Phf45VUW7An5LnauqpB-lIRVwwBiQawZkoWbqBjQnWE,1756
|
|
403
|
-
lfx/components/nvidia/nvidia.py,sha256=
|
|
404
|
+
lfx/components/nvidia/nvidia.py,sha256=_WyuMcKgTXgtVTnn30fsUvuFEtIJqBK8FsvEuV5HMGE,6134
|
|
404
405
|
lfx/components/nvidia/nvidia_embedding.py,sha256=D97QOAgtZEzwHvBmDDShTmZhDAyN2SRbfb71515ib-g,2658
|
|
405
406
|
lfx/components/nvidia/nvidia_ingest.py,sha256=_wxmYNmRQ2kBfAxaXLykBIlKFXVGXEsTY22spVeoCCI,12065
|
|
406
407
|
lfx/components/nvidia/nvidia_rerank.py,sha256=zzl2skHxf2oXINDZBmG8-GbkTkc6EWtyMjyV8pVRAm4,2293
|
|
@@ -422,7 +423,7 @@ lfx/components/pgvector/__init__.py,sha256=swho2zRxXeqlLBtSJD--b2XS0R3UiLPtwejql
|
|
|
422
423
|
lfx/components/pgvector/pgvector.py,sha256=UBF2B79eVfjj3hHoxrHzmT2UXOsUZxp4dWvyuPS2wh4,2635
|
|
423
424
|
lfx/components/pinecone/__init__.py,sha256=iz4GAXdbt9vo_CeWns1qyT0s7a56Q5CyS4H5MWa4Mv0,953
|
|
424
425
|
lfx/components/pinecone/pinecone.py,sha256=VkygoOmrco417hYInjYIFwuxX1M7peYJl9-jhuiySR8,5137
|
|
425
|
-
lfx/components/processing/__init__.py,sha256
|
|
426
|
+
lfx/components/processing/__init__.py,sha256=Ei7dnjSDlpBpaJ8bw1jzOlJMIisrU6DULXrOxYUXW0U,5236
|
|
426
427
|
lfx/components/processing/alter_metadata.py,sha256=Cy_mLq7E8nEJd36kmCVwqjvt-4HvWcqAXwPXjdOqVps,3831
|
|
427
428
|
lfx/components/processing/batch_run.py,sha256=KZtEaQMuSEUsQ5qwiU-dJPMAqNE5LA83HoLk-Y646hg,7861
|
|
428
429
|
lfx/components/processing/combine_text.py,sha256=EP-2VD3Za5usoNj87Gtjbjh7e23_4tNpXzFo7pXpKx8,1290
|
|
@@ -432,6 +433,7 @@ lfx/components/processing/data_operations.py,sha256=9dloD4ZEvwlpQwpV2Tig6sGwWTOx
|
|
|
432
433
|
lfx/components/processing/data_to_dataframe.py,sha256=V7n3kCjp6v6vdcsrdVJQxlgaYHqevL46x4lAcgnKNGA,2408
|
|
433
434
|
lfx/components/processing/dataframe_operations.py,sha256=tNaxm27vTkH_uVqqQ5k-c0HwVuvGAgNRzT0LCCbqmnI,11552
|
|
434
435
|
lfx/components/processing/dataframe_to_toolset.py,sha256=jnXdzOPrQnKne7P7MTiU8Oye4KUydCe6BKfkT9E7kr0,9911
|
|
436
|
+
lfx/components/processing/dynamic_create_data.py,sha256=BFfErN9F3aVyiIguL4aqvYnKcbTJneXoYD8RVch-FZ4,15511
|
|
435
437
|
lfx/components/processing/extract_key.py,sha256=7e0_ThUzvAe6blYuj0A8zc-b3FzYqlPJPvK4krF4voc,2012
|
|
436
438
|
lfx/components/processing/filter_data.py,sha256=BMUJNyFtTLRdmuxcyPeH_W2PfEWErH6rxMfsLSQrarw,1317
|
|
437
439
|
lfx/components/processing/filter_data_values.py,sha256=hHUiVJxnbERVbvyycmBmUrl4nDK6x7cfQThs5N9JRkk,3182
|
|
@@ -560,7 +562,7 @@ lfx/custom/eval.py,sha256=6iekrFA2xHopjorhU06Je5cksgq9KWCHjr_84ehC58c,378
|
|
|
560
562
|
lfx/custom/schema.py,sha256=WwHe0TnNauyiaC17-bKSyEb8K7KJxBtkB32OSbxiICY,678
|
|
561
563
|
lfx/custom/tree_visitor.py,sha256=sa4j8VTwksN8ejTE9fnnH1TpD6OnnTtlg2KemiI-eQA,601
|
|
562
564
|
lfx/custom/utils.py,sha256=eFZcNHvpUhb1Fx6Kbvna2wS0coN3Iub8CW0MvrpstMM,35958
|
|
563
|
-
lfx/custom/validate.py,sha256=
|
|
565
|
+
lfx/custom/validate.py,sha256=DHS3c3TJmzAIKCZtxf9p3W0NMCD8e7GDPOeoekv_XsM,17550
|
|
564
566
|
lfx/custom/code_parser/__init__.py,sha256=qIwZQdEp1z7ldn0z-GY44wmwRaywN3L6VPoPt6lqx1k,62
|
|
565
567
|
lfx/custom/code_parser/code_parser.py,sha256=QAqsp4QF607319dClK60BsaiwZLV55n0xeGR-DthSoE,14280
|
|
566
568
|
lfx/custom/custom_component/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -614,7 +616,7 @@ lfx/inputs/input_mixin.py,sha256=fRnx-0FjIG-Vf_BCaXFMysca5f9CvRVKYhsD6mtNLnY,108
|
|
|
614
616
|
lfx/inputs/inputs.py,sha256=jNZhr7Uud_YQ9gYBMrBeBbP-m2-n4pQQ1V-fp8eNFTc,25706
|
|
615
617
|
lfx/inputs/validators.py,sha256=i_PyQHQUmNpeS-_jRJNNsP3WlTPMkCJk2iFmFt3_ijw,505
|
|
616
618
|
lfx/interface/__init__.py,sha256=hlivcb8kMhU_V8VeXClNfz5fRyF-u5PZZMXkgu0U5a0,211
|
|
617
|
-
lfx/interface/components.py,sha256=
|
|
619
|
+
lfx/interface/components.py,sha256=L4xXcVpPVMX4DsSGhxGQnUUR2fDMD85jBIQvOPrBPTE,33216
|
|
618
620
|
lfx/interface/listing.py,sha256=fCpnp1F4foldTEbt1sQcF2HNqsaUZZ5uEyIe_FDL42c,711
|
|
619
621
|
lfx/interface/run.py,sha256=m2u9r7K-v_FIe19GpwPUoaCeOMhA1iqp1k7Cy5G75uE,743
|
|
620
622
|
lfx/interface/utils.py,sha256=qKi2HRg-QgeI3hmXLMtG6DHBbaQPuVMW5-o9lcN7j0Q,3790
|
|
@@ -680,7 +682,7 @@ lfx/services/mcp_composer/factory.py,sha256=f8Bj0ZR9A_o1c3Kw5JKyR6SbtbCEPNWOy8b0
|
|
|
680
682
|
lfx/services/mcp_composer/service.py,sha256=TdQoQ1VV_aATRGCYNm9MZRj_WEb45LLP4ACub_ChCXg,25876
|
|
681
683
|
lfx/services/settings/__init__.py,sha256=UISBvOQIqoA3a8opwJrTQp4PSTqpReY6GQ_7O6WuqJQ,65
|
|
682
684
|
lfx/services/settings/auth.py,sha256=_18KZipq0udCJPq-4xCD_juhqSwAEvoCqxOTSYsNv5w,5720
|
|
683
|
-
lfx/services/settings/base.py,sha256=
|
|
685
|
+
lfx/services/settings/base.py,sha256=Cohox-JLOcrGXr1-hvJXtm8K1I3Fw9PH9JufuT5u4rA,27874
|
|
684
686
|
lfx/services/settings/constants.py,sha256=ZBJolZ4kx0ZoYp2BDyHkgDFgaXEQAH-ZcLqgunv_MqQ,908
|
|
685
687
|
lfx/services/settings/factory.py,sha256=NezZ6TE_xP955B9l9pI6ONNyoylrHPfUZN8arvLVRXg,615
|
|
686
688
|
lfx/services/settings/feature_flags.py,sha256=HGuDGgfOBIDtuEiEVTgoWHxKqX2vuVBRgsqdX_4D9kg,205
|
|
@@ -724,7 +726,7 @@ lfx/utils/schemas.py,sha256=NbOtVQBrn4d0BAu-0H_eCTZI2CXkKZlRY37XCSmuJwc,3865
|
|
|
724
726
|
lfx/utils/util.py,sha256=Ww85wbr1-vjh2pXVtmTqoUVr6MXAW8S7eDx_Ys6HpE8,20696
|
|
725
727
|
lfx/utils/util_strings.py,sha256=nU_IcdphNaj6bAPbjeL-c1cInQPfTBit8mp5Y57lwQk,1686
|
|
726
728
|
lfx/utils/version.py,sha256=cHpbO0OJD2JQAvVaTH_6ibYeFbHJV0QDHs_YXXZ-bT8,671
|
|
727
|
-
lfx_nightly-0.1.12.
|
|
728
|
-
lfx_nightly-0.1.12.
|
|
729
|
-
lfx_nightly-0.1.12.
|
|
730
|
-
lfx_nightly-0.1.12.
|
|
729
|
+
lfx_nightly-0.1.12.dev39.dist-info/METADATA,sha256=Ecknf2wvOaYtJ4NqOBun56OH0RPNzF-NTdycBZUgWTE,8290
|
|
730
|
+
lfx_nightly-0.1.12.dev39.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
731
|
+
lfx_nightly-0.1.12.dev39.dist-info/entry_points.txt,sha256=1724p3RHDQRT2CKx_QRzEIa7sFuSVO0Ux70YfXfoMT4,42
|
|
732
|
+
lfx_nightly-0.1.12.dev39.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|