lfx-nightly 0.1.12.dev39__py3-none-any.whl → 0.1.12.dev40__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.

Files changed (30) hide show
  1. lfx/_assets/component_index.json +1 -1
  2. lfx/base/composio/composio_base.py +73 -170
  3. lfx/components/arxiv/arxiv.py +8 -2
  4. lfx/components/composio/__init__.py +71 -17
  5. lfx/components/composio/agentql_composio.py +11 -0
  6. lfx/components/composio/agiled_composio.py +11 -0
  7. lfx/components/composio/bolna_composio.py +11 -0
  8. lfx/components/composio/brightdata_composio.py +11 -0
  9. lfx/components/composio/canvas_composio.py +11 -0
  10. lfx/components/composio/digicert_composio.py +11 -0
  11. lfx/components/composio/finage_composio.py +11 -0
  12. lfx/components/composio/fixer_composio.py +11 -0
  13. lfx/components/composio/flexisign_composio.py +11 -0
  14. lfx/components/composio/freshdesk_composio.py +11 -0
  15. lfx/components/composio/googleclassroom_composio.py +11 -0
  16. lfx/components/composio/instagram_composio.py +11 -0
  17. lfx/components/composio/jira_composio.py +11 -0
  18. lfx/components/composio/jotform_composio.py +11 -0
  19. lfx/components/composio/listennotes_composio.py +11 -0
  20. lfx/components/composio/missive_composio.py +11 -0
  21. lfx/components/composio/pandadoc_composio.py +11 -0
  22. lfx/components/composio/slack_composio.py +573 -2
  23. lfx/components/composio/timelinesai_composio.py +11 -0
  24. lfx/components/logic/__init__.py +3 -0
  25. lfx/components/logic/llm_conditional_router.py +65 -21
  26. lfx/components/processing/lambda_filter.py +82 -18
  27. {lfx_nightly-0.1.12.dev39.dist-info → lfx_nightly-0.1.12.dev40.dist-info}/METADATA +1 -1
  28. {lfx_nightly-0.1.12.dev39.dist-info → lfx_nightly-0.1.12.dev40.dist-info}/RECORD +30 -12
  29. {lfx_nightly-0.1.12.dev39.dist-info → lfx_nightly-0.1.12.dev40.dist-info}/WHEEL +0 -0
  30. {lfx_nightly-0.1.12.dev39.dist-info → lfx_nightly-0.1.12.dev40.dist-info}/entry_points.txt +0 -0
@@ -8,6 +8,7 @@ if TYPE_CHECKING:
8
8
  from lfx.components.logic.conditional_router import ConditionalRouterComponent
9
9
  from lfx.components.logic.data_conditional_router import DataConditionalRouterComponent
10
10
  from lfx.components.logic.flow_tool import FlowToolComponent
11
+ from lfx.components.logic.llm_conditional_router import SmartRouterComponent
11
12
  from lfx.components.logic.loop import LoopComponent
12
13
  from lfx.components.logic.pass_message import PassMessageComponent
13
14
  from lfx.components.logic.run_flow import RunFlowComponent
@@ -20,6 +21,7 @@ _dynamic_imports = {
20
21
  "LoopComponent": "loop",
21
22
  "PassMessageComponent": "pass_message",
22
23
  "RunFlowComponent": "run_flow",
24
+ "SmartRouterComponent": "llm_conditional_router",
23
25
  "SubFlowComponent": "sub_flow",
24
26
  }
25
27
 
@@ -30,6 +32,7 @@ __all__ = [
30
32
  "LoopComponent",
31
33
  "PassMessageComponent",
32
34
  "RunFlowComponent",
35
+ "SmartRouterComponent",
33
36
  "SubFlowComponent",
34
37
  ]
35
38
 
@@ -1,8 +1,9 @@
1
1
  from typing import Any
2
2
 
3
- from langflow.custom import Component
4
- from langflow.io import BoolInput, HandleInput, MessageInput, MessageTextInput, MultilineInput, Output, TableInput
5
- from langflow.schema.message import Message
3
+ from lfx.custom import Component
4
+ from lfx.io import BoolInput, HandleInput, MessageInput, MessageTextInput, MultilineInput, Output, TableInput
5
+ from lfx.schema.message import Message
6
+ from lfx.schema.table import EditMode
6
7
 
7
8
 
8
9
  class SmartRouterComponent(Component):
