lfx-nightly 0.1.11.dev0__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.
Files changed (699) hide show
  1. lfx/__init__.py +0 -0
  2. lfx/__main__.py +25 -0
  3. lfx/base/__init__.py +0 -0
  4. lfx/base/agents/__init__.py +0 -0
  5. lfx/base/agents/agent.py +268 -0
  6. lfx/base/agents/callback.py +130 -0
  7. lfx/base/agents/context.py +109 -0
  8. lfx/base/agents/crewai/__init__.py +0 -0
  9. lfx/base/agents/crewai/crew.py +231 -0
  10. lfx/base/agents/crewai/tasks.py +12 -0
  11. lfx/base/agents/default_prompts.py +23 -0
  12. lfx/base/agents/errors.py +15 -0
  13. lfx/base/agents/events.py +346 -0
  14. lfx/base/agents/utils.py +205 -0
  15. lfx/base/astra_assistants/__init__.py +0 -0
  16. lfx/base/astra_assistants/util.py +171 -0
  17. lfx/base/chains/__init__.py +0 -0
  18. lfx/base/chains/model.py +19 -0
  19. lfx/base/composio/__init__.py +0 -0
  20. lfx/base/composio/composio_base.py +1291 -0
  21. lfx/base/compressors/__init__.py +0 -0
  22. lfx/base/compressors/model.py +60 -0
  23. lfx/base/constants.py +46 -0
  24. lfx/base/curl/__init__.py +0 -0
  25. lfx/base/curl/parse.py +188 -0
  26. lfx/base/data/__init__.py +5 -0
  27. lfx/base/data/base_file.py +685 -0
  28. lfx/base/data/docling_utils.py +245 -0
  29. lfx/base/data/utils.py +198 -0
  30. lfx/base/document_transformers/__init__.py +0 -0
  31. lfx/base/document_transformers/model.py +43 -0
  32. lfx/base/embeddings/__init__.py +0 -0
  33. lfx/base/embeddings/aiml_embeddings.py +62 -0
  34. lfx/base/embeddings/model.py +26 -0
  35. lfx/base/flow_processing/__init__.py +0 -0
  36. lfx/base/flow_processing/utils.py +86 -0
  37. lfx/base/huggingface/__init__.py +0 -0
  38. lfx/base/huggingface/model_bridge.py +133 -0
  39. lfx/base/io/__init__.py +0 -0
  40. lfx/base/io/chat.py +20 -0
  41. lfx/base/io/text.py +22 -0
  42. lfx/base/langchain_utilities/__init__.py +0 -0
  43. lfx/base/langchain_utilities/model.py +35 -0
  44. lfx/base/langchain_utilities/spider_constants.py +1 -0
  45. lfx/base/langwatch/__init__.py +0 -0
  46. lfx/base/langwatch/utils.py +18 -0
  47. lfx/base/mcp/__init__.py +0 -0
  48. lfx/base/mcp/constants.py +2 -0
  49. lfx/base/mcp/util.py +1398 -0
  50. lfx/base/memory/__init__.py +0 -0
  51. lfx/base/memory/memory.py +49 -0
  52. lfx/base/memory/model.py +38 -0
  53. lfx/base/models/__init__.py +3 -0
  54. lfx/base/models/aiml_constants.py +51 -0
  55. lfx/base/models/anthropic_constants.py +47 -0
  56. lfx/base/models/aws_constants.py +151 -0
  57. lfx/base/models/chat_result.py +76 -0
  58. lfx/base/models/google_generative_ai_constants.py +70 -0
  59. lfx/base/models/groq_constants.py +134 -0
  60. lfx/base/models/model.py +375 -0
  61. lfx/base/models/model_input_constants.py +307 -0
  62. lfx/base/models/model_metadata.py +41 -0
  63. lfx/base/models/model_utils.py +8 -0
  64. lfx/base/models/novita_constants.py +35 -0
  65. lfx/base/models/ollama_constants.py +49 -0
  66. lfx/base/models/openai_constants.py +122 -0
  67. lfx/base/models/sambanova_constants.py +18 -0
  68. lfx/base/processing/__init__.py +0 -0
  69. lfx/base/prompts/__init__.py +0 -0
  70. lfx/base/prompts/api_utils.py +224 -0
  71. lfx/base/prompts/utils.py +61 -0
  72. lfx/base/textsplitters/__init__.py +0 -0
  73. lfx/base/textsplitters/model.py +28 -0
  74. lfx/base/tools/__init__.py +0 -0
  75. lfx/base/tools/base.py +26 -0
  76. lfx/base/tools/component_tool.py +325 -0
  77. lfx/base/tools/constants.py +49 -0
  78. lfx/base/tools/flow_tool.py +132 -0
  79. lfx/base/tools/run_flow.py +224 -0
  80. lfx/base/vectorstores/__init__.py +0 -0
  81. lfx/base/vectorstores/model.py +193 -0
  82. lfx/base/vectorstores/utils.py +22 -0
  83. lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
  84. lfx/cli/__init__.py +5 -0
  85. lfx/cli/commands.py +319 -0
  86. lfx/cli/common.py +650 -0
  87. lfx/cli/run.py +441 -0
  88. lfx/cli/script_loader.py +247 -0
  89. lfx/cli/serve_app.py +546 -0
  90. lfx/cli/validation.py +69 -0
  91. lfx/components/FAISS/__init__.py +34 -0
  92. lfx/components/FAISS/faiss.py +111 -0
  93. lfx/components/Notion/__init__.py +19 -0
  94. lfx/components/Notion/add_content_to_page.py +269 -0
  95. lfx/components/Notion/create_page.py +94 -0
  96. lfx/components/Notion/list_database_properties.py +68 -0
  97. lfx/components/Notion/list_pages.py +122 -0
  98. lfx/components/Notion/list_users.py +77 -0
  99. lfx/components/Notion/page_content_viewer.py +93 -0
  100. lfx/components/Notion/search.py +111 -0
  101. lfx/components/Notion/update_page_property.py +114 -0
  102. lfx/components/__init__.py +411 -0
  103. lfx/components/_importing.py +42 -0
  104. lfx/components/agentql/__init__.py +3 -0
  105. lfx/components/agentql/agentql_api.py +151 -0
  106. lfx/components/agents/__init__.py +34 -0
  107. lfx/components/agents/agent.py +558 -0
  108. lfx/components/agents/mcp_component.py +501 -0
  109. lfx/components/aiml/__init__.py +37 -0
  110. lfx/components/aiml/aiml.py +112 -0
  111. lfx/components/aiml/aiml_embeddings.py +37 -0
  112. lfx/components/amazon/__init__.py +36 -0
  113. lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
  114. lfx/components/amazon/amazon_bedrock_model.py +124 -0
  115. lfx/components/amazon/s3_bucket_uploader.py +211 -0
  116. lfx/components/anthropic/__init__.py +34 -0
  117. lfx/components/anthropic/anthropic.py +187 -0
  118. lfx/components/apify/__init__.py +5 -0
  119. lfx/components/apify/apify_actor.py +325 -0
  120. lfx/components/arxiv/__init__.py +3 -0
  121. lfx/components/arxiv/arxiv.py +163 -0
  122. lfx/components/assemblyai/__init__.py +46 -0
  123. lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  124. lfx/components/assemblyai/assemblyai_lemur.py +183 -0
  125. lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  126. lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  127. lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
  128. lfx/components/azure/__init__.py +37 -0
  129. lfx/components/azure/azure_openai.py +95 -0
  130. lfx/components/azure/azure_openai_embeddings.py +83 -0
  131. lfx/components/baidu/__init__.py +32 -0
  132. lfx/components/baidu/baidu_qianfan_chat.py +113 -0
  133. lfx/components/bing/__init__.py +3 -0
  134. lfx/components/bing/bing_search_api.py +61 -0
  135. lfx/components/cassandra/__init__.py +40 -0
  136. lfx/components/cassandra/cassandra.py +264 -0
  137. lfx/components/cassandra/cassandra_chat.py +92 -0
  138. lfx/components/cassandra/cassandra_graph.py +238 -0
  139. lfx/components/chains/__init__.py +3 -0
  140. lfx/components/chroma/__init__.py +34 -0
  141. lfx/components/chroma/chroma.py +167 -0
  142. lfx/components/cleanlab/__init__.py +40 -0
  143. lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
  144. lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  145. lfx/components/cleanlab/cleanlab_remediator.py +131 -0
  146. lfx/components/clickhouse/__init__.py +34 -0
  147. lfx/components/clickhouse/clickhouse.py +135 -0
  148. lfx/components/cloudflare/__init__.py +32 -0
  149. lfx/components/cloudflare/cloudflare.py +81 -0
  150. lfx/components/cohere/__init__.py +40 -0
  151. lfx/components/cohere/cohere_embeddings.py +81 -0
  152. lfx/components/cohere/cohere_models.py +46 -0
  153. lfx/components/cohere/cohere_rerank.py +51 -0
  154. lfx/components/composio/__init__.py +74 -0
  155. lfx/components/composio/composio_api.py +268 -0
  156. lfx/components/composio/dropbox_compnent.py +11 -0
  157. lfx/components/composio/github_composio.py +11 -0
  158. lfx/components/composio/gmail_composio.py +38 -0
  159. lfx/components/composio/googlecalendar_composio.py +11 -0
  160. lfx/components/composio/googlemeet_composio.py +11 -0
  161. lfx/components/composio/googletasks_composio.py +8 -0
  162. lfx/components/composio/linear_composio.py +11 -0
  163. lfx/components/composio/outlook_composio.py +11 -0
  164. lfx/components/composio/reddit_composio.py +11 -0
  165. lfx/components/composio/slack_composio.py +582 -0
  166. lfx/components/composio/slackbot_composio.py +11 -0
  167. lfx/components/composio/supabase_composio.py +11 -0
  168. lfx/components/composio/todoist_composio.py +11 -0
  169. lfx/components/composio/youtube_composio.py +11 -0
  170. lfx/components/confluence/__init__.py +3 -0
  171. lfx/components/confluence/confluence.py +84 -0
  172. lfx/components/couchbase/__init__.py +34 -0
  173. lfx/components/couchbase/couchbase.py +102 -0
  174. lfx/components/crewai/__init__.py +49 -0
  175. lfx/components/crewai/crewai.py +107 -0
  176. lfx/components/crewai/hierarchical_crew.py +46 -0
  177. lfx/components/crewai/hierarchical_task.py +44 -0
  178. lfx/components/crewai/sequential_crew.py +52 -0
  179. lfx/components/crewai/sequential_task.py +73 -0
  180. lfx/components/crewai/sequential_task_agent.py +143 -0
  181. lfx/components/custom_component/__init__.py +34 -0
  182. lfx/components/custom_component/custom_component.py +31 -0
  183. lfx/components/data/__init__.py +64 -0
  184. lfx/components/data/api_request.py +544 -0
  185. lfx/components/data/csv_to_data.py +95 -0
  186. lfx/components/data/directory.py +113 -0
  187. lfx/components/data/file.py +577 -0
  188. lfx/components/data/json_to_data.py +98 -0
  189. lfx/components/data/news_search.py +164 -0
  190. lfx/components/data/rss.py +69 -0
  191. lfx/components/data/sql_executor.py +101 -0
  192. lfx/components/data/url.py +311 -0
  193. lfx/components/data/web_search.py +112 -0
  194. lfx/components/data/webhook.py +56 -0
  195. lfx/components/datastax/__init__.py +70 -0
  196. lfx/components/datastax/astra_assistant_manager.py +306 -0
  197. lfx/components/datastax/astra_db.py +75 -0
  198. lfx/components/datastax/astra_vectorize.py +124 -0
  199. lfx/components/datastax/astradb.py +1285 -0
  200. lfx/components/datastax/astradb_cql.py +314 -0
  201. lfx/components/datastax/astradb_graph.py +330 -0
  202. lfx/components/datastax/astradb_tool.py +414 -0
  203. lfx/components/datastax/astradb_vectorstore.py +1285 -0
  204. lfx/components/datastax/cassandra.py +92 -0
  205. lfx/components/datastax/create_assistant.py +58 -0
  206. lfx/components/datastax/create_thread.py +32 -0
  207. lfx/components/datastax/dotenv.py +35 -0
  208. lfx/components/datastax/get_assistant.py +37 -0
  209. lfx/components/datastax/getenvvar.py +30 -0
  210. lfx/components/datastax/graph_rag.py +141 -0
  211. lfx/components/datastax/hcd.py +314 -0
  212. lfx/components/datastax/list_assistants.py +25 -0
  213. lfx/components/datastax/run.py +89 -0
  214. lfx/components/deactivated/__init__.py +15 -0
  215. lfx/components/deactivated/amazon_kendra.py +66 -0
  216. lfx/components/deactivated/chat_litellm_model.py +158 -0
  217. lfx/components/deactivated/code_block_extractor.py +26 -0
  218. lfx/components/deactivated/documents_to_data.py +22 -0
  219. lfx/components/deactivated/embed.py +16 -0
  220. lfx/components/deactivated/extract_key_from_data.py +46 -0
  221. lfx/components/deactivated/json_document_builder.py +57 -0
  222. lfx/components/deactivated/list_flows.py +20 -0
  223. lfx/components/deactivated/mcp_sse.py +61 -0
  224. lfx/components/deactivated/mcp_stdio.py +62 -0
  225. lfx/components/deactivated/merge_data.py +93 -0
  226. lfx/components/deactivated/message.py +37 -0
  227. lfx/components/deactivated/metal.py +54 -0
  228. lfx/components/deactivated/multi_query.py +59 -0
  229. lfx/components/deactivated/retriever.py +43 -0
  230. lfx/components/deactivated/selective_passthrough.py +77 -0
  231. lfx/components/deactivated/should_run_next.py +40 -0
  232. lfx/components/deactivated/split_text.py +63 -0
  233. lfx/components/deactivated/store_message.py +24 -0
  234. lfx/components/deactivated/sub_flow.py +124 -0
  235. lfx/components/deactivated/vectara_self_query.py +76 -0
  236. lfx/components/deactivated/vector_store.py +24 -0
  237. lfx/components/deepseek/__init__.py +34 -0
  238. lfx/components/deepseek/deepseek.py +136 -0
  239. lfx/components/docling/__init__.py +43 -0
  240. lfx/components/docling/chunk_docling_document.py +186 -0
  241. lfx/components/docling/docling_inline.py +231 -0
  242. lfx/components/docling/docling_remote.py +193 -0
  243. lfx/components/docling/export_docling_document.py +117 -0
  244. lfx/components/documentloaders/__init__.py +3 -0
  245. lfx/components/duckduckgo/__init__.py +3 -0
  246. lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  247. lfx/components/elastic/__init__.py +37 -0
  248. lfx/components/elastic/elasticsearch.py +267 -0
  249. lfx/components/elastic/opensearch.py +243 -0
  250. lfx/components/embeddings/__init__.py +37 -0
  251. lfx/components/embeddings/similarity.py +76 -0
  252. lfx/components/embeddings/text_embedder.py +64 -0
  253. lfx/components/exa/__init__.py +3 -0
  254. lfx/components/exa/exa_search.py +68 -0
  255. lfx/components/firecrawl/__init__.py +43 -0
  256. lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
  257. lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
  258. lfx/components/firecrawl/firecrawl_map_api.py +89 -0
  259. lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
  260. lfx/components/git/__init__.py +4 -0
  261. lfx/components/git/git.py +262 -0
  262. lfx/components/git/gitextractor.py +196 -0
  263. lfx/components/glean/__init__.py +3 -0
  264. lfx/components/glean/glean_search_api.py +173 -0
  265. lfx/components/google/__init__.py +17 -0
  266. lfx/components/google/gmail.py +192 -0
  267. lfx/components/google/google_bq_sql_executor.py +157 -0
  268. lfx/components/google/google_drive.py +92 -0
  269. lfx/components/google/google_drive_search.py +152 -0
  270. lfx/components/google/google_generative_ai.py +147 -0
  271. lfx/components/google/google_generative_ai_embeddings.py +141 -0
  272. lfx/components/google/google_oauth_token.py +89 -0
  273. lfx/components/google/google_search_api_core.py +68 -0
  274. lfx/components/google/google_serper_api_core.py +74 -0
  275. lfx/components/groq/__init__.py +34 -0
  276. lfx/components/groq/groq.py +136 -0
  277. lfx/components/helpers/__init__.py +52 -0
  278. lfx/components/helpers/calculator_core.py +89 -0
  279. lfx/components/helpers/create_list.py +40 -0
  280. lfx/components/helpers/current_date.py +42 -0
  281. lfx/components/helpers/id_generator.py +42 -0
  282. lfx/components/helpers/memory.py +251 -0
  283. lfx/components/helpers/output_parser.py +45 -0
  284. lfx/components/helpers/store_message.py +90 -0
  285. lfx/components/homeassistant/__init__.py +7 -0
  286. lfx/components/homeassistant/home_assistant_control.py +152 -0
  287. lfx/components/homeassistant/list_home_assistant_states.py +137 -0
  288. lfx/components/huggingface/__init__.py +37 -0
  289. lfx/components/huggingface/huggingface.py +197 -0
  290. lfx/components/huggingface/huggingface_inference_api.py +106 -0
  291. lfx/components/ibm/__init__.py +34 -0
  292. lfx/components/ibm/watsonx.py +203 -0
  293. lfx/components/ibm/watsonx_embeddings.py +135 -0
  294. lfx/components/icosacomputing/__init__.py +5 -0
  295. lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
  296. lfx/components/input_output/__init__.py +38 -0
  297. lfx/components/input_output/chat.py +120 -0
  298. lfx/components/input_output/chat_output.py +200 -0
  299. lfx/components/input_output/text.py +27 -0
  300. lfx/components/input_output/text_output.py +29 -0
  301. lfx/components/jigsawstack/__init__.py +23 -0
  302. lfx/components/jigsawstack/ai_scrape.py +126 -0
  303. lfx/components/jigsawstack/ai_web_search.py +136 -0
  304. lfx/components/jigsawstack/file_read.py +115 -0
  305. lfx/components/jigsawstack/file_upload.py +94 -0
  306. lfx/components/jigsawstack/image_generation.py +205 -0
  307. lfx/components/jigsawstack/nsfw.py +60 -0
  308. lfx/components/jigsawstack/object_detection.py +124 -0
  309. lfx/components/jigsawstack/sentiment.py +112 -0
  310. lfx/components/jigsawstack/text_to_sql.py +90 -0
  311. lfx/components/jigsawstack/text_translate.py +77 -0
  312. lfx/components/jigsawstack/vocr.py +107 -0
  313. lfx/components/langchain_utilities/__init__.py +109 -0
  314. lfx/components/langchain_utilities/character.py +53 -0
  315. lfx/components/langchain_utilities/conversation.py +59 -0
  316. lfx/components/langchain_utilities/csv_agent.py +107 -0
  317. lfx/components/langchain_utilities/fake_embeddings.py +26 -0
  318. lfx/components/langchain_utilities/html_link_extractor.py +35 -0
  319. lfx/components/langchain_utilities/json_agent.py +45 -0
  320. lfx/components/langchain_utilities/langchain_hub.py +126 -0
  321. lfx/components/langchain_utilities/language_recursive.py +49 -0
  322. lfx/components/langchain_utilities/language_semantic.py +138 -0
  323. lfx/components/langchain_utilities/llm_checker.py +39 -0
  324. lfx/components/langchain_utilities/llm_math.py +42 -0
  325. lfx/components/langchain_utilities/natural_language.py +61 -0
  326. lfx/components/langchain_utilities/openai_tools.py +53 -0
  327. lfx/components/langchain_utilities/openapi.py +48 -0
  328. lfx/components/langchain_utilities/recursive_character.py +60 -0
  329. lfx/components/langchain_utilities/retrieval_qa.py +83 -0
  330. lfx/components/langchain_utilities/runnable_executor.py +137 -0
  331. lfx/components/langchain_utilities/self_query.py +80 -0
  332. lfx/components/langchain_utilities/spider.py +142 -0
  333. lfx/components/langchain_utilities/sql.py +40 -0
  334. lfx/components/langchain_utilities/sql_database.py +35 -0
  335. lfx/components/langchain_utilities/sql_generator.py +78 -0
  336. lfx/components/langchain_utilities/tool_calling.py +59 -0
  337. lfx/components/langchain_utilities/vector_store_info.py +49 -0
  338. lfx/components/langchain_utilities/vector_store_router.py +33 -0
  339. lfx/components/langchain_utilities/xml_agent.py +71 -0
  340. lfx/components/langwatch/__init__.py +3 -0
  341. lfx/components/langwatch/langwatch.py +278 -0
  342. lfx/components/link_extractors/__init__.py +3 -0
  343. lfx/components/lmstudio/__init__.py +34 -0
  344. lfx/components/lmstudio/lmstudioembeddings.py +89 -0
  345. lfx/components/lmstudio/lmstudiomodel.py +129 -0
  346. lfx/components/logic/__init__.py +52 -0
  347. lfx/components/logic/conditional_router.py +171 -0
  348. lfx/components/logic/data_conditional_router.py +125 -0
  349. lfx/components/logic/flow_tool.py +110 -0
  350. lfx/components/logic/listen.py +29 -0
  351. lfx/components/logic/loop.py +125 -0
  352. lfx/components/logic/notify.py +88 -0
  353. lfx/components/logic/pass_message.py +35 -0
  354. lfx/components/logic/run_flow.py +71 -0
  355. lfx/components/logic/sub_flow.py +114 -0
  356. lfx/components/maritalk/__init__.py +32 -0
  357. lfx/components/maritalk/maritalk.py +52 -0
  358. lfx/components/mem0/__init__.py +3 -0
  359. lfx/components/mem0/mem0_chat_memory.py +136 -0
  360. lfx/components/milvus/__init__.py +34 -0
  361. lfx/components/milvus/milvus.py +115 -0
  362. lfx/components/mistral/__init__.py +37 -0
  363. lfx/components/mistral/mistral.py +114 -0
  364. lfx/components/mistral/mistral_embeddings.py +58 -0
  365. lfx/components/models/__init__.py +34 -0
  366. lfx/components/models/embedding_model.py +114 -0
  367. lfx/components/models/language_model.py +144 -0
  368. lfx/components/mongodb/__init__.py +34 -0
  369. lfx/components/mongodb/mongodb_atlas.py +213 -0
  370. lfx/components/needle/__init__.py +3 -0
  371. lfx/components/needle/needle.py +104 -0
  372. lfx/components/notdiamond/__init__.py +34 -0
  373. lfx/components/notdiamond/notdiamond.py +228 -0
  374. lfx/components/novita/__init__.py +32 -0
  375. lfx/components/novita/novita.py +130 -0
  376. lfx/components/nvidia/__init__.py +57 -0
  377. lfx/components/nvidia/nvidia.py +157 -0
  378. lfx/components/nvidia/nvidia_embedding.py +77 -0
  379. lfx/components/nvidia/nvidia_ingest.py +317 -0
  380. lfx/components/nvidia/nvidia_rerank.py +63 -0
  381. lfx/components/nvidia/system_assist.py +65 -0
  382. lfx/components/olivya/__init__.py +3 -0
  383. lfx/components/olivya/olivya.py +116 -0
  384. lfx/components/ollama/__init__.py +37 -0
  385. lfx/components/ollama/ollama.py +330 -0
  386. lfx/components/ollama/ollama_embeddings.py +106 -0
  387. lfx/components/openai/__init__.py +37 -0
  388. lfx/components/openai/openai.py +100 -0
  389. lfx/components/openai/openai_chat_model.py +176 -0
  390. lfx/components/openrouter/__init__.py +32 -0
  391. lfx/components/openrouter/openrouter.py +202 -0
  392. lfx/components/output_parsers/__init__.py +3 -0
  393. lfx/components/perplexity/__init__.py +34 -0
  394. lfx/components/perplexity/perplexity.py +75 -0
  395. lfx/components/pgvector/__init__.py +34 -0
  396. lfx/components/pgvector/pgvector.py +72 -0
  397. lfx/components/pinecone/__init__.py +34 -0
  398. lfx/components/pinecone/pinecone.py +134 -0
  399. lfx/components/processing/__init__.py +117 -0
  400. lfx/components/processing/alter_metadata.py +108 -0
  401. lfx/components/processing/batch_run.py +205 -0
  402. lfx/components/processing/combine_text.py +39 -0
  403. lfx/components/processing/converter.py +159 -0
  404. lfx/components/processing/create_data.py +110 -0
  405. lfx/components/processing/data_operations.py +438 -0
  406. lfx/components/processing/data_to_dataframe.py +70 -0
  407. lfx/components/processing/dataframe_operations.py +313 -0
  408. lfx/components/processing/extract_key.py +53 -0
  409. lfx/components/processing/filter_data.py +42 -0
  410. lfx/components/processing/filter_data_values.py +88 -0
  411. lfx/components/processing/json_cleaner.py +103 -0
  412. lfx/components/processing/lambda_filter.py +154 -0
  413. lfx/components/processing/llm_router.py +499 -0
  414. lfx/components/processing/merge_data.py +90 -0
  415. lfx/components/processing/message_to_data.py +36 -0
  416. lfx/components/processing/parse_data.py +70 -0
  417. lfx/components/processing/parse_dataframe.py +68 -0
  418. lfx/components/processing/parse_json_data.py +90 -0
  419. lfx/components/processing/parser.py +143 -0
  420. lfx/components/processing/prompt.py +67 -0
  421. lfx/components/processing/python_repl_core.py +98 -0
  422. lfx/components/processing/regex.py +82 -0
  423. lfx/components/processing/save_file.py +225 -0
  424. lfx/components/processing/select_data.py +48 -0
  425. lfx/components/processing/split_text.py +141 -0
  426. lfx/components/processing/structured_output.py +202 -0
  427. lfx/components/processing/update_data.py +160 -0
  428. lfx/components/prototypes/__init__.py +34 -0
  429. lfx/components/prototypes/python_function.py +73 -0
  430. lfx/components/qdrant/__init__.py +34 -0
  431. lfx/components/qdrant/qdrant.py +109 -0
  432. lfx/components/redis/__init__.py +37 -0
  433. lfx/components/redis/redis.py +89 -0
  434. lfx/components/redis/redis_chat.py +43 -0
  435. lfx/components/sambanova/__init__.py +32 -0
  436. lfx/components/sambanova/sambanova.py +84 -0
  437. lfx/components/scrapegraph/__init__.py +40 -0
  438. lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  439. lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
  440. lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  441. lfx/components/searchapi/__init__.py +34 -0
  442. lfx/components/searchapi/search.py +79 -0
  443. lfx/components/serpapi/__init__.py +3 -0
  444. lfx/components/serpapi/serp.py +115 -0
  445. lfx/components/supabase/__init__.py +34 -0
  446. lfx/components/supabase/supabase.py +76 -0
  447. lfx/components/tavily/__init__.py +4 -0
  448. lfx/components/tavily/tavily_extract.py +117 -0
  449. lfx/components/tavily/tavily_search.py +212 -0
  450. lfx/components/textsplitters/__init__.py +3 -0
  451. lfx/components/toolkits/__init__.py +3 -0
  452. lfx/components/tools/__init__.py +72 -0
  453. lfx/components/tools/calculator.py +108 -0
  454. lfx/components/tools/google_search_api.py +45 -0
  455. lfx/components/tools/google_serper_api.py +115 -0
  456. lfx/components/tools/python_code_structured_tool.py +327 -0
  457. lfx/components/tools/python_repl.py +97 -0
  458. lfx/components/tools/search_api.py +87 -0
  459. lfx/components/tools/searxng.py +145 -0
  460. lfx/components/tools/serp_api.py +119 -0
  461. lfx/components/tools/tavily_search_tool.py +344 -0
  462. lfx/components/tools/wikidata_api.py +102 -0
  463. lfx/components/tools/wikipedia_api.py +49 -0
  464. lfx/components/tools/yahoo_finance.py +129 -0
  465. lfx/components/twelvelabs/__init__.py +52 -0
  466. lfx/components/twelvelabs/convert_astra_results.py +84 -0
  467. lfx/components/twelvelabs/pegasus_index.py +311 -0
  468. lfx/components/twelvelabs/split_video.py +291 -0
  469. lfx/components/twelvelabs/text_embeddings.py +57 -0
  470. lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  471. lfx/components/twelvelabs/video_embeddings.py +100 -0
  472. lfx/components/twelvelabs/video_file.py +179 -0
  473. lfx/components/unstructured/__init__.py +3 -0
  474. lfx/components/unstructured/unstructured.py +121 -0
  475. lfx/components/upstash/__init__.py +34 -0
  476. lfx/components/upstash/upstash.py +124 -0
  477. lfx/components/vectara/__init__.py +37 -0
  478. lfx/components/vectara/vectara.py +97 -0
  479. lfx/components/vectara/vectara_rag.py +164 -0
  480. lfx/components/vectorstores/__init__.py +40 -0
  481. lfx/components/vectorstores/astradb.py +1285 -0
  482. lfx/components/vectorstores/astradb_graph.py +319 -0
  483. lfx/components/vectorstores/cassandra.py +264 -0
  484. lfx/components/vectorstores/cassandra_graph.py +238 -0
  485. lfx/components/vectorstores/chroma.py +167 -0
  486. lfx/components/vectorstores/clickhouse.py +135 -0
  487. lfx/components/vectorstores/couchbase.py +102 -0
  488. lfx/components/vectorstores/elasticsearch.py +267 -0
  489. lfx/components/vectorstores/faiss.py +111 -0
  490. lfx/components/vectorstores/graph_rag.py +141 -0
  491. lfx/components/vectorstores/hcd.py +314 -0
  492. lfx/components/vectorstores/local_db.py +261 -0
  493. lfx/components/vectorstores/milvus.py +115 -0
  494. lfx/components/vectorstores/mongodb_atlas.py +213 -0
  495. lfx/components/vectorstores/opensearch.py +243 -0
  496. lfx/components/vectorstores/pgvector.py +72 -0
  497. lfx/components/vectorstores/pinecone.py +134 -0
  498. lfx/components/vectorstores/qdrant.py +109 -0
  499. lfx/components/vectorstores/supabase.py +76 -0
  500. lfx/components/vectorstores/upstash.py +124 -0
  501. lfx/components/vectorstores/vectara.py +97 -0
  502. lfx/components/vectorstores/vectara_rag.py +164 -0
  503. lfx/components/vectorstores/weaviate.py +89 -0
  504. lfx/components/vertexai/__init__.py +37 -0
  505. lfx/components/vertexai/vertexai.py +71 -0
  506. lfx/components/vertexai/vertexai_embeddings.py +67 -0
  507. lfx/components/weaviate/__init__.py +34 -0
  508. lfx/components/weaviate/weaviate.py +89 -0
  509. lfx/components/wikipedia/__init__.py +4 -0
  510. lfx/components/wikipedia/wikidata.py +86 -0
  511. lfx/components/wikipedia/wikipedia.py +53 -0
  512. lfx/components/wolframalpha/__init__.py +3 -0
  513. lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
  514. lfx/components/xai/__init__.py +32 -0
  515. lfx/components/xai/xai.py +167 -0
  516. lfx/components/yahoosearch/__init__.py +3 -0
  517. lfx/components/yahoosearch/yahoo.py +137 -0
  518. lfx/components/youtube/__init__.py +52 -0
  519. lfx/components/youtube/channel.py +227 -0
  520. lfx/components/youtube/comments.py +231 -0
  521. lfx/components/youtube/playlist.py +33 -0
  522. lfx/components/youtube/search.py +120 -0
  523. lfx/components/youtube/trending.py +285 -0
  524. lfx/components/youtube/video_details.py +263 -0
  525. lfx/components/youtube/youtube_transcripts.py +118 -0
  526. lfx/components/zep/__init__.py +3 -0
  527. lfx/components/zep/zep.py +44 -0
  528. lfx/constants.py +6 -0
  529. lfx/custom/__init__.py +7 -0
  530. lfx/custom/attributes.py +86 -0
  531. lfx/custom/code_parser/__init__.py +3 -0
  532. lfx/custom/code_parser/code_parser.py +361 -0
  533. lfx/custom/custom_component/__init__.py +0 -0
  534. lfx/custom/custom_component/base_component.py +128 -0
  535. lfx/custom/custom_component/component.py +1808 -0
  536. lfx/custom/custom_component/component_with_cache.py +8 -0
  537. lfx/custom/custom_component/custom_component.py +588 -0
  538. lfx/custom/dependency_analyzer.py +165 -0
  539. lfx/custom/directory_reader/__init__.py +3 -0
  540. lfx/custom/directory_reader/directory_reader.py +359 -0
  541. lfx/custom/directory_reader/utils.py +171 -0
  542. lfx/custom/eval.py +12 -0
  543. lfx/custom/schema.py +32 -0
  544. lfx/custom/tree_visitor.py +21 -0
  545. lfx/custom/utils.py +877 -0
  546. lfx/custom/validate.py +488 -0
  547. lfx/events/__init__.py +1 -0
  548. lfx/events/event_manager.py +110 -0
  549. lfx/exceptions/__init__.py +0 -0
  550. lfx/exceptions/component.py +15 -0
  551. lfx/field_typing/__init__.py +91 -0
  552. lfx/field_typing/constants.py +215 -0
  553. lfx/field_typing/range_spec.py +35 -0
  554. lfx/graph/__init__.py +6 -0
  555. lfx/graph/edge/__init__.py +0 -0
  556. lfx/graph/edge/base.py +277 -0
  557. lfx/graph/edge/schema.py +119 -0
  558. lfx/graph/edge/utils.py +0 -0
  559. lfx/graph/graph/__init__.py +0 -0
  560. lfx/graph/graph/ascii.py +202 -0
  561. lfx/graph/graph/base.py +2238 -0
  562. lfx/graph/graph/constants.py +63 -0
  563. lfx/graph/graph/runnable_vertices_manager.py +133 -0
  564. lfx/graph/graph/schema.py +52 -0
  565. lfx/graph/graph/state_model.py +66 -0
  566. lfx/graph/graph/utils.py +1024 -0
  567. lfx/graph/schema.py +75 -0
  568. lfx/graph/state/__init__.py +0 -0
  569. lfx/graph/state/model.py +237 -0
  570. lfx/graph/utils.py +200 -0
  571. lfx/graph/vertex/__init__.py +0 -0
  572. lfx/graph/vertex/base.py +823 -0
  573. lfx/graph/vertex/constants.py +0 -0
  574. lfx/graph/vertex/exceptions.py +4 -0
  575. lfx/graph/vertex/param_handler.py +264 -0
  576. lfx/graph/vertex/schema.py +26 -0
  577. lfx/graph/vertex/utils.py +19 -0
  578. lfx/graph/vertex/vertex_types.py +489 -0
  579. lfx/helpers/__init__.py +1 -0
  580. lfx/helpers/base_model.py +71 -0
  581. lfx/helpers/custom.py +13 -0
  582. lfx/helpers/data.py +167 -0
  583. lfx/helpers/flow.py +194 -0
  584. lfx/inputs/__init__.py +68 -0
  585. lfx/inputs/constants.py +2 -0
  586. lfx/inputs/input_mixin.py +328 -0
  587. lfx/inputs/inputs.py +714 -0
  588. lfx/inputs/validators.py +19 -0
  589. lfx/interface/__init__.py +6 -0
  590. lfx/interface/components.py +489 -0
  591. lfx/interface/importing/__init__.py +5 -0
  592. lfx/interface/importing/utils.py +39 -0
  593. lfx/interface/initialize/__init__.py +3 -0
  594. lfx/interface/initialize/loading.py +224 -0
  595. lfx/interface/listing.py +26 -0
  596. lfx/interface/run.py +16 -0
  597. lfx/interface/utils.py +111 -0
  598. lfx/io/__init__.py +63 -0
  599. lfx/io/schema.py +289 -0
  600. lfx/load/__init__.py +8 -0
  601. lfx/load/load.py +256 -0
  602. lfx/load/utils.py +99 -0
  603. lfx/log/__init__.py +5 -0
  604. lfx/log/logger.py +385 -0
  605. lfx/memory/__init__.py +90 -0
  606. lfx/memory/stubs.py +283 -0
  607. lfx/processing/__init__.py +1 -0
  608. lfx/processing/process.py +238 -0
  609. lfx/processing/utils.py +25 -0
  610. lfx/py.typed +0 -0
  611. lfx/schema/__init__.py +66 -0
  612. lfx/schema/artifact.py +83 -0
  613. lfx/schema/content_block.py +62 -0
  614. lfx/schema/content_types.py +91 -0
  615. lfx/schema/data.py +308 -0
  616. lfx/schema/dataframe.py +210 -0
  617. lfx/schema/dotdict.py +74 -0
  618. lfx/schema/encoders.py +13 -0
  619. lfx/schema/graph.py +47 -0
  620. lfx/schema/image.py +131 -0
  621. lfx/schema/json_schema.py +141 -0
  622. lfx/schema/log.py +61 -0
  623. lfx/schema/message.py +473 -0
  624. lfx/schema/openai_responses_schemas.py +74 -0
  625. lfx/schema/properties.py +41 -0
  626. lfx/schema/schema.py +171 -0
  627. lfx/schema/serialize.py +13 -0
  628. lfx/schema/table.py +140 -0
  629. lfx/schema/validators.py +114 -0
  630. lfx/serialization/__init__.py +5 -0
  631. lfx/serialization/constants.py +2 -0
  632. lfx/serialization/serialization.py +314 -0
  633. lfx/services/__init__.py +23 -0
  634. lfx/services/base.py +28 -0
  635. lfx/services/cache/__init__.py +6 -0
  636. lfx/services/cache/base.py +183 -0
  637. lfx/services/cache/service.py +166 -0
  638. lfx/services/cache/utils.py +169 -0
  639. lfx/services/chat/__init__.py +1 -0
  640. lfx/services/chat/config.py +2 -0
  641. lfx/services/chat/schema.py +10 -0
  642. lfx/services/deps.py +129 -0
  643. lfx/services/factory.py +19 -0
  644. lfx/services/initialize.py +19 -0
  645. lfx/services/interfaces.py +103 -0
  646. lfx/services/manager.py +172 -0
  647. lfx/services/schema.py +20 -0
  648. lfx/services/session.py +82 -0
  649. lfx/services/settings/__init__.py +3 -0
  650. lfx/services/settings/auth.py +130 -0
  651. lfx/services/settings/base.py +539 -0
  652. lfx/services/settings/constants.py +31 -0
  653. lfx/services/settings/factory.py +23 -0
  654. lfx/services/settings/feature_flags.py +12 -0
  655. lfx/services/settings/service.py +35 -0
  656. lfx/services/settings/utils.py +40 -0
  657. lfx/services/shared_component_cache/__init__.py +1 -0
  658. lfx/services/shared_component_cache/factory.py +30 -0
  659. lfx/services/shared_component_cache/service.py +9 -0
  660. lfx/services/storage/__init__.py +5 -0
  661. lfx/services/storage/local.py +155 -0
  662. lfx/services/storage/service.py +54 -0
  663. lfx/services/tracing/__init__.py +1 -0
  664. lfx/services/tracing/service.py +21 -0
  665. lfx/settings.py +6 -0
  666. lfx/template/__init__.py +6 -0
  667. lfx/template/field/__init__.py +0 -0
  668. lfx/template/field/base.py +257 -0
  669. lfx/template/field/prompt.py +15 -0
  670. lfx/template/frontend_node/__init__.py +6 -0
  671. lfx/template/frontend_node/base.py +212 -0
  672. lfx/template/frontend_node/constants.py +65 -0
  673. lfx/template/frontend_node/custom_components.py +79 -0
  674. lfx/template/template/__init__.py +0 -0
  675. lfx/template/template/base.py +100 -0
  676. lfx/template/utils.py +217 -0
  677. lfx/type_extraction/__init__.py +19 -0
  678. lfx/type_extraction/type_extraction.py +75 -0
  679. lfx/type_extraction.py +80 -0
  680. lfx/utils/__init__.py +1 -0
  681. lfx/utils/async_helpers.py +42 -0
  682. lfx/utils/component_utils.py +154 -0
  683. lfx/utils/concurrency.py +60 -0
  684. lfx/utils/connection_string_parser.py +11 -0
  685. lfx/utils/constants.py +205 -0
  686. lfx/utils/data_structure.py +212 -0
  687. lfx/utils/exceptions.py +22 -0
  688. lfx/utils/helpers.py +28 -0
  689. lfx/utils/image.py +73 -0
  690. lfx/utils/lazy_load.py +15 -0
  691. lfx/utils/request_utils.py +18 -0
  692. lfx/utils/schemas.py +139 -0
  693. lfx/utils/util.py +481 -0
  694. lfx/utils/util_strings.py +56 -0
  695. lfx/utils/version.py +24 -0
  696. lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
  697. lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
  698. lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
  699. lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,171 @@
