lfx-nightly 0.2.0.dev25__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of lfx-nightly might be problematic. Click here for more details.

Files changed (769) hide show
  1. lfx/__init__.py +0 -0
  2. lfx/__main__.py +25 -0
  3. lfx/_assets/component_index.json +1 -0
  4. lfx/base/__init__.py +0 -0
  5. lfx/base/agents/__init__.py +0 -0
  6. lfx/base/agents/agent.py +375 -0
  7. lfx/base/agents/altk_base_agent.py +380 -0
  8. lfx/base/agents/altk_tool_wrappers.py +565 -0
  9. lfx/base/agents/callback.py +130 -0
  10. lfx/base/agents/context.py +109 -0
  11. lfx/base/agents/crewai/__init__.py +0 -0
  12. lfx/base/agents/crewai/crew.py +231 -0
  13. lfx/base/agents/crewai/tasks.py +12 -0
  14. lfx/base/agents/default_prompts.py +23 -0
  15. lfx/base/agents/errors.py +15 -0
  16. lfx/base/agents/events.py +430 -0
  17. lfx/base/agents/utils.py +237 -0
  18. lfx/base/astra_assistants/__init__.py +0 -0
  19. lfx/base/astra_assistants/util.py +171 -0
  20. lfx/base/chains/__init__.py +0 -0
  21. lfx/base/chains/model.py +19 -0
  22. lfx/base/composio/__init__.py +0 -0
  23. lfx/base/composio/composio_base.py +2584 -0
  24. lfx/base/compressors/__init__.py +0 -0
  25. lfx/base/compressors/model.py +60 -0
  26. lfx/base/constants.py +46 -0
  27. lfx/base/curl/__init__.py +0 -0
  28. lfx/base/curl/parse.py +188 -0
  29. lfx/base/data/__init__.py +5 -0
  30. lfx/base/data/base_file.py +810 -0
  31. lfx/base/data/docling_utils.py +338 -0
  32. lfx/base/data/storage_utils.py +192 -0
  33. lfx/base/data/utils.py +362 -0
  34. lfx/base/datastax/__init__.py +5 -0
  35. lfx/base/datastax/astradb_base.py +896 -0
  36. lfx/base/document_transformers/__init__.py +0 -0
  37. lfx/base/document_transformers/model.py +43 -0
  38. lfx/base/embeddings/__init__.py +0 -0
  39. lfx/base/embeddings/aiml_embeddings.py +62 -0
  40. lfx/base/embeddings/embeddings_class.py +113 -0
  41. lfx/base/embeddings/model.py +26 -0
  42. lfx/base/flow_processing/__init__.py +0 -0
  43. lfx/base/flow_processing/utils.py +86 -0
  44. lfx/base/huggingface/__init__.py +0 -0
  45. lfx/base/huggingface/model_bridge.py +133 -0
  46. lfx/base/io/__init__.py +0 -0
  47. lfx/base/io/chat.py +21 -0
  48. lfx/base/io/text.py +22 -0
  49. lfx/base/knowledge_bases/__init__.py +3 -0
  50. lfx/base/knowledge_bases/knowledge_base_utils.py +137 -0
  51. lfx/base/langchain_utilities/__init__.py +0 -0
  52. lfx/base/langchain_utilities/model.py +35 -0
  53. lfx/base/langchain_utilities/spider_constants.py +1 -0
  54. lfx/base/langwatch/__init__.py +0 -0
  55. lfx/base/langwatch/utils.py +18 -0
  56. lfx/base/mcp/__init__.py +0 -0
  57. lfx/base/mcp/constants.py +2 -0
  58. lfx/base/mcp/util.py +1659 -0
  59. lfx/base/memory/__init__.py +0 -0
  60. lfx/base/memory/memory.py +49 -0
  61. lfx/base/memory/model.py +38 -0
  62. lfx/base/models/__init__.py +3 -0
  63. lfx/base/models/aiml_constants.py +51 -0
  64. lfx/base/models/anthropic_constants.py +51 -0
  65. lfx/base/models/aws_constants.py +151 -0
  66. lfx/base/models/chat_result.py +76 -0
  67. lfx/base/models/cometapi_constants.py +54 -0
  68. lfx/base/models/google_generative_ai_constants.py +70 -0
  69. lfx/base/models/google_generative_ai_model.py +38 -0
  70. lfx/base/models/groq_constants.py +150 -0
  71. lfx/base/models/groq_model_discovery.py +265 -0
  72. lfx/base/models/model.py +375 -0
  73. lfx/base/models/model_input_constants.py +378 -0
  74. lfx/base/models/model_metadata.py +41 -0
  75. lfx/base/models/model_utils.py +108 -0
  76. lfx/base/models/novita_constants.py +35 -0
  77. lfx/base/models/ollama_constants.py +52 -0
  78. lfx/base/models/openai_constants.py +129 -0
  79. lfx/base/models/sambanova_constants.py +18 -0
  80. lfx/base/models/watsonx_constants.py +36 -0
  81. lfx/base/processing/__init__.py +0 -0
  82. lfx/base/prompts/__init__.py +0 -0
  83. lfx/base/prompts/api_utils.py +224 -0
  84. lfx/base/prompts/utils.py +61 -0
  85. lfx/base/textsplitters/__init__.py +0 -0
  86. lfx/base/textsplitters/model.py +28 -0
  87. lfx/base/tools/__init__.py +0 -0
  88. lfx/base/tools/base.py +26 -0
  89. lfx/base/tools/component_tool.py +325 -0
  90. lfx/base/tools/constants.py +49 -0
  91. lfx/base/tools/flow_tool.py +132 -0
  92. lfx/base/tools/run_flow.py +698 -0
  93. lfx/base/vectorstores/__init__.py +0 -0
  94. lfx/base/vectorstores/model.py +193 -0
  95. lfx/base/vectorstores/utils.py +22 -0
  96. lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
  97. lfx/cli/__init__.py +5 -0
  98. lfx/cli/commands.py +327 -0
  99. lfx/cli/common.py +650 -0
  100. lfx/cli/run.py +506 -0
  101. lfx/cli/script_loader.py +289 -0
  102. lfx/cli/serve_app.py +546 -0
  103. lfx/cli/validation.py +69 -0
  104. lfx/components/FAISS/__init__.py +34 -0
  105. lfx/components/FAISS/faiss.py +111 -0
  106. lfx/components/Notion/__init__.py +19 -0
  107. lfx/components/Notion/add_content_to_page.py +269 -0
  108. lfx/components/Notion/create_page.py +94 -0
  109. lfx/components/Notion/list_database_properties.py +68 -0
  110. lfx/components/Notion/list_pages.py +122 -0
  111. lfx/components/Notion/list_users.py +77 -0
  112. lfx/components/Notion/page_content_viewer.py +93 -0
  113. lfx/components/Notion/search.py +111 -0
  114. lfx/components/Notion/update_page_property.py +114 -0
  115. lfx/components/__init__.py +428 -0
  116. lfx/components/_importing.py +42 -0
  117. lfx/components/agentql/__init__.py +3 -0
  118. lfx/components/agentql/agentql_api.py +151 -0
  119. lfx/components/aiml/__init__.py +37 -0
  120. lfx/components/aiml/aiml.py +115 -0
  121. lfx/components/aiml/aiml_embeddings.py +37 -0
  122. lfx/components/altk/__init__.py +34 -0
  123. lfx/components/altk/altk_agent.py +193 -0
  124. lfx/components/amazon/__init__.py +36 -0
  125. lfx/components/amazon/amazon_bedrock_converse.py +195 -0
  126. lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
  127. lfx/components/amazon/amazon_bedrock_model.py +130 -0
  128. lfx/components/amazon/s3_bucket_uploader.py +211 -0
  129. lfx/components/anthropic/__init__.py +34 -0
  130. lfx/components/anthropic/anthropic.py +187 -0
  131. lfx/components/apify/__init__.py +5 -0
  132. lfx/components/apify/apify_actor.py +325 -0
  133. lfx/components/arxiv/__init__.py +3 -0
  134. lfx/components/arxiv/arxiv.py +169 -0
  135. lfx/components/assemblyai/__init__.py +46 -0
  136. lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  137. lfx/components/assemblyai/assemblyai_lemur.py +183 -0
  138. lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  139. lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  140. lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
  141. lfx/components/azure/__init__.py +37 -0
  142. lfx/components/azure/azure_openai.py +95 -0
  143. lfx/components/azure/azure_openai_embeddings.py +83 -0
  144. lfx/components/baidu/__init__.py +32 -0
  145. lfx/components/baidu/baidu_qianfan_chat.py +113 -0
  146. lfx/components/bing/__init__.py +3 -0
  147. lfx/components/bing/bing_search_api.py +61 -0
  148. lfx/components/cassandra/__init__.py +40 -0
  149. lfx/components/cassandra/cassandra.py +264 -0
  150. lfx/components/cassandra/cassandra_chat.py +92 -0
  151. lfx/components/cassandra/cassandra_graph.py +238 -0
  152. lfx/components/chains/__init__.py +3 -0
  153. lfx/components/chroma/__init__.py +34 -0
  154. lfx/components/chroma/chroma.py +169 -0
  155. lfx/components/cleanlab/__init__.py +40 -0
  156. lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
  157. lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  158. lfx/components/cleanlab/cleanlab_remediator.py +131 -0
  159. lfx/components/clickhouse/__init__.py +34 -0
  160. lfx/components/clickhouse/clickhouse.py +135 -0
  161. lfx/components/cloudflare/__init__.py +32 -0
  162. lfx/components/cloudflare/cloudflare.py +81 -0
  163. lfx/components/cohere/__init__.py +40 -0
  164. lfx/components/cohere/cohere_embeddings.py +81 -0
  165. lfx/components/cohere/cohere_models.py +46 -0
  166. lfx/components/cohere/cohere_rerank.py +51 -0
  167. lfx/components/cometapi/__init__.py +32 -0
  168. lfx/components/cometapi/cometapi.py +166 -0
  169. lfx/components/composio/__init__.py +222 -0
  170. lfx/components/composio/agentql_composio.py +11 -0
  171. lfx/components/composio/agiled_composio.py +11 -0
  172. lfx/components/composio/airtable_composio.py +11 -0
  173. lfx/components/composio/apollo_composio.py +11 -0
  174. lfx/components/composio/asana_composio.py +11 -0
  175. lfx/components/composio/attio_composio.py +11 -0
  176. lfx/components/composio/bitbucket_composio.py +11 -0
  177. lfx/components/composio/bolna_composio.py +11 -0
  178. lfx/components/composio/brightdata_composio.py +11 -0
  179. lfx/components/composio/calendly_composio.py +11 -0
  180. lfx/components/composio/canva_composio.py +11 -0
  181. lfx/components/composio/canvas_composio.py +11 -0
  182. lfx/components/composio/coda_composio.py +11 -0
  183. lfx/components/composio/composio_api.py +278 -0
  184. lfx/components/composio/contentful_composio.py +11 -0
  185. lfx/components/composio/digicert_composio.py +11 -0
  186. lfx/components/composio/discord_composio.py +11 -0
  187. lfx/components/composio/dropbox_compnent.py +11 -0
  188. lfx/components/composio/elevenlabs_composio.py +11 -0
  189. lfx/components/composio/exa_composio.py +11 -0
  190. lfx/components/composio/figma_composio.py +11 -0
  191. lfx/components/composio/finage_composio.py +11 -0
  192. lfx/components/composio/firecrawl_composio.py +11 -0
  193. lfx/components/composio/fireflies_composio.py +11 -0
  194. lfx/components/composio/fixer_composio.py +11 -0
  195. lfx/components/composio/flexisign_composio.py +11 -0
  196. lfx/components/composio/freshdesk_composio.py +11 -0
  197. lfx/components/composio/github_composio.py +11 -0
  198. lfx/components/composio/gmail_composio.py +38 -0
  199. lfx/components/composio/googlebigquery_composio.py +11 -0
  200. lfx/components/composio/googlecalendar_composio.py +11 -0
  201. lfx/components/composio/googleclassroom_composio.py +11 -0
  202. lfx/components/composio/googledocs_composio.py +11 -0
  203. lfx/components/composio/googlemeet_composio.py +11 -0
  204. lfx/components/composio/googlesheets_composio.py +11 -0
  205. lfx/components/composio/googletasks_composio.py +8 -0
  206. lfx/components/composio/heygen_composio.py +11 -0
  207. lfx/components/composio/instagram_composio.py +11 -0
  208. lfx/components/composio/jira_composio.py +11 -0
  209. lfx/components/composio/jotform_composio.py +11 -0
  210. lfx/components/composio/klaviyo_composio.py +11 -0
  211. lfx/components/composio/linear_composio.py +11 -0
  212. lfx/components/composio/listennotes_composio.py +11 -0
  213. lfx/components/composio/mem0_composio.py +11 -0
  214. lfx/components/composio/miro_composio.py +11 -0
  215. lfx/components/composio/missive_composio.py +11 -0
  216. lfx/components/composio/notion_composio.py +11 -0
  217. lfx/components/composio/onedrive_composio.py +11 -0
  218. lfx/components/composio/outlook_composio.py +11 -0
  219. lfx/components/composio/pandadoc_composio.py +11 -0
  220. lfx/components/composio/peopledatalabs_composio.py +11 -0
  221. lfx/components/composio/perplexityai_composio.py +11 -0
  222. lfx/components/composio/reddit_composio.py +11 -0
  223. lfx/components/composio/serpapi_composio.py +11 -0
  224. lfx/components/composio/slack_composio.py +11 -0
  225. lfx/components/composio/slackbot_composio.py +11 -0
  226. lfx/components/composio/snowflake_composio.py +11 -0
  227. lfx/components/composio/supabase_composio.py +11 -0
  228. lfx/components/composio/tavily_composio.py +11 -0
  229. lfx/components/composio/timelinesai_composio.py +11 -0
  230. lfx/components/composio/todoist_composio.py +11 -0
  231. lfx/components/composio/wrike_composio.py +11 -0
  232. lfx/components/composio/youtube_composio.py +11 -0
  233. lfx/components/confluence/__init__.py +3 -0
  234. lfx/components/confluence/confluence.py +84 -0
  235. lfx/components/couchbase/__init__.py +34 -0
  236. lfx/components/couchbase/couchbase.py +102 -0
  237. lfx/components/crewai/__init__.py +49 -0
  238. lfx/components/crewai/crewai.py +108 -0
  239. lfx/components/crewai/hierarchical_crew.py +47 -0
  240. lfx/components/crewai/hierarchical_task.py +45 -0
  241. lfx/components/crewai/sequential_crew.py +53 -0
  242. lfx/components/crewai/sequential_task.py +74 -0
  243. lfx/components/crewai/sequential_task_agent.py +144 -0
  244. lfx/components/cuga/__init__.py +34 -0
  245. lfx/components/cuga/cuga_agent.py +730 -0
  246. lfx/components/custom_component/__init__.py +34 -0
  247. lfx/components/custom_component/custom_component.py +31 -0
  248. lfx/components/data/__init__.py +114 -0
  249. lfx/components/data_source/__init__.py +58 -0
  250. lfx/components/data_source/api_request.py +577 -0
  251. lfx/components/data_source/csv_to_data.py +101 -0
  252. lfx/components/data_source/json_to_data.py +106 -0
  253. lfx/components/data_source/mock_data.py +398 -0
  254. lfx/components/data_source/news_search.py +166 -0
  255. lfx/components/data_source/rss.py +71 -0
  256. lfx/components/data_source/sql_executor.py +101 -0
  257. lfx/components/data_source/url.py +311 -0
  258. lfx/components/data_source/web_search.py +326 -0
  259. lfx/components/datastax/__init__.py +76 -0
  260. lfx/components/datastax/astradb_assistant_manager.py +307 -0
  261. lfx/components/datastax/astradb_chatmemory.py +40 -0
  262. lfx/components/datastax/astradb_cql.py +288 -0
  263. lfx/components/datastax/astradb_graph.py +217 -0
  264. lfx/components/datastax/astradb_tool.py +378 -0
  265. lfx/components/datastax/astradb_vectorize.py +122 -0
  266. lfx/components/datastax/astradb_vectorstore.py +449 -0
  267. lfx/components/datastax/create_assistant.py +59 -0
  268. lfx/components/datastax/create_thread.py +33 -0
  269. lfx/components/datastax/dotenv.py +36 -0
  270. lfx/components/datastax/get_assistant.py +38 -0
  271. lfx/components/datastax/getenvvar.py +31 -0
  272. lfx/components/datastax/graph_rag.py +141 -0
  273. lfx/components/datastax/hcd.py +315 -0
  274. lfx/components/datastax/list_assistants.py +26 -0
  275. lfx/components/datastax/run.py +90 -0
  276. lfx/components/deactivated/__init__.py +15 -0
  277. lfx/components/deactivated/amazon_kendra.py +66 -0
  278. lfx/components/deactivated/chat_litellm_model.py +158 -0
  279. lfx/components/deactivated/code_block_extractor.py +26 -0
  280. lfx/components/deactivated/documents_to_data.py +22 -0
  281. lfx/components/deactivated/embed.py +16 -0
  282. lfx/components/deactivated/extract_key_from_data.py +46 -0
  283. lfx/components/deactivated/json_document_builder.py +57 -0
  284. lfx/components/deactivated/list_flows.py +20 -0
  285. lfx/components/deactivated/mcp_sse.py +61 -0
  286. lfx/components/deactivated/mcp_stdio.py +62 -0
  287. lfx/components/deactivated/merge_data.py +93 -0
  288. lfx/components/deactivated/message.py +37 -0
  289. lfx/components/deactivated/metal.py +54 -0
  290. lfx/components/deactivated/multi_query.py +59 -0
  291. lfx/components/deactivated/retriever.py +43 -0
  292. lfx/components/deactivated/selective_passthrough.py +77 -0
  293. lfx/components/deactivated/should_run_next.py +40 -0
  294. lfx/components/deactivated/split_text.py +63 -0
  295. lfx/components/deactivated/store_message.py +24 -0
  296. lfx/components/deactivated/sub_flow.py +124 -0
  297. lfx/components/deactivated/vectara_self_query.py +76 -0
  298. lfx/components/deactivated/vector_store.py +24 -0
  299. lfx/components/deepseek/__init__.py +34 -0
  300. lfx/components/deepseek/deepseek.py +136 -0
  301. lfx/components/docling/__init__.py +43 -0
  302. lfx/components/docling/chunk_docling_document.py +186 -0
  303. lfx/components/docling/docling_inline.py +238 -0
  304. lfx/components/docling/docling_remote.py +195 -0
  305. lfx/components/docling/export_docling_document.py +117 -0
  306. lfx/components/documentloaders/__init__.py +3 -0
  307. lfx/components/duckduckgo/__init__.py +3 -0
  308. lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  309. lfx/components/elastic/__init__.py +37 -0
  310. lfx/components/elastic/elasticsearch.py +267 -0
  311. lfx/components/elastic/opensearch.py +789 -0
  312. lfx/components/elastic/opensearch_multimodal.py +1575 -0
  313. lfx/components/embeddings/__init__.py +37 -0
  314. lfx/components/embeddings/similarity.py +77 -0
  315. lfx/components/embeddings/text_embedder.py +65 -0
  316. lfx/components/exa/__init__.py +3 -0
  317. lfx/components/exa/exa_search.py +68 -0
  318. lfx/components/files_and_knowledge/__init__.py +47 -0
  319. lfx/components/files_and_knowledge/directory.py +113 -0
  320. lfx/components/files_and_knowledge/file.py +841 -0
  321. lfx/components/files_and_knowledge/ingestion.py +694 -0
  322. lfx/components/files_and_knowledge/retrieval.py +264 -0
  323. lfx/components/files_and_knowledge/save_file.py +746 -0
  324. lfx/components/firecrawl/__init__.py +43 -0
  325. lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
  326. lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
  327. lfx/components/firecrawl/firecrawl_map_api.py +89 -0
  328. lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
  329. lfx/components/flow_controls/__init__.py +58 -0
  330. lfx/components/flow_controls/conditional_router.py +208 -0
  331. lfx/components/flow_controls/data_conditional_router.py +126 -0
  332. lfx/components/flow_controls/flow_tool.py +111 -0
  333. lfx/components/flow_controls/listen.py +29 -0
  334. lfx/components/flow_controls/loop.py +163 -0
  335. lfx/components/flow_controls/notify.py +88 -0
  336. lfx/components/flow_controls/pass_message.py +36 -0
  337. lfx/components/flow_controls/run_flow.py +108 -0
  338. lfx/components/flow_controls/sub_flow.py +115 -0
  339. lfx/components/git/__init__.py +4 -0
  340. lfx/components/git/git.py +262 -0
  341. lfx/components/git/gitextractor.py +196 -0
  342. lfx/components/glean/__init__.py +3 -0
  343. lfx/components/glean/glean_search_api.py +173 -0
  344. lfx/components/google/__init__.py +17 -0
  345. lfx/components/google/gmail.py +193 -0
  346. lfx/components/google/google_bq_sql_executor.py +157 -0
  347. lfx/components/google/google_drive.py +92 -0
  348. lfx/components/google/google_drive_search.py +152 -0
  349. lfx/components/google/google_generative_ai.py +144 -0
  350. lfx/components/google/google_generative_ai_embeddings.py +141 -0
  351. lfx/components/google/google_oauth_token.py +89 -0
  352. lfx/components/google/google_search_api_core.py +68 -0
  353. lfx/components/google/google_serper_api_core.py +74 -0
  354. lfx/components/groq/__init__.py +34 -0
  355. lfx/components/groq/groq.py +143 -0
  356. lfx/components/helpers/__init__.py +154 -0
  357. lfx/components/homeassistant/__init__.py +7 -0
  358. lfx/components/homeassistant/home_assistant_control.py +152 -0
  359. lfx/components/homeassistant/list_home_assistant_states.py +137 -0
  360. lfx/components/huggingface/__init__.py +37 -0
  361. lfx/components/huggingface/huggingface.py +199 -0
  362. lfx/components/huggingface/huggingface_inference_api.py +106 -0
  363. lfx/components/ibm/__init__.py +34 -0
  364. lfx/components/ibm/watsonx.py +207 -0
  365. lfx/components/ibm/watsonx_embeddings.py +135 -0
  366. lfx/components/icosacomputing/__init__.py +5 -0
  367. lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
  368. lfx/components/input_output/__init__.py +40 -0
  369. lfx/components/input_output/chat.py +109 -0
  370. lfx/components/input_output/chat_output.py +184 -0
  371. lfx/components/input_output/text.py +27 -0
  372. lfx/components/input_output/text_output.py +29 -0
  373. lfx/components/input_output/webhook.py +56 -0
  374. lfx/components/jigsawstack/__init__.py +23 -0
  375. lfx/components/jigsawstack/ai_scrape.py +126 -0
  376. lfx/components/jigsawstack/ai_web_search.py +136 -0
  377. lfx/components/jigsawstack/file_read.py +115 -0
  378. lfx/components/jigsawstack/file_upload.py +94 -0
  379. lfx/components/jigsawstack/image_generation.py +205 -0
  380. lfx/components/jigsawstack/nsfw.py +60 -0
  381. lfx/components/jigsawstack/object_detection.py +124 -0
  382. lfx/components/jigsawstack/sentiment.py +112 -0
  383. lfx/components/jigsawstack/text_to_sql.py +90 -0
  384. lfx/components/jigsawstack/text_translate.py +77 -0
  385. lfx/components/jigsawstack/vocr.py +107 -0
  386. lfx/components/knowledge_bases/__init__.py +89 -0
  387. lfx/components/langchain_utilities/__init__.py +109 -0
  388. lfx/components/langchain_utilities/character.py +53 -0
  389. lfx/components/langchain_utilities/conversation.py +59 -0
  390. lfx/components/langchain_utilities/csv_agent.py +175 -0
  391. lfx/components/langchain_utilities/fake_embeddings.py +26 -0
  392. lfx/components/langchain_utilities/html_link_extractor.py +35 -0
  393. lfx/components/langchain_utilities/json_agent.py +100 -0
  394. lfx/components/langchain_utilities/langchain_hub.py +126 -0
  395. lfx/components/langchain_utilities/language_recursive.py +49 -0
  396. lfx/components/langchain_utilities/language_semantic.py +138 -0
  397. lfx/components/langchain_utilities/llm_checker.py +39 -0
  398. lfx/components/langchain_utilities/llm_math.py +42 -0
  399. lfx/components/langchain_utilities/natural_language.py +61 -0
  400. lfx/components/langchain_utilities/openai_tools.py +53 -0
  401. lfx/components/langchain_utilities/openapi.py +48 -0
  402. lfx/components/langchain_utilities/recursive_character.py +60 -0
  403. lfx/components/langchain_utilities/retrieval_qa.py +83 -0
  404. lfx/components/langchain_utilities/runnable_executor.py +137 -0
  405. lfx/components/langchain_utilities/self_query.py +80 -0
  406. lfx/components/langchain_utilities/spider.py +142 -0
  407. lfx/components/langchain_utilities/sql.py +40 -0
  408. lfx/components/langchain_utilities/sql_database.py +35 -0
  409. lfx/components/langchain_utilities/sql_generator.py +78 -0
  410. lfx/components/langchain_utilities/tool_calling.py +59 -0
  411. lfx/components/langchain_utilities/vector_store_info.py +49 -0
  412. lfx/components/langchain_utilities/vector_store_router.py +33 -0
  413. lfx/components/langchain_utilities/xml_agent.py +71 -0
  414. lfx/components/langwatch/__init__.py +3 -0
  415. lfx/components/langwatch/langwatch.py +278 -0
  416. lfx/components/link_extractors/__init__.py +3 -0
  417. lfx/components/llm_operations/__init__.py +46 -0
  418. lfx/components/llm_operations/batch_run.py +205 -0
  419. lfx/components/llm_operations/lambda_filter.py +218 -0
  420. lfx/components/llm_operations/llm_conditional_router.py +421 -0
  421. lfx/components/llm_operations/llm_selector.py +499 -0
  422. lfx/components/llm_operations/structured_output.py +244 -0
  423. lfx/components/lmstudio/__init__.py +34 -0
  424. lfx/components/lmstudio/lmstudioembeddings.py +89 -0
  425. lfx/components/lmstudio/lmstudiomodel.py +133 -0
  426. lfx/components/logic/__init__.py +181 -0
  427. lfx/components/maritalk/__init__.py +32 -0
  428. lfx/components/maritalk/maritalk.py +52 -0
  429. lfx/components/mem0/__init__.py +3 -0
  430. lfx/components/mem0/mem0_chat_memory.py +147 -0
  431. lfx/components/milvus/__init__.py +34 -0
  432. lfx/components/milvus/milvus.py +115 -0
  433. lfx/components/mistral/__init__.py +37 -0
  434. lfx/components/mistral/mistral.py +114 -0
  435. lfx/components/mistral/mistral_embeddings.py +58 -0
  436. lfx/components/models/__init__.py +89 -0
  437. lfx/components/models_and_agents/__init__.py +49 -0
  438. lfx/components/models_and_agents/agent.py +644 -0
  439. lfx/components/models_and_agents/embedding_model.py +423 -0
  440. lfx/components/models_and_agents/language_model.py +398 -0
  441. lfx/components/models_and_agents/mcp_component.py +594 -0
  442. lfx/components/models_and_agents/memory.py +268 -0
  443. lfx/components/models_and_agents/prompt.py +67 -0
  444. lfx/components/mongodb/__init__.py +34 -0
  445. lfx/components/mongodb/mongodb_atlas.py +213 -0
  446. lfx/components/needle/__init__.py +3 -0
  447. lfx/components/needle/needle.py +104 -0
  448. lfx/components/notdiamond/__init__.py +34 -0
  449. lfx/components/notdiamond/notdiamond.py +228 -0
  450. lfx/components/novita/__init__.py +32 -0
  451. lfx/components/novita/novita.py +130 -0
  452. lfx/components/nvidia/__init__.py +57 -0
  453. lfx/components/nvidia/nvidia.py +151 -0
  454. lfx/components/nvidia/nvidia_embedding.py +77 -0
  455. lfx/components/nvidia/nvidia_ingest.py +317 -0
  456. lfx/components/nvidia/nvidia_rerank.py +63 -0
  457. lfx/components/nvidia/system_assist.py +65 -0
  458. lfx/components/olivya/__init__.py +3 -0
  459. lfx/components/olivya/olivya.py +116 -0
  460. lfx/components/ollama/__init__.py +37 -0
  461. lfx/components/ollama/ollama.py +548 -0
  462. lfx/components/ollama/ollama_embeddings.py +103 -0
  463. lfx/components/openai/__init__.py +37 -0
  464. lfx/components/openai/openai.py +100 -0
  465. lfx/components/openai/openai_chat_model.py +176 -0
  466. lfx/components/openrouter/__init__.py +32 -0
  467. lfx/components/openrouter/openrouter.py +104 -0
  468. lfx/components/output_parsers/__init__.py +3 -0
  469. lfx/components/perplexity/__init__.py +34 -0
  470. lfx/components/perplexity/perplexity.py +75 -0
  471. lfx/components/pgvector/__init__.py +34 -0
  472. lfx/components/pgvector/pgvector.py +72 -0
  473. lfx/components/pinecone/__init__.py +34 -0
  474. lfx/components/pinecone/pinecone.py +134 -0
  475. lfx/components/processing/__init__.py +72 -0
  476. lfx/components/processing/alter_metadata.py +109 -0
  477. lfx/components/processing/combine_text.py +40 -0
  478. lfx/components/processing/converter.py +248 -0
  479. lfx/components/processing/create_data.py +111 -0
  480. lfx/components/processing/create_list.py +40 -0
  481. lfx/components/processing/data_operations.py +528 -0
  482. lfx/components/processing/data_to_dataframe.py +71 -0
  483. lfx/components/processing/dataframe_operations.py +313 -0
  484. lfx/components/processing/dataframe_to_toolset.py +259 -0
  485. lfx/components/processing/dynamic_create_data.py +357 -0
  486. lfx/components/processing/extract_key.py +54 -0
  487. lfx/components/processing/filter_data.py +43 -0
  488. lfx/components/processing/filter_data_values.py +89 -0
  489. lfx/components/processing/json_cleaner.py +104 -0
  490. lfx/components/processing/merge_data.py +91 -0
  491. lfx/components/processing/message_to_data.py +37 -0
  492. lfx/components/processing/output_parser.py +46 -0
  493. lfx/components/processing/parse_data.py +71 -0
  494. lfx/components/processing/parse_dataframe.py +69 -0
  495. lfx/components/processing/parse_json_data.py +91 -0
  496. lfx/components/processing/parser.py +148 -0
  497. lfx/components/processing/regex.py +83 -0
  498. lfx/components/processing/select_data.py +49 -0
  499. lfx/components/processing/split_text.py +141 -0
  500. lfx/components/processing/store_message.py +91 -0
  501. lfx/components/processing/update_data.py +161 -0
  502. lfx/components/prototypes/__init__.py +35 -0
  503. lfx/components/prototypes/python_function.py +73 -0
  504. lfx/components/qdrant/__init__.py +34 -0
  505. lfx/components/qdrant/qdrant.py +109 -0
  506. lfx/components/redis/__init__.py +37 -0
  507. lfx/components/redis/redis.py +89 -0
  508. lfx/components/redis/redis_chat.py +43 -0
  509. lfx/components/sambanova/__init__.py +32 -0
  510. lfx/components/sambanova/sambanova.py +84 -0
  511. lfx/components/scrapegraph/__init__.py +40 -0
  512. lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  513. lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
  514. lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  515. lfx/components/searchapi/__init__.py +34 -0
  516. lfx/components/searchapi/search.py +79 -0
  517. lfx/components/serpapi/__init__.py +3 -0
  518. lfx/components/serpapi/serp.py +115 -0
  519. lfx/components/supabase/__init__.py +34 -0
  520. lfx/components/supabase/supabase.py +76 -0
  521. lfx/components/tavily/__init__.py +4 -0
  522. lfx/components/tavily/tavily_extract.py +117 -0
  523. lfx/components/tavily/tavily_search.py +212 -0
  524. lfx/components/textsplitters/__init__.py +3 -0
  525. lfx/components/toolkits/__init__.py +3 -0
  526. lfx/components/tools/__init__.py +66 -0
  527. lfx/components/tools/calculator.py +109 -0
  528. lfx/components/tools/google_search_api.py +45 -0
  529. lfx/components/tools/google_serper_api.py +115 -0
  530. lfx/components/tools/python_code_structured_tool.py +328 -0
  531. lfx/components/tools/python_repl.py +98 -0
  532. lfx/components/tools/search_api.py +88 -0
  533. lfx/components/tools/searxng.py +145 -0
  534. lfx/components/tools/serp_api.py +120 -0
  535. lfx/components/tools/tavily_search_tool.py +345 -0
  536. lfx/components/tools/wikidata_api.py +103 -0
  537. lfx/components/tools/wikipedia_api.py +50 -0
  538. lfx/components/tools/yahoo_finance.py +130 -0
  539. lfx/components/twelvelabs/__init__.py +52 -0
  540. lfx/components/twelvelabs/convert_astra_results.py +84 -0
  541. lfx/components/twelvelabs/pegasus_index.py +311 -0
  542. lfx/components/twelvelabs/split_video.py +301 -0
  543. lfx/components/twelvelabs/text_embeddings.py +57 -0
  544. lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  545. lfx/components/twelvelabs/video_embeddings.py +100 -0
  546. lfx/components/twelvelabs/video_file.py +191 -0
  547. lfx/components/unstructured/__init__.py +3 -0
  548. lfx/components/unstructured/unstructured.py +121 -0
  549. lfx/components/upstash/__init__.py +34 -0
  550. lfx/components/upstash/upstash.py +124 -0
  551. lfx/components/utilities/__init__.py +43 -0
  552. lfx/components/utilities/calculator_core.py +89 -0
  553. lfx/components/utilities/current_date.py +42 -0
  554. lfx/components/utilities/id_generator.py +42 -0
  555. lfx/components/utilities/python_repl_core.py +98 -0
  556. lfx/components/vectara/__init__.py +37 -0
  557. lfx/components/vectara/vectara.py +97 -0
  558. lfx/components/vectara/vectara_rag.py +164 -0
  559. lfx/components/vectorstores/__init__.py +34 -0
  560. lfx/components/vectorstores/local_db.py +270 -0
  561. lfx/components/vertexai/__init__.py +37 -0
  562. lfx/components/vertexai/vertexai.py +71 -0
  563. lfx/components/vertexai/vertexai_embeddings.py +67 -0
  564. lfx/components/vlmrun/__init__.py +34 -0
  565. lfx/components/vlmrun/vlmrun_transcription.py +224 -0
  566. lfx/components/weaviate/__init__.py +34 -0
  567. lfx/components/weaviate/weaviate.py +89 -0
  568. lfx/components/wikipedia/__init__.py +4 -0
  569. lfx/components/wikipedia/wikidata.py +86 -0
  570. lfx/components/wikipedia/wikipedia.py +53 -0
  571. lfx/components/wolframalpha/__init__.py +3 -0
  572. lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
  573. lfx/components/xai/__init__.py +32 -0
  574. lfx/components/xai/xai.py +167 -0
  575. lfx/components/yahoosearch/__init__.py +3 -0
  576. lfx/components/yahoosearch/yahoo.py +137 -0
  577. lfx/components/youtube/__init__.py +52 -0
  578. lfx/components/youtube/channel.py +227 -0
  579. lfx/components/youtube/comments.py +231 -0
  580. lfx/components/youtube/playlist.py +33 -0
  581. lfx/components/youtube/search.py +120 -0
  582. lfx/components/youtube/trending.py +285 -0
  583. lfx/components/youtube/video_details.py +263 -0
  584. lfx/components/youtube/youtube_transcripts.py +206 -0
  585. lfx/components/zep/__init__.py +3 -0
  586. lfx/components/zep/zep.py +45 -0
  587. lfx/constants.py +6 -0
  588. lfx/custom/__init__.py +7 -0
  589. lfx/custom/attributes.py +87 -0
  590. lfx/custom/code_parser/__init__.py +3 -0
  591. lfx/custom/code_parser/code_parser.py +361 -0
  592. lfx/custom/custom_component/__init__.py +0 -0
  593. lfx/custom/custom_component/base_component.py +128 -0
  594. lfx/custom/custom_component/component.py +1890 -0
  595. lfx/custom/custom_component/component_with_cache.py +8 -0
  596. lfx/custom/custom_component/custom_component.py +650 -0
  597. lfx/custom/dependency_analyzer.py +165 -0
  598. lfx/custom/directory_reader/__init__.py +3 -0
  599. lfx/custom/directory_reader/directory_reader.py +359 -0
  600. lfx/custom/directory_reader/utils.py +171 -0
  601. lfx/custom/eval.py +12 -0
  602. lfx/custom/schema.py +32 -0
  603. lfx/custom/tree_visitor.py +21 -0
  604. lfx/custom/utils.py +877 -0
  605. lfx/custom/validate.py +523 -0
  606. lfx/events/__init__.py +1 -0
  607. lfx/events/event_manager.py +110 -0
  608. lfx/exceptions/__init__.py +0 -0
  609. lfx/exceptions/component.py +15 -0
  610. lfx/field_typing/__init__.py +91 -0
  611. lfx/field_typing/constants.py +216 -0
  612. lfx/field_typing/range_spec.py +35 -0
  613. lfx/graph/__init__.py +6 -0
  614. lfx/graph/edge/__init__.py +0 -0
  615. lfx/graph/edge/base.py +300 -0
  616. lfx/graph/edge/schema.py +119 -0
  617. lfx/graph/edge/utils.py +0 -0
  618. lfx/graph/graph/__init__.py +0 -0
  619. lfx/graph/graph/ascii.py +202 -0
  620. lfx/graph/graph/base.py +2298 -0
  621. lfx/graph/graph/constants.py +63 -0
  622. lfx/graph/graph/runnable_vertices_manager.py +133 -0
  623. lfx/graph/graph/schema.py +53 -0
  624. lfx/graph/graph/state_model.py +66 -0
  625. lfx/graph/graph/utils.py +1024 -0
  626. lfx/graph/schema.py +75 -0
  627. lfx/graph/state/__init__.py +0 -0
  628. lfx/graph/state/model.py +250 -0
  629. lfx/graph/utils.py +206 -0
  630. lfx/graph/vertex/__init__.py +0 -0
  631. lfx/graph/vertex/base.py +826 -0
  632. lfx/graph/vertex/constants.py +0 -0
  633. lfx/graph/vertex/exceptions.py +4 -0
  634. lfx/graph/vertex/param_handler.py +316 -0
  635. lfx/graph/vertex/schema.py +26 -0
  636. lfx/graph/vertex/utils.py +19 -0
  637. lfx/graph/vertex/vertex_types.py +489 -0
  638. lfx/helpers/__init__.py +141 -0
  639. lfx/helpers/base_model.py +71 -0
  640. lfx/helpers/custom.py +13 -0
  641. lfx/helpers/data.py +167 -0
  642. lfx/helpers/flow.py +308 -0
  643. lfx/inputs/__init__.py +68 -0
  644. lfx/inputs/constants.py +2 -0
  645. lfx/inputs/input_mixin.py +352 -0
  646. lfx/inputs/inputs.py +718 -0
  647. lfx/inputs/validators.py +19 -0
  648. lfx/interface/__init__.py +6 -0
  649. lfx/interface/components.py +897 -0
  650. lfx/interface/importing/__init__.py +5 -0
  651. lfx/interface/importing/utils.py +39 -0
  652. lfx/interface/initialize/__init__.py +3 -0
  653. lfx/interface/initialize/loading.py +317 -0
  654. lfx/interface/listing.py +26 -0
  655. lfx/interface/run.py +16 -0
  656. lfx/interface/utils.py +111 -0
  657. lfx/io/__init__.py +63 -0
  658. lfx/io/schema.py +295 -0
  659. lfx/load/__init__.py +8 -0
  660. lfx/load/load.py +256 -0
  661. lfx/load/utils.py +99 -0
  662. lfx/log/__init__.py +5 -0
  663. lfx/log/logger.py +411 -0
  664. lfx/logging/__init__.py +11 -0
  665. lfx/logging/logger.py +24 -0
  666. lfx/memory/__init__.py +70 -0
  667. lfx/memory/stubs.py +302 -0
  668. lfx/processing/__init__.py +1 -0
  669. lfx/processing/process.py +238 -0
  670. lfx/processing/utils.py +25 -0
  671. lfx/py.typed +0 -0
  672. lfx/schema/__init__.py +66 -0
  673. lfx/schema/artifact.py +83 -0
  674. lfx/schema/content_block.py +62 -0
  675. lfx/schema/content_types.py +91 -0
  676. lfx/schema/cross_module.py +80 -0
  677. lfx/schema/data.py +309 -0
  678. lfx/schema/dataframe.py +210 -0
  679. lfx/schema/dotdict.py +74 -0
  680. lfx/schema/encoders.py +13 -0
  681. lfx/schema/graph.py +47 -0
  682. lfx/schema/image.py +184 -0
  683. lfx/schema/json_schema.py +186 -0
  684. lfx/schema/log.py +62 -0
  685. lfx/schema/message.py +493 -0
  686. lfx/schema/openai_responses_schemas.py +74 -0
  687. lfx/schema/properties.py +41 -0
  688. lfx/schema/schema.py +180 -0
  689. lfx/schema/serialize.py +13 -0
  690. lfx/schema/table.py +142 -0
  691. lfx/schema/validators.py +114 -0
  692. lfx/serialization/__init__.py +5 -0
  693. lfx/serialization/constants.py +2 -0
  694. lfx/serialization/serialization.py +314 -0
  695. lfx/services/__init__.py +26 -0
  696. lfx/services/base.py +28 -0
  697. lfx/services/cache/__init__.py +6 -0
  698. lfx/services/cache/base.py +183 -0
  699. lfx/services/cache/service.py +166 -0
  700. lfx/services/cache/utils.py +169 -0
  701. lfx/services/chat/__init__.py +1 -0
  702. lfx/services/chat/config.py +2 -0
  703. lfx/services/chat/schema.py +10 -0
  704. lfx/services/database/__init__.py +5 -0
  705. lfx/services/database/service.py +25 -0
  706. lfx/services/deps.py +194 -0
  707. lfx/services/factory.py +19 -0
  708. lfx/services/initialize.py +19 -0
  709. lfx/services/interfaces.py +103 -0
  710. lfx/services/manager.py +185 -0
  711. lfx/services/mcp_composer/__init__.py +6 -0
  712. lfx/services/mcp_composer/factory.py +16 -0
  713. lfx/services/mcp_composer/service.py +1441 -0
  714. lfx/services/schema.py +21 -0
  715. lfx/services/session.py +87 -0
  716. lfx/services/settings/__init__.py +3 -0
  717. lfx/services/settings/auth.py +133 -0
  718. lfx/services/settings/base.py +668 -0
  719. lfx/services/settings/constants.py +43 -0
  720. lfx/services/settings/factory.py +23 -0
  721. lfx/services/settings/feature_flags.py +11 -0
  722. lfx/services/settings/service.py +35 -0
  723. lfx/services/settings/utils.py +40 -0
  724. lfx/services/shared_component_cache/__init__.py +1 -0
  725. lfx/services/shared_component_cache/factory.py +30 -0
  726. lfx/services/shared_component_cache/service.py +9 -0
  727. lfx/services/storage/__init__.py +5 -0
  728. lfx/services/storage/local.py +185 -0
  729. lfx/services/storage/service.py +177 -0
  730. lfx/services/tracing/__init__.py +1 -0
  731. lfx/services/tracing/service.py +21 -0
  732. lfx/settings.py +6 -0
  733. lfx/template/__init__.py +6 -0
  734. lfx/template/field/__init__.py +0 -0
  735. lfx/template/field/base.py +260 -0
  736. lfx/template/field/prompt.py +15 -0
  737. lfx/template/frontend_node/__init__.py +6 -0
  738. lfx/template/frontend_node/base.py +214 -0
  739. lfx/template/frontend_node/constants.py +65 -0
  740. lfx/template/frontend_node/custom_components.py +79 -0
  741. lfx/template/template/__init__.py +0 -0
  742. lfx/template/template/base.py +100 -0
  743. lfx/template/utils.py +217 -0
  744. lfx/type_extraction/__init__.py +19 -0
  745. lfx/type_extraction/type_extraction.py +75 -0
  746. lfx/type_extraction.py +80 -0
  747. lfx/utils/__init__.py +1 -0
  748. lfx/utils/async_helpers.py +42 -0
  749. lfx/utils/component_utils.py +154 -0
  750. lfx/utils/concurrency.py +60 -0
  751. lfx/utils/connection_string_parser.py +11 -0
  752. lfx/utils/constants.py +233 -0
  753. lfx/utils/data_structure.py +212 -0
  754. lfx/utils/exceptions.py +22 -0
  755. lfx/utils/helpers.py +34 -0
  756. lfx/utils/image.py +79 -0
  757. lfx/utils/langflow_utils.py +52 -0
  758. lfx/utils/lazy_load.py +15 -0
  759. lfx/utils/request_utils.py +18 -0
  760. lfx/utils/schemas.py +139 -0
  761. lfx/utils/ssrf_protection.py +384 -0
  762. lfx/utils/util.py +626 -0
  763. lfx/utils/util_strings.py +56 -0
  764. lfx/utils/validate_cloud.py +26 -0
  765. lfx/utils/version.py +24 -0
  766. lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
  767. lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
  768. lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
  769. lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,111 @@