@@ -39,21 +40,42 @@ class SmartRouterComponent(Component):
39
40
  table_schema=[
40
41
  {
41
42
  "name": "route_category",
42
- "display_name": "Route/Category",
43
+ "display_name": "Route Name",
43
44
  "type": "str",
44
- "description": "Name for the route/category (used for both output name and category matching)",
45
+ "description": "Name for the route (used for both output name and category matching)",
46
+ "edit_mode": EditMode.INLINE,
47
+ },
48
+ {
49
+ "name": "route_description",
50
+ "display_name": "Route Description",
51
+ "type": "str",
52
+ "description": "Description of when this route should be used (helps LLM understand the category)",
53
+ "default": "",
54
+ "edit_mode": EditMode.POPOVER,
45
55
  },
46
56
  {
47
57
  "name": "output_value",
48
- "display_name": "Output Value",
58
+ "display_name": "Route Message (Optional)",
49
59
  "type": "str",
50
- "description": "Custom message for this category (overrides default output message if filled)",
60
+ "description": (
61
+ "Optional message to send when this route is matched."
62
+ "Leave empty to pass through the original input text."
63
+ ),
51
64
  "default": "",
65
+ "edit_mode": EditMode.POPOVER,
52
66
  },
53
67
  ],
54
68
  value=[
55
- {"route_category": "Positive", "output_value": ""},
56
- {"route_category": "Negative", "output_value": ""},
69
+ {
70
+ "route_category": "Positive",
71
+ "route_description": "Positive feedback, satisfaction, or compliments",
72
+ "output_value": "",
73
+ },
74
+ {
75
+ "route_category": "Negative",
76
+ "route_description": "Complaints, issues, or dissatisfaction",
77
+ "output_value": "",
78
+ },
57
79
  ],
58
80
  real_time_refresh=True,
59
81
  required=True,
@@ -125,6 +147,7 @@ class SmartRouterComponent(Component):
125
147
  # Clear any previous match state
126
148
  self._matched_category = None
127
149
 
150
+ # Get categories and input text
128
151
  categories = getattr(self, "routes", [])
129
152
  input_text = getattr(self, "input_text", "")
130
153
 
@@ -134,17 +157,23 @@ class SmartRouterComponent(Component):
134
157
 
135
158
  if llm and categories:
136
159
  # Create prompt for categorization
137
- category_values = [
138
- category.get("route_category", f"Category {i + 1}") for i, category in enumerate(categories)
139
- ]
140
- categories_text = ", ".join([f'"{cat}"' for cat in category_values if cat])
160
+ category_info = []
161
+ for i, category in enumerate(categories):
162
+ cat_name = category.get("route_category", f"Category {i + 1}")
163
+ cat_desc = category.get("route_description", "")
164
+ if cat_desc and cat_desc.strip():
165
+ category_info.append(f'"{cat_name}": {cat_desc}')
166
+ else:
167
+ category_info.append(f'"{cat_name}"')
168
+
169
+ categories_text = "\n".join([f"- {info}" for info in category_info if info])
141
170
 
142
171
  # Create base prompt
143
172
  base_prompt = (
144
173
  f"You are a text classifier. Given the following text and categories, "
145
174
  f"determine which category best matches the text.\n\n"
146
175
  f'Text to classify: "{input_text}"\n\n'
147
- f"Available categories: {categories_text}\n\n"
176
+ f"Available categories:\n{categories_text}\n\n"
148
177
  f"Respond with ONLY the exact category name that best matches the text. "
149
178
  f'If none match well, respond with "NONE".\n\n'
150
179
  f"Category:"
@@ -155,7 +184,11 @@ class SmartRouterComponent(Component):
155
184
  if custom_prompt and custom_prompt.strip():
156
185
  self.status = "Using custom prompt as additional instructions"
157
186
  # Format custom prompt with variables
158
- formatted_custom = custom_prompt.format(input_text=input_text, routes=categories_text)
187
+ # For the routes variable, create a simpler format for custom prompt usage
188
+ simple_routes = ", ".join(
189
+ [f'"{cat.get("route_category", f"Category {i + 1}")}"' for i, cat in enumerate(categories)]
190
+ )
191
+ formatted_custom = custom_prompt.format(input_text=input_text, routes=simple_routes)
159
192
  # Combine base prompt with custom instructions
160
193
  prompt = f"{base_prompt}\n\nAdditional Instructions:\n{formatted_custom}"
161
194
  else:
@@ -188,6 +221,7 @@ class SmartRouterComponent(Component):
188
221
  f"Comparing '{categorization}' with category {i + 1}: route_category='{route_category}'"
189
222
  )
