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,90 @@
1
+ from enum import Enum
2
+ from typing import cast
3
+
4
+ from lfx.custom.custom_component.component import Component
5
+ from lfx.io import DataInput, DropdownInput, Output
6
+ from lfx.log.logger import logger
7
+ from lfx.schema.dataframe import DataFrame
8
+
9
+
10
+ class DataOperation(str, Enum):
11
+ CONCATENATE = "Concatenate"
12
+ APPEND = "Append"
13
+ MERGE = "Merge"
14
+ JOIN = "Join"
15
+
16
+
17
+ class MergeDataComponent(Component):
18
+ display_name = "Combine Data"
19
+ description = "Combines data using different operations"
20
+ icon = "merge"
21
+ MIN_INPUTS_REQUIRED = 2
22
+ legacy = True
23
+
24
+ inputs = [
25
+ DataInput(name="data_inputs", display_name="Data Inputs", info="Data to combine", is_list=True, required=True),
26
+ DropdownInput(
27
+ name="operation",
28
+ display_name="Operation Type",
29
+ options=[op.value for op in DataOperation],
30
+ value=DataOperation.CONCATENATE.value,
31
+ ),
32
+ ]
33
+ outputs = [Output(display_name="DataFrame", name="combined_data", method="combine_data")]
34
+
35
+ def combine_data(self) -> DataFrame:
36
+ if not self.data_inputs or len(self.data_inputs) < self.MIN_INPUTS_REQUIRED:
37
+ empty_dataframe = DataFrame()
38
+ self.status = empty_dataframe
39
+ return empty_dataframe
40
+
41
+ operation = DataOperation(self.operation)
42
+ try:
43
+ combined_dataframe = self._process_operation(operation)
44
+ self.status = combined_dataframe
45
+ except Exception as e:
46
+ logger.error(f"Error during operation {operation}: {e!s}")
47
+ raise
48
+ else:
49
+ return combined_dataframe
50
+
51
+ def _process_operation(self, operation: DataOperation) -> DataFrame:
52
+ if operation == DataOperation.CONCATENATE:
53
+ combined_data: dict[str, str | object] = {}
54
+ for data_input in self.data_inputs:
55
+ for key, value in data_input.data.items():
56
+ if key in combined_data:
57
+ if isinstance(combined_data[key], str) and isinstance(value, str):
58
+ combined_data[key] = f"{combined_data[key]}\n{value}"
59
+ else:
60
+ combined_data[key] = value
61
+ else:
62
+ combined_data[key] = value
63
+ return DataFrame([combined_data])
64
+
65
+ if operation == DataOperation.APPEND:
66
+ rows = [data_input.data for data_input in self.data_inputs]
67
+ return DataFrame(rows)
68
+
69
+ if operation == DataOperation.MERGE:
70
+ result_data: dict[str, str | list[str] | object] = {}
71
+ for data_input in self.data_inputs:
72
+ for key, value in data_input.data.items():
73
+ if key in result_data and isinstance(value, str):
74
+ if isinstance(result_data[key], list):
75
+ cast("list[str]", result_data[key]).append(value)
76
+ else:
77
+ result_data[key] = [result_data[key], value]
78
+ else:
79
+ result_data[key] = value
80
+ return DataFrame([result_data])
81
+
82
+ if operation == DataOperation.JOIN:
83
+ combined_data = {}
84
+ for idx, data_input in enumerate(self.data_inputs, 1):
85
+ for key, value in data_input.data.items():
86
+ new_key = f"{key}_doc{idx}" if idx > 1 else key
87
+ combined_data[new_key] = value
88
+ return DataFrame([combined_data])
89
+
90
+ return DataFrame()
@@ -0,0 +1,36 @@
1
+ from lfx.custom.custom_component.component import Component
2
+ from lfx.io import MessageInput, Output
3
+ from lfx.log.logger import logger
4
+ from lfx.schema.data import Data
5
+
6
+
7
+ class MessageToDataComponent(Component):
8
+ display_name = "Message to Data"
9
+ description = "Convert a Message object to a Data object"
10
+ icon = "message-square-share"
11
+ beta = True
12
+ name = "MessagetoData"
13
+ legacy = True
14
+
15
+ inputs = [
16
+ MessageInput(
17
+ name="message",
18
+ display_name="Message",
19
+ info="The Message object to convert to a Data object",
20
+ ),
21
+ ]
22
+
23
+ outputs = [
24
+ Output(display_name="Data", name="data", method="convert_message_to_data"),
25
+ ]
26
+
27
+ def convert_message_to_data(self) -> Data:
28
+ # Check for Message by checking if it has the expected attributes instead of isinstance
29
+ if hasattr(self.message, "data") and hasattr(self.message, "text") and hasattr(self.message, "get_text"):
30
+ # Convert Message to Data - this works for both langflow.Message and lfx.Message
31
+ return Data(data=self.message.data)
32
+
33
+ msg = "Error converting Message to Data: Input must be a Message object"
34
+ logger.debug(msg, exc_info=True)
35
+ self.status = msg
36
+ return Data(data={"error": msg})
@@ -0,0 +1,70 @@
1
+ from lfx.custom.custom_component.component import Component
2
+ from lfx.helpers.data import data_to_text, data_to_text_list
3
+ from lfx.io import DataInput, MultilineInput, Output, StrInput
4
+ from lfx.schema.data import Data
5
+ from lfx.schema.message import Message
6
+
7
+
8
+ class ParseDataComponent(Component):
9
+ display_name = "Data to Message"
10
+ description = "Convert Data objects into Messages using any {field_name} from input data."
11
+ icon = "message-square"
12
+ name = "ParseData"
13
+ legacy = True
14
+ metadata = {
15
+ "legacy_name": "Parse Data",
16
+ }
17
+
18
+ inputs = [
19
+ DataInput(
20
+ name="data",
21
+ display_name="Data",
22
+ info="The data to convert to text.",
23
+ is_list=True,
24
+ required=True,
25
+ ),
26
+ MultilineInput(
27
+ name="template",
28
+ display_name="Template",
29
+ info="The template to use for formatting the data. "
30
+ "It can contain the keys {text}, {data} or any other key in the Data.",
31
+ value="{text}",
32
+ required=True,
33
+ ),
34
+ StrInput(name="sep", display_name="Separator", advanced=True, value="\n"),
35
+ ]
36
+
37
+ outputs = [
38
+ Output(
39
+ display_name="Message",
40
+ name="text",
41
+ info="Data as a single Message, with each input Data separated by Separator",
42
+ method="parse_data",
43
+ ),
44
+ Output(
45
+ display_name="Data List",
46
+ name="data_list",
47
+ info="Data as a list of new Data, each having `text` formatted by Template",
48
+ method="parse_data_as_list",
49
+ ),
50
+ ]
51
+
52
+ def _clean_args(self) -> tuple[list[Data], str, str]:
53
+ data = self.data if isinstance(self.data, list) else [self.data]
54
+ template = self.template
55
+ sep = self.sep
56
+ return data, template, sep
57
+
58
+ def parse_data(self) -> Message:
59
+ data, template, sep = self._clean_args()
60
+ result_string = data_to_text(template, data, sep)
61
+ self.status = result_string
62
+ return Message(text=result_string)
63
+
64
+ def parse_data_as_list(self) -> list[Data]:
65
+ data, template, _ = self._clean_args()
66
+ text_list, data_list = data_to_text_list(template, data)
67
+ for item, text in zip(data_list, text_list, strict=True):
68
+ item.set_text(text)
69
+ self.status = data_list
70
+ return data_list
@@ -0,0 +1,68 @@
1
+ from lfx.custom.custom_component.component import Component
2
+ from lfx.io import DataFrameInput, MultilineInput, Output, StrInput
3
+ from lfx.schema.message import Message
4
+
5
+
6
+ class ParseDataFrameComponent(Component):
7
+ display_name = "Parse DataFrame"
8
+ description = (
9
+ "Convert a DataFrame into plain text following a specified template. "
10
+ "Each column in the DataFrame is treated as a possible template key, e.g. {col_name}."
11
+ )
12
+ icon = "braces"
13
+ name = "ParseDataFrame"
14
+ legacy = True
15
+
16
+ inputs = [
17
+ DataFrameInput(name="df", display_name="DataFrame", info="The DataFrame to convert to text rows."),
18
+ MultilineInput(
19
+ name="template",
20
+ display_name="Template",
21
+ info=(
22
+ "The template for formatting each row. "
23
+ "Use placeholders matching column names in the DataFrame, for example '{col1}', '{col2}'."
24
+ ),
25
+ value="{text}",
26
+ ),
27
+ StrInput(
28
+ name="sep",
29
+ display_name="Separator",
30
+ advanced=True,
31
+ value="\n",
32
+ info="String that joins all row texts when building the single Text output.",
33
+ ),
34
+ ]
35
+
36
+ outputs = [
37
+ Output(
38
+ display_name="Text",
39
+ name="text",
40
+ info="All rows combined into a single text, each row formatted by the template and separated by `sep`.",
41
+ method="parse_data",
42
+ ),
43
+ ]
44
+
45
+ def _clean_args(self):
46
+ dataframe = self.df
47
+ template = self.template or "{text}"
48
+ sep = self.sep or "\n"
49
+ return dataframe, template, sep
50
+
51
+ def parse_data(self) -> Message:
52
+ """Converts each row of the DataFrame into a formatted string using the template.
53
+
54
+ then joins them with `sep`. Returns a single combined string as a Message.
55
+ """
56
+ dataframe, template, sep = self._clean_args()
57
+
58
+ lines = []
59
+ # For each row in the DataFrame, build a dict and format
60
+ for _, row in dataframe.iterrows():
61
+ row_dict = row.to_dict()
62
+ text_line = template.format(**row_dict) # e.g. template="{text}", row_dict={"text": "Hello"}
63
+ lines.append(text_line)
64
+
65
+ # Join all lines with the provided separator
66
+ result_string = sep.join(lines)
67
+ self.status = result_string # store in self.status for UI logs
68
+ return Message(text=result_string)
@@ -0,0 +1,90 @@
1
+ import json
2
+ from json import JSONDecodeError
3
+
4
+ import jq
5
+ from json_repair import repair_json
6
+
7
+ from lfx.custom.custom_component.component import Component
8
+ from lfx.inputs.inputs import HandleInput, MessageTextInput
9
+ from lfx.io import Output
10
+ from lfx.log.logger import logger
11
+ from lfx.schema.data import Data
12
+ from lfx.schema.message import Message
13
+
14
+
15
+ class ParseJSONDataComponent(Component):
16
+ display_name = "Parse JSON"
17
+ description = "Convert and extract JSON fields."
18
+ icon = "braces"
19
+ name = "ParseJSONData"
20
+ legacy: bool = True
21
+
22
+ inputs = [
23
+ HandleInput(
24
+ name="input_value",
25
+ display_name="Input",
26
+ info="Data object to filter.",
27
+ required=True,
28
+ input_types=["Message", "Data"],
29
+ ),
30
+ MessageTextInput(
31
+ name="query",
32
+ display_name="JQ Query",
33
+ info="JQ Query to filter the data. The input is always a JSON list.",
34
+ required=True,
35
+ ),
36
+ ]
37
+
38
+ outputs = [
39
+ Output(display_name="Filtered Data", name="filtered_data", method="filter_data"),
40
+ ]
41
+
42
+ def _parse_data(self, input_value) -> str:
43
+ if isinstance(input_value, Message) and isinstance(input_value.text, str):
44
+ return input_value.text
45
+ if isinstance(input_value, Data):
46
+ return json.dumps(input_value.data)
47
+ return str(input_value)
48
+
49
+ def filter_data(self) -> list[Data]:
50
+ to_filter = self.input_value
51
+ if not to_filter:
52
+ return []
53
+ # Check if input is a list
54
+ if isinstance(to_filter, list):
55
+ to_filter = [self._parse_data(f) for f in to_filter]
56
+ else:
57
+ to_filter = self._parse_data(to_filter)
58
+
59
+ # If input is not a list, don't wrap it in a list
60
+ if not isinstance(to_filter, list):
61
+ to_filter = repair_json(to_filter)
62
+ try:
63
+ to_filter_as_dict = json.loads(to_filter)
64
+ except JSONDecodeError:
65
+ try:
66
+ to_filter_as_dict = json.loads(repair_json(to_filter))
67
+ except JSONDecodeError as e:
68
+ msg = f"Invalid JSON: {e}"
69
+ raise ValueError(msg) from e
70
+ else:
71
+ to_filter = [repair_json(f) for f in to_filter]
72
+ to_filter_as_dict = []
73
+ for f in to_filter:
74
+ try:
75
+ to_filter_as_dict.append(json.loads(f))
76
+ except JSONDecodeError:
77
+ try:
78
+ to_filter_as_dict.append(json.loads(repair_json(f)))
79
+ except JSONDecodeError as e:
80
+ msg = f"Invalid JSON: {e}"
81
+ raise ValueError(msg) from e
82
+ to_filter = to_filter_as_dict
83
+
84
+ full_filter_str = json.dumps(to_filter_as_dict)
85
+
86
+ logger.info("to_filter: ", to_filter)
87
+
88
+ results = jq.compile(self.query).input_text(full_filter_str).all()
89
+ logger.info("results: ", results)
90
+ return [Data(data=value) if isinstance(value, dict) else Data(text=str(value)) for value in results]
@@ -0,0 +1,143 @@
1
+ from lfx.custom.custom_component.component import Component
2
+ from lfx.helpers.data import safe_convert
3
+ from lfx.inputs.inputs import BoolInput, HandleInput, MessageTextInput, MultilineInput, TabInput
4
+ from lfx.schema.data import Data
5
+ from lfx.schema.dataframe import DataFrame
6
+ from lfx.schema.message import Message
7
+ from lfx.template.field.base import Output
8
+
9
+
10
+ class ParserComponent(Component):
11
+ display_name = "Parser"
12
+ description = "Extracts text using a template."
13
+ documentation: str = "https://docs.langflow.org/components-processing#parser"
14
+ icon = "braces"
15
+
16
+ inputs = [
17
+ HandleInput(
18
+ name="input_data",
19
+ display_name="Data or DataFrame",
20
+ input_types=["DataFrame", "Data"],
21
+ info="Accepts either a DataFrame or a Data object.",
22
+ required=True,
23
+ ),
24
+ TabInput(
25
+ name="mode",
26
+ display_name="Mode",
27
+ options=["Parser", "Stringify"],
28
+ value="Parser",
29
+ info="Convert into raw string instead of using a template.",
30
+ real_time_refresh=True,
31
+ ),
32
+ MultilineInput(
33
+ name="pattern",
34
+ display_name="Template",
35
+ info=(
36
+ "Use variables within curly brackets to extract column values for DataFrames "
37
+ "or key values for Data."
38
+ "For example: `Name: {Name}, Age: {Age}, Country: {Country}`"
39
+ ),
40
+ value="Text: {text}", # Example default
41
+ dynamic=True,
42
+ show=True,
43
+ required=True,
44
+ ),
45
+ MessageTextInput(
46
+ name="sep",
47
+ display_name="Separator",
48
+ advanced=True,
49
+ value="\n",
50
+ info="String used to separate rows/items.",
51
+ ),
52
+ ]
53
+
54
+ outputs = [
55
+ Output(
56
+ display_name="Parsed Text",
57
+ name="parsed_text",
58
+ info="Formatted text output.",
59
+ method="parse_combined_text",
60
+ ),
61
+ ]
62
+
63
+ def update_build_config(self, build_config, field_value, field_name=None):
64
+ """Dynamically hide/show `template` and enforce requirement based on `stringify`."""
65
+ if field_name == "mode":
66
+ build_config["pattern"]["show"] = self.mode == "Parser"
67
+ build_config["pattern"]["required"] = self.mode == "Parser"
68
+ if field_value:
69
+ clean_data = BoolInput(
70
+ name="clean_data",
71
+ display_name="Clean Data",
72
+ info=(
73
+ "Enable to clean the data by removing empty rows and lines "
74
+ "in each cell of the DataFrame/ Data object."
75
+ ),
76
+ value=True,
77
+ advanced=True,
78
+ required=False,
79
+ )
80
+ build_config["clean_data"] = clean_data.to_dict()
81
+ else:
82
+ build_config.pop("clean_data", None)
83
+
84
+ return build_config
85
+
86
+ def _clean_args(self):
87
+ """Prepare arguments based on input type."""
88
+ input_data = self.input_data
89
+
90
+ match input_data:
91
+ case list() if all(isinstance(item, Data) for item in input_data):
92
+ msg = "List of Data objects is not supported."
93
+ raise ValueError(msg)
94
+ case DataFrame():
95
+ return input_data, None
96
+ case Data():
97
+ return None, input_data
98
+ case dict() if "data" in input_data:
99
+ try:
100
+ if "columns" in input_data: # Likely a DataFrame
101
+ return DataFrame.from_dict(input_data), None
102
+ # Likely a Data object
103
+ return None, Data(**input_data)
104
+ except (TypeError, ValueError, KeyError) as e:
105
+ msg = f"Invalid structured input provided: {e!s}"
106
+ raise ValueError(msg) from e
107
+ case _:
108
+ msg = f"Unsupported input type: {type(input_data)}. Expected DataFrame or Data."
109
+ raise ValueError(msg)
110
+
111
+ def parse_combined_text(self) -> Message:
112
+ """Parse all rows/items into a single text or convert input to string if `stringify` is enabled."""
113
+ # Early return for stringify option
114
+ if self.mode == "Stringify":
115
+ return self.convert_to_string()
116
+
117
+ df, data = self._clean_args()
118
+
119
+ lines = []
120
+ if df is not None:
121
+ for _, row in df.iterrows():
122
+ formatted_text = self.pattern.format(**row.to_dict())
123
+ lines.append(formatted_text)
124
+ elif data is not None:
125
+ formatted_text = self.pattern.format(**data.data)
126
+ lines.append(formatted_text)
127
+
128
+ combined_text = self.sep.join(lines)
129
+ self.status = combined_text
130
+ return Message(text=combined_text)
131
+
132
+ def convert_to_string(self) -> Message:
133
+ """Convert input data to string with proper error handling."""
134
+ result = ""
135
+ if isinstance(self.input_data, list):
136
+ result = "\n".join([safe_convert(item, clean_data=self.clean_data or False) for item in self.input_data])
137
+ else:
138
+ result = safe_convert(self.input_data or False)
139
+ self.log(f"Converted to string with length: {len(result)}")
140
+
141
+ message = Message(text=result)
142
+ self.status = message
143
+ return message
@@ -0,0 +1,67 @@
1
+ from lfx.base.prompts.api_utils import process_prompt_template
2
+ from lfx.custom.custom_component.component import Component
3
+ from lfx.inputs.inputs import DefaultPromptField
4
+ from lfx.io import MessageTextInput, Output, PromptInput
5
+ from lfx.schema.message import Message
6
+ from lfx.template.utils import update_template_values
7
+
8
+
9
+ class PromptComponent(Component):
10
+ display_name: str = "Prompt Template"
11
+ description: str = "Create a prompt template with dynamic variables."
12
+ documentation: str = "https://docs.langflow.org/components-prompts"
13
+ icon = "braces"
14
+ trace_type = "prompt"
15
+ name = "Prompt Template"
16
+ priority = 0 # Set priority to 0 to make it appear first
17
+
18
+ inputs = [
19
+ PromptInput(name="template", display_name="Template"),
20
+ MessageTextInput(
21
+ name="tool_placeholder",
22
+ display_name="Tool Placeholder",
23
+ tool_mode=True,
24
+ advanced=True,
25
+ info="A placeholder input for tool mode.",
26
+ ),
27
+ ]
28
+
29
+ outputs = [
30
+ Output(display_name="Prompt", name="prompt", method="build_prompt"),
31
+ ]
32
+
33
+ async def build_prompt(self) -> Message:
34
+ prompt = Message.from_template(**self._attributes)
35
+ self.status = prompt.text
36
+ return prompt
37
+
38
+ def _update_template(self, frontend_node: dict):
39
+ prompt_template = frontend_node["template"]["template"]["value"]
40
+ custom_fields = frontend_node["custom_fields"]
41
+ frontend_node_template = frontend_node["template"]
42
+ _ = process_prompt_template(
43
+ template=prompt_template,
44
+ name="template",
45
+ custom_fields=custom_fields,
46
+ frontend_node_template=frontend_node_template,
47
+ )
48
+ return frontend_node
49
+
50
+ async def update_frontend_node(self, new_frontend_node: dict, current_frontend_node: dict):
51
+ """This function is called after the code validation is done."""
52
+ frontend_node = await super().update_frontend_node(new_frontend_node, current_frontend_node)
53
+ template = frontend_node["template"]["template"]["value"]
54
+ # Kept it duplicated for backwards compatibility
55
+ _ = process_prompt_template(
56
+ template=template,
57
+ name="template",
58
+ custom_fields=frontend_node["custom_fields"],
59
+ frontend_node_template=frontend_node["template"],
60
+ )
61
+ # Now that template is updated, we need to grab any values that were set in the current_frontend_node
62
+ # and update the frontend_node with those values
63
+ update_template_values(new_template=frontend_node, previous_template=current_frontend_node["template"])
64
+ return frontend_node
65
+
66
+ def _get_fallback_input(self, **kwargs):
67
+ return DefaultPromptField(**kwargs)
@@ -0,0 +1,98 @@
1
+ import importlib
2
+
3
+ from langchain_experimental.utilities import PythonREPL
4
+
5
+ from lfx.custom.custom_component.component import Component
6
+ from lfx.io import CodeInput, Output, StrInput
7
+ from lfx.schema.data import Data
8
+
9
+
10
+ class PythonREPLComponent(Component):
11
+ display_name = "Python Interpreter"
12
+ description = "Run Python code with optional imports. Use print() to see the output."
13
+ documentation: str = "https://docs.langflow.org/components-processing#python-interpreter"
14
+ icon = "square-terminal"
15
+
16
+ inputs = [
17
+ StrInput(
18
+ name="global_imports",
19
+ display_name="Global Imports",
20
+ info="A comma-separated list of modules to import globally, e.g. 'math,numpy,pandas'.",
21
+ value="math,pandas",
22
+ required=True,
23
+ ),
24
+ CodeInput(
25
+ name="python_code",
26
+ display_name="Python Code",
27
+ info="The Python code to execute. Only modules specified in Global Imports can be used.",
28
+ value="print('Hello, World!')",
29
+ input_types=["Message"],
30
+ tool_mode=True,
31
+ required=True,
32
+ ),
33
+ ]
34
+
35
+ outputs = [
36
+ Output(
37
+ display_name="Results",
38
+ name="results",
39
+ type_=Data,
40
+ method="run_python_repl",
41
+ ),
42
+ ]
43
+
44
+ def get_globals(self, global_imports: str | list[str]) -> dict:
45
+ """Create a globals dictionary with only the specified allowed imports."""
46
+ global_dict = {}
47
+
48
+ try:
49
+ if isinstance(global_imports, str):
50
+ modules = [module.strip() for module in global_imports.split(",")]
51
+ elif isinstance(global_imports, list):
52
+ modules = global_imports
53
+ else:
54
+ msg = "global_imports must be either a string or a list"
55
+ raise TypeError(msg)
56
+
57
+ for module in modules:
58
+ try:
59
+ imported_module = importlib.import_module(module)
60
+ global_dict[imported_module.__name__] = imported_module
61
+ except ImportError as e:
62
+ msg = f"Could not import module {module}: {e!s}"
63
+ raise ImportError(msg) from e
64
+
65
+ except Exception as e:
66
+ self.log(f"Error in global imports: {e!s}")
67
+ raise
68
+ else:
69
+ self.log(f"Successfully imported modules: {list(global_dict.keys())}")
70
+ return global_dict
71
+
72
+ def run_python_repl(self) -> Data:
73
+ try:
74
+ globals_ = self.get_globals(self.global_imports)
75
+ python_repl = PythonREPL(_globals=globals_)
76
+ result = python_repl.run(self.python_code)
77
+ result = result.strip() if result else ""
78
+
79
+ self.log("Code execution completed successfully")
80
+ return Data(data={"result": result})
81
+
82
+ except ImportError as e:
83
+ error_message = f"Import Error: {e!s}"
84
+ self.log(error_message)
85
+ return Data(data={"error": error_message})
86
+
87
+ except SyntaxError as e:
88
+ error_message = f"Syntax Error: {e!s}"
89
+ self.log(error_message)
90
+ return Data(data={"error": error_message})
91
+
92
+ except (NameError, TypeError, ValueError) as e:
93
+ error_message = f"Error during execution: {e!s}"
94
+ self.log(error_message)
95
+ return Data(data={"error": error_message})
96
+
97
+ def build(self):
98
+ return self.run_python_repl