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 @@
1
+ """Shared component cache service module."""
@@ -0,0 +1,30 @@
1
+ """Factory for creating shared component cache service."""
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from lfx.services.factory import ServiceFactory
6
+ from lfx.services.shared_component_cache.service import SharedComponentCacheService
7
+
8
+ if TYPE_CHECKING:
9
+ from lfx.services.base import Service
10
+
11
+
12
+ class SharedComponentCacheServiceFactory(ServiceFactory):
13
+ """Factory for creating SharedComponentCacheService instances."""
14
+
15
+ def __init__(self) -> None:
16
+ """Initialize the factory."""
17
+ super().__init__()
18
+ self.service_class = SharedComponentCacheService
19
+
20
+ def create(self, **kwargs) -> "Service":
21
+ """Create a SharedComponentCacheService instance.
22
+
23
+ Args:
24
+ **kwargs: Keyword arguments including expiration_time
25
+
26
+ Returns:
27
+ SharedComponentCacheService instance
28
+ """
29
+ expiration_time = kwargs.get("expiration_time", 60 * 60) # Default 1 hour
30
+ return SharedComponentCacheService(expiration_time=expiration_time)
@@ -0,0 +1,9 @@
1
+ """Shared component cache service implementation."""
2
+
3
+ from lfx.services.cache.service import ThreadingInMemoryCache
4
+
5
+
6
+ class SharedComponentCacheService(ThreadingInMemoryCache):
7
+ """A caching service shared across components."""
8
+
9
+ name = "shared_component_cache_service"
@@ -0,0 +1,5 @@
1
+ """Storage services for lfx package."""
2
+
3
+ from lfx.services.storage.local import LocalStorageService
4
+
5
+ __all__ = ["LocalStorageService"]
@@ -0,0 +1,155 @@
1
+ """Local file-based storage service for lfx package."""
2
+
3
+ from pathlib import Path
4
+
5
+ from lfx.log.logger import logger
6
+ from lfx.services.storage.service import StorageService
7
+
8
+
9
+ class LocalStorageService(StorageService):
10
+ """A service class for handling local file storage operations."""
11
+
12
+ def __init__(self, data_dir: str | Path | None = None) -> None:
13
+ """Initialize the local storage service."""
14
+ super().__init__(data_dir)
15
+ self.set_ready()
16
+
17
+ def build_full_path(self, flow_id: str, file_name: str) -> str:
18
+ """Build the full path of a file in the local storage."""
19
+ return str(self.data_dir / flow_id / file_name)
20
+
21
+ async def save_file(self, flow_id: str, file_name: str, data: bytes) -> None:
22
+ """Save a file in the local storage.
23
+
24
+ Args:
25
+ flow_id: The identifier for the flow.
26
+ file_name: The name of the file to be saved.
27
+ data: The byte content of the file.
28
+
29
+ Raises:
30
+ FileNotFoundError: If the specified flow does not exist.
31
+ IsADirectoryError: If the file name is a directory.
32
+ PermissionError: If there is no permission to write the file.
33
+ """
34
+ folder_path = self.data_dir / flow_id
35
+ folder_path.mkdir(parents=True, exist_ok=True)
36
+ file_path = folder_path / file_name
37
+
38
+ try:
39
+ with file_path.open("wb") as f:
40
+ f.write(data)
41
+ except Exception:
42
+ logger.exception(f"Error saving file {file_name} in flow {flow_id}")
43
+ raise
44
+ else:
45
+ logger.info(f"File {file_name} saved successfully in flow {flow_id}.")
46
+
47
+ async def get_file(self, flow_id: str, file_name: str) -> bytes:
48
+ """Retrieve a file from the local storage.
49
+
50
+ Args:
51
+ flow_id: The identifier for the flow.
52
+ file_name: The name of the file to be retrieved.
53
+
54
+ Returns:
55
+ The byte content of the file.
56
+
57
+ Raises:
58
+ FileNotFoundError: If the file does not exist.
59
+ """
60
+ file_path = self.data_dir / flow_id / file_name
61
+ if not file_path.exists():
62
+ logger.warning(f"File {file_name} not found in flow {flow_id}.")
63
+ msg = f"File {file_name} not found in flow {flow_id}"
64
+ raise FileNotFoundError(msg)
65
+
66
+ try:
67
+ with file_path.open("rb") as f:
68
+ content = f.read()
69
+ except Exception:
70
+ logger.exception(f"Error reading file {file_name} in flow {flow_id}")
71
+ raise
72
+ else:
73
+ logger.debug(f"File {file_name} retrieved successfully from flow {flow_id}.")
74
+ return content
75
+
76
+ async def list_files(self, flow_id: str) -> list[str]:
77
+ """List all files in a specific flow directory.
78
+
79
+ Args:
80
+ flow_id: The identifier for the flow.
81
+
82
+ Returns:
83
+ List of file names in the flow directory.
84
+ """
85
+ if not isinstance(flow_id, str):
86
+ flow_id = str(flow_id)
87
+
88
+ folder_path = self.data_dir / flow_id
89
+ if not folder_path.exists():
90
+ logger.debug(f"Flow folder {flow_id} does not exist.")
91
+ return []
92
+
93
+ if not folder_path.is_dir():
94
+ logger.warning(f"Flow path {flow_id} is not a directory.")
95
+ return []
96
+
97
+ try:
98
+ files = [item.name for item in folder_path.iterdir() if item.is_file()]
99
+ except Exception: # noqa: BLE001
100
+ logger.exception(f"Error listing files in flow {flow_id}")
101
+ return []
102
+ else:
103
+ logger.debug(f"Listed {len(files)} files in flow {flow_id}.")
104
+ return files
105
+
106
+ async def delete_file(self, flow_id: str, file_name: str) -> None:
107
+ """Delete a file from the local storage.
108
+
109
+ Args:
110
+ flow_id: The identifier for the flow.
111
+ file_name: The name of the file to be deleted.
112
+
113
+ Raises:
114
+ FileNotFoundError: If the file does not exist.
115
+ """
116
+ file_path = self.data_dir / flow_id / file_name
117
+ if not file_path.exists():
118
+ logger.warning(f"File {file_name} not found in flow {flow_id}.")
119
+ msg = f"File {file_name} not found in flow {flow_id}"
120
+ raise FileNotFoundError(msg)
121
+
122
+ try:
123
+ file_path.unlink()
124
+ logger.info(f"File {file_name} deleted successfully from flow {flow_id}.")
125
+ except Exception:
126
+ logger.exception(f"Error deleting file {file_name} in flow {flow_id}")
127
+ raise
128
+
129
+ async def get_file_size(self, flow_id: str, file_name: str) -> int:
130
+ """Get the size of a file in bytes.
131
+
132
+ Args:
133
+ flow_id: The identifier for the flow.
134
+ file_name: The name of the file.
135
+
136
+ Returns:
137
+ The size of the file in bytes.
138
+
139
+ Raises:
140
+ FileNotFoundError: If the file does not exist.
141
+ """
142
+ file_path = self.data_dir / flow_id / file_name
143
+ if not file_path.exists():
144
+ logger.warning(f"File {file_name} not found in flow {flow_id}.")
145
+ msg = f"File {file_name} not found in flow {flow_id}"
146
+ raise FileNotFoundError(msg)
147
+
148
+ try:
149
+ size = file_path.stat().st_size
150
+ except Exception:
151
+ logger.exception(f"Error getting size of file {file_name} in flow {flow_id}")
152
+ raise
153
+ else:
154
+ logger.debug(f"File {file_name} size: {size} bytes in flow {flow_id}.")
155
+ return size
@@ -0,0 +1,54 @@
1
+ """Base storage service for lfx package."""
2
+
3
+ from abc import ABC, abstractmethod
4
+ from pathlib import Path
5
+
6
+
7
+ class StorageService(ABC):
8
+ """Abstract base class for storage services."""
9
+
10
+ def __init__(self, data_dir: str | Path | None = None) -> None:
11
+ """Initialize the storage service.
12
+
13
+ Args:
14
+ data_dir: Directory path for storing data. Defaults to ~/.lfx/data
15
+ """
16
+ if data_dir is None:
17
+ data_dir = Path.home() / ".lfx" / "data"
18
+ self.data_dir = Path(data_dir)
19
+ self._ready = False
20
+
21
+ def set_ready(self) -> None:
22
+ """Mark the service as ready."""
23
+ self._ready = True
24
+ # Ensure the data directory exists
25
+ self.data_dir.mkdir(parents=True, exist_ok=True)
26
+
27
+ @property
28
+ def ready(self) -> bool:
29
+ """Check if the service is ready."""
30
+ return self._ready
31
+
32
+ @abstractmethod
33
+ def build_full_path(self, flow_id: str, file_name: str) -> str:
34
+ """Build the full path for a file."""
35
+
36
+ @abstractmethod
37
+ async def save_file(self, flow_id: str, file_name: str, data: bytes) -> None:
38
+ """Save a file."""
39
+
40
+ @abstractmethod
41
+ async def get_file(self, flow_id: str, file_name: str) -> bytes:
42
+ """Retrieve a file."""
43
+
44
+ @abstractmethod
45
+ async def list_files(self, flow_id: str) -> list[str]:
46
+ """List files in a flow."""
47
+
48
+ @abstractmethod
49
+ async def delete_file(self, flow_id: str, file_name: str) -> None:
50
+ """Delete a file."""
51
+
52
+ @abstractmethod
53
+ async def get_file_size(self, flow_id: str, file_name: str) -> int:
54
+ """Get the size of a file."""
@@ -0,0 +1 @@
1
+ # Tracing service for lfx package
@@ -0,0 +1,21 @@
1
+ """Lightweight tracing service for lfx package."""
2
+
3
+ from lfx.services.base import Service
4
+
5
+
6
+ class TracingService(Service):
7
+ """Lightweight tracing service."""
8
+
9
+ @property
10
+ def name(self) -> str:
11
+ return "tracing_service"
12
+
13
+ def log(self, message: str, **kwargs) -> None: # noqa: ARG002
14
+ """Log a message with optional metadata."""
15
+ # Lightweight implementation - just log basic info
16
+ from lfx.log.logger import logger
17
+
18
+ logger.debug(f"Trace: {message}")
19
+
20
+ async def teardown(self) -> None:
21
+ """Teardown the tracing service."""
lfx/settings.py ADDED
@@ -0,0 +1,6 @@
1
+ """Settings constants for lfx package."""
2
+
3
+ import os
4
+
5
+ # Development mode flag - can be overridden by environment variable
6
+ DEV = os.getenv("LANGFLOW_DEV", "false").lower() == "true"
@@ -0,0 +1,6 @@
1
+ from lfx.template.field.base import Input, Output
2
+
3
+ __all__ = [
4
+ "Input",
5
+ "Output",
6
+ ]
File without changes
@@ -0,0 +1,257 @@
1
+ from collections.abc import Callable
2
+ from enum import Enum
3
+ from typing import ( # type: ignore[attr-defined]
4
+ Any,
5
+ GenericAlias, # type: ignore[attr-defined]
6
+ _GenericAlias, # type: ignore[attr-defined]
7
+ _UnionGenericAlias, # type: ignore[attr-defined]
8
+ )
9
+
10
+ from pydantic import (
11
+ BaseModel,
12
+ ConfigDict,
13
+ Field,
14
+ field_serializer,
15
+ field_validator,
16
+ model_serializer,
17
+ model_validator,
18
+ )
19
+
20
+ from lfx.field_typing import Text
21
+ from lfx.field_typing.range_spec import RangeSpec
22
+ from lfx.helpers.custom import format_type
23
+ from lfx.schema.data import Data
24
+ from lfx.type_extraction import post_process_type
25
+
26
+
27
+ class UndefinedType(Enum):
28
+ undefined = "__UNDEFINED__"
29
+
30
+
31
+ UNDEFINED = UndefinedType.undefined
32
+
33
+
34
+ class Input(BaseModel):
35
+ model_config = ConfigDict(arbitrary_types_allowed=True)
36
+
37
+ field_type: str | type | None = Field(default=str, serialization_alias="type")
38
+ """The type of field this is. Default is a string."""
39
+
40
+ required: bool = False
41
+ """Specifies if the field is required. Defaults to False."""
42
+
43
+ placeholder: str = ""
44
+ """A placeholder string for the field. Default is an empty string."""
45
+
46
+ is_list: bool = Field(default=False, serialization_alias="list")
47
+ """Defines if the field is a list. Default is False."""
48
+
49
+ show: bool = True
50
+ """Should the field be shown. Defaults to True."""
51
+
52
+ multiline: bool = False
53
+ """Defines if the field will allow the user to open a text editor. Default is False."""
54
+
55
+ value: Any = None
56
+ """The value of the field. Default is None."""
57
+
58
+ file_types: list[str] = Field(default=[], serialization_alias="fileTypes")
59
+ """List of file types associated with the field . Default is an empty list."""
60
+
61
+ file_path: str | None = ""
62
+ """The file path of the field if it is a file. Defaults to None."""
63
+
64
+ password: bool | None = None
65
+ """Specifies if the field is a password. Defaults to None."""
66
+
67
+ options: list[str] | Callable | None = None
68
+ """List of options for the field. Only used when is_list=True. Default is an empty list."""
69
+
70
+ name: str | None = None
71
+ """Name of the field. Default is an empty string."""
72
+
73
+ display_name: str | None = None
74
+ """Display name of the field. Defaults to None."""
75
+
76
+ advanced: bool = False
77
+ """Specifies if the field will an advanced parameter (hidden). Defaults to False."""
78
+
79
+ input_types: list[str] | None = None
80
+ """List of input types for the handle when the field has more than one type. Default is an empty list."""
81
+
82
+ dynamic: bool = False
83
+ """Specifies if the field is dynamic. Defaults to False."""
84
+
85
+ info: str | None = ""
86
+ """Additional information about the field to be shown in the tooltip. Defaults to an empty string."""
87
+
88
+ real_time_refresh: bool | None = None
89
+ """Specifies if the field should have real time refresh. `refresh_button` must be False. Defaults to None."""
90
+
91
+ refresh_button: bool | None = None
92
+ """Specifies if the field should have a refresh button. Defaults to False."""
93
+
94
+ refresh_button_text: str | None = None
95
+ """Specifies the text for the refresh button. Defaults to None."""
96
+
97
+ range_spec: RangeSpec | None = Field(default=None, serialization_alias="rangeSpec")
98
+ """Range specification for the field. Defaults to None."""
99
+
100
+ load_from_db: bool = False
101
+ """Specifies if the field should be loaded from the database. Defaults to False."""
102
+
103
+ title_case: bool = False
104
+ """Specifies if the field should be displayed in title case. Defaults to True."""
105
+
106
+ def to_dict(self):
107
+ return self.model_dump(by_alias=True, exclude_none=True)
108
+
109
+ @model_serializer(mode="wrap")
110
+ def serialize_model(self, handler):
111
+ result = handler(self)
112
+ # If the field is str, we add the Text input type
113
+ if self.field_type in {"str", "Text"} and "input_types" not in result:
114
+ result["input_types"] = ["Text"]
115
+ if self.field_type == Text:
116
+ result["type"] = "str"
117
+ else:
118
+ result["type"] = self.field_type
119
+ return result
120
+
121
+ @model_validator(mode="after")
122
+ def validate_model(self):
123
+ # if field_type is int, we need to set the range_spec
124
+ if self.field_type == "int" and self.range_spec is not None:
125
+ self.range_spec = RangeSpec.set_step_type("int", self.range_spec)
126
+ return self
127
+
128
+ @field_serializer("file_path")
129
+ def serialize_file_path(self, value):
130
+ return value if self.field_type == "file" else ""
131
+
132
+ @field_serializer("field_type")
133
+ def serialize_field_type(self, value, _info):
134
+ if value is float and self.range_spec is None:
135
+ self.range_spec = RangeSpec()
136
+ return value
137
+
138
+ @field_serializer("display_name")
139
+ def serialize_display_name(self, value, _info):
140
+ # If display_name is not set, use name and convert to title case
141
+ # if title_case is True
142
+ if value is None:
143
+ # name is probably a snake_case string
144
+ # Ex: "file_path" -> "File Path"
145
+ value = self.name.replace("_", " ")
146
+ if self.title_case:
147
+ value = value.title()
148
+ return value
149
+
150
+ @field_validator("file_types")
151
+ @classmethod
152
+ def validate_file_types(cls, value):
153
+ if not isinstance(value, list):
154
+ msg = "file_types must be a list"
155
+ raise ValueError(msg) # noqa: TRY004
156
+ return [
157
+ (f".{file_type}" if isinstance(file_type, str) and not file_type.startswith(".") else file_type)
158
+ for file_type in value
159
+ ]
160
+
161
+ @field_validator("field_type", mode="before")
162
+ @classmethod
163
+ def validate_type(cls, v):
164
+ # If the user passes CustomComponent as a type insteado of "CustomComponent" we need to convert it to a string
165
+ # this should be done for all types
166
+ # How to check if v is a type?
167
+ if isinstance(v, type | _GenericAlias | GenericAlias | _UnionGenericAlias):
168
+ v = post_process_type(v)[0]
169
+ v = format_type(v)
170
+ elif not isinstance(v, str):
171
+ msg = f"type must be a string or a type, not {type(v)}"
172
+ raise ValueError(msg) # noqa: TRY004
173
+ return v
174
+
175
+
176
+ class OutputOptions(BaseModel):
177
+ filter: str | None = None
178
+ """Filter to be applied to the output data."""
179
+
180
+
181
+ class Output(BaseModel):
182
+ types: list[str] = Field(default=[])
183
+ """List of output types for the field."""
184
+
185
+ selected: str | None = Field(default=None)
186
+ """The selected output type for the field."""
187
+
188
+ name: str = Field(description="The name of the field.")
189
+ """The name of the field."""
190
+
191
+ hidden: bool | None = Field(default=None)
192
+ """Dictates if the field is hidden."""
193
+
194
+ display_name: str | None = Field(default=None)
195
+ """The display name of the field."""
196
+
197
+ method: str | None = Field(default=None)
198
+ """The method to use for the output."""
199
+
200
+ value: Any | None = Field(default=UNDEFINED)
201
+ """The result of the Output. Dynamically updated as execution occurs."""
202
+
203
+ cache: bool = Field(default=True)
204
+
205
+ required_inputs: list[str] | None = Field(default=None)
206
+ """List of required inputs for this output."""
207
+
208
+ allows_loop: bool = Field(default=False)
209
+ """Specifies if the output allows looping."""
210
+
211
+ group_outputs: bool = Field(default=False)
212
+ """Specifies if all outputs should be grouped and shown without dropdowns."""
213
+
214
+ options: OutputOptions | None = Field(default=None)
215
+ """Options for the output."""
216
+
217
+ tool_mode: bool = Field(default=True)
218
+ """Specifies if the output should be used as a tool"""
219
+
220
+ def to_dict(self):
221
+ return self.model_dump(by_alias=True, exclude_none=True)
222
+
223
+ def add_types(self, type_: list[Any]) -> None:
224
+ if self.types is None:
225
+ self.types = []
226
+ self.types.extend([t for t in type_ if t not in self.types])
227
+ # If no type is selected and we have types, select the first one
228
+ if self.selected is None and self.types:
229
+ self.selected = self.types[0]
230
+
231
+ @model_serializer(mode="wrap")
232
+ def serialize_model(self, handler):
233
+ result = handler(self)
234
+ if self.value == UNDEFINED:
235
+ result["value"] = UNDEFINED.value
236
+ return result
237
+
238
+ @model_validator(mode="after")
239
+ def validate_model(self):
240
+ if self.value == UNDEFINED.value:
241
+ self.value = UNDEFINED
242
+ if self.name is None:
243
+ msg = "name must be set"
244
+ raise ValueError(msg)
245
+ if self.display_name is None:
246
+ self.display_name = self.name
247
+ # Convert dict options to OutputOptions model
248
+ if isinstance(self.options, dict):
249
+ self.options = OutputOptions(**self.options)
250
+ return self
251
+
252
+ def apply_options(self, result):
253
+ if not self.options:
254
+ return result
255
+ if self.options.filter and isinstance(result, Data):
256
+ return result.filter_data(self.options.filter)
257
+ return result
@@ -0,0 +1,15 @@
1
+ # This file provides backwards compatibility for prompt field constants
2
+ from lfx.template.field.base import Input
3
+
4
+ # Default input types for prompt fields
5
+ DEFAULT_PROMPT_INTUT_TYPES = ["Message"]
6
+
7
+
8
+ class DefaultPromptField(Input):
9
+ """Default prompt field for backwards compatibility."""
10
+
11
+ field_type: str = "str"
12
+ advanced: bool = False
13
+ multiline: bool = True
14
+ input_types: list[str] = DEFAULT_PROMPT_INTUT_TYPES
15
+ value: str = "" # Set the value to empty string
@@ -0,0 +1,6 @@
1
+ from lfx.template.frontend_node import base, custom_components
2
+
3
+ __all__ = [
4
+ "base",
5
+ "custom_components",
6
+ ]