190
223
 
224
+ # Case-insensitive match
191
225
  if categorization.lower() == route_category.lower():
192
226
  matched_category = i
193
227
  self.status = f"MATCH FOUND! Category {i + 1} matched with '{categorization}'"
@@ -286,17 +320,23 @@ class SmartRouterComponent(Component):
286
320
  if llm and categories:
287
321
  try:
288
322
  # Create prompt for categorization
289
- category_values = [
290
- category.get("route_category", f"Category {i + 1}") for i, category in enumerate(categories)
291
- ]
292
- categories_text = ", ".join([f'"{cat}"' for cat in category_values if cat])
323
+ category_info = []
324
+ for i, category in enumerate(categories):
325
+ cat_name = category.get("route_category", f"Category {i + 1}")
326
+ cat_desc = category.get("route_description", "")
327
+ if cat_desc and cat_desc.strip():
328
+ category_info.append(f'"{cat_name}": {cat_desc}')
329
+ else:
330
+ category_info.append(f'"{cat_name}"')
331
+
332
+ categories_text = "\n".join([f"- {info}" for info in category_info if info])
293
333
 
294
334
  # Create base prompt
295
335
  base_prompt = (
296
336
  "You are a text classifier. Given the following text and categories, "
297
337
  "determine which category best matches the text.\n\n"
298
338
  f'Text to classify: "{input_text}"\n\n'
299
- f"Available categories: {categories_text}\n\n"
339
+ f"Available categories:\n{categories_text}\n\n"
300
340
  "Respond with ONLY the exact category name that best matches the text. "
301
341
  'If none match well, respond with "NONE".\n\n'
302
342
  "Category:"
@@ -307,7 +347,11 @@ class SmartRouterComponent(Component):
307
347
  if custom_prompt and custom_prompt.strip():
308
348
  self.status = "Using custom prompt as additional instructions (default check)"
309
349
  # Format custom prompt with variables
310
- formatted_custom = custom_prompt.format(input_text=input_text, routes=categories_text)
350
+ # For the routes variable, create a simpler format for custom prompt usage
351
+ simple_routes = ", ".join(
352
+ [f'"{cat.get("route_category", f"Category {i + 1}")}"' for i, cat in enumerate(categories)]
353
+ )
354
+ formatted_custom = custom_prompt.format(input_text=input_text, routes=simple_routes)
311
355
  # Combine base prompt with custom instructions
312
356
  prompt = f"{base_prompt}\n\nAdditional Instructions:\n{formatted_custom}"
313
357
  else:
@@ -7,7 +7,7 @@ from typing import TYPE_CHECKING, Any
7
7
  from lfx.custom.custom_component.component import Component
8
8
  from lfx.io import DataInput, HandleInput, IntInput, MultilineInput, Output
9
9
  from lfx.schema.data import Data
10
- from lfx.utils.data_structure import get_data_structure
10
+ from lfx.schema.dataframe import DataFrame
11
11
 
12
12
  if TYPE_CHECKING:
13
13
  from collections.abc import Callable
@@ -25,6 +25,7 @@ class LambdaFilterComponent(Component):
25
25
  name="data",
26
26
  display_name="Data",
27
27
  info="The structured data to filter or transform using a lambda function.",
28
+ input_types=["Data", "DataFrame"],
28
29
  is_list=True,
29
30
  required=True,
30
31
  ),
@@ -63,24 +64,67 @@ class LambdaFilterComponent(Component):
63
64
 
64
65
  outputs = [
65
66
  Output(
66
- display_name="Filtered Data",
67
- name="filtered_data",
68
- method="filter_data",
67
+ display_name="Output",
68
+ name="data_output",
69
+ method="process_as_data",
70
+ ),
71
+ Output(
72
+ display_name="Output",
73
+ name="dataframe_output",
74
+ method="process_as_dataframe",
69
75
  ),
70
76
  ]
71
77
 
72
78
  def get_data_structure(self, data):
73
- """Extract the structure of a dictionary, replacing values with their types."""
74
- return {k: get_data_structure(v) for k, v in data.items()}
79
+ """Extract the structure of data, replacing values with their types."""
80
+ if isinstance(data, list):
81
+ # For lists, get structure of first item if available
82
+ if data:
83
+ return [self.get_data_structure(data[0])]
84
+ return []
85
+ if isinstance(data, dict):
86
+ return {k: self.get_data_structure(v) for k, v in data.items()}
87
+ # For primitive types, return the type name
88
+ return type(data).__name__
75
89
 
