lfx-nightly 0.1.12.dev37__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.

@@ -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
- async def import_langflow_components():
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" not in modname:
56
- module_names.append(modname)
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 "langflow.components."
104
- # e.g., "langflow.components.Notion.add_content_to_page" -> "Notion"
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
- # merge the dicts
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
- **custom_components_dict,
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")
@@ -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.dev37
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=pltCXF0eQVfGbetksE2sXMTPMji8lR1jSryeMNrYNZM,115607
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=_7JX6YpoO3XLCfD2BtZl3FsghMyo18B9SriLyO0EaoQ,21411
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=gUZ5RTgf_6G8Yi6QnQRuC4qn1rh2eeIF9MHQL8G-D3k,26592
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=21re5KgNjtKTqHLJ9Bc7Y87lr5UAHejgCFY2UkBNnck,27453
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=fUGT-p3YdOgLUCjBT6mMIpfbCsiGd_OOXtXQy-R3MUk,1525
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=73bEJ2CgqsnoYWhtqNq2Fpe9yedHK9udV1SVClh3f38,4542
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=Ej8WbpJD5fWAtFsMa4qUiK1Xu6igL6SQYwM0hk5mPGo,6116
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=-M4X7S2PjQ2wGFbH1B1tuIs_-kCifCatHIu6pPhyV8U,5056
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=Gae1nmvUurTWsEXZ2304IZZVy44tqLcGbATSMvEXl1Y,17117
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=BotYhF246Ixm41AQb2aD5OJ7G8dIX_uE_55ZOrI4C70,20058
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=xtqqE4f8Bo-Dt0D2DlB83-BHss8BACYioaQ08y5ETYY,27558
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.dev37.dist-info/METADATA,sha256=d776iFhCA-JXSNc7oP-rmjUilfF7E-LU99hI434WnDs,8290
728
- lfx_nightly-0.1.12.dev37.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
729
- lfx_nightly-0.1.12.dev37.dist-info/entry_points.txt,sha256=1724p3RHDQRT2CKx_QRzEIa7sFuSVO0Ux70YfXfoMT4,42
730
- lfx_nightly-0.1.12.dev37.dist-info/RECORD,,
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,,