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
lfx/io/schema.py ADDED
@@ -0,0 +1,289 @@
1
+ from types import UnionType
2
+ from typing import Any, Literal, Union, get_args, get_origin
3
+
4
+ from pydantic import BaseModel, Field, create_model
5
+
6
+ from lfx.inputs.input_mixin import FieldTypes
7
+ from lfx.inputs.inputs import (
8
+ BoolInput,
9
+ DictInput,
10
+ DropdownInput,
11
+ FloatInput,
12
+ InputTypes,
13
+ IntInput,
14
+ MessageTextInput,
15
+ )
16
+ from lfx.schema.dotdict import dotdict
17
+
18
+ _convert_field_type_to_type: dict[FieldTypes, type] = {
19
+ FieldTypes.TEXT: str,
20
+ FieldTypes.INTEGER: int,
21
+ FieldTypes.FLOAT: float,
22
+ FieldTypes.BOOLEAN: bool,
23
+ FieldTypes.DICT: dict,
24
+ FieldTypes.NESTED_DICT: dict,
25
+ FieldTypes.TABLE: dict,
26
+ FieldTypes.FILE: str,
27
+ FieldTypes.PROMPT: str,
28
+ FieldTypes.CODE: str,
29
+ FieldTypes.OTHER: str,
30
+ FieldTypes.TAB: str,
31
+ FieldTypes.QUERY: str,
32
+ }
33
+
34
+
35
+ _convert_type_to_field_type = {
36
+ str: MessageTextInput,
37
+ int: IntInput,
38
+ float: FloatInput,
39
+ bool: BoolInput,
40
+ dict: DictInput,
41
+ list: MessageTextInput,
42
+ }
43
+
44
+
45
+ def flatten_schema(root_schema: dict[str, Any]) -> dict[str, Any]:
46
+ """Flatten a JSON RPC style schema into a single level JSON Schema.
47
+
48
+ If the input schema is already flat (no $defs / $ref / nested objects or arrays)
49
+ the function simply returns the original i.e. a noop.
50
+ """
51
+ defs = root_schema.get("$defs", {})
52
+
53
+ # --- Fast path: schema is already flat ---------------------------------
54
+ props = root_schema.get("properties", {})
55
+ if not defs and all("$ref" not in v and v.get("type") not in ("object", "array") for v in props.values()):
56
+ return root_schema
57
+ # -----------------------------------------------------------------------
58
+
59
+ flat_props: dict[str, dict[str, Any]] = {}
60
+ required_list: list[str] = []
61
+
62
+ def _resolve_if_ref(schema: dict[str, Any]) -> dict[str, Any]:
63
+ while "$ref" in schema:
64
+ ref_name = schema["$ref"].split("/")[-1]
65
+ schema = defs.get(ref_name, {})
66
+ return schema
67
+
68
+ def _walk(name: str, schema: dict[str, Any], *, inherited_req: bool) -> None:
69
+ schema = _resolve_if_ref(schema)
70
+ t = schema.get("type")
71
+
72
+ # ── objects ─────────────────────────────────────────────────────────
73
+ if t == "object":
74
+ req_here = set(schema.get("required", []))
75
+ for k, subschema in schema.get("properties", {}).items():
76
+ child_name = f"{name}.{k}" if name else k
77
+ _walk(name=child_name, schema=subschema, inherited_req=inherited_req and k in req_here)
78
+ return
79
+
80
+ # ── arrays (always recurse into the first item as "[0]") ───────────
81
+ if t == "array":
82
+ items = schema.get("items", {})
83
+ _walk(name=f"{name}[0]", schema=items, inherited_req=inherited_req)
84
+ return
85
+
86
+ leaf: dict[str, Any] = {
87
+ k: v
88
+ for k, v in schema.items()
89
+ if k
90
+ in (
91
+ "type",
92
+ "description",
93
+ "pattern",
94
+ "format",
95
+ "enum",
96
+ "default",
97
+ "minLength",
98
+ "maxLength",
99
+ "minimum",
100
+ "maximum",
101
+ "exclusiveMinimum",
102
+ "exclusiveMaximum",
103
+ "additionalProperties",
104
+ "examples",
105
+ )
106
+ }
107
+ flat_props[name] = leaf
108
+ if inherited_req:
109
+ required_list.append(name)
110
+
111
+ # kick things off at the true root
112
+ root_required = set(root_schema.get("required", []))
113
+ for k, subschema in props.items():
114
+ _walk(k, subschema, inherited_req=k in root_required)
115
+
116
+ # build the flattened schema; keep any descriptive metadata
117
+ result: dict[str, Any] = {
118
+ "type": "object",
119
+ "properties": flat_props,
120
+ **{k: v for k, v in root_schema.items() if k not in ("properties", "$defs")},
121
+ }
122
+ if required_list:
123
+ result["required"] = required_list
124
+ return result
125
+
126
+
127
+ def schema_to_langflow_inputs(schema: type[BaseModel]) -> list[InputTypes]:
128
+ inputs: list[InputTypes] = []
129
+
130
+ for field_name, model_field in schema.model_fields.items():
131
+ ann = model_field.annotation
132
+ if isinstance(ann, UnionType):
133
+ # Extract non-None types from Union
134
+ non_none_types = [t for t in get_args(ann) if t is not type(None)]
135
+ if len(non_none_types) == 1:
136
+ ann = non_none_types[0]
137
+
138
+ is_list = False
139
+
140
+ if get_origin(ann) is list:
141
+ is_list = True
142
+ ann = get_args(ann)[0]
143
+
144
+ options: list[Any] | None = None
145
+ if get_origin(ann) is Literal:
146
+ options = list(get_args(ann))
147
+ if options:
148
+ ann = type(options[0])
149
+
150
+ if get_origin(ann) is Union:
151
+ non_none = [t for t in get_args(ann) if t is not type(None)]
152
+ if len(non_none) == 1:
153
+ ann = non_none[0]
154
+
155
+ # 2) Enumerated choices
156
+ if options is not None:
157
+ inputs.append(
158
+ DropdownInput(
159
+ display_name=model_field.title or field_name.replace("_", " ").title(),
160
+ name=field_name,
161
+ info=model_field.description or "",
162
+ required=model_field.is_required(),
163
+ is_list=is_list,
164
+ options=options,
165
+ )
166
+ )
167
+ continue
168
+
169
+ # 3) "Any" fallback → text
170
+ if ann is Any:
171
+ inputs.append(
172
+ MessageTextInput(
173
+ display_name=model_field.title or field_name.replace("_", " ").title(),
174
+ name=field_name,
175
+ info=model_field.description or "",
176
+ required=model_field.is_required(),
177
+ is_list=is_list,
178
+ )
179
+ )
180
+ continue
181
+
182
+ # 4) Primitive via your mapping
183
+ try:
184
+ lf_cls = _convert_type_to_field_type[ann]
185
+ except KeyError as err:
186
+ msg = f"Unsupported field type: {ann}"
187
+ raise TypeError(msg) from err
188
+ inputs.append(
189
+ lf_cls(
190
+ display_name=model_field.title or field_name.replace("_", " ").title(),
191
+ name=field_name,
192
+ info=model_field.description or "",
193
+ required=model_field.is_required(),
194
+ is_list=is_list,
195
+ )
196
+ )
197
+
198
+ return inputs
199
+
200
+
201
+ def create_input_schema(inputs: list["InputTypes"]) -> type[BaseModel]:
202
+ if not isinstance(inputs, list):
203
+ msg = "inputs must be a list of Inputs"
204
+ raise TypeError(msg)
205
+ fields = {}
206
+ for input_model in inputs:
207
+ # Create a Pydantic Field for each input field
208
+ field_type = input_model.field_type
209
+ if isinstance(field_type, FieldTypes):
210
+ field_type = _convert_field_type_to_type[field_type]
211
+ else:
212
+ msg = f"Invalid field type: {field_type}"
213
+ raise TypeError(msg)
214
+ if hasattr(input_model, "options") and isinstance(input_model.options, list) and input_model.options:
215
+ literal_string = f"Literal{input_model.options}"
216
+ # validate that the literal_string is a valid literal
217
+
218
+ field_type = eval(literal_string, {"Literal": Literal}) # noqa: S307
219
+ if hasattr(input_model, "is_list") and input_model.is_list:
220
+ field_type = list[field_type] # type: ignore[valid-type]
221
+ if input_model.name:
222
+ name = input_model.name.replace("_", " ").title()
223
+ elif input_model.display_name:
224
+ name = input_model.display_name
225
+ else:
226
+ msg = "Input name or display_name is required"
227
+ raise ValueError(msg)
228
+ field_dict = {
229
+ "title": name,
230
+ "description": input_model.info or "",
231
+ }
232
+ if input_model.required is False:
233
+ field_dict["default"] = input_model.value # type: ignore[assignment]
234
+ pydantic_field = Field(**field_dict)
235
+
236
+ fields[input_model.name] = (field_type, pydantic_field)
237
+
238
+ # Create and return the InputSchema model
239
+ model = create_model("InputSchema", **fields)
240
+ model.model_rebuild()
241
+ return model
242
+
243
+
244
+ def create_input_schema_from_dict(inputs: list[dotdict], param_key: str | None = None) -> type[BaseModel]:
245
+ if not isinstance(inputs, list):
246
+ msg = "inputs must be a list of Inputs"
247
+ raise TypeError(msg)
248
+ fields = {}
249
+ for input_model in inputs:
250
+ # Create a Pydantic Field for each input field
251
+ field_type = input_model.type
252
+ if hasattr(input_model, "options") and isinstance(input_model.options, list) and input_model.options:
253
+ literal_string = f"Literal{input_model.options}"
254
+ # validate that the literal_string is a valid literal
255
+
256
+ field_type = eval(literal_string, {"Literal": Literal}) # noqa: S307
257
+ if hasattr(input_model, "is_list") and input_model.is_list:
258
+ field_type = list[field_type] # type: ignore[valid-type]
259
+ if input_model.name:
260
+ name = input_model.name.replace("_", " ").title()
261
+ elif input_model.display_name:
262
+ name = input_model.display_name
263
+ else:
264
+ msg = "Input name or display_name is required"
265
+ raise ValueError(msg)
266
+ field_dict = {
267
+ "title": name,
268
+ "description": input_model.info or "",
269
+ }
270
+ if input_model.required is False:
271
+ field_dict["default"] = input_model.value # type: ignore[assignment]
272
+ pydantic_field = Field(**field_dict)
273
+
274
+ fields[input_model.name] = (field_type, pydantic_field)
275
+
276
+ # Wrap fields in a dictionary with the key as param_key
277
+ if param_key is not None:
278
+ # Create an inner model with the fields
279
+ inner_model = create_model("InnerModel", **fields)
280
+
281
+ # Ensure the model is wrapped correctly in a dictionary
282
+ # model = create_model("InputSchema", **{param_key: (inner_model, Field(default=..., description=description))})
283
+ model = create_model("InputSchema", **{param_key: (inner_model, ...)})
284
+ else:
285
+ # Create and return the InputSchema model
286
+ model = create_model("InputSchema", **fields)
287
+
288
+ model.model_rebuild()
289
+ return model
lfx/load/__init__.py ADDED
@@ -0,0 +1,8 @@
1
+ from .load import aload_flow_from_json, arun_flow_from_json, load_flow_from_json, run_flow_from_json
2
+
3
+ __all__ = [
4
+ "aload_flow_from_json",
5
+ "arun_flow_from_json",
6
+ "load_flow_from_json",
7
+ "run_flow_from_json",
8
+ ]
lfx/load/load.py ADDED
@@ -0,0 +1,256 @@
1
+ import json
2
+ from io import StringIO
3
+ from pathlib import Path
4
+ from typing import TYPE_CHECKING
5
+
6
+ from aiofile import async_open
7
+ from dotenv import dotenv_values
8
+
9
+ from lfx.graph.schema import RunOutputs
10
+
11
+ if TYPE_CHECKING:
12
+ from lfx.graph.graph.base import Graph
13
+
14
+ from lfx.load.utils import replace_tweaks_with_env
15
+ from lfx.log.logger import configure
16
+ from lfx.processing.process import process_tweaks, run_graph
17
+ from lfx.utils.async_helpers import run_until_complete
18
+ from lfx.utils.util import update_settings
19
+
20
+
21
+ async def aload_flow_from_json(
22
+ flow: Path | str | dict,
23
+ *,
24
+ tweaks: dict | None = None,
25
+ log_level: str | None = None,
26
+ log_file: str | None = None,
27
+ log_rotation: str | None = None,
28
+ env_file: str | None = None,
29
+ cache: str | None = None,
30
+ disable_logs: bool | None = True,
31
+ ) -> "Graph":
32
+ """Load a flow graph from a JSON file or a JSON object.
33
+
34
+ Args:
35
+ flow (Union[Path, str, dict]): The flow to load. It can be a file path (str or Path object)
36
+ or a JSON object (dict).
37
+ tweaks (Optional[dict]): Optional tweaks to apply to the loaded flow graph.
38
+ log_level (Optional[str]): Optional log level to configure for the flow processing.
39
+ log_file (Optional[str]): Optional log file to configure for the flow processing.
40
+ log_rotation (Optional[str]): Optional log rotation(Time/Size) to configure for the flow processing.
41
+ env_file (Optional[str]): Optional .env file to override environment variables.
42
+ cache (Optional[str]): Optional cache path to update the flow settings.
43
+ disable_logs (Optional[bool], default=True): Optional flag to disable logs during flow processing.
44
+ If log_level or log_file are set, disable_logs is not used.
45
+
46
+ Returns:
47
+ Graph: The loaded flow graph as a Graph object.
48
+
49
+ Raises:
50
+ TypeError: If the input is neither a file path (str or Path object) nor a JSON object (dict).
51
+
52
+ """
53
+ # If input is a file path, load JSON from the file
54
+ log_file_path = Path(log_file) if log_file else None
55
+ configure(log_level=log_level, log_file=log_file_path, disable=disable_logs, log_rotation=log_rotation)
56
+
57
+ # override env variables with .env file
58
+ if env_file and tweaks is not None:
59
+ async with async_open(Path(env_file), encoding="utf-8") as f:
60
+ content = await f.read()
61
+ env_vars = dotenv_values(stream=StringIO(content))
62
+ tweaks = replace_tweaks_with_env(tweaks=tweaks, env_vars=env_vars)
63
+
64
+ # Update settings with cache and components path
65
+ await update_settings(cache=cache)
66
+
67
+ if isinstance(flow, str | Path):
68
+ async with async_open(Path(flow), encoding="utf-8") as f:
69
+ content = await f.read()
70
+ flow_graph = json.loads(content)
71
+ # If input is a dictionary, assume it's a JSON object
72
+ elif isinstance(flow, dict):
73
+ flow_graph = flow
74
+ else:
75
+ msg = "Input must be either a file path (str) or a JSON object (dict)"
76
+ raise TypeError(msg)
77
+
78
+ graph_data = flow_graph["data"]
79
+ if tweaks is not None:
80
+ graph_data = process_tweaks(graph_data, tweaks)
81
+
82
+ from lfx.graph.graph.base import Graph
83
+
84
+ return Graph.from_payload(graph_data)
85
+
86
+
87
+ def load_flow_from_json(
88
+ flow: Path | str | dict,
89
+ *,
90
+ tweaks: dict | None = None,
91
+ log_level: str | None = None,
92
+ log_file: str | None = None,
93
+ log_rotation: str | None = None,
94
+ env_file: str | None = None,
95
+ cache: str | None = None,
96
+ disable_logs: bool | None = True,
97
+ ) -> "Graph":
98
+ """Load a flow graph from a JSON file or a JSON object.
99
+
100
+ Args:
101
+ flow (Union[Path, str, dict]): The flow to load. It can be a file path (str or Path object)
102
+ or a JSON object (dict).
103
+ tweaks (Optional[dict]): Optional tweaks to apply to the loaded flow graph.
104
+ log_level (Optional[str]): Optional log level to configure for the flow processing.
105
+ log_file (Optional[str]): Optional log file to configure for the flow processing.
106
+ log_rotation (Optional[str]): Optional log rotation(Time/Size) to configure for the flow processing.
107
+ env_file (Optional[str]): Optional .env file to override environment variables.
108
+ cache (Optional[str]): Optional cache path to update the flow settings.
109
+ disable_logs (Optional[bool], default=True): Optional flag to disable logs during flow processing.
110
+ If log_level or log_file are set, disable_logs is not used.
111
+
112
+ Returns:
113
+ Graph: The loaded flow graph as a Graph object.
114
+
115
+ Raises:
116
+ TypeError: If the input is neither a file path (str or Path object) nor a JSON object (dict).
117
+
118
+ """
119
+ return run_until_complete(
120
+ aload_flow_from_json(
121
+ flow,
122
+ tweaks=tweaks,
123
+ log_level=log_level,
124
+ log_file=log_file,
125
+ log_rotation=log_rotation,
126
+ env_file=env_file,
127
+ cache=cache,
128
+ disable_logs=disable_logs,
129
+ )
130
+ )
131
+
132
+
133
+ async def arun_flow_from_json(
134
+ flow: Path | str | dict,
135
+ input_value: str,
136
+ *,
137
+ session_id: str | None = None,
138
+ tweaks: dict | None = None,
139
+ input_type: str = "chat",
140
+ output_type: str = "chat",
141
+ output_component: str | None = None,
142
+ log_level: str | None = None,
143
+ log_file: str | None = None,
144
+ log_rotation: str | None = None,
145
+ env_file: str | None = None,
146
+ cache: str | None = None,
147
+ disable_logs: bool | None = True,
148
+ fallback_to_env_vars: bool = False,
149
+ ) -> list[RunOutputs]:
150
+ """Run a flow from a JSON file or dictionary.
151
+
152
+ Args:
153
+ flow (Union[Path, str, dict]): The path to the JSON file or the JSON dictionary representing the flow.
154
+ input_value (str): The input value to be processed by the flow.
155
+ session_id (str | None, optional): The session ID to be used for the flow. Defaults to None.
156
+ tweaks (Optional[dict], optional): Optional tweaks to be applied to the flow. Defaults to None.
157
+ input_type (str, optional): The type of the input value. Defaults to "chat".
158
+ output_type (str, optional): The type of the output value. Defaults to "chat".
159
+ output_component (Optional[str], optional): The specific component to output. Defaults to None.
160
+ log_level (Optional[str], optional): The log level to use. Defaults to None.
161
+ log_file (Optional[str], optional): The log file to write logs to. Defaults to None.
162
+ log_rotation (Optional[str], optional): The log rotation to use. Defaults to None.
163
+ env_file (Optional[str], optional): The environment file to load. Defaults to None.
164
+ cache (Optional[str], optional): The cache directory to use. Defaults to None.
165
+ disable_logs (Optional[bool], optional): Whether to disable logs. Defaults to True.
166
+ fallback_to_env_vars (bool, optional): Whether Global Variables should fallback to environment variables if
167
+ not found. Defaults to False.
168
+
169
+ Returns:
170
+ List[RunOutputs]: A list of RunOutputs objects representing the results of running the flow.
171
+ """
172
+ if tweaks is None:
173
+ tweaks = {}
174
+ tweaks["stream"] = False
175
+ graph = await aload_flow_from_json(
176
+ flow=flow,
177
+ tweaks=tweaks,
178
+ log_level=log_level,
179
+ log_file=log_file,
180
+ log_rotation=log_rotation,
181
+ env_file=env_file,
182
+ cache=cache,
183
+ disable_logs=disable_logs,
184
+ )
185
+ return await run_graph(
186
+ graph=graph,
187
+ session_id=session_id,
188
+ input_value=input_value,
189
+ input_type=input_type,
190
+ output_type=output_type,
191
+ output_component=output_component,
192
+ fallback_to_env_vars=fallback_to_env_vars,
193
+ )
194
+
195
+
196
+ def run_flow_from_json(
197
+ flow: Path | str | dict,
198
+ input_value: str,
199
+ *,
200
+ session_id: str | None = None,
201
+ tweaks: dict | None = None,
202
+ input_type: str = "chat",
203
+ output_type: str = "chat",
204
+ output_component: str | None = None,
205
+ log_level: str | None = None,
206
+ log_file: str | None = None,
207
+ log_rotation: str | None = None,
208
+ env_file: str | None = None,
209
+ cache: str | None = None,
210
+ disable_logs: bool | None = True,
211
+ fallback_to_env_vars: bool = False,
212
+ ) -> list[RunOutputs]:
213
+ """Run a flow from a JSON file or dictionary.
214
+
215
+ Note:
216
+ This function is a synchronous wrapper around `arun_flow_from_json`.
217
+ It creates an event loop if one does not exist and runs the flow.
218
+
219
+ Args:
220
+ flow (Union[Path, str, dict]): The path to the JSON file or the JSON dictionary representing the flow.
221
+ input_value (str): The input value to be processed by the flow.
222
+ session_id (str | None, optional): The session ID to be used for the flow. Defaults to None.
223
+ tweaks (Optional[dict], optional): Optional tweaks to be applied to the flow. Defaults to None.
224
+ input_type (str, optional): The type of the input value. Defaults to "chat".
225
+ output_type (str, optional): The type of the output value. Defaults to "chat".
226
+ output_component (Optional[str], optional): The specific component to output. Defaults to None.
227
+ log_level (Optional[str], optional): The log level to use. Defaults to None.
228
+ log_file (Optional[str], optional): The log file to write logs to. Defaults to None.
229
+ log_rotation (Optional[str], optional): The log rotation to use. Defaults to None.
230
+ env_file (Optional[str], optional): The environment file to load. Defaults to None.
231
+ cache (Optional[str], optional): The cache directory to use. Defaults to None.
232
+ disable_logs (Optional[bool], optional): Whether to disable logs. Defaults to True.
233
+ fallback_to_env_vars (bool, optional): Whether Global Variables should fallback to environment variables if
234
+ not found. Defaults to False.
235
+
236
+ Returns:
237
+ List[RunOutputs]: A list of RunOutputs objects representing the results of running the flow.
238
+ """
239
+ return run_until_complete(
240
+ arun_flow_from_json(
241
+ flow,
242
+ input_value,
243
+ session_id=session_id,
244
+ tweaks=tweaks,
245
+ input_type=input_type,
246
+ output_type=output_type,
247
+ output_component=output_component,
248
+ log_level=log_level,
249
+ log_file=log_file,
250
+ log_rotation=log_rotation,
251
+ env_file=env_file,
252
+ cache=cache,
253
+ disable_logs=disable_logs,
254
+ fallback_to_env_vars=fallback_to_env_vars,
255
+ )
256
+ )
lfx/load/utils.py ADDED
@@ -0,0 +1,99 @@
1
+ from pathlib import Path
2
+
3
+ import httpx
4
+
5
+
6
+ class UploadError(Exception):
7
+ """Raised when an error occurs during the upload process."""
8
+
9
+
10
+ def upload(file_path: str, host: str, flow_id: str):
11
+ """Upload a file to Langflow and return the file path.
12
+
13
+ Args:
14
+ file_path (str): The path to the file to be uploaded.
15
+ host (str): The host URL of Langflow.
16
+ flow_id (UUID): The ID of the flow to which the file belongs.
17
+
18
+ Returns:
19
+ dict: A dictionary containing the file path.
20
+
21
+ Raises:
22
+ UploadError: If an error occurs during the upload process.
23
+ """
24
+ try:
25
+ url = f"{host}/api/v1/upload/{flow_id}"
26
+ with Path(file_path).open("rb") as file:
27
+ response = httpx.post(url, files={"file": file})
28
+ if response.status_code in {httpx.codes.OK, httpx.codes.CREATED}:
29
+ return response.json()
30
+ except Exception as e:
31
+ msg = f"Error uploading file: {e}"
32
+ raise UploadError(msg) from e
33
+
34
+ msg = f"Error uploading file: {response.status_code}"
35
+ raise UploadError(msg)
36
+
37
+
38
+ def upload_file(file_path: str, host: str, flow_id: str, components: list[str], tweaks: dict | None = None):
39
+ """Upload a file to Langflow and return the file path.
40
+
41
+ Args:
42
+ file_path (str): The path to the file to be uploaded.
43
+ host (str): The host URL of Langflow.
44
+ port (int): The port number of Langflow.
45
+ flow_id (UUID): The ID of the flow to which the file belongs.
46
+ components (str): List of component IDs or names that need the file.
47
+ tweaks (dict): A dictionary of tweaks to be applied to the file.
48
+
49
+ Returns:
50
+ dict: A dictionary containing the file path and any tweaks that were applied.
51
+
52
+ Raises:
53
+ UploadError: If an error occurs during the upload process.
54
+ """
55
+ try:
56
+ response = upload(file_path, host, flow_id)
57
+ except Exception as e:
58
+ msg = f"Error uploading file: {e}"
59
+ raise UploadError(msg) from e
60
+
61
+ if not tweaks:
62
+ tweaks = {}
63
+ if response["file_path"]:
64
+ for component in components:
65
+ if isinstance(component, str):
66
+ tweaks[component] = {"path": response["file_path"]}
67
+ else:
68
+ msg = f"Error uploading file: component ID or name must be a string. Got {type(component)}"
69
+ raise UploadError(msg)
70
+ return tweaks
71
+
72
+ msg = "Error uploading file"
73
+ raise UploadError(msg)
74
+
75
+
76
+ def replace_tweaks_with_env(tweaks: dict, env_vars: dict) -> dict:
77
+ """Replace keys in the tweaks dictionary with their corresponding environment variable values.
78
+
79
+ This function recursively traverses the tweaks dictionary and replaces any string keys
80
+ with their values from the provided environment variables. If a key's value is a dictionary,
81
+ the function will call itself to handle nested dictionaries.
82
+
83
+ Args:
84
+ tweaks (dict): A dictionary containing keys that may correspond to environment variable names.
85
+ env_vars (dict): A dictionary of environment variables where keys are variable names
86
+ and values are their corresponding values.
87
+
88
+ Returns:
89
+ dict: The updated tweaks dictionary with keys replaced by their environment variable values.
90
+ """
91
+ for key, value in tweaks.items():
92
+ if isinstance(value, dict):
93
+ # Recursively replace in nested dictionaries
94
+ tweaks[key] = replace_tweaks_with_env(value, env_vars)
95
+ elif isinstance(value, str):
96
+ env_value = env_vars.get(value) # Get the value from the provided environment variables
97
+ if env_value is not None:
98
+ tweaks[key] = env_value
99
+ return tweaks
lfx/log/__init__.py ADDED
@@ -0,0 +1,5 @@
1
+ """Logging module for lfx package."""
2
+
3
+ from lfx.log.logger import configure, logger
4
+
5
+ __all__ = ["configure", "logger"]