76
90
  def _validate_lambda(self, lambda_text: str) -> bool:
77
91
  """Validate the provided lambda function text."""
78
92
  # Return False if the lambda function does not start with 'lambda' or does not contain a colon
79
93
  return lambda_text.strip().startswith("lambda") and ":" in lambda_text
80
94
 
81
- async def filter_data(self) -> list[Data]:
95
+ async def _execute_lambda(self) -> Any:
82
96
  self.log(str(self.data))
83
- data = self.data[0].data if isinstance(self.data, list) else self.data.data
97
+
98
+ # Convert input to a unified format
99
+ if isinstance(self.data, list):
100
+ # Handle list of Data or DataFrame objects
101
+ combined_data = []
102
+ for item in self.data:
103
+ if isinstance(item, DataFrame):
104
+ # DataFrame to list of dicts
105
+ combined_data.extend(item.to_dict(orient="records"))
106
+ elif hasattr(item, "data"):
107
+ # Data object
108
+ if isinstance(item.data, dict):
109
+ combined_data.append(item.data)
110
+ elif isinstance(item.data, list):
111
+ combined_data.extend(item.data)
112
+
113
+ # If we have a single dict, unwrap it so lambdas can access it directly
114
+ if len(combined_data) == 1 and isinstance(combined_data[0], dict):
115
+ data = combined_data[0]
116
+ elif len(combined_data) == 0:
117
+ data = {}
118
+ else:
119
+ data = combined_data # type: ignore[assignment]
120
+ elif isinstance(self.data, DataFrame):
121
+ # Single DataFrame to list of dicts
122
+ data = self.data.to_dict(orient="records")
123
+ elif hasattr(self.data, "data"):
124
+ # Single Data object
125
+ data = self.data.data
126
+ else:
127
+ data = self.data
84
128
 
85
129
  dump = json.dumps(data)
86
130
  self.log(str(data))
@@ -142,13 +186,33 @@ class LambdaFilterComponent(Component):
142
186
  fn: Callable[[Any], Any] = eval(lambda_text) # noqa: S307
143
187
 
144
188
  # Apply the lambda function to the data
145
- processed_data = fn(data)
146
-
147
- # If it's a dict, wrap it in a Data object
148
- if isinstance(processed_data, dict):
149
- return [Data(**processed_data)]
150
- # If it's a list, convert each item to a Data object
151
- if isinstance(processed_data, list):
152
- return [Data(**item) if isinstance(item, dict) else Data(text=str(item)) for item in processed_data]
153
- # If it's anything else, convert to string and wrap in a Data object
154
- return [Data(text=str(processed_data))]
189
+ return fn(data)
190
+
191
+ async def process_as_data(self) -> Data:
192
+ """Process the data and return as a Data object."""
193
+ result = await self._execute_lambda()
194
+
195
+ # Convert result to Data based on type
196
+ if isinstance(result, dict):
197
+ return Data(data=result)
198
+ if isinstance(result, list):
199
+ return Data(data={"_results": result})
200
+ # For other types, convert to string
201
+ return Data(data={"text": str(result)})
202
+
203
+ async def process_as_dataframe(self) -> DataFrame:
204
+ """Process the data and return as a DataFrame."""
205
+ result = await self._execute_lambda()
206
+
207
+ # Convert result to DataFrame based on type
208
+ if isinstance(result, list):
209
+ # Check if it's a list of dicts
210
+ if all(isinstance(item, dict) for item in result):
211
+ return DataFrame(result)
212
+ # List of non-dicts: wrap each value
213
+ return DataFrame([{"value": item} for item in result])
214
+ if isinstance(result, dict):
215
+ # Single dict becomes single-row DataFrame
216
+ return DataFrame([result])
217
+ # Other types: convert to string and wrap
218
+ return DataFrame([{"value": str(result)}])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lfx-nightly
3
- Version: 0.1.12.dev39
3
+ Version: 0.1.12.dev40
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,7 +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
+ lfx/_assets/component_index.json,sha256=fxtpy4FgxLQswo9s5ftwTTVC6uwyz1yA30EHKpS8VsA,3502133
8
8
  lfx/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  lfx/base/constants.py,sha256=v9vo0Ifg8RxDu__XqgGzIXHlsnUFyWM-SSux0uHHoz8,1187