1
+ import re
2
+
3
+ from lfx.custom.custom_component.component import Component
4
+ from lfx.io import BoolInput, DropdownInput, IntInput, MessageInput, MessageTextInput, Output
5
+ from lfx.schema.message import Message
6
+
7
+
8
+ class ConditionalRouterComponent(Component):
9
+ display_name = "If-Else"
10
+ description = "Routes an input message to a corresponding output based on text comparison."
11
+ documentation: str = "https://docs.langflow.org/components-logic#conditional-router-if-else-component"
12
+ icon = "split"
13
+ name = "ConditionalRouter"
14
+
15
+ def __init__(self, *args, **kwargs):
16
+ super().__init__(*args, **kwargs)
17
+ self.__iteration_updated = False
18
+
19
+ inputs = [
20
+ MessageTextInput(
21
+ name="input_text",
22
+ display_name="Text Input",
23
+ info="The primary text input for the operation.",
24
+ required=True,
25
+ ),
26
+ DropdownInput(
27
+ name="operator",
28
+ display_name="Operator",
29
+ options=[
30
+ "equals",
31
+ "not equals",
32
+ "contains",
33
+ "starts with",
34
+ "ends with",
35
+ "regex",
36
+ "less than",
37
+ "less than or equal",
38
+ "greater than",
39
+ "greater than or equal",
40
+ ],
41
+ info="The operator to apply for comparing the texts.",
42
+ value="equals",
43
+ real_time_refresh=True,
44
+ ),
45
+ MessageTextInput(
46
+ name="match_text",
47
+ display_name="Match Text",
48
+ info="The text input to compare against.",
49
+ required=True,
50
+ ),
51
+ BoolInput(
52
+ name="case_sensitive",
53
+ display_name="Case Sensitive",
54
+ info="If true, the comparison will be case sensitive.",
55
+ value=True,
56
+ advanced=True,
57
+ ),
58
+ MessageInput(
59
+ name="true_case_message",
60
+ display_name="Case True",
61
+ info="The message to pass if the condition is True.",
62
+ advanced=True,
63
+ ),
64
+ MessageInput(
65
+ name="false_case_message",
66
+ display_name="Case False",
67
+ info="The message to pass if the condition is False.",
68
+ advanced=True,
69
+ ),
70
+ IntInput(
71
+ name="max_iterations",
72
+ display_name="Max Iterations",
73
+ info="The maximum number of iterations for the conditional router.",
74
+ value=10,
75
+ advanced=True,
76
+ ),
77
+ DropdownInput(
78
+ name="default_route",
79
+ display_name="Default Route",
80
+ options=["true_result", "false_result"],
81
+ info="The default route to take when max iterations are reached.",
82
+ value="false_result",
83
+ advanced=True,
84
+ ),
85
+ ]
86
+
87
+ outputs = [
88
+ Output(display_name="True", name="true_result", method="true_response", group_outputs=True),
89
+ Output(display_name="False", name="false_result", method="false_response", group_outputs=True),
90
+ ]
91
+
92
+ def _pre_run_setup(self):
93
+ self.__iteration_updated = False
94
+
95
+ def evaluate_condition(self, input_text: str, match_text: str, operator: str, *, case_sensitive: bool) -> bool:
96
+ if not case_sensitive and operator != "regex":
97
+ input_text = input_text.lower()
98
+ match_text = match_text.lower()
99
+
100
+ if operator == "equals":
101
+ return input_text == match_text
102
+ if operator == "not equals":
103
+ return input_text != match_text
104
+ if operator == "contains":
105
+ return match_text in input_text
106
+ if operator == "starts with":
107
+ return input_text.startswith(match_text)
108
+ if operator == "ends with":
109
+ return input_text.endswith(match_text)
110
+ if operator == "regex":
111
+ try:
112
+ return bool(re.match(match_text, input_text))
113
+ except re.error:
114
+ return False # Return False if the regex is invalid
115
+ if operator in ["less than", "less than or equal", "greater than", "greater than or equal"]:
116
+ try:
117
+ input_num = float(input_text)
118
+ match_num = float(match_text)
119
+ if operator == "less than":
120
+ return input_num < match_num
121
+ if operator == "less than or equal":
122
+ return input_num <= match_num
123
+ if operator == "greater than":
124
+ return input_num > match_num
125
+ if operator == "greater than or equal":
126
+ return input_num >= match_num
127
+ except ValueError:
128
+ return False # Invalid number format for comparison
129
+ return False
130
+
131
+ def iterate_and_stop_once(self, route_to_stop: str):
132
+ if not self.__iteration_updated:
133
+ self.update_ctx({f"{self._id}_iteration": self.ctx.get(f"{self._id}_iteration", 0) + 1})
134
+ self.__iteration_updated = True
135
+ if self.ctx.get(f"{self._id}_iteration", 0) >= self.max_iterations and route_to_stop == self.default_route:
136
+ route_to_stop = "true_result" if route_to_stop == "false_result" else "false_result"
137
+ self.stop(route_to_stop)
138
+
139
+ def true_response(self) -> Message:
140
+ result = self.evaluate_condition(
141
+ self.input_text, self.match_text, self.operator, case_sensitive=self.case_sensitive
142
+ )
143
+ if result:
144
+ self.status = self.true_case_message
145
+ self.iterate_and_stop_once("false_result")
146
+ return self.true_case_message
147
+ self.iterate_and_stop_once("true_result")
148
+ return Message(content="")
149
+
150
+ def false_response(self) -> Message:
151
+ result = self.evaluate_condition(
152
+ self.input_text, self.match_text, self.operator, case_sensitive=self.case_sensitive
153
+ )
154
+ if not result:
155
+ self.status = self.false_case_message
156
+ self.iterate_and_stop_once("true_result")
157
+ return self.false_case_message
158
+ self.iterate_and_stop_once("false_result")
159
+ return Message(content="")
160
+
161
+ def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None) -> dict:
162
+ if field_name == "operator":
163
+ if field_value == "regex":
164
+ build_config.pop("case_sensitive", None)
165
+ elif "case_sensitive" not in build_config:
166
+ case_sensitive_input = next(
167
+ (input_field for input_field in self.inputs if input_field.name == "case_sensitive"), None
168
+ )
169
+ if case_sensitive_input:
170
+ build_config["case_sensitive"] = case_sensitive_input.to_dict()
171
+ return build_config
@@ -0,0 +1,125 @@
1
+ from typing import Any
2
+
3
+ from lfx.custom.custom_component.component import Component
4
+ from lfx.io import DataInput, DropdownInput, MessageTextInput, Output
5
+ from lfx.schema.data import Data
6
+ from lfx.schema.dotdict import dotdict
7
+
8
+
9
+ class DataConditionalRouterComponent(Component):
10
+ display_name = "Condition"
11
+ description = "Route Data object(s) based on a condition applied to a specified key, including boolean validation."
12
+ icon = "split"
13
+ name = "DataConditionalRouter"
14
+ legacy = True
15
+
16
+ inputs = [
17
+ DataInput(
18
+ name="data_input",
19
+ display_name="Data Input",
20
+ info="The Data object or list of Data objects to process",
21
+ is_list=True,
22
+ ),
23
+ MessageTextInput(
24
+ name="key_name",
25
+ display_name="Key Name",
26
+ info="The name of the key in the Data object(s) to check",
27
+ ),
28
+ DropdownInput(
29
+ name="operator",
30
+ display_name="Operator",
31
+ options=["equals", "not equals", "contains", "starts with", "ends with", "boolean validator"],
32
+ info="The operator to apply for comparing the values. 'boolean validator' treats the value as a boolean.",
33
+ value="equals",
34
+ ),
35
+ MessageTextInput(
36
+ name="compare_value",
37
+ display_name="Match Text",
38
+ info="The value to compare against (not used for boolean validator)",
39
+ ),
40
+ ]
41
+
42
+ outputs = [
43
+ Output(display_name="True Output", name="true_output", method="process_data"),
44
+ Output(display_name="False Output", name="false_output", method="process_data"),
45
+ ]
46
+
47
+ def compare_values(self, item_value: str, compare_value: str, operator: str) -> bool:
48
+ if operator == "equals":
49
+ return item_value == compare_value
50
+ if operator == "not equals":
51
+ return item_value != compare_value
52
+ if operator == "contains":
53
+ return compare_value in item_value
54
+ if operator == "starts with":
55
+ return item_value.startswith(compare_value)
56
+ if operator == "ends with":
57
+ return item_value.endswith(compare_value)
58
+ if operator == "boolean validator":
59
+ return self.parse_boolean(item_value)
60
+ return False
61
+
62
+ def parse_boolean(self, value):
63
+ if isinstance(value, bool):
64
+ return value
65
+ if isinstance(value, str):
66
+ return value.lower() in {"true", "1", "yes", "y", "on"}
67
+ return bool(value)
68
+
69
+ def validate_input(self, data_item: Data) -> bool:
70
+ if not isinstance(data_item, Data):
71
+ self.status = "Input is not a Data object"
72
+ return False
73
+ if self.key_name not in data_item.data:
74
+ self.status = f"Key '{self.key_name}' not found in Data"
75
+ return False
76
+ return True
77
+
78
+ def process_data(self) -> Data | list[Data]:
79
+ if isinstance(self.data_input, list):
80
+ true_output = []
81
+ false_output = []
82
+ for item in self.data_input:
83
+ if self.validate_input(item):
84
+ result = self.process_single_data(item)
85
+ if result:
86
+ true_output.append(item)
87
+ else:
88
+ false_output.append(item)
89
+ self.stop("false_output" if true_output else "true_output")
90
+ return true_output or false_output
91
+ if not self.validate_input(self.data_input):
92
+ return Data(data={"error": self.status})
93
+ result = self.process_single_data(self.data_input)
94
+ self.stop("false_output" if result else "true_output")
95
+ return self.data_input
96
+
97
+ def process_single_data(self, data_item: Data) -> bool:
98
+ item_value = data_item.data[self.key_name]
99
+ operator = self.operator
100
+
101
+ if operator == "boolean validator":
102
+ condition_met = self.parse_boolean(item_value)
103
+ condition_description = f"Boolean validation of '{self.key_name}'"
104
+ else:
105
+ compare_value = self.compare_value
106
+ condition_met = self.compare_values(str(item_value), compare_value, operator)
107
+ condition_description = f"{self.key_name} {operator} {compare_value}"
108
+
109
+ if condition_met:
110
+ self.status = f"Condition met: {condition_description}"
111
+ return True
112
+ self.status = f"Condition not met: {condition_description}"
113
+ return False
114
+
115
+ def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
116
+ if field_name == "operator":
117
+ if field_value == "boolean validator":
118
+ build_config["compare_value"]["show"] = False
119
+ build_config["compare_value"]["advanced"] = True
120
+ build_config["compare_value"]["value"] = None
121
+ else:
122
+ build_config["compare_value"]["show"] = True
123
+ build_config["compare_value"]["advanced"] = False
124
+
125
+ return build_config
@@ -0,0 +1,110 @@
1
+ from typing import Any
2
+
3
+ from typing_extensions import override
4
+
5
+ from lfx.base.langchain_utilities.model import LCToolComponent
6
+ from lfx.base.tools.flow_tool import FlowTool
7
+ from lfx.field_typing import Tool
8
+ from lfx.graph.graph.base import Graph
9
+ from lfx.helpers.flow import get_flow_inputs
10
+ from lfx.io import BoolInput, DropdownInput, Output, StrInput
11
+ from lfx.log.logger import logger
12
+ from lfx.schema.data import Data
13
+ from lfx.schema.dotdict import dotdict
14
+
15
+
16
+ class FlowToolComponent(LCToolComponent):
17
+ display_name = "Flow as Tool [Deprecated]"
18
+ description = "Construct a Tool from a function that runs the loaded Flow."
19
+ field_order = ["flow_name", "name", "description", "return_direct"]
20
+ trace_type = "tool"
21
+ name = "FlowTool"
22
+ legacy: bool = True
23
+ icon = "hammer"
24
+
25
+ async def get_flow_names(self) -> list[str]:
26
+ flow_datas = await self.alist_flows()
27
+ return [flow_data.data["name"] for flow_data in flow_datas]
28
+
29
+ async def get_flow(self, flow_name: str) -> Data | None:
30
+ """Retrieves a flow by its name.
31
+
32
+ Args:
33
+ flow_name (str): The name of the flow to retrieve.
34
+
35
+ Returns:
36
+ Optional[Text]: The flow record if found, None otherwise.
37
+ """
38
+ flow_datas = await self.alist_flows()
39
+ for flow_data in flow_datas:
40
+ if flow_data.data["name"] == flow_name:
41
+ return flow_data
42
+ return None
43
+
44
+ @override
45
+ async def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
46
+ if field_name == "flow_name":
47
+ build_config["flow_name"]["options"] = self.get_flow_names()
48
+
49
+ return build_config
50
+
51
+ inputs = [
52
+ DropdownInput(
53
+ name="flow_name", display_name="Flow Name", info="The name of the flow to run.", refresh_button=True
54
+ ),
55
+ StrInput(
56
+ name="tool_name",
57
+ display_name="Name",
58
+ info="The name of the tool.",
59
+ ),
60
+ StrInput(
61
+ name="tool_description",
62
+ display_name="Description",
63
+ info="The description of the tool; defaults to the Flow's description.",
64
+ ),
65
+ BoolInput(
66
+ name="return_direct",
67
+ display_name="Return Direct",
68
+ info="Return the result directly from the Tool.",
69
+ advanced=True,
70
+ ),
71
+ ]
72
+
73
+ outputs = [
74
+ Output(name="api_build_tool", display_name="Tool", method="build_tool"),
75
+ ]
76
+
77
+ async def build_tool(self) -> Tool:
78
+ FlowTool.model_rebuild()
79
+ if "flow_name" not in self._attributes or not self._attributes["flow_name"]:
80
+ msg = "Flow name is required"
81
+ raise ValueError(msg)
82
+ flow_name = self._attributes["flow_name"]
83
+ flow_data = await self.get_flow(flow_name)
84
+ if not flow_data:
85
+ msg = "Flow not found."
86
+ raise ValueError(msg)
87
+ graph = Graph.from_payload(
88
+ flow_data.data["data"],
89
+ user_id=str(self.user_id),
90
+ )
91
+ try:
92
+ graph.set_run_id(self.graph.run_id)
93
+ except Exception: # noqa: BLE001
94
+ logger.warning("Failed to set run_id", exc_info=True)
95
+ inputs = get_flow_inputs(graph)
96
+ tool_description = self.tool_description.strip() or flow_data.description
97
+ tool = FlowTool(
98
+ name=self.tool_name,
99
+ description=tool_description,
100
+ graph=graph,
101
+ return_direct=self.return_direct,
102
+ inputs=inputs,
103
+ flow_id=str(flow_data.id),
104
+ user_id=str(self.user_id),
105
+ session_id=self.graph.session_id if hasattr(self, "graph") else None,
106
+ )
107
+ description_repr = repr(tool.description).strip("'")
108
+ args_str = "\n".join([f"- {arg_name}: {arg_data['description']}" for arg_name, arg_data in tool.args.items()])
109
+ self.status = f"{description_repr}\nArguments:\n{args_str}"
110
+ return tool
@@ -0,0 +1,29 @@
1
+ from lfx.custom import Component
2
+ from lfx.io import Output, StrInput
3
+ from lfx.schema.data import Data
4
+
5
+
6
+ class ListenComponent(Component):
7
+ display_name = "Listen"
8
+ description = "A component to listen for a notification."
9
+ name = "Listen"
10
+ beta: bool = True
11
+ icon = "Radio"
12
+ inputs = [
13
+ StrInput(
14
+ name="context_key",
15
+ display_name="Context Key",
16
+ info="The key of the context to listen for.",
17
+ input_types=["Message"],
18
+ required=True,
19
+ )
20
+ ]
21
+
22
+ outputs = [Output(name="data", display_name="Data", method="listen_for_data", cache=False)]
23
+
24
+ def listen_for_data(self) -> Data:
25
+ """Retrieves a Data object from the component context using the provided context key.
26
+
27
+ If the specified context key does not exist in the context, returns an empty Data object.
28
+ """
29
+ return self.ctx.get(self.context_key, Data(text=""))
@@ -0,0 +1,125 @@
1
+ from lfx.custom.custom_component.component import Component
2
+ from lfx.inputs.inputs import HandleInput
3
+ from lfx.schema.data import Data
4
+ from lfx.schema.dataframe import DataFrame
5
+ from lfx.template.field.base import Output
6
+
7
+
8
+ class LoopComponent(Component):
9
+ display_name = "Loop"
10
+ description = (
11
+ "Iterates over a list of Data objects, outputting one item at a time and aggregating results from loop inputs."
12
+ )
13
+ documentation: str = "https://docs.langflow.org/components-logic#loop"
14
+ icon = "infinity"
15
+
16
+ inputs = [
17
+ HandleInput(
18
+ name="data",
19
+ display_name="Inputs",
20
+ info="The initial list of Data objects or DataFrame to iterate over.",
21
+ input_types=["DataFrame"],
22
+ ),
23
+ ]
24
+
25
+ outputs = [
26
+ Output(display_name="Item", name="item", method="item_output", allows_loop=True, group_outputs=True),
27
+ Output(display_name="Done", name="done", method="done_output", group_outputs=True),
28
+ ]
29
+
30
+ def initialize_data(self) -> None:
31
+ """Initialize the data list, context index, and aggregated list."""
32
+ if self.ctx.get(f"{self._id}_initialized", False):
33
+ return
34
+
35
+ # Ensure data is a list of Data objects
36
+ data_list = self._validate_data(self.data)
37
+
38
+ # Store the initial data and context variables
39
+ self.update_ctx(
40
+ {
41
+ f"{self._id}_data": data_list,
42
+ f"{self._id}_index": 0,
43
+ f"{self._id}_aggregated": [],
44
+ f"{self._id}_initialized": True,
45
+ }
46
+ )
47
+
48
+ def _validate_data(self, data):
49
+ """Validate and return a list of Data objects."""
50
+ if isinstance(data, DataFrame):
51
+ return data.to_data_list()
52
+ if isinstance(data, Data):
53
+ return [data]
54
+ if isinstance(data, list) and all(isinstance(item, Data) for item in data):
55
+ return data
56
+ msg = "The 'data' input must be a DataFrame, a list of Data objects, or a single Data object."
57
+ raise TypeError(msg)
58
+
59
+ def evaluate_stop_loop(self) -> bool:
60
+ """Evaluate whether to stop item or done output."""
61
+ current_index = self.ctx.get(f"{self._id}_index", 0)
62
+ data_length = len(self.ctx.get(f"{self._id}_data", []))
63
+ return current_index > data_length
64
+
65
+ def item_output(self) -> Data:
66
+ """Output the next item in the list or stop if done."""
67
+ self.initialize_data()
68
+ current_item = Data(text="")
69
+
70
+ if self.evaluate_stop_loop():
71
+ self.stop("item")
72
+ else:
73
+ # Get data list and current index
74
+ data_list, current_index = self.loop_variables()
75
+ if current_index < len(data_list):
76
+ # Output current item and increment index
77
+ try:
78
+ current_item = data_list[current_index]
79
+ except IndexError:
80
+ current_item = Data(text="")
81
+ self.aggregated_output()
82
+ self.update_ctx({f"{self._id}_index": current_index + 1})
83
+
84
+ # Now we need to update the dependencies for the next run
85
+ self.update_dependency()
86
+ return current_item
87
+
88
+ def update_dependency(self):
89
+ item_dependency_id = self.get_incoming_edge_by_target_param("item")
90
+ if item_dependency_id not in self.graph.run_manager.run_predecessors[self._id]:
91
+ self.graph.run_manager.run_predecessors[self._id].append(item_dependency_id)
92
+
93
+ def done_output(self) -> DataFrame:
94
+ """Trigger the done output when iteration is complete."""
95
+ self.initialize_data()
96
+
97
+ if self.evaluate_stop_loop():
98
+ self.stop("item")
99
+ self.start("done")
100
+
101
+ aggregated = self.ctx.get(f"{self._id}_aggregated", [])
102
+
103
+ return DataFrame(aggregated)
104
+ self.stop("done")
105
+ return DataFrame([])
106
+
107
+ def loop_variables(self):
108
+ """Retrieve loop variables from context."""
109
+ return (
110
+ self.ctx.get(f"{self._id}_data", []),
111
+ self.ctx.get(f"{self._id}_index", 0),
112
+ )
113
+
114
+ def aggregated_output(self) -> list[Data]:
115
+ """Return the aggregated list once all items are processed."""
116
+ self.initialize_data()
117
+
118
+ # Get data list and aggregated list
119
+ data_list = self.ctx.get(f"{self._id}_data", [])
120
+ aggregated = self.ctx.get(f"{self._id}_aggregated", [])
121
+ loop_input = self.item
122
+ if loop_input is not None and not isinstance(loop_input, str) and len(aggregated) <= len(data_list):
123
+ aggregated.append(loop_input)
124
+ self.update_ctx({f"{self._id}_aggregated": aggregated})
125
+ return aggregated
@@ -0,0 +1,88 @@
1
+ from typing import cast
2
+
3
+ from lfx.custom import Component
4
+ from lfx.io import BoolInput, HandleInput, Output, StrInput
5
+ from lfx.schema.data import Data
6
+
7
+
8
+ class NotifyComponent(Component):
9
+ display_name = "Notify"
10
+ description = "A component to generate a notification to Get Notified component."
11
+ icon = "Notify"
12
+ name = "Notify"
13
+ beta: bool = True
14
+
15
+ inputs = [
16
+ StrInput(
17
+ name="context_key",
18
+ display_name="Context Key",
19
+ info="The key of the context to store the notification.",
20
+ required=True,
21
+ ),
22
+ HandleInput(
23
+ name="input_value",
24
+ display_name="Input Data",
25
+ info="The data to store.",
26
+ required=False,
27
+ input_types=["Data", "Message", "DataFrame"],
28
+ ),
29
+ BoolInput(
30
+ name="append",
31
+ display_name="Append",
32
+ info="If True, the record will be appended to the notification.",
33
+ value=False,
34
+ required=False,
35
+ ),
36
+ ]
37
+
38
+ outputs = [
39
+ Output(
40
+ display_name="Data",
41
+ name="result",
42
+ method="notify_components",
43
+ cache=False,
44
+ ),
45
+ ]
46
+
47
+ async def notify_components(self) -> Data:
48
+ """Processes and stores a notification in the component's context.
49
+
50
+ Normalizes the input value to a `Data` object and stores it under the
51
+ specified context key. If `append` is True, adds the value to a list
52
+ of notifications; otherwise, replaces the existing value. Updates the
53
+ component's status and activates related state vertices in the graph.
54
+
55
+ Returns:
56
+ The processed `Data` object stored in the context.
57
+
58
+ Raises:
59
+ ValueError: If the component is not part of a graph.
60
+ """
61
+ if not self._vertex:
62
+ msg = "Notify component must be used in a graph."
63
+ raise ValueError(msg)
64
+ input_value: Data | str | dict | None = self.input_value
65
+ if input_value is None:
66
+ input_value = Data(text="")
67
+ elif not isinstance(input_value, Data):
68
+ if isinstance(input_value, str):
69
+ input_value = Data(text=input_value)
70
+ elif isinstance(input_value, dict):
71
+ input_value = Data(data=input_value)
72
+ else:
73
+ input_value = Data(text=str(input_value))
74
+ if input_value:
75
+ if self.append:
76
+ current_data = self.ctx.get(self.context_key, [])
77
+ if not isinstance(current_data, list):
78
+ current_data = [current_data]
79
+ current_data.append(input_value)
80
+ self.update_ctx({self.context_key: current_data})
81
+ else:
82
+ self.update_ctx({self.context_key: input_value})
83
+ self.status = input_value
84
+ else:
85
+ self.status = "No record provided."
86
+ self._vertex.is_state = True
87
+ self.graph.activate_state_vertices(name=self.context_key, caller=self._id)
88
+ return cast("Data", input_value)
@@ -0,0 +1,35 @@
1
+ from lfx.custom.custom_component.component import Component
2
+ from lfx.io import MessageInput
3
+ from lfx.schema.message import Message
4
+ from lfx.template.field.base import Output
5
+
6
+
7
+ class PassMessageComponent(Component):
8
+ display_name = "Pass"
9
+ description = "Forwards the input message, unchanged."
10
+ name = "Pass"
11
+ icon = "arrow-right"
12
+ legacy: bool = True
13
+
14
+ inputs = [
15
+ MessageInput(
16
+ name="input_message",
17
+ display_name="Input Message",
18
+ info="The message to be passed forward.",
19
+ required=True,
20
+ ),
21
+ MessageInput(
22
+ name="ignored_message",
23
+ display_name="Ignored Message",
24
+ info="A second message to be ignored. Used as a workaround for continuity.",
25
+ advanced=True,
26
+ ),
27
+ ]
28
+
29
+ outputs = [
30
+ Output(display_name="Output Message", name="output_message", method="pass_message"),
31
+ ]
32
+
33
+ def pass_message(self) -> Message:
34
+ self.status = self.input_message
35
+ return self.input_message