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,134 @@
1
+ import numpy as np
2
+ from langchain_core.vectorstores import VectorStore
3
+
4
+ from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
5
+ from lfx.helpers.data import docs_to_data
6
+ from lfx.io import DropdownInput, HandleInput, IntInput, SecretStrInput, StrInput
7
+ from lfx.schema.data import Data
8
+
9
+
10
+ class PineconeVectorStoreComponent(LCVectorStoreComponent):
11
+ display_name = "Pinecone"
12
+ description = "Pinecone Vector Store with search capabilities"
13
+ name = "Pinecone"
14
+ icon = "Pinecone"
15
+ inputs = [
16
+ StrInput(name="index_name", display_name="Index Name", required=True),
17
+ StrInput(name="namespace", display_name="Namespace", info="Namespace for the index."),
18
+ DropdownInput(
19
+ name="distance_strategy",
20
+ display_name="Distance Strategy",
21
+ options=["Cosine", "Euclidean", "Dot Product"],
22
+ value="Cosine",
23
+ advanced=True,
24
+ ),
25
+ SecretStrInput(name="pinecone_api_key", display_name="Pinecone API Key", required=True),
26
+ StrInput(
27
+ name="text_key",
28
+ display_name="Text Key",
29
+ info="Key in the record to use as text.",
30
+ value="text",
31
+ advanced=True,
32
+ ),
33
+ *LCVectorStoreComponent.inputs,
34
+ HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
35
+ IntInput(
36
+ name="number_of_results",
37
+ display_name="Number of Results",
38
+ info="Number of results to return.",
39
+ value=4,
40
+ advanced=True,
41
+ ),
42
+ ]
43
+
44
+ @check_cached_vector_store
45
+ def build_vector_store(self) -> VectorStore:
46
+ """Build and return a Pinecone vector store instance."""
47
+ try:
48
+ from langchain_pinecone import PineconeVectorStore
49
+ except ImportError as e:
50
+ msg = "langchain-pinecone is not installed. Please install it with `pip install langchain-pinecone`."
51
+ raise ValueError(msg) from e
52
+
53
+ try:
54
+ from langchain_pinecone._utilities import DistanceStrategy
55
+
56
+ # Wrap the embedding model to ensure float32 output
57
+ wrapped_embeddings = Float32Embeddings(self.embedding)
58
+
59
+ # Convert distance strategy
60
+ distance_strategy = self.distance_strategy.replace(" ", "_").upper()
61
+ distance_strategy = DistanceStrategy[distance_strategy]
62
+
63
+ # Initialize Pinecone instance with wrapped embeddings
64
+ pinecone = PineconeVectorStore(
65
+ index_name=self.index_name,
66
+ embedding=wrapped_embeddings, # Use wrapped embeddings
67
+ text_key=self.text_key,
68
+ namespace=self.namespace,
69
+ distance_strategy=distance_strategy,
70
+ pinecone_api_key=self.pinecone_api_key,
71
+ )
72
+ except Exception as e:
73
+ error_msg = "Error building Pinecone vector store"
74
+ raise ValueError(error_msg) from e
75
+ else:
76
+ self.ingest_data = self._prepare_ingest_data()
77
+
78
+ # Process documents if any
79
+ documents = []
80
+ if self.ingest_data:
81
+ # Convert DataFrame to Data if needed using parent's method
82
+
83
+ for doc in self.ingest_data:
84
+ if isinstance(doc, Data):
85
+ documents.append(doc.to_lc_document())
86
+ else:
87
+ documents.append(doc)
88
+
89
+ if documents:
90
+ pinecone.add_documents(documents)
91
+
92
+ return pinecone
93
+
94
+ def search_documents(self) -> list[Data]:
95
+ """Search documents in the vector store."""
96
+ try:
97
+ if not self.search_query or not isinstance(self.search_query, str) or not self.search_query.strip():
98
+ return []
99
+
100
+ vector_store = self.build_vector_store()
101
+ docs = vector_store.similarity_search(
102
+ query=self.search_query,
103
+ k=self.number_of_results,
104
+ )
105
+ except Exception as e:
106
+ error_msg = "Error searching documents"
107
+ raise ValueError(error_msg) from e
108
+ else:
109
+ data = docs_to_data(docs)
110
+ self.status = data
111
+ return data
112
+
113
+
114
+ class Float32Embeddings:
115
+ """Wrapper class to ensure float32 embeddings."""
116
+
117
+ def __init__(self, base_embeddings):
118
+ self.base_embeddings = base_embeddings
119
+
120
+ def embed_documents(self, texts):
121
+ embeddings = self.base_embeddings.embed_documents(texts)
122
+ if isinstance(embeddings, np.ndarray):
123
+ return [[self._force_float32(x) for x in vec] for vec in embeddings]
124
+ return [[self._force_float32(x) for x in vec] for vec in embeddings]
125
+
126
+ def embed_query(self, text):
127
+ embedding = self.base_embeddings.embed_query(text)
128
+ if isinstance(embedding, np.ndarray):
129
+ return [self._force_float32(x) for x in embedding]
130
+ return [self._force_float32(x) for x in embedding]
131
+
132
+ def _force_float32(self, value):
133
+ """Convert any numeric type to Python float."""
134
+ return float(np.float32(value))
@@ -0,0 +1,117 @@
1
+ """Processing components for LangFlow."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, Any
6
+
7
+ from lfx.components._importing import import_mod
8
+
9
+ if TYPE_CHECKING:
10
+ from lfx.components.processing.alter_metadata import AlterMetadataComponent
11
+ from lfx.components.processing.batch_run import BatchRunComponent
12
+ from lfx.components.processing.combine_text import CombineTextComponent
13
+ from lfx.components.processing.converter import TypeConverterComponent
14
+ from lfx.components.processing.create_data import CreateDataComponent
15
+ from lfx.components.processing.data_operations import DataOperationsComponent
16
+ from lfx.components.processing.data_to_dataframe import DataToDataFrameComponent
17
+ from lfx.components.processing.dataframe_operations import DataFrameOperationsComponent
18
+ from lfx.components.processing.extract_key import ExtractDataKeyComponent
19
+ from lfx.components.processing.filter_data import FilterDataComponent
20
+ from lfx.components.processing.filter_data_values import DataFilterComponent
21
+ from lfx.components.processing.json_cleaner import JSONCleaner
22
+ from lfx.components.processing.lambda_filter import LambdaFilterComponent
23
+ from lfx.components.processing.llm_router import LLMRouterComponent
24
+ from lfx.components.processing.merge_data import MergeDataComponent
25
+ from lfx.components.processing.message_to_data import MessageToDataComponent
26
+ from lfx.components.processing.parse_data import ParseDataComponent
27
+ from lfx.components.processing.parse_dataframe import ParseDataFrameComponent
28
+ from lfx.components.processing.parse_json_data import ParseJSONDataComponent
29
+ from lfx.components.processing.parser import ParserComponent
30
+ from lfx.components.processing.prompt import PromptComponent
31
+ from lfx.components.processing.python_repl_core import PythonREPLComponent
32
+ from lfx.components.processing.regex import RegexExtractorComponent
33
+ from lfx.components.processing.save_file import SaveToFileComponent
34
+ from lfx.components.processing.select_data import SelectDataComponent
35
+ from lfx.components.processing.split_text import SplitTextComponent
36
+ from lfx.components.processing.structured_output import StructuredOutputComponent
37
+ from lfx.components.processing.update_data import UpdateDataComponent
38
+
39
+ _dynamic_imports = {
40
+ "AlterMetadataComponent": "alter_metadata",
41
+ "BatchRunComponent": "batch_run",
42
+ "CombineTextComponent": "combine_text",
43
+ "TypeConverterComponent": "converter",
44
+ "CreateDataComponent": "create_data",
45
+ "DataOperationsComponent": "data_operations",
46
+ "DataToDataFrameComponent": "data_to_dataframe",
47
+ "DataFrameOperationsComponent": "dataframe_operations",
48
+ "ExtractDataKeyComponent": "extract_key",
49
+ "FilterDataComponent": "filter_data",
50
+ "DataFilterComponent": "filter_data_values",
51
+ "JSONCleaner": "json_cleaner",
52
+ "LambdaFilterComponent": "lambda_filter",
53
+ "LLMRouterComponent": "llm_router",
54
+ "MergeDataComponent": "merge_data",
55
+ "MessageToDataComponent": "message_to_data",
56
+ "ParseDataComponent": "parse_data",
57
+ "ParseDataFrameComponent": "parse_dataframe",
58
+ "ParseJSONDataComponent": "parse_json_data",
59
+ "ParserComponent": "parser",
60
+ "PromptComponent": "prompt",
61
+ "PythonREPLComponent": "python_repl_core",
62
+ "RegexExtractorComponent": "regex",
63
+ "SaveToFileComponent": "save_file",
64
+ "SelectDataComponent": "select_data",
65
+ "SplitTextComponent": "split_text",
66
+ "StructuredOutputComponent": "structured_output",
67
+ "UpdateDataComponent": "update_data",
68
+ }
69
+
70
+ __all__ = [
71
+ "AlterMetadataComponent",
72
+ "BatchRunComponent",
73
+ "CombineTextComponent",
74
+ "CreateDataComponent",
75
+ "DataFilterComponent",
76
+ "DataFrameOperationsComponent",
77
+ "DataOperationsComponent",
78
+ "DataToDataFrameComponent",
79
+ "ExtractDataKeyComponent",
80
+ "FilterDataComponent",
81
+ "JSONCleaner",
82
+ "LLMRouterComponent",
83
+ "LambdaFilterComponent",
84
+ "MergeDataComponent",
85
+ "MessageToDataComponent",
86
+ "ParseDataComponent",
87
+ "ParseDataFrameComponent",
88
+ "ParseJSONDataComponent",
89
+ "ParserComponent",
90
+ "PromptComponent",
91
+ "PythonREPLComponent",
92
+ "RegexExtractorComponent",
93
+ "SaveToFileComponent",
94
+ "SelectDataComponent",
95
+ "SplitTextComponent",
96
+ "StructuredOutputComponent",
97
+ "TypeConverterComponent",
98
+ "UpdateDataComponent",
99
+ ]
100
+
101
+
102
+ def __getattr__(attr_name: str) -> Any:
103
+ """Lazily import processing components on attribute access."""
104
+ if attr_name not in _dynamic_imports:
105
+ msg = f"module '{__name__}' has no attribute '{attr_name}'"
106
+ raise AttributeError(msg)
107
+ try:
108
+ result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
109
+ except (ModuleNotFoundError, ImportError, AttributeError) as e:
110
+ msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
111
+ raise AttributeError(msg) from e
112
+ globals()[attr_name] = result
113
+ return result
114
+
115
+
116
+ def __dir__() -> list[str]:
117
+ return list(__all__)
@@ -0,0 +1,108 @@
1
+ from lfx.custom.custom_component.component import Component
2
+ from lfx.inputs.inputs import MessageTextInput
3
+ from lfx.io import HandleInput, NestedDictInput, Output, StrInput
4
+ from lfx.schema.data import Data
5
+ from lfx.schema.dataframe import DataFrame
6
+
7
+
8
+ class AlterMetadataComponent(Component):
9
+ display_name = "Alter Metadata"
10
+ description = "Adds/Removes Metadata Dictionary on inputs"
11
+ icon = "merge"
12
+ name = "AlterMetadata"
13
+ legacy = True
14
+
15
+ inputs = [
16
+ HandleInput(
17
+ name="input_value",
18
+ display_name="Input",
19
+ info="Object(s) to which Metadata should be added",
20
+ required=False,
21
+ input_types=["Message", "Data"],
22
+ is_list=True,
23
+ ),
24
+ StrInput(
25
+ name="text_in",
26
+ display_name="User Text",
27
+ info="Text input; value will be in 'text' attribute of Data object. Empty text entries are ignored.",
28
+ required=False,
29
+ ),
30
+ NestedDictInput(
31
+ name="metadata",
32
+ display_name="Metadata",
33
+ info="Metadata to add to each object",
34
+ input_types=["Data"],
35
+ required=True,
36
+ ),
37
+ MessageTextInput(
38
+ name="remove_fields",
39
+ display_name="Fields to Remove",
40
+ info="Metadata Fields to Remove",
41
+ required=False,
42
+ is_list=True,
43
+ ),
44
+ ]
45
+
46
+ outputs = [
47
+ Output(
48
+ name="data",
49
+ display_name="Data",
50
+ info="List of Input objects each with added Metadata",
51
+ method="process_output",
52
+ ),
53
+ Output(
54
+ display_name="DataFrame",
55
+ name="dataframe",
56
+ info="Data objects as a DataFrame, with metadata as columns",
57
+ method="as_dataframe",
58
+ ),
59
+ ]
60
+
61
+ def _as_clean_dict(self, obj):
62
+ """Convert a Data object or a standard dictionary to a standard dictionary."""
63
+ if isinstance(obj, dict):
64
+ as_dict = obj
65
+ elif isinstance(obj, Data):
66
+ as_dict = obj.data
67
+ else:
68
+ msg = f"Expected a Data object or a dictionary but got {type(obj)}."
69
+ raise TypeError(msg)
70
+
71
+ return {k: v for k, v in (as_dict or {}).items() if k and k.strip()}
72
+
73
+ def process_output(self) -> list[Data]:
74
+ # Ensure metadata is a dictionary, filtering out any empty keys
75
+ metadata = self._as_clean_dict(self.metadata)
76
+
77
+ # Convert text_in to a Data object if it exists, and initialize our list of Data objects
78
+ data_objects = [Data(text=self.text_in)] if self.text_in else []
79
+
80
+ # Append existing Data objects from input_value, if any
81
+ if self.input_value:
82
+ data_objects.extend(self.input_value)
83
+
84
+ # Update each Data object with the new metadata, preserving existing fields
85
+ for data in data_objects:
86
+ data.data.update(metadata)
87
+
88
+ # Handle removal of fields specified in remove_fields
89
+ if self.remove_fields:
90
+ fields_to_remove = {field.strip() for field in self.remove_fields if field.strip()}
91
+
92
+ # Remove specified fields from each Data object's metadata
93
+ for data in data_objects:
94
+ data.data = {k: v for k, v in data.data.items() if k not in fields_to_remove}
95
+
96
+ # Set the status for tracking/debugging purposes
97
+ self.status = data_objects
98
+ return data_objects
99
+
100
+ def as_dataframe(self) -> DataFrame:
101
+ """Convert the processed data objects into a DataFrame.
102
+
103
+ Returns:
104
+ DataFrame: A DataFrame where each row corresponds to a Data object,
105
+ with metadata fields as columns.
106
+ """
107
+ data_list = self.process_output()
108
+ return DataFrame(data_list)
@@ -0,0 +1,205 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any, cast
4
+
5
+ import toml # type: ignore[import-untyped]
6
+
7
+ from lfx.custom.custom_component.component import Component
8
+ from lfx.io import BoolInput, DataFrameInput, HandleInput, MessageTextInput, MultilineInput, Output
9
+ from lfx.log.logger import logger
10
+ from lfx.schema.dataframe import DataFrame
11
+
12
+ if TYPE_CHECKING:
13
+ from langchain_core.runnables import Runnable
14
+
15
+
16
+ class BatchRunComponent(Component):
17
+ display_name = "Batch Run"
18
+ description = "Runs an LLM on each row of a DataFrame column. If no column is specified, all columns are used."
19
+ documentation: str = "https://docs.langflow.org/components-processing#batch-run"
20
+ icon = "List"
21
+
22
+ inputs = [
23
+ HandleInput(
24
+ name="model",
25
+ display_name="Language Model",
26
+ info="Connect the 'Language Model' output from your LLM component here.",
27
+ input_types=["LanguageModel"],
28
+ required=True,
29
+ ),
30
+ MultilineInput(
31
+ name="system_message",
32
+ display_name="Instructions",
33
+ info="Multi-line system instruction for all rows in the DataFrame.",
34
+ required=False,
35
+ ),
36
+ DataFrameInput(
37
+ name="df",
38
+ display_name="DataFrame",
39
+ info="The DataFrame whose column (specified by 'column_name') we'll treat as text messages.",
40
+ required=True,
41
+ ),
42
+ MessageTextInput(
43
+ name="column_name",
44
+ display_name="Column Name",
45
+ info=(
46
+ "The name of the DataFrame column to treat as text messages. "
47
+ "If empty, all columns will be formatted in TOML."
48
+ ),
49
+ required=False,
50
+ advanced=False,
51
+ ),
52
+ MessageTextInput(
53
+ name="output_column_name",
54
+ display_name="Output Column Name",
55
+ info="Name of the column where the model's response will be stored.",
56
+ value="model_response",
57
+ required=False,
58
+ advanced=True,
59
+ ),
60
+ BoolInput(
61
+ name="enable_metadata",
62
+ display_name="Enable Metadata",
63
+ info="If True, add metadata to the output DataFrame.",
64
+ value=False,
65
+ required=False,
66
+ advanced=True,
67
+ ),
68
+ ]
69
+
70
+ outputs = [
71
+ Output(
72
+ display_name="LLM Results",
73
+ name="batch_results",
74
+ method="run_batch",
75
+ info="A DataFrame with all original columns plus the model's response column.",
76
+ ),
77
+ ]
78
+
79
+ def _format_row_as_toml(self, row: dict[str, Any]) -> str:
80
+ """Convert a dictionary (row) into a TOML-formatted string."""
81
+ formatted_dict = {str(col): {"value": str(val)} for col, val in row.items()}
82
+ return toml.dumps(formatted_dict)
83
+
84
+ def _create_base_row(
85
+ self, original_row: dict[str, Any], model_response: str = "", batch_index: int = -1
86
+ ) -> dict[str, Any]:
87
+ """Create a base row with original columns and additional metadata."""
88
+ row = original_row.copy()
89
+ row[self.output_column_name] = model_response
90
+ row["batch_index"] = batch_index
91
+ return row
92
+
93
+ def _add_metadata(
94
+ self, row: dict[str, Any], *, success: bool = True, system_msg: str = "", error: str | None = None
95
+ ) -> None:
96
+ """Add metadata to a row if enabled."""
97
+ if not self.enable_metadata:
98
+ return
99
+
100
+ if success:
101
+ row["metadata"] = {
102
+ "has_system_message": bool(system_msg),
103
+ "input_length": len(row.get("text_input", "")),
104
+ "response_length": len(row[self.output_column_name]),
105
+ "processing_status": "success",
106
+ }
107
+ else:
108
+ row["metadata"] = {
109
+ "error": error,
110
+ "processing_status": "failed",
111
+ }
112
+
113
+ async def run_batch(self) -> DataFrame:
114
+ """Process each row in df[column_name] with the language model asynchronously.
115
+
116
+ Returns:
117
+ DataFrame: A new DataFrame containing:
118
+ - All original columns
119
+ - The model's response column (customizable name)
120
+ - 'batch_index' column for processing order
121
+ - 'metadata' (optional)
122
+
123
+ Raises:
124
+ ValueError: If the specified column is not found in the DataFrame
125
+ TypeError: If the model is not compatible or input types are wrong
126
+ """
127
+ model: Runnable = self.model
128
+ system_msg = self.system_message or ""
129
+ df: DataFrame = self.df
130
+ col_name = self.column_name or ""
131
+
132
+ # Validate inputs first
133
+ if not isinstance(df, DataFrame):
134
+ msg = f"Expected DataFrame input, got {type(df)}"
135
+ raise TypeError(msg)
136
+
137
+ if col_name and col_name not in df.columns:
138
+ msg = f"Column '{col_name}' not found in the DataFrame. Available columns: {', '.join(df.columns)}"
139
+ raise ValueError(msg)
140
+
141
+ try:
142
+ # Determine text input for each row
143
+ if col_name:
144
+ user_texts = df[col_name].astype(str).tolist()
145
+ else:
146
+ user_texts = [
147
+ self._format_row_as_toml(cast("dict[str, Any]", row)) for row in df.to_dict(orient="records")
148
+ ]
149
+
150
+ total_rows = len(user_texts)
151
+ await logger.ainfo(f"Processing {total_rows} rows with batch run")
152
+
153
+ # Prepare the batch of conversations
154
+ conversations = [
155
+ [{"role": "system", "content": system_msg}, {"role": "user", "content": text}]
156
+ if system_msg
157
+ else [{"role": "user", "content": text}]
158
+ for text in user_texts
159
+ ]
160
+
161
+ # Configure the model with project info and callbacks
162
+ model = model.with_config(
163
+ {
164
+ "run_name": self.display_name,
165
+ "project_name": self.get_project_name(),
166
+ "callbacks": self.get_langchain_callbacks(),
167
+ }
168
+ )
169
+ # Process batches and track progress
170
+ responses_with_idx = list(
171
+ zip(
172
+ range(len(conversations)),
173
+ await model.abatch(list(conversations)),
174
+ strict=True,
175
+ )
176
+ )
177
+
178
+ # Sort by index to maintain order
179
+ responses_with_idx.sort(key=lambda x: x[0])
180
+
181
+ # Build the final data with enhanced metadata
182
+ rows: list[dict[str, Any]] = []
183
+ for idx, (original_row, response) in enumerate(
184
+ zip(df.to_dict(orient="records"), responses_with_idx, strict=False)
185
+ ):
186
+ response_text = response[1].content if hasattr(response[1], "content") else str(response[1])
187
+ row = self._create_base_row(
188
+ cast("dict[str, Any]", original_row), model_response=response_text, batch_index=idx
189
+ )
190
+ self._add_metadata(row, success=True, system_msg=system_msg)
191
+ rows.append(row)
192
+
193
+ # Log progress
194
+ if (idx + 1) % max(1, total_rows // 10) == 0:
195
+ await logger.ainfo(f"Processed {idx + 1}/{total_rows} rows")
196
+
197
+ await logger.ainfo("Batch processing completed successfully")
198
+ return DataFrame(rows)
199
+
200
+ except (KeyError, AttributeError) as e:
201
+ # Handle data structure and attribute access errors
202
+ await logger.aerror(f"Data processing error: {e!s}")
203
+ error_row = self._create_base_row(dict.fromkeys(df.columns, ""), model_response="", batch_index=-1)
204
+ self._add_metadata(error_row, success=False, error=str(e))
205
+ return DataFrame([error_row])
@@ -0,0 +1,39 @@
1
+ from lfx.custom.custom_component.component import Component
2
+ from lfx.io import MessageTextInput, Output
3
+ from lfx.schema.message import Message
4
+
5
+
6
+ class CombineTextComponent(Component):
7
+ display_name = "Combine Text"
8
+ description = "Concatenate two text sources into a single text chunk using a specified delimiter."
9
+ icon = "merge"
10
+ name = "CombineText"
11
+ legacy: bool = True
12
+
13
+ inputs = [
14
+ MessageTextInput(
15
+ name="text1",
16
+ display_name="First Text",
17
+ info="The first text input to concatenate.",
18
+ ),
19
+ MessageTextInput(
20
+ name="text2",
21
+ display_name="Second Text",
22
+ info="The second text input to concatenate.",
23
+ ),
24
+ MessageTextInput(
25
+ name="delimiter",
26
+ display_name="Delimiter",
27
+ info="A string used to separate the two text inputs. Defaults to a whitespace.",
28
+ value=" ",
29
+ ),
30
+ ]
31
+
32
+ outputs = [
33
+ Output(display_name="Combined Text", name="combined_text", method="combine_texts"),
34
+ ]
35
+
36
+ def combine_texts(self) -> Message:
37
+ combined = self.delimiter.join([self.text1, self.text2])
38
+ self.status = combined
39
+ return Message(text=combined)