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/custom/validate.py ADDED
@@ -0,0 +1,488 @@
1
+ import ast
2
+ import contextlib
3
+ import importlib
4
+ import warnings
5
+ from types import FunctionType
6
+ from typing import Optional, Union
7
+
8
+ from langchain_core._api.deprecation import LangChainDeprecationWarning
9
+ from pydantic import ValidationError
10
+
11
+ from lfx.field_typing.constants import CUSTOM_COMPONENT_SUPPORTED_TYPES, DEFAULT_IMPORT_STRING
12
+ from lfx.log.logger import logger
13
+
14
+ _LANGFLOW_IS_INSTALLED = False
15
+
16
+ with contextlib.suppress(ImportError):
17
+ import langflow # noqa: F401
18
+
19
+ _LANGFLOW_IS_INSTALLED = True
20
+
21
+
22
+ def add_type_ignores() -> None:
23
+ if not hasattr(ast, "TypeIgnore"):
24
+
25
+ class TypeIgnore(ast.AST):
26
+ _fields = ()
27
+
28
+ ast.TypeIgnore = TypeIgnore # type: ignore[assignment, misc]
29
+
30
+
31
+ def validate_code(code):
32
+ # Initialize the errors dictionary
33
+ errors = {"imports": {"errors": []}, "function": {"errors": []}}
34
+
35
+ # Parse the code string into an abstract syntax tree (AST)
36
+ try:
37
+ tree = ast.parse(code)
38
+ except Exception as e: # noqa: BLE001
39
+ if hasattr(logger, "opt"):
40
+ logger.debug("Error parsing code", exc_info=True)
41
+ else:
42
+ logger.debug("Error parsing code")
43
+ errors["function"]["errors"].append(str(e))
44
+ return errors
45
+
46
+ # Add a dummy type_ignores field to the AST
47
+ add_type_ignores()
48
+ tree.type_ignores = []
49
+
50
+ # Evaluate the import statements
51
+ for node in tree.body:
52
+ if isinstance(node, ast.Import):
53
+ for alias in node.names:
54
+ try:
55
+ importlib.import_module(alias.name)
56
+ except ModuleNotFoundError as e:
57
+ errors["imports"]["errors"].append(str(e))
58
+
59
+ # Evaluate the function definition with langflow context
60
+ for node in tree.body:
61
+ if isinstance(node, ast.FunctionDef):
62
+ code_obj = compile(ast.Module(body=[node], type_ignores=[]), "<string>", "exec")
63
+ try:
64
+ # Create execution context with common langflow imports
65
+ exec_globals = _create_langflow_execution_context()
66
+ exec(code_obj, exec_globals)
67
+ except Exception as e: # noqa: BLE001
68
+ logger.debug("Error executing function code", exc_info=True)
69
+ errors["function"]["errors"].append(str(e))
70
+
71
+ # Return the errors dictionary
72
+ return errors
73
+
74
+
75
+ def _create_langflow_execution_context():
76
+ """Create execution context with common langflow imports."""
77
+ context = {}
78
+
79
+ # Import common langflow types that are used in templates
80
+ try:
81
+ from lfx.schema.dataframe import DataFrame
82
+
83
+ context["DataFrame"] = DataFrame
84
+ except ImportError:
85
+ # Create a mock DataFrame if import fails
86
+ context["DataFrame"] = type("DataFrame", (), {})
87
+
88
+ try:
89
+ from lfx.schema.message import Message
90
+
91
+ context["Message"] = Message
92
+ except ImportError:
93
+ context["Message"] = type("Message", (), {})
94
+
95
+ try:
96
+ from lfx.schema.data import Data
97
+
98
+ context["Data"] = Data
99
+ except ImportError:
100
+ context["Data"] = type("Data", (), {})
101
+
102
+ try:
103
+ from lfx.custom import Component
104
+
105
+ context["Component"] = Component
106
+ except ImportError:
107
+ context["Component"] = type("Component", (), {})
108
+
109
+ try:
110
+ from lfx.io import HandleInput, Output, TabInput
111
+
112
+ context["HandleInput"] = HandleInput
113
+ context["Output"] = Output
114
+ context["TabInput"] = TabInput
115
+ except ImportError:
116
+ context["HandleInput"] = type("HandleInput", (), {})
117
+ context["Output"] = type("Output", (), {})
118
+ context["TabInput"] = type("TabInput", (), {})
119
+
120
+ # Add common Python typing imports
121
+ try:
122
+ from typing import Any, Optional, Union
123
+
124
+ context["Any"] = Any
125
+ context["Dict"] = dict
126
+ context["List"] = list
127
+ context["Optional"] = Optional
128
+ context["Union"] = Union
129
+ except ImportError:
130
+ pass
131
+
132
+ return context
133
+
134
+
135
+ def eval_function(function_string: str):
136
+ # Create an empty dictionary to serve as a separate namespace
137
+ namespace: dict = {}
138
+
139
+ # Execute the code string in the new namespace
140
+ exec(function_string, namespace)
141
+ function_object = next(
142
+ (
143
+ obj
144
+ for name, obj in namespace.items()
145
+ if isinstance(obj, FunctionType) and obj.__code__.co_filename == "<string>"
146
+ ),
147
+ None,
148
+ )
149
+ if function_object is None:
150
+ msg = "Function string does not contain a function"
151
+ raise ValueError(msg)
152
+ return function_object
153
+
154
+
155
+ def execute_function(code, function_name, *args, **kwargs):
156
+ add_type_ignores()
157
+
158
+ module = ast.parse(code)
159
+ exec_globals = globals().copy()
160
+
161
+ for node in module.body:
162
+ if isinstance(node, ast.Import):
163
+ for alias in node.names:
164
+ try:
165
+ exec(
166
+ f"{alias.asname or alias.name} = importlib.import_module('{alias.name}')",
167
+ exec_globals,
168
+ locals(),
169
+ )
170
+ exec_globals[alias.asname or alias.name] = importlib.import_module(alias.name)
171
+ except ModuleNotFoundError as e:
172
+ msg = f"Module {alias.name} not found. Please install it and try again."
173
+ raise ModuleNotFoundError(msg) from e
174
+
175
+ function_code = next(
176
+ node for node in module.body if isinstance(node, ast.FunctionDef) and node.name == function_name
177
+ )
178
+ function_code.parent = None
179
+ code_obj = compile(ast.Module(body=[function_code], type_ignores=[]), "<string>", "exec")
180
+ exec_locals = dict(locals())
181
+ try:
182
+ exec(code_obj, exec_globals, exec_locals)
183
+ except Exception as exc:
184
+ msg = "Function string does not contain a function"
185
+ raise ValueError(msg) from exc
186
+
187
+ # Add the function to the exec_globals dictionary
188
+ exec_globals[function_name] = exec_locals[function_name]
189
+
190
+ return exec_globals[function_name](*args, **kwargs)
191
+
192
+
193
+ def create_function(code, function_name):
194
+ if not hasattr(ast, "TypeIgnore"):
195
+
196
+ class TypeIgnore(ast.AST):
197
+ _fields = ()
198
+
199
+ ast.TypeIgnore = TypeIgnore
200
+
201
+ module = ast.parse(code)
202
+ exec_globals = globals().copy()
203
+
204
+ for node in module.body:
205
+ if isinstance(node, ast.Import | ast.ImportFrom):
206
+ for alias in node.names:
207
+ try:
208
+ if isinstance(node, ast.ImportFrom):
209
+ module_name = node.module
210
+ exec_globals[alias.asname or alias.name] = getattr(
211
+ importlib.import_module(module_name), alias.name
212
+ )
213
+ else:
214
+ module_name = alias.name
215
+ exec_globals[alias.asname or alias.name] = importlib.import_module(module_name)
216
+ except ModuleNotFoundError as e:
217
+ msg = f"Module {alias.name} not found. Please install it and try again."
218
+ raise ModuleNotFoundError(msg) from e
219
+
220
+ function_code = next(
221
+ node for node in module.body if isinstance(node, ast.FunctionDef) and node.name == function_name
222
+ )
223
+ function_code.parent = None
224
+ code_obj = compile(ast.Module(body=[function_code], type_ignores=[]), "<string>", "exec")
225
+ exec_locals = dict(locals())
226
+ with contextlib.suppress(Exception):
227
+ exec(code_obj, exec_globals, exec_locals)
228
+ exec_globals[function_name] = exec_locals[function_name]
229
+
230
+ # Return a function that imports necessary modules and calls the target function
231
+ def wrapped_function(*args, **kwargs):
232
+ for module_name, module in exec_globals.items():
233
+ if isinstance(module, type(importlib)):
234
+ globals()[module_name] = module
235
+
236
+ return exec_globals[function_name](*args, **kwargs)
237
+
238
+ return wrapped_function
239
+
240
+
241
+ def create_class(code, class_name):
242
+ """Dynamically create a class from a string of code and a specified class name.
243
+
244
+ Args:
245
+ code: String containing the Python code defining the class
246
+ class_name: Name of the class to be created
247
+
248
+ Returns:
249
+ A function that, when called, returns an instance of the created class
250
+
251
+ Raises:
252
+ ValueError: If the code contains syntax errors or the class definition is invalid
253
+ """
254
+ if not hasattr(ast, "TypeIgnore"):
255
+ ast.TypeIgnore = create_type_ignore_class()
256
+
257
+ code = code.replace("from langflow import CustomComponent", "from langflow.custom import CustomComponent")
258
+ code = code.replace(
259
+ "from langflow.interface.custom.custom_component import CustomComponent",
260
+ "from langflow.custom import CustomComponent",
261
+ )
262
+
263
+ code = DEFAULT_IMPORT_STRING + "\n" + code
264
+ try:
265
+ module = ast.parse(code)
266
+ exec_globals = prepare_global_scope(module)
267
+
268
+ class_code = extract_class_code(module, class_name)
269
+ compiled_class = compile_class_code(class_code)
270
+
271
+ return build_class_constructor(compiled_class, exec_globals, class_name)
272
+
273
+ except SyntaxError as e:
274
+ msg = f"Syntax error in code: {e!s}"
275
+ raise ValueError(msg) from e
276
+ except NameError as e:
277
+ msg = f"Name error (possibly undefined variable): {e!s}"
278
+ raise ValueError(msg) from e
279
+ except ValidationError as e:
280
+ messages = [error["msg"].split(",", 1) for error in e.errors()]
281
+ error_message = "\n".join([message[1] if len(message) > 1 else message[0] for message in messages])
282
+ raise ValueError(error_message) from e
283
+ except Exception as e:
284
+ msg = f"Error creating class: {e!s}"
285
+ raise ValueError(msg) from e
286
+
287
+
288
+ def create_type_ignore_class():
289
+ """Create a TypeIgnore class for AST module if it doesn't exist.
290
+
291
+ Returns:
292
+ TypeIgnore class
293
+ """
294
+
295
+ class TypeIgnore(ast.AST):
296
+ _fields = ()
297
+
298
+ return TypeIgnore
299
+
300
+
301
+ def prepare_global_scope(module):
302
+ """Prepares the global scope with necessary imports from the provided code module.
303
+
304
+ Args:
305
+ module: AST parsed module
306
+
307
+ Returns:
308
+ Dictionary representing the global scope with imported modules
309
+
310
+ Raises:
311
+ ModuleNotFoundError: If a module is not found in the code
312
+ """
313
+ exec_globals = globals().copy()
314
+ imports = []
315
+ import_froms = []
316
+ definitions = []
317
+
318
+ for node in module.body:
319
+ if isinstance(node, ast.Import):
320
+ imports.append(node)
321
+ elif isinstance(node, ast.ImportFrom) and node.module is not None:
322
+ import_froms.append(node)
323
+ elif isinstance(node, ast.ClassDef | ast.FunctionDef | ast.Assign):
324
+ definitions.append(node)
325
+
326
+ for node in imports:
327
+ for alias in node.names:
328
+ try:
329
+ module_name = alias.name
330
+ variable_name = alias.asname or alias.name
331
+ exec_globals[variable_name] = importlib.import_module(module_name)
332
+ except ModuleNotFoundError as e:
333
+ msg = f"Module {alias.name} not found. Please install it and try again."
334
+ raise ModuleNotFoundError(msg) from e
335
+
336
+ for node in import_froms:
337
+ try:
338
+ module_name = node.module
339
+ # Apply warning suppression only when needed
340
+ if "langchain" in module_name:
341
+ with warnings.catch_warnings():
342
+ warnings.simplefilter("ignore", LangChainDeprecationWarning)
343
+ imported_module = importlib.import_module(module_name)
344
+ else:
345
+ imported_module = importlib.import_module(module_name)
346
+
347
+ for alias in node.names:
348
+ try:
349
+ # First try getting it as an attribute
350
+ exec_globals[alias.name] = getattr(imported_module, alias.name)
351
+ except AttributeError:
352
+ # If that fails, try importing the full module path
353
+ full_module_path = f"{module_name}.{alias.name}"
354
+ exec_globals[alias.name] = importlib.import_module(full_module_path)
355
+ except ModuleNotFoundError as e:
356
+ msg = f"Module {node.module} not found. Please install it and try again"
357
+ raise ModuleNotFoundError(msg) from e
358
+
359
+ if definitions:
360
+ combined_module = ast.Module(body=definitions, type_ignores=[])
361
+ compiled_code = compile(combined_module, "<string>", "exec")
362
+ exec(compiled_code, exec_globals)
363
+
364
+ return exec_globals
365
+
366
+
367
+ def extract_class_code(module, class_name):
368
+ """Extracts the AST node for the specified class from the module.
369
+
370
+ Args:
371
+ module: AST parsed module
372
+ class_name: Name of the class to extract
373
+
374
+ Returns:
375
+ AST node of the specified class
376
+ """
377
+ class_code = next(node for node in module.body if isinstance(node, ast.ClassDef) and node.name == class_name)
378
+
379
+ class_code.parent = None
380
+ return class_code
381
+
382
+
383
+ def compile_class_code(class_code):
384
+ """Compiles the AST node of a class into a code object.
385
+
386
+ Args:
387
+ class_code: AST node of the class
388
+
389
+ Returns:
390
+ Compiled code object of the class
391
+ """
392
+ return compile(ast.Module(body=[class_code], type_ignores=[]), "<string>", "exec")
393
+
394
+
395
+ def build_class_constructor(compiled_class, exec_globals, class_name):
396
+ """Builds a constructor function for the dynamically created class.
397
+
398
+ Args:
399
+ compiled_class: Compiled code object of the class
400
+ exec_globals: Global scope with necessary imports
401
+ class_name: Name of the class
402
+
403
+ Returns:
404
+ Constructor function for the class
405
+ """
406
+ exec_locals = dict(locals())
407
+ exec(compiled_class, exec_globals, exec_locals)
408
+ exec_globals[class_name] = exec_locals[class_name]
409
+
410
+ # Return a function that imports necessary modules and creates an instance of the target class
411
+ def build_custom_class():
412
+ for module_name, module in exec_globals.items():
413
+ if isinstance(module, type(importlib)):
414
+ globals()[module_name] = module
415
+
416
+ return exec_globals[class_name]
417
+
418
+ return build_custom_class()
419
+
420
+
421
+ # TODO: Remove this function
422
+ def get_default_imports(code_string):
423
+ """Returns a dictionary of default imports for the dynamic class constructor."""
424
+ default_imports = {
425
+ "Optional": Optional,
426
+ "List": list,
427
+ "Dict": dict,
428
+ "Union": Union,
429
+ }
430
+ langflow_imports = list(CUSTOM_COMPONENT_SUPPORTED_TYPES.keys())
431
+ necessary_imports = find_names_in_code(code_string, langflow_imports)
432
+ langflow_module = importlib.import_module("lfx.field_typing")
433
+ default_imports.update({name: getattr(langflow_module, name) for name in necessary_imports})
434
+
435
+ return default_imports
436
+
437
+
438
+ def find_names_in_code(code, names):
439
+ """Finds if any of the specified names are present in the given code string.
440
+
441
+ Args:
442
+ code: The source code as a string.
443
+ names: A list of names to check for in the code.
444
+
445
+ Returns:
446
+ A set of names that are found in the code.
447
+ """
448
+ return {name for name in names if name in code}
449
+
450
+
451
+ def extract_function_name(code):
452
+ module = ast.parse(code)
453
+ for node in module.body:
454
+ if isinstance(node, ast.FunctionDef):
455
+ return node.name
456
+ msg = "No function definition found in the code string"
457
+ raise ValueError(msg)
458
+
459
+
460
+ def extract_class_name(code: str) -> str:
461
+ """Extract the name of the first Component subclass found in the code.
462
+
463
+ Args:
464
+ code (str): The source code to parse
465
+
466
+ Returns:
467
+ str: Name of the first Component subclass found
468
+
469
+ Raises:
470
+ TypeError: If no Component subclass is found in the code
471
+ """
472
+ try:
473
+ module = ast.parse(code)
474
+ for node in module.body:
475
+ if not isinstance(node, ast.ClassDef):
476
+ continue
477
+
478
+ # Check bases for Component inheritance
479
+ # TODO: Build a more robust check for Component inheritance
480
+ for base in node.bases:
481
+ if isinstance(base, ast.Name) and any(pattern in base.id for pattern in ["Component", "LC"]):
482
+ return node.name
483
+
484
+ msg = f"No Component subclass found in the code string. Code snippet: {code[:100]}"
485
+ raise TypeError(msg)
486
+ except SyntaxError as e:
487
+ msg = f"Invalid Python code: {e!s}"
488
+ raise ValueError(msg) from e
lfx/events/__init__.py ADDED
@@ -0,0 +1 @@
1
+ # Event management for lfx package
@@ -0,0 +1,110 @@
1
+ from __future__ import annotations
2
+
3
+ import inspect
4
+ import json
5
+ import time
6
+ import uuid
7
+ from functools import partial
8
+ from typing import TYPE_CHECKING
9
+
10
+ from fastapi.encoders import jsonable_encoder
11
+ from typing_extensions import Protocol
12
+
13
+ from lfx.log.logger import logger
14
+
15
+ if TYPE_CHECKING:
16
+ # Lightweight type stub for log types
17
+ LoggableType = dict | str | int | float | bool | list | None
18
+
19
+
20
+ class EventCallback(Protocol):
21
+ def __call__(self, *, manager: EventManager, event_type: str, data: LoggableType): ...
22
+
23
+
24
+ class PartialEventCallback(Protocol):
25
+ def __call__(self, *, data: LoggableType): ...
26
+
27
+
28
+ class EventManager:
29
+ def __init__(self, queue):
30
+ self.queue = queue
31
+ self.events: dict[str, PartialEventCallback] = {}
32
+
33
+ @staticmethod
34
+ def _validate_callback(callback: EventCallback) -> None:
35
+ if not callable(callback):
36
+ msg = "Callback must be callable"
37
+ raise TypeError(msg)
38
+ # Check if it has `self, event_type and data`
39
+ sig = inspect.signature(callback)
40
+ parameters = ["manager", "event_type", "data"]
41
+ if len(sig.parameters) != len(parameters):
42
+ msg = "Callback must have exactly 3 parameters"
43
+ raise ValueError(msg)
44
+ if not all(param.name in parameters for param in sig.parameters.values()):
45
+ msg = "Callback must have exactly 3 parameters: manager, event_type, and data"
46
+ raise ValueError(msg)
47
+
48
+ def register_event(
49
+ self,
50
+ name: str,
51
+ event_type: str,
52
+ callback: EventCallback | None = None,
53
+ ) -> None:
54
+ if not name:
55
+ msg = "Event name cannot be empty"
56
+ raise ValueError(msg)
57
+ if not name.startswith("on_"):
58
+ msg = "Event name must start with 'on_'"
59
+ raise ValueError(msg)
60
+ if callback is None:
61
+ callback_ = partial(self.send_event, event_type=event_type)
62
+ else:
63
+ callback_ = partial(callback, manager=self, event_type=event_type)
64
+ self.events[name] = callback_
65
+
66
+ def send_event(self, *, event_type: str, data: LoggableType):
67
+ try:
68
+ # Simple event creation without heavy dependencies
69
+ if isinstance(data, dict) and event_type in {"message", "error", "warning", "info", "token"}:
70
+ # For lfx, keep it simple without playground event creation
71
+ pass
72
+ except Exception: # noqa: BLE001
73
+ logger.debug(f"Error processing event: {event_type}")
74
+ jsonable_data = jsonable_encoder(data)
75
+ json_data = {"event": event_type, "data": jsonable_data}
76
+ event_id = f"{event_type}-{uuid.uuid4()}"
77
+ str_data = json.dumps(json_data) + "\n\n"
78
+ if self.queue:
79
+ try:
80
+ self.queue.put_nowait((event_id, str_data.encode("utf-8"), time.time()))
81
+ except Exception: # noqa: BLE001
82
+ logger.debug("Queue not available for event")
83
+
84
+ def noop(self, *, data: LoggableType) -> None:
85
+ pass
86
+
87
+ def __getattr__(self, name: str) -> PartialEventCallback:
88
+ return self.events.get(name, self.noop)
89
+
90
+
91
+ def create_default_event_manager(queue=None):
92
+ manager = EventManager(queue)
93
+ manager.register_event("on_token", "token")
94
+ manager.register_event("on_vertices_sorted", "vertices_sorted")
95
+ manager.register_event("on_error", "error")
96
+ manager.register_event("on_end", "end")
97
+ manager.register_event("on_message", "add_message")
98
+ manager.register_event("on_remove_message", "remove_message")
99
+ manager.register_event("on_end_vertex", "end_vertex")
100
+ manager.register_event("on_build_start", "build_start")
101
+ manager.register_event("on_build_end", "build_end")
102
+ return manager
103
+
104
+
105
+ def create_stream_tokens_event_manager(queue=None):
106
+ manager = EventManager(queue)
107
+ manager.register_event("on_message", "add_message")
108
+ manager.register_event("on_token", "token")
109
+ manager.register_event("on_end", "end")
110
+ return manager
File without changes
@@ -0,0 +1,15 @@
1
+ from lfx.schema.properties import Source
2
+
3
+
4
+ class ComponentBuildError(Exception):
5
+ def __init__(self, message: str, formatted_traceback: str):
6
+ self.message = message
7
+ self.formatted_traceback = formatted_traceback
8
+ super().__init__(message)
9
+
10
+
11
+ class StreamingError(Exception):
12
+ def __init__(self, cause: Exception, source: Source):
13
+ self.cause = cause
14
+ self.source = source
15
+ super().__init__(cause)
@@ -0,0 +1,91 @@
1
+ from typing import Any
2
+
3
+ from .constants import (
4
+ AgentExecutor,
5
+ BaseChatMemory,
6
+ BaseChatModel,
7
+ BaseDocumentCompressor,
8
+ BaseLanguageModel,
9
+ BaseLLM,
10
+ BaseLoader,
11
+ BaseMemory,
12
+ BaseOutputParser,
13
+ BasePromptTemplate,
14
+ BaseRetriever,
15
+ Callable,
16
+ Chain,
17
+ ChatPromptTemplate,
18
+ Code,
19
+ Data,
20
+ Document,
21
+ Embeddings,
22
+ LanguageModel,
23
+ NestedDict,
24
+ Object,
25
+ PromptTemplate,
26
+ Retriever,
27
+ Text,
28
+ TextSplitter,
29
+ Tool,
30
+ VectorStore,
31
+ )
32
+ from .range_spec import RangeSpec
33
+
34
+
35
+ def _import_input_class():
36
+ from lfx.template.field.base import Input
37
+
38
+ return Input
39
+
40
+
41
+ def _import_output_class():
42
+ from lfx.template.field.base import Output
43
+
44
+ return Output
45
+
46
+
47
+ def __getattr__(name: str) -> Any:
48
+ # This is to avoid circular imports
49
+ if name == "Input":
50
+ return _import_input_class()
51
+ if name == "Output":
52
+ return _import_output_class()
53
+ if name == "RangeSpec":
54
+ return RangeSpec
55
+ # The other names should work as if they were imported from constants
56
+ # Import the constants module langflow.field_typing.constants
57
+ from . import constants
58
+
59
+ return getattr(constants, name)
60
+
61
+
62
+ __all__ = [
63
+ "AgentExecutor",
64
+ "BaseChatMemory",
65
+ "BaseChatModel",
66
+ "BaseDocumentCompressor",
67
+ "BaseLLM",
68
+ "BaseLanguageModel",
69
+ "BaseLoader",
70
+ "BaseMemory",
71
+ "BaseOutputParser",
72
+ "BasePromptTemplate",
73
+ "BaseRetriever",
74
+ "Callable",
75
+ "Chain",
76
+ "ChatPromptTemplate",
77
+ "Code",
78
+ "Data",
79
+ "Document",
80
+ "Embeddings",
81
+ "LanguageModel",
82
+ "NestedDict",
83
+ "Object",
84
+ "PromptTemplate",
85
+ "RangeSpec",
86
+ "Retriever",
87
+ "Text",
88
+ "TextSplitter",
89
+ "Tool",
90
+ "VectorStore",
91
+ ]