10
10
  lfx/base/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -23,7 +23,7 @@ lfx/base/astra_assistants/util.py,sha256=T_W44VFoOXBF3m-0eCSrHvzbKx1gdyBF9IAWKMX
23
23
  lfx/base/chains/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  lfx/base/chains/model.py,sha256=QSYJBc0Ygpx2Ko273u1idL_gPK2xpvRQgJb4oTx8x8s,766
25
25
  lfx/base/composio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- lfx/base/composio/composio_base.py,sha256=-E98PGHB4YK7Amt9duZvxiAWCPPn3vvR-KBj-N5VRZA,118459
26
+ lfx/base/composio/composio_base.py,sha256=pltCXF0eQVfGbetksE2sXMTPMji8lR1jSryeMNrYNZM,115607
27
27
  lfx/base/compressors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  lfx/base/compressors/model.py,sha256=-FFBAPAy9bAgvklIo7x_uwShZR5NoMHakF6f_hNnLHg,2098
29
29
  lfx/base/curl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -126,7 +126,7 @@ lfx/components/anthropic/anthropic.py,sha256=fIlMWma6rsfQ499vkkLSWFZqwKn5ifvhFQn
126
126
  lfx/components/apify/__init__.py,sha256=ADNTjMjTglvdC34YEgMYWippzrXWiH3ku_3RvRQcOlw,89
127
127
  lfx/components/apify/apify_actor.py,sha256=O8au5opTgLuv5QY-OUzV4-Pst1clxGKWgHPm08i5PFQ,12853
128
128
  lfx/components/arxiv/__init__.py,sha256=g3uhahiWz1ZALR65oBFfO-hmrHcJLb5HuUqbeTFZ2Ss,64
129
- lfx/components/arxiv/arxiv.py,sha256=5LE8oOCvfMjjSUfqkHDdstMlVt5sObscvP8E08i4foo,6283
129
+ lfx/components/arxiv/arxiv.py,sha256=IZI57itI_oiu_BA3q9QQRP8bh2TqIjrcOXCR7QT_DSM,6627
130
130
  lfx/components/assemblyai/__init__.py,sha256=H0Rt2gzDDgj6IL8laOpolIFzhueT08VaMiVetGvlt0c,1632
131
131
  lfx/components/assemblyai/assemblyai_get_subtitles.py,sha256=Uz0fz3x6nnplLS960F8K8ob8mZ6eY9GPVdHdkJJ61KA,3019
132
132
  lfx/components/assemblyai/assemblyai_lemur.py,sha256=jJZzirlnwlxT0SNot-9ea_odV0TpTnW70sbd49KGbjc,7577
@@ -159,33 +159,51 @@ lfx/components/cohere/__init__.py,sha256=MSTeplsNIXTVm_dUcJETy6YGb-fw7-dplC9jzAo
159
159
  lfx/components/cohere/cohere_embeddings.py,sha256=nA9BOixk534yJZymJaukBrQYBj_uB2nyYvzJPd_3aUc,3083
160
160
  lfx/components/cohere/cohere_models.py,sha256=WUhS4dcG8FBcJm2dCfhiDuaxZX8S1lICMI_Mmd6kflo,1563
161
161
  lfx/components/cohere/cohere_rerank.py,sha256=qUoNEe6sjUnvkTHkCzwayBuLDoH957BBEgb-Qu_k9Yk,1554
162
- lfx/components/composio/__init__.py,sha256=DVYKV9JyGTAWYDpAV7TeEKp_efltoOiyblQmL-qq4Ok,5175
162
+ lfx/components/composio/__init__.py,sha256=Ycwax7TUDTez6O9Q9cv0I9GT0eB1hquDIOMJo51R_64,7996
163
+ lfx/components/composio/agentql_composio.py,sha256=zKcIoQq2WmY_if3b7e6N0S5Z-k1aDAoQSoeKePiRIwI,352
164
+ lfx/components/composio/agiled_composio.py,sha256=MpSpUaGo0t2Lu-KzHpv4NT0LZNbvLwkdZ3gJ0gf9cdk,347
163
165
  lfx/components/composio/airtable_composio.py,sha256=5HrQEcM8bW7xv4AE5NIWyBzfgopxf9SIIpdcQHuy978,357
164
166
  lfx/components/composio/asana_composio.py,sha256=KQ1tYdBJKOhtOqI11r8x2HxA0X21F7YaU-KEs3BOqAE,342