1
+ from typing import Any
2
+
3
+ from lfx.custom.custom_component.component import Component
4
+ from lfx.field_typing.range_spec import RangeSpec
5
+ from lfx.inputs.inputs import BoolInput, DictInput, IntInput, MessageTextInput
6
+ from lfx.io import Output
7
+ from lfx.schema.data import Data
8
+ from lfx.schema.dotdict import dotdict
9
+
10
+
11
+ class CreateDataComponent(Component):
12
+ display_name: str = "Create Data"
13
+ description: str = "Dynamically create a Data with a specified number of fields."
14
+ name: str = "CreateData"
15
+ MAX_FIELDS = 15 # Define a constant for maximum number of fields
16
+ legacy = True
17
+ replacement = ["processing.DataOperations"]
18
+ icon = "ListFilter"
19
+
20
+ inputs = [
21
+ IntInput(
22
+ name="number_of_fields",
23
+ display_name="Number of Fields",
24
+ info="Number of fields to be added to the record.",
25
+ real_time_refresh=True,
26
+ value=1,
27
+ range_spec=RangeSpec(min=1, max=MAX_FIELDS, step=1, step_type="int"),
28
+ ),
29
+ MessageTextInput(
30
+ name="text_key",
31
+ display_name="Text Key",
32
+ info="Key that identifies the field to be used as the text content.",
33
+ advanced=True,
34
+ ),
35
+ BoolInput(
36
+ name="text_key_validator",
37
+ display_name="Text Key Validator",
38
+ advanced=True,
39
+ info="If enabled, checks if the given 'Text Key' is present in the given 'Data'.",
40
+ ),
41
+ ]
42
+
43
+ outputs = [
44
+ Output(display_name="Data", name="data", method="build_data"),
45
+ ]
46
+
47
+ def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
48
+ if field_name == "number_of_fields":
49
+ default_keys = ["code", "_type", "number_of_fields", "text_key", "text_key_validator"]
50
+ try:
51
+ field_value_int = int(field_value)
52
+ except ValueError:
53
+ return build_config
54
+ existing_fields = {}
55
+ if field_value_int > self.MAX_FIELDS:
56
+ build_config["number_of_fields"]["value"] = self.MAX_FIELDS
57
+ msg = (
58
+ f"Number of fields cannot exceed {self.MAX_FIELDS}. "
59
+ "Please adjust the number of fields to be within the allowed limit."
60
+ )
61
+ raise ValueError(msg)
62
+ if len(build_config) > len(default_keys):
63
+ # back up the existing template fields
64
+ for key in build_config.copy():
65
+ if key not in default_keys:
66
+ existing_fields[key] = build_config.pop(key)
67
+
68
+ for i in range(1, field_value_int + 1):
69
+ key = f"field_{i}_key"
70
+ if key in existing_fields:
71
+ field = existing_fields[key]
72
+ build_config[key] = field
73
+ else:
74
+ field = DictInput(
75
+ display_name=f"Field {i}",
76
+ name=key,
77
+ info=f"Key for field {i}.",
78
+ input_types=["Message", "Data"],
79
+ )
80
+ build_config[field.name] = field.to_dict()
81
+
82
+ build_config["number_of_fields"]["value"] = field_value_int
83
+ return build_config
84
+
85
+ async def build_data(self) -> Data:
86
+ data = self.get_data()
87
+ return_data = Data(data=data, text_key=self.text_key)
88
+ self.status = return_data
89
+ if self.text_key_validator:
90
+ self.validate_text_key()
91
+ return return_data
92
+
93
+ def get_data(self):
94
+ """Function to get the Data from the attributes."""
95
+ data = {}
96
+ for value_dict in self._attributes.values():
97
+ if isinstance(value_dict, dict):
98
+ # Check if the value of the value_dict is a Data
99
+ value_dict_ = {
100
+ key: value.get_text() if isinstance(value, Data) else value for key, value in value_dict.items()
101
+ }
102
+ data.update(value_dict_)
103
+ return data
104
+
105
+ def validate_text_key(self) -> None:
106
+ """This function validates that the Text Key is one of the keys in the Data."""
107
+ data_keys = self.get_data().keys()
108
+ if self.text_key not in data_keys and self.text_key != "":
109
+ formatted_data_keys = ", ".join(data_keys)
110
+ msg = f"Text Key: '{self.text_key}' not found in the Data keys: '{formatted_data_keys}'"
111
+ raise ValueError(msg)
@@ -0,0 +1,40 @@
1
+ from lfx.custom.custom_component.component import Component
2
+ from lfx.inputs.inputs import StrInput
3
+ from lfx.schema.data import Data
4
+ from lfx.schema.dataframe import DataFrame
5
+ from lfx.template.field.base import Output
6
+
7
+
8
+ class CreateListComponent(Component):
9
+ display_name = "Create List"
10
+ description = "Creates a list of texts."
11
+ icon = "list"
12
+ name = "CreateList"
13
+ legacy = True
14
+
15
+ inputs = [
16
+ StrInput(
17
+ name="texts",
18
+ display_name="Texts",
19
+ info="Enter one or more texts.",
20
+ is_list=True,
21
+ ),
22
+ ]
23
+
24
+ outputs = [
25
+ Output(display_name="Data List", name="list", method="create_list"),
26
+ Output(display_name="DataFrame", name="dataframe", method="as_dataframe"),
27
+ ]
28
+
29
+ def create_list(self) -> list[Data]:
30
+ data = [Data(text=text) for text in self.texts]
31
+ self.status = data
32
+ return data
33
+
34
+ def as_dataframe(self) -> DataFrame:
35
+ """Convert the list of Data objects into a DataFrame.
36
+
37
+ Returns:
38
+ DataFrame: A DataFrame containing the list data.
39
+ """
40
+ return DataFrame(self.create_list())
@@ -0,0 +1,528 @@
1
+ import ast
2
+ import json
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ import jq
6
+ from json_repair import repair_json
7
+
8
+ from lfx.custom import Component
9
+ from lfx.inputs import DictInput, DropdownInput, MessageTextInput, SortableListInput
10
+ from lfx.io import DataInput, MultilineInput, Output
11
+ from lfx.log.logger import logger
12
+ from lfx.schema import Data
13
+ from lfx.schema.dotdict import dotdict
14
+ from lfx.utils.component_utils import set_current_fields, set_field_display
15
+
16
+ if TYPE_CHECKING:
17
+ from collections.abc import Callable
18
+
19
+ ACTION_CONFIG = {
20
+ "Select Keys": {"is_list": False, "log_msg": "setting filter fields"},
21
+ "Literal Eval": {"is_list": False, "log_msg": "setting evaluate fields"},
22
+ "Combine": {"is_list": True, "log_msg": "setting combine fields"},
23
+ "Filter Values": {"is_list": False, "log_msg": "setting filter values fields"},
24
+ "Append or Update": {"is_list": False, "log_msg": "setting Append or Update fields"},
25
+ "Remove Keys": {"is_list": False, "log_msg": "setting remove keys fields"},
26
+ "Rename Keys": {"is_list": False, "log_msg": "setting rename keys fields"},
27
+ "Path Selection": {"is_list": False, "log_msg": "setting mapped key extractor fields"},
28
+ "JQ Expression": {"is_list": False, "log_msg": "setting parse json fields"},
29
+ }
30
+ OPERATORS = {
31
+ "equals": lambda a, b: str(a) == str(b),
32
+ "not equals": lambda a, b: str(a) != str(b),
33
+ "contains": lambda a, b: str(b) in str(a),
34
+ "starts with": lambda a, b: str(a).startswith(str(b)),
35
+ "ends with": lambda a, b: str(a).endswith(str(b)),
36
+ }
37
+
38
+
39
+ class DataOperationsComponent(Component):
40
+ display_name = "Data Operations"
41
+ description = "Perform various operations on a Data object."
42
+ icon = "file-json"
43
+ name = "DataOperations"
44
+ default_keys = ["operations", "data"]
45
+ metadata = {
46
+ "keywords": [
47
+ "data",
48
+ "operations",
49
+ "filter values",
50
+ "Append or Update",
51
+ "remove keys",
52
+ "rename keys",
53
+ "select keys",
54
+ "literal eval",
55
+ "combine",
56
+ "filter",
57
+ "append",
58
+ "update",
59
+ "remove",
60
+ "rename",
61
+ "data operations",
62
+ "data manipulation",
63
+ "data transformation",
64
+ "data filtering",
65
+ "data selection",
66
+ "data combination",
67
+ "Parse JSON",
68
+ "JSON Query",
69
+ "JQ Query",
70
+ ],
71
+ }
72
+ actions_data = {
73
+ "Select Keys": ["select_keys_input", "operations"],
74
+ "Literal Eval": [],
75
+ "Combine": [],
76
+ "Filter Values": ["filter_values", "operations", "operator", "filter_key"],
77
+ "Append or Update": ["append_update_data", "operations"],
78
+ "Remove Keys": ["remove_keys_input", "operations"],
79
+ "Rename Keys": ["rename_keys_input", "operations"],
80
+ "Path Selection": ["mapped_json_display", "selected_key", "operations"],
81
+ "JQ Expression": ["query", "operations"],
82
+ }
83
+
84
+ @staticmethod
85
+ def extract_all_paths(obj, path=""):
86
+ paths = []
87
+ if isinstance(obj, dict):
88
+ for k, v in obj.items():
89
+ new_path = f"{path}.{k}" if path else f".{k}"
90
+ paths.append(new_path)
91
+ paths.extend(DataOperationsComponent.extract_all_paths(v, new_path))
92
+ elif isinstance(obj, list) and obj:
93
+ new_path = f"{path}[0]"
94
+ paths.append(new_path)
95
+ paths.extend(DataOperationsComponent.extract_all_paths(obj[0], new_path))
96
+ return paths
97
+
98
+ @staticmethod
99
+ def remove_keys_recursive(obj, keys_to_remove):
100
+ if isinstance(obj, dict):
101
+ return {
102
+ k: DataOperationsComponent.remove_keys_recursive(v, keys_to_remove)
103
+ for k, v in obj.items()
104
+ if k not in keys_to_remove
105
+ }
106
+ if isinstance(obj, list):
107
+ return [DataOperationsComponent.remove_keys_recursive(item, keys_to_remove) for item in obj]
108
+ return obj
109
+
110
+ @staticmethod
111
+ def rename_keys_recursive(obj, rename_map):
112
+ if isinstance(obj, dict):
113
+ return {
114
+ rename_map.get(k, k): DataOperationsComponent.rename_keys_recursive(v, rename_map)
115
+ for k, v in obj.items()
116
+ }
117
+ if isinstance(obj, list):
118
+ return [DataOperationsComponent.rename_keys_recursive(item, rename_map) for item in obj]
119
+ return obj
120
+
121
+ inputs = [
122
+ DataInput(name="data", display_name="Data", info="Data object to filter.", required=True, is_list=True),
123
+ SortableListInput(
124
+ name="operations",
125
+ display_name="Operations",
126
+ placeholder="Select Operation",
127
+ info="List of operations to perform on the data.",
128
+ options=[
129
+ {"name": "Select Keys", "icon": "lasso-select"},
130
+ {"name": "Literal Eval", "icon": "braces"},
131
+ {"name": "Combine", "icon": "merge"},
132
+ {"name": "Filter Values", "icon": "filter"},
133
+ {"name": "Append or Update", "icon": "circle-plus"},
134
+ {"name": "Remove Keys", "icon": "eraser"},
135
+ {"name": "Rename Keys", "icon": "pencil-line"},
136
+ {"name": "Path Selection", "icon": "mouse-pointer"},
137
+ {"name": "JQ Expression", "icon": "terminal"},
138
+ ],
139
+ real_time_refresh=True,
140
+ limit=1,
141
+ ),
142
+ # select keys inputs
143
+ MessageTextInput(
144
+ name="select_keys_input",
145
+ display_name="Select Keys",
146
+ info="List of keys to select from the data. Only top-level keys can be selected.",
147
+ show=False,
148
+ is_list=True,
149
+ ),
150
+ # filter values inputs
151
+ MessageTextInput(
152
+ name="filter_key",
153
+ display_name="Filter Key",
154
+ info=(
155
+ "Name of the key containing the list to filter. "
156
+ "It must be a top-level key in the JSON and its value must be a list."
157
+ ),
158
+ is_list=True,
159
+ show=False,
160
+ ),
161
+ DropdownInput(
162
+ name="operator",
163
+ display_name="Comparison Operator",
164
+ options=["equals", "not equals", "contains", "starts with", "ends with"],
165
+ info="The operator to apply for comparing the values.",
166
+ value="equals",
167
+ advanced=False,
168
+ show=False,
169
+ ),
170
+ DictInput(
171
+ name="filter_values",
172
+ display_name="Filter Values",
173
+ info="List of values to filter by.",
174
+ show=False,
175
+ is_list=True,
176
+ ),
177
+ # update/ Append data inputs
178
+ DictInput(
179
+ name="append_update_data",
180
+ display_name="Append or Update",
181
+ info="Data to append or update the existing data with. Only top-level keys are checked.",
182
+ show=False,
183
+ value={"key": "value"},
184
+ is_list=True,
185
+ ),
186
+ # remove keys inputs
187
+ MessageTextInput(
188
+ name="remove_keys_input",
189
+ display_name="Remove Keys",
190
+ info="List of keys to remove from the data.",
191
+ show=False,
192
+ is_list=True,
193
+ ),
194
+ # rename keys inputs
195
+ DictInput(
196
+ name="rename_keys_input",
197
+ display_name="Rename Keys",
198
+ info="List of keys to rename in the data.",
199
+ show=False,
200
+ is_list=True,
201
+ value={"old_key": "new_key"},
202
+ ),
203
+ MultilineInput(
204
+ name="mapped_json_display",
205
+ display_name="JSON to Map",
206
+ info="Paste or preview your JSON here to explore its structure and select a path for extraction.",
207
+ required=False,
208
+ refresh_button=True,
209
+ real_time_refresh=True,
210
+ placeholder="Add a JSON example.",
211
+ show=False,
212
+ ),
213
+ DropdownInput(
214
+ name="selected_key", display_name="Select Path", options=[], required=False, dynamic=True, show=False
215
+ ),
216
+ MessageTextInput(
217
+ name="query",
218
+ display_name="JQ Expression",
219
+ info="JSON Query to filter the data. Used by Parse JSON operation.",
220
+ placeholder="e.g., .properties.id",
221
+ show=False,
222
+ ),
223
+ ]
224
+ outputs = [
225
+ Output(display_name="Data", name="data_output", method="as_data"),
226
+ ]
227
+
228
+ # Helper methods for data operations
229
+ def get_data_dict(self) -> dict:
230
+ """Extract data dictionary from Data object."""
231
+ data = self.data[0] if isinstance(self.data, list) and len(self.data) == 1 else self.data
232
+ return data.model_dump()
233
+
234
+ def json_query(self) -> Data:
235
+ import json
236
+
237
+ import jq
238
+
239
+ if not self.query or not self.query.strip():
240
+ msg = "JSON Query is required and cannot be blank."
241
+ raise ValueError(msg)
242
+ raw_data = self.get_data_dict()
243
+ try:
244
+ input_str = json.dumps(raw_data)
245
+ repaired = repair_json(input_str)
246
+ data_json = json.loads(repaired)
247
+ jq_input = data_json["data"] if isinstance(data_json, dict) and "data" in data_json else data_json
248
+ results = jq.compile(self.query).input(jq_input).all()
249
+ if not results:
250
+ msg = "No result from JSON query."
251
+ raise ValueError(msg)
252
+ result = results[0] if len(results) == 1 else results
253
+ if result is None or result == "None":
254
+ msg = "JSON query returned null/None. Check if the path exists in your data."
255
+ raise ValueError(msg)
256
+ if isinstance(result, dict):
257
+ return Data(data=result)
258
+ return Data(data={"result": result})
259
+ except (ValueError, TypeError, KeyError, json.JSONDecodeError) as e:
260
+ logger.error(f"JSON Query failed: {e}")
261
+ msg = f"JSON Query error: {e}"
262
+ raise ValueError(msg) from e
263
+
264
+ def get_normalized_data(self) -> dict:
265
+ """Get normalized data dictionary, handling the 'data' key if present."""
266
+ data_dict = self.get_data_dict()
267
+ return data_dict.get("data", data_dict)
268
+
269
+ def data_is_list(self) -> bool:
270
+ """Check if data contains multiple items."""
271
+ return isinstance(self.data, list) and len(self.data) > 1
272
+
273
+ def validate_single_data(self, operation: str) -> None:
274
+ """Validate that the operation is being performed on a single data object."""
275
+ if self.data_is_list():
276
+ msg = f"{operation} operation is not supported for multiple data objects."
277
+ raise ValueError(msg)
278
+
279
+ def operation_exception(self, operations: list[str]) -> None:
280
+ """Raise exception for incompatible operations."""
281
+ msg = f"{operations} operations are not supported in combination with each other."
282
+ raise ValueError(msg)
283
+
284
+ # Data transformation operations
285
+ def select_keys(self, *, evaluate: bool | None = None) -> Data:
286
+ """Select specific keys from the data dictionary."""
287
+ self.validate_single_data("Select Keys")
288
+ data_dict = self.get_normalized_data()
289
+ filter_criteria: list[str] = self.select_keys_input
290
+
291
+ # Filter the data
292
+ if len(filter_criteria) == 1 and filter_criteria[0] == "data":
293
+ filtered = data_dict["data"]
294
+ else:
295
+ if not all(key in data_dict for key in filter_criteria):
296
+ msg = f"Select key not found in data. Available keys: {list(data_dict.keys())}"
297
+ raise ValueError(msg)
298
+ filtered = {key: value for key, value in data_dict.items() if key in filter_criteria}
299
+
300
+ # Create a new Data object with the filtered data
301
+ if evaluate:
302
+ filtered = self.recursive_eval(filtered)
303
+
304
+ # Return a new Data object with the filtered data directly in the data attribute
305
+ return Data(data=filtered)
306
+
307
+ def remove_keys(self) -> Data:
308
+ """Remove specified keys from the data dictionary, recursively."""
309
+ self.validate_single_data("Remove Keys")
310
+ data_dict = self.get_normalized_data()
311
+ remove_keys_input: list[str] = self.remove_keys_input
312
+
313
+ filtered = DataOperationsComponent.remove_keys_recursive(data_dict, set(remove_keys_input))
314
+ return Data(data=filtered)
315
+
316
+ def rename_keys(self) -> Data:
317
+ """Rename keys in the data dictionary, recursively."""
318
+ self.validate_single_data("Rename Keys")
319
+ data_dict = self.get_normalized_data()
320
+ rename_keys_input: dict[str, str] = self.rename_keys_input
321
+
322
+ renamed = DataOperationsComponent.rename_keys_recursive(data_dict, rename_keys_input)
323
+ return Data(data=renamed)
324
+
325
+ def recursive_eval(self, data: Any) -> Any:
326
+ """Recursively evaluate string values in a dictionary or list.
327
+
328
+ If the value is a string that can be evaluated, it will be evaluated.
329
+ Otherwise, the original value is returned.
330
+ """
331
+ if isinstance(data, dict):
332
+ return {k: self.recursive_eval(v) for k, v in data.items()}
333
+ if isinstance(data, list):
334
+ return [self.recursive_eval(item) for item in data]
335
+ if isinstance(data, str):
336
+ try:
337
+ # Only attempt to evaluate strings that look like Python literals
338
+ if (
339
+ data.strip().startswith(("{", "[", "(", "'", '"'))
340
+ or data.strip().lower() in ("true", "false", "none")
341
+ or data.strip().replace(".", "").isdigit()
342
+ ):
343
+ return ast.literal_eval(data)
344
+ # return data
345
+ except (ValueError, SyntaxError, TypeError, MemoryError):
346
+ # If evaluation fails for any reason, return the original string
347
+ return data
348
+ else:
349
+ return data
350
+ return data
351
+
352
+ def evaluate_data(self) -> Data:
353
+ """Evaluate string values in the data dictionary."""
354
+ self.validate_single_data("Literal Eval")
355
+ logger.info("evaluating data")
356
+ return Data(**self.recursive_eval(self.get_data_dict()))
357
+
358
+ def combine_data(self, *, evaluate: bool | None = None) -> Data:
359
+ """Combine multiple data objects into one."""
360
+ logger.info("combining data")
361
+ if not self.data_is_list():
362
+ return self.data[0] if self.data else Data(data={})
363
+
364
+ if len(self.data) == 1:
365
+ msg = "Combine operation requires multiple data inputs."
366
+ raise ValueError(msg)
367
+
368
+ data_dicts = [data.model_dump().get("data", data.model_dump()) for data in self.data]
369
+ combined_data = {}
370
+
371
+ for data_dict in data_dicts:
372
+ for key, value in data_dict.items():
373
+ if key not in combined_data:
374
+ combined_data[key] = value
375
+ elif isinstance(combined_data[key], list):
376
+ if isinstance(value, list):
377
+ combined_data[key].extend(value)
378
+ else:
379
+ combined_data[key].append(value)
380
+ else:
381
+ # If current value is not a list, convert it to list and add new value
382
+ combined_data[key] = (
383
+ [combined_data[key], value] if not isinstance(value, list) else [combined_data[key], *value]
384
+ )
385
+
386
+ if evaluate:
387
+ combined_data = self.recursive_eval(combined_data)
388
+
389
+ return Data(**combined_data)
390
+
391
+ def filter_data(self, input_data: list[dict[str, Any]], filter_key: str, filter_value: str, operator: str) -> list:
392
+ """Filter list data based on key, value, and operator."""
393
+ # Validate inputs
394
+ if not input_data:
395
+ self.status = "Input data is empty."
396
+ return []
397
+
398
+ if not filter_key or not filter_value:
399
+ self.status = "Filter key or value is missing."
400
+ return input_data
401
+
402
+ # Filter the data
403
+ filtered_data = []
404
+ for item in input_data:
405
+ if isinstance(item, dict) and filter_key in item:
406
+ if self.compare_values(item[filter_key], filter_value, operator):
407
+ filtered_data.append(item)
408
+ else:
409
+ self.status = f"Warning: Some items don't have the key '{filter_key}' or are not dictionaries."
410
+
411
+ return filtered_data
412
+
413
+ def compare_values(self, item_value: Any, filter_value: str, operator: str) -> bool:
414
+ comparison_func = OPERATORS.get(operator)
415
+ if comparison_func:
416
+ return comparison_func(item_value, filter_value)
417
+ return False
418
+
419
+ def multi_filter_data(self) -> Data:
420
+ """Apply multiple filters to the data."""
421
+ self.validate_single_data("Filter Values")
422
+ data_filtered = self.get_normalized_data()
423
+
424
+ for filter_key in self.filter_key:
425
+ if filter_key not in data_filtered:
426
+ msg = f"Filter key '{filter_key}' not found in data. Available keys: {list(data_filtered.keys())}"
427
+ raise ValueError(msg)
428
+
429
+ if isinstance(data_filtered[filter_key], list):
430
+ for filter_data in self.filter_values:
431
+ filter_value = self.filter_values.get(filter_data)
432
+ if filter_value is not None:
433
+ data_filtered[filter_key] = self.filter_data(
434
+ input_data=data_filtered[filter_key],
435
+ filter_key=filter_data,
436
+ filter_value=filter_value,
437
+ operator=self.operator,
438
+ )
439
+ else:
440
+ msg = f"Filter key '{filter_key}' is not a list."
441
+ raise TypeError(msg)
442
+
443
+ return Data(**data_filtered)
444
+
445
+ def append_update(self) -> Data:
446
+ """Append or Update with new key-value pairs."""
447
+ self.validate_single_data("Append or Update")
448
+ data_filtered = self.get_normalized_data()
449
+
450
+ for key, value in self.append_update_data.items():
451
+ data_filtered[key] = value
452
+
453
+ return Data(**data_filtered)
454
+
455
+ # Configuration and execution methods
456
+ def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:
457
+ if field_name == "operations":
458
+ build_config["operations"]["value"] = field_value
459
+ selected_actions = [action["name"] for action in field_value]
460
+ if len(selected_actions) == 1 and selected_actions[0] in ACTION_CONFIG:
461
+ action = selected_actions[0]
462
+ config = ACTION_CONFIG[action]
463
+ build_config["data"]["is_list"] = config["is_list"]
464
+ logger.info(config["log_msg"])
465
+ return set_current_fields(
466
+ build_config=build_config,
467
+ action_fields=self.actions_data,
468
+ selected_action=action,
469
+ default_fields=["operations", "data"],
470
+ func=set_field_display,
471
+ )
472
+
473
+ if field_name == "mapped_json_display":
474
+ try:
475
+ parsed_json = json.loads(field_value)
476
+ keys = DataOperationsComponent.extract_all_paths(parsed_json)
477
+ build_config["selected_key"]["options"] = keys
478
+ build_config["selected_key"]["show"] = True
479
+ except (json.JSONDecodeError, TypeError, ValueError) as e:
480
+ logger.error(f"Error parsing mapped JSON: {e}")
481
+ build_config["selected_key"]["show"] = False
482
+
483
+ return build_config
484
+
485
+ def json_path(self) -> Data:
486
+ try:
487
+ if not self.data or not self.selected_key:
488
+ msg = "Missing input data or selected key."
489
+ raise ValueError(msg)
490
+ input_payload = self.data[0].data if isinstance(self.data, list) else self.data.data
491
+ compiled = jq.compile(self.selected_key)
492
+ result = compiled.input(input_payload).first()
493
+ if isinstance(result, dict):
494
+ return Data(data=result)
495
+ return Data(data={"result": result})
496
+ except (ValueError, TypeError, KeyError) as e:
497
+ self.status = f"Error: {e!s}"
498
+ self.log(self.status)
499
+ return Data(data={"error": str(e)})
500
+
501
+ def as_data(self) -> Data:
502
+ if not hasattr(self, "operations") or not self.operations:
503
+ return Data(data={})
504
+
505
+ selected_actions = [action["name"] for action in self.operations]
506
+ logger.info(f"selected_actions: {selected_actions}")
507
+ if len(selected_actions) != 1:
508
+ return Data(data={})
509
+
510
+ action_map: dict[str, Callable[[], Data]] = {
511
+ "Select Keys": self.select_keys,
512
+ "Literal Eval": self.evaluate_data,
513
+ "Combine": self.combine_data,
514
+ "Filter Values": self.multi_filter_data,
515
+ "Append or Update": self.append_update,
516
+ "Remove Keys": self.remove_keys,
517
+ "Rename Keys": self.rename_keys,
518
+ "Path Selection": self.json_path,
519
+ "JQ Expression": self.json_query,
520
+ }
521
+ handler: Callable[[], Data] | None = action_map.get(selected_actions[0])
522
+ if handler:
523
+ try:
524
+ return handler()
525
+ except Exception as e:
526
+ logger.error(f"Error executing {selected_actions[0]}: {e!s}")
527
+ raise
528
+ return Data(data={})