165
167
  lfx/components/composio/attio_composio.py,sha256=3kOzz1Zx4_sXEqGY26l3r0nYK6c-RxCYchUwBGZ_vG0,342
168
+ lfx/components/composio/bolna_composio.py,sha256=3efS7oCiYxXOt3suHSSDUhpmRIoZKQsLY_Fsvl4GDUs,342
169
+ lfx/components/composio/brightdata_composio.py,sha256=SaBMWiPLoSQ8aIdBohJbaHZfkudPYYhYFkVxls28ETg,367
166
170
  lfx/components/composio/calendly_composio.py,sha256=SiguQT1VKiQ1F_sJs0ZGtNR6qoRYVCtpGbwYelmwU2A,357
171
+ lfx/components/composio/canvas_composio.py,sha256=ZRDSEqcg9q9ZnsTKhOqux8g9zlsPDzBZg8aojt1rAYA,348
167
172
  lfx/components/composio/composio_api.py,sha256=xBzxP4T_mPToP5teroP2C4vDiJiyK-tzclDKHxdPRHM,10667
168
173
  lfx/components/composio/contentful_composio.py,sha256=Nr77Hsj8R-B_QALVY4aabas4bEjD_xfVdsVdh9_bGu4,367
174
+ lfx/components/composio/digicert_composio.py,sha256=D8vBuJn48UIHV8u_lBFTUJJZPUw_l4Mbh9tbsgBAGVI,357
169
175
  lfx/components/composio/discord_composio.py,sha256=3X4b7Wun7N4yt7KV6Hd120t_keNXm3cIMRWajeHSfsM,352
170
176
  lfx/components/composio/dropbox_compnent.py,sha256=0FglWZ3vZYQFNo8OJcIMoIE8HQi3N5w2JY8FBhrS4sg,352
171
177
  lfx/components/composio/figma_composio.py,sha256=dEPSE1RrJMFuW63R9KPc3HKi3v-ztfHUDHspgagvE-w,342
178
+ lfx/components/composio/finage_composio.py,sha256=UKK97kzRZgwBNZsOuYTMta912LwoBjqMcaLzogRrRGs,347
179
+ lfx/components/composio/fixer_composio.py,sha256=nkwA-dzYiNpIrKgRg1qYzxWf8VGTqs5XH9KK-obqQEM,342
180
+ lfx/components/composio/flexisign_composio.py,sha256=xpu-4ABdiOuzFb4tIVfTx8evQYJbfUN3YLkv3EWWV1c,362
181
+ lfx/components/composio/freshdesk_composio.py,sha256=Hd4D1hXKmXTec0JdR7WFGx-YhUqSsD4jtbZfNJHU01A,362
172
182
  lfx/components/composio/github_composio.py,sha256=-KutXeX95w3uUyBufvVmLMYuwHhSPxswLMpI6YrUgWs,347
173
183
  lfx/components/composio/gmail_composio.py,sha256=VQiEIi3hWIj4tWzFD2yARqhn2uCifp_rdsJzCjSIyKg,1342
174
184
  lfx/components/composio/googlecalendar_composio.py,sha256=hyMyC2yblNCQb8sxa2t2tnke_zE5Uq1OkEAvd_kfIE4,389
185
+ lfx/components/composio/googleclassroom_composio.py,sha256=haXDfBP2mkPgnRUl62eaY7mVlaWpy8Vt_O2LQOafQ98,389
175
186
  lfx/components/composio/googledocs_composio.py,sha256=_EIPZqeAPWD5ptTb3h9-Yxaajr_zQo26ZSBzpwBwVyo,369
176
187
  lfx/components/composio/googlemeet_composio.py,sha256=xU25iiHRMW0rcCNq0fxmuiEQN7mv1K7NnRqgTg7SBCI,373
177
188
  lfx/components/composio/googlesheets_composio.py,sha256=o-84aBcIgQd7md5WdUwRV8tF3QBzTms3Idko2ybgAMA,379
178
189
  lfx/components/composio/googletasks_composio.py,sha256=3bmyDAX8OwB6KryAiAitue6rHdeZBoDfJ6q6rzuwOcs,276
190
+ lfx/components/composio/instagram_composio.py,sha256=pmkckFgz2gLtB9JE_uJ8FQsgGdBSrB0cUUXttas6ZB8,362
191
+ lfx/components/composio/jira_composio.py,sha256=PmI5bzhoNy5yE9cfV86gWpPtONJEc4ROoLCg_oFY3_4,337
192
+ lfx/components/composio/jotform_composio.py,sha256=fBxqZ2gU9jwNN1BzMEqeprH_cxSKys4PvDiFTawuCEw,352
179
193
  lfx/components/composio/klaviyo_composio.py,sha256=O-fopeP-_RoTdZLHlRlcS5S5jTb3JkT7nE-BIYqIISk,352
180
194
  lfx/components/composio/linear_composio.py,sha256=visuu-6nQizgbEM2C6GwvHXYY59_mfGx-rhS4QvQjIA,347
195
+ lfx/components/composio/listennotes_composio.py,sha256=uF8v5RkGQeWy9OLLoyOk4g2GvGMpzBAsxee9uxZoNt0,372
181
196
  lfx/components/composio/miro_composio.py,sha256=HpxCHhrEGXD8pCPzI9BX3pomIw2tysDCCmzRo_y9i48,337
197
+ lfx/components/composio/missive_composio.py,sha256=be-USnc5zfpT5Ndr3ClDKMtWZ1y8ozPmsCTC2Ekf5Yg,352
182
198
  lfx/components/composio/notion_composio.py,sha256=WQqm_zDRxMtiqomYuzH0Q4hM2ceNJHiHJVr6l-aviKY,347
183
199
  lfx/components/composio/onedrive_composio.py,sha256=SXzEYlEhyHNxPu_1_GuQF0FykO5twCpkDy-G3hHlcOQ,359
184
200
  lfx/components/composio/outlook_composio.py,sha256=v2mY1gtjUYsTDBD2TdKAUo8E-Y_2YT4ZOBLrv2qrkww,350
201
+ lfx/components/composio/pandadoc_composio.py,sha256=Idkqq8G_5pqqsPF0LtUSGEZYHOcuB4DJJABd3i2rWUQ,357
185
202
  lfx/components/composio/reddit_composio.py,sha256=qGeUBzwiUlk_ojDhuMfXpK2pPUXdLPLOA9LXq8W-zE4,347
186
- lfx/components/composio/slack_composio.py,sha256=AtvmGTu-nzaahIvg9J1QcQSVR8datd6iTLTy2WpuuOE,342
203
+ lfx/components/composio/slack_composio.py,sha256=21re5KgNjtKTqHLJ9Bc7Y87lr5UAHejgCFY2UkBNnck,27453
187
204
  lfx/components/composio/slackbot_composio.py,sha256=sTL6VbzuW-Y0rbLEP8O6ypAWoT7pNUC35JhnvP5f4mQ,354
188
205
  lfx/components/composio/supabase_composio.py,sha256=etWM40zAwrCmLQrQeN-Pa4i9YU8hr7VIf0BhYKNH1Cg,357
206
+ lfx/components/composio/timelinesai_composio.py,sha256=ducOLeTTlk6PgywrC-o7e5scgrjtmBYBRNWOqvjGPhM,372
189
207
  lfx/components/composio/todoist_composio.py,sha256=TdmFLyBYBxTa88Hq18ZaFmS1_UjPXp2I-lRvEJcbEyI,352
190
208
  lfx/components/composio/wrike_composio.py,sha256=pfLPAMoI39rY8aFtFpnSyK29vZZvdXn3Tp50HyIXncs,342
191
209
  lfx/components/composio/youtube_composio.py,sha256=EaW3f8Cthza9IkHebwjld5u2Vvwa3SyoStplCDVWy00,352
@@ -369,12 +387,12 @@ lfx/components/link_extractors/__init__.py,sha256=dL4pKVepOSxdKYRggng-sz9eVL-7Rg
369
387
  lfx/components/lmstudio/__init__.py,sha256=IcaH0L89DrXILWtUyc0mRVfpy6u0fBxjm1f8vggVCs0,1136
370
388
  lfx/components/lmstudio/lmstudioembeddings.py,sha256=7NWEt6SG3FOigrxLZ5-TIOSvX4CvCF2zUDa5FmOGyNo,3175
371
389
  lfx/components/lmstudio/lmstudiomodel.py,sha256=2ks7FV3E2neKS9LO9R78UISIUJLe2C4YdQ8XzkoPWrU,4839
372
- lfx/components/logic/__init__.py,sha256=nHxJDynHNaHDhdckwa8Y6UCyjlsoO0QcNaSPq51OuUM,1802
390
+ lfx/components/logic/__init__.py,sha256=qjxFQTtlK-KTRNldRrm9q_TjA7qxDmTlrcCG5jlBogU,1965
373
391
  lfx/components/logic/conditional_router.py,sha256=RQaoM9FF63vXw6rebKA_j4-Hl2YRNvHRtwEq5eT48yY,8692
374
392
  lfx/components/logic/data_conditional_router.py,sha256=b6G_QWajQqoFCQM-614QbrPoU2AVzkgMHA6AMUZybl0,5054
375
393
  lfx/components/logic/flow_tool.py,sha256=k0jXnRn0TIarE7cw61w80R-a_XmloRTIHioYGeZrBeU,3984
376
394
  lfx/components/logic/listen.py,sha256=k_wRN3yW5xtG1CjTdGYhL5LxdgCZ0Bi9cbWP54FkyuY,935
377
- lfx/components/logic/llm_conditional_router.py,sha256=x-qCphrRd16yh_n2IQxqoCWu4AMMlI1QNLKBA0r7Rz8,16613
395
+ lfx/components/logic/llm_conditional_router.py,sha256=wHCAryCKBvQG5SEwm4KmTufliGBlLFS0Dby2ndF-77w,18714
378
396
  lfx/components/logic/loop.py,sha256=F9vGbfAH-zDQgnJpVy9yk4fdrSIXz1gomnAOYW71Gto,4682
379
397
  lfx/components/logic/notify.py,sha256=A9aLooUwudRUsf2BRdE7CmGibCCRuQeCadneart9BEg,3086
380
398
  lfx/components/logic/pass_message.py,sha256=BNPh7TOQ-svrhR2-uMQMMT0LBW0sT_zzIpbuWeEEPDY,1085
@@ -438,7 +456,7 @@ lfx/components/processing/extract_key.py,sha256=7e0_ThUzvAe6blYuj0A8zc-b3FzYqlPJ
438
456
  lfx/components/processing/filter_data.py,sha256=BMUJNyFtTLRdmuxcyPeH_W2PfEWErH6rxMfsLSQrarw,1317
439
457
  lfx/components/processing/filter_data_values.py,sha256=hHUiVJxnbERVbvyycmBmUrl4nDK6x7cfQThs5N9JRkk,3182
440
458
  lfx/components/processing/json_cleaner.py,sha256=XBUJl67E0qI93yK6L_8uHmbMRaKllk1cQ2c1Dz5DdWw,3750
441
- lfx/components/processing/lambda_filter.py,sha256=QHhlDuyU-4Cm28UB0umKohkd7yp_Hlnngj-d2faHvIk,5566
459
+ lfx/components/processing/lambda_filter.py,sha256=KSXi8I1fE6jSqj1tOsxhTHSqItem-ExWoO73cbbarQ4,8009
442
460
  lfx/components/processing/llm_router.py,sha256=FYC0SylbjUDlOBRLSdpFfU6Ep4IMk7tWpRAQJ5k9aA4,23198
443
461
  lfx/components/processing/merge_data.py,sha256=ouy4E6rFi2A4_xC6T8Vr3GwFy7fhR98WBuXLGFGom7o,3569
444
462
  lfx/components/processing/message_to_data.py,sha256=0K8SIq6vuAvQ3K7siXstNint6R1-rAuZ5NIwQiiG_n0,1342
@@ -726,7 +744,7 @@ lfx/utils/schemas.py,sha256=NbOtVQBrn4d0BAu-0H_eCTZI2CXkKZlRY37XCSmuJwc,3865
726
744
  lfx/utils/util.py,sha256=Ww85wbr1-vjh2pXVtmTqoUVr6MXAW8S7eDx_Ys6HpE8,20696
727
745
  lfx/utils/util_strings.py,sha256=nU_IcdphNaj6bAPbjeL-c1cInQPfTBit8mp5Y57lwQk,1686
728
746
  lfx/utils/version.py,sha256=cHpbO0OJD2JQAvVaTH_6ibYeFbHJV0QDHs_YXXZ-bT8,671
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,,
747
+ lfx_nightly-0.1.12.dev40.dist-info/METADATA,sha256=sUZ01YKv2VE7yqJ6CUxLVqEF3kHPysjqHgP-fx17CzQ,8290
748
+ lfx_nightly-0.1.12.dev40.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
749
+ lfx_nightly-0.1.12.dev40.dist-info/entry_points.txt,sha256=1724p3RHDQRT2CKx_QRzEIa7sFuSVO0Ux70YfXfoMT4,42
750
+ lfx_nightly-0.1.12.dev40.dist-info/RECORD,,