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

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

Potentially problematic release.


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

Files changed (769) hide show
  1. lfx/__init__.py +0 -0
  2. lfx/__main__.py +25 -0
  3. lfx/_assets/component_index.json +1 -0
  4. lfx/base/__init__.py +0 -0
  5. lfx/base/agents/__init__.py +0 -0
  6. lfx/base/agents/agent.py +375 -0
  7. lfx/base/agents/altk_base_agent.py +380 -0
  8. lfx/base/agents/altk_tool_wrappers.py +565 -0
  9. lfx/base/agents/callback.py +130 -0
  10. lfx/base/agents/context.py +109 -0
  11. lfx/base/agents/crewai/__init__.py +0 -0
  12. lfx/base/agents/crewai/crew.py +231 -0
  13. lfx/base/agents/crewai/tasks.py +12 -0
  14. lfx/base/agents/default_prompts.py +23 -0
  15. lfx/base/agents/errors.py +15 -0
  16. lfx/base/agents/events.py +430 -0
  17. lfx/base/agents/utils.py +237 -0
  18. lfx/base/astra_assistants/__init__.py +0 -0
  19. lfx/base/astra_assistants/util.py +171 -0
  20. lfx/base/chains/__init__.py +0 -0
  21. lfx/base/chains/model.py +19 -0
  22. lfx/base/composio/__init__.py +0 -0
  23. lfx/base/composio/composio_base.py +2584 -0
  24. lfx/base/compressors/__init__.py +0 -0
  25. lfx/base/compressors/model.py +60 -0
  26. lfx/base/constants.py +46 -0
  27. lfx/base/curl/__init__.py +0 -0
  28. lfx/base/curl/parse.py +188 -0
  29. lfx/base/data/__init__.py +5 -0
  30. lfx/base/data/base_file.py +810 -0
  31. lfx/base/data/docling_utils.py +338 -0
  32. lfx/base/data/storage_utils.py +192 -0
  33. lfx/base/data/utils.py +362 -0
  34. lfx/base/datastax/__init__.py +5 -0
  35. lfx/base/datastax/astradb_base.py +896 -0
  36. lfx/base/document_transformers/__init__.py +0 -0
  37. lfx/base/document_transformers/model.py +43 -0
  38. lfx/base/embeddings/__init__.py +0 -0
  39. lfx/base/embeddings/aiml_embeddings.py +62 -0
  40. lfx/base/embeddings/embeddings_class.py +113 -0
  41. lfx/base/embeddings/model.py +26 -0
  42. lfx/base/flow_processing/__init__.py +0 -0
  43. lfx/base/flow_processing/utils.py +86 -0
  44. lfx/base/huggingface/__init__.py +0 -0
  45. lfx/base/huggingface/model_bridge.py +133 -0
  46. lfx/base/io/__init__.py +0 -0
  47. lfx/base/io/chat.py +21 -0
  48. lfx/base/io/text.py +22 -0
  49. lfx/base/knowledge_bases/__init__.py +3 -0
  50. lfx/base/knowledge_bases/knowledge_base_utils.py +137 -0
  51. lfx/base/langchain_utilities/__init__.py +0 -0
  52. lfx/base/langchain_utilities/model.py +35 -0
  53. lfx/base/langchain_utilities/spider_constants.py +1 -0
  54. lfx/base/langwatch/__init__.py +0 -0
  55. lfx/base/langwatch/utils.py +18 -0
  56. lfx/base/mcp/__init__.py +0 -0
  57. lfx/base/mcp/constants.py +2 -0
  58. lfx/base/mcp/util.py +1659 -0
  59. lfx/base/memory/__init__.py +0 -0
  60. lfx/base/memory/memory.py +49 -0
  61. lfx/base/memory/model.py +38 -0
  62. lfx/base/models/__init__.py +3 -0
  63. lfx/base/models/aiml_constants.py +51 -0
  64. lfx/base/models/anthropic_constants.py +51 -0
  65. lfx/base/models/aws_constants.py +151 -0
  66. lfx/base/models/chat_result.py +76 -0
  67. lfx/base/models/cometapi_constants.py +54 -0
  68. lfx/base/models/google_generative_ai_constants.py +70 -0
  69. lfx/base/models/google_generative_ai_model.py +38 -0
  70. lfx/base/models/groq_constants.py +150 -0
  71. lfx/base/models/groq_model_discovery.py +265 -0
  72. lfx/base/models/model.py +375 -0
  73. lfx/base/models/model_input_constants.py +378 -0
  74. lfx/base/models/model_metadata.py +41 -0
  75. lfx/base/models/model_utils.py +108 -0
  76. lfx/base/models/novita_constants.py +35 -0
  77. lfx/base/models/ollama_constants.py +52 -0
  78. lfx/base/models/openai_constants.py +129 -0
  79. lfx/base/models/sambanova_constants.py +18 -0
  80. lfx/base/models/watsonx_constants.py +36 -0
  81. lfx/base/processing/__init__.py +0 -0
  82. lfx/base/prompts/__init__.py +0 -0
  83. lfx/base/prompts/api_utils.py +224 -0
  84. lfx/base/prompts/utils.py +61 -0
  85. lfx/base/textsplitters/__init__.py +0 -0
  86. lfx/base/textsplitters/model.py +28 -0
  87. lfx/base/tools/__init__.py +0 -0
  88. lfx/base/tools/base.py +26 -0
  89. lfx/base/tools/component_tool.py +325 -0
  90. lfx/base/tools/constants.py +49 -0
  91. lfx/base/tools/flow_tool.py +132 -0
  92. lfx/base/tools/run_flow.py +698 -0
  93. lfx/base/vectorstores/__init__.py +0 -0
  94. lfx/base/vectorstores/model.py +193 -0
  95. lfx/base/vectorstores/utils.py +22 -0
  96. lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
  97. lfx/cli/__init__.py +5 -0
  98. lfx/cli/commands.py +327 -0
  99. lfx/cli/common.py +650 -0
  100. lfx/cli/run.py +506 -0
  101. lfx/cli/script_loader.py +289 -0
  102. lfx/cli/serve_app.py +546 -0
  103. lfx/cli/validation.py +69 -0
  104. lfx/components/FAISS/__init__.py +34 -0
  105. lfx/components/FAISS/faiss.py +111 -0
  106. lfx/components/Notion/__init__.py +19 -0
  107. lfx/components/Notion/add_content_to_page.py +269 -0
  108. lfx/components/Notion/create_page.py +94 -0
  109. lfx/components/Notion/list_database_properties.py +68 -0
  110. lfx/components/Notion/list_pages.py +122 -0
  111. lfx/components/Notion/list_users.py +77 -0
  112. lfx/components/Notion/page_content_viewer.py +93 -0
  113. lfx/components/Notion/search.py +111 -0
  114. lfx/components/Notion/update_page_property.py +114 -0
  115. lfx/components/__init__.py +428 -0
  116. lfx/components/_importing.py +42 -0
  117. lfx/components/agentql/__init__.py +3 -0
  118. lfx/components/agentql/agentql_api.py +151 -0
  119. lfx/components/aiml/__init__.py +37 -0
  120. lfx/components/aiml/aiml.py +115 -0
  121. lfx/components/aiml/aiml_embeddings.py +37 -0
  122. lfx/components/altk/__init__.py +34 -0
  123. lfx/components/altk/altk_agent.py +193 -0
  124. lfx/components/amazon/__init__.py +36 -0
  125. lfx/components/amazon/amazon_bedrock_converse.py +195 -0
  126. lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
  127. lfx/components/amazon/amazon_bedrock_model.py +130 -0
  128. lfx/components/amazon/s3_bucket_uploader.py +211 -0
  129. lfx/components/anthropic/__init__.py +34 -0
  130. lfx/components/anthropic/anthropic.py +187 -0
  131. lfx/components/apify/__init__.py +5 -0
  132. lfx/components/apify/apify_actor.py +325 -0
  133. lfx/components/arxiv/__init__.py +3 -0
  134. lfx/components/arxiv/arxiv.py +169 -0
  135. lfx/components/assemblyai/__init__.py +46 -0
  136. lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  137. lfx/components/assemblyai/assemblyai_lemur.py +183 -0
  138. lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  139. lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  140. lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
  141. lfx/components/azure/__init__.py +37 -0
  142. lfx/components/azure/azure_openai.py +95 -0
  143. lfx/components/azure/azure_openai_embeddings.py +83 -0
  144. lfx/components/baidu/__init__.py +32 -0
  145. lfx/components/baidu/baidu_qianfan_chat.py +113 -0
  146. lfx/components/bing/__init__.py +3 -0
  147. lfx/components/bing/bing_search_api.py +61 -0
  148. lfx/components/cassandra/__init__.py +40 -0
  149. lfx/components/cassandra/cassandra.py +264 -0
  150. lfx/components/cassandra/cassandra_chat.py +92 -0
  151. lfx/components/cassandra/cassandra_graph.py +238 -0
  152. lfx/components/chains/__init__.py +3 -0
  153. lfx/components/chroma/__init__.py +34 -0
  154. lfx/components/chroma/chroma.py +169 -0
  155. lfx/components/cleanlab/__init__.py +40 -0
  156. lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
  157. lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  158. lfx/components/cleanlab/cleanlab_remediator.py +131 -0
  159. lfx/components/clickhouse/__init__.py +34 -0
  160. lfx/components/clickhouse/clickhouse.py +135 -0
  161. lfx/components/cloudflare/__init__.py +32 -0
  162. lfx/components/cloudflare/cloudflare.py +81 -0
  163. lfx/components/cohere/__init__.py +40 -0
  164. lfx/components/cohere/cohere_embeddings.py +81 -0
  165. lfx/components/cohere/cohere_models.py +46 -0
  166. lfx/components/cohere/cohere_rerank.py +51 -0
  167. lfx/components/cometapi/__init__.py +32 -0
  168. lfx/components/cometapi/cometapi.py +166 -0
  169. lfx/components/composio/__init__.py +222 -0
  170. lfx/components/composio/agentql_composio.py +11 -0
  171. lfx/components/composio/agiled_composio.py +11 -0
  172. lfx/components/composio/airtable_composio.py +11 -0
  173. lfx/components/composio/apollo_composio.py +11 -0
  174. lfx/components/composio/asana_composio.py +11 -0
  175. lfx/components/composio/attio_composio.py +11 -0
  176. lfx/components/composio/bitbucket_composio.py +11 -0
  177. lfx/components/composio/bolna_composio.py +11 -0
  178. lfx/components/composio/brightdata_composio.py +11 -0
  179. lfx/components/composio/calendly_composio.py +11 -0
  180. lfx/components/composio/canva_composio.py +11 -0
  181. lfx/components/composio/canvas_composio.py +11 -0
  182. lfx/components/composio/coda_composio.py +11 -0
  183. lfx/components/composio/composio_api.py +278 -0
  184. lfx/components/composio/contentful_composio.py +11 -0
  185. lfx/components/composio/digicert_composio.py +11 -0
  186. lfx/components/composio/discord_composio.py +11 -0
  187. lfx/components/composio/dropbox_compnent.py +11 -0
  188. lfx/components/composio/elevenlabs_composio.py +11 -0
  189. lfx/components/composio/exa_composio.py +11 -0
  190. lfx/components/composio/figma_composio.py +11 -0
  191. lfx/components/composio/finage_composio.py +11 -0
  192. lfx/components/composio/firecrawl_composio.py +11 -0
  193. lfx/components/composio/fireflies_composio.py +11 -0
  194. lfx/components/composio/fixer_composio.py +11 -0
  195. lfx/components/composio/flexisign_composio.py +11 -0
  196. lfx/components/composio/freshdesk_composio.py +11 -0
  197. lfx/components/composio/github_composio.py +11 -0
  198. lfx/components/composio/gmail_composio.py +38 -0
  199. lfx/components/composio/googlebigquery_composio.py +11 -0
  200. lfx/components/composio/googlecalendar_composio.py +11 -0
  201. lfx/components/composio/googleclassroom_composio.py +11 -0
  202. lfx/components/composio/googledocs_composio.py +11 -0
  203. lfx/components/composio/googlemeet_composio.py +11 -0
  204. lfx/components/composio/googlesheets_composio.py +11 -0
  205. lfx/components/composio/googletasks_composio.py +8 -0
  206. lfx/components/composio/heygen_composio.py +11 -0
  207. lfx/components/composio/instagram_composio.py +11 -0
  208. lfx/components/composio/jira_composio.py +11 -0
  209. lfx/components/composio/jotform_composio.py +11 -0
  210. lfx/components/composio/klaviyo_composio.py +11 -0
  211. lfx/components/composio/linear_composio.py +11 -0
  212. lfx/components/composio/listennotes_composio.py +11 -0
  213. lfx/components/composio/mem0_composio.py +11 -0
  214. lfx/components/composio/miro_composio.py +11 -0
  215. lfx/components/composio/missive_composio.py +11 -0
  216. lfx/components/composio/notion_composio.py +11 -0
  217. lfx/components/composio/onedrive_composio.py +11 -0
  218. lfx/components/composio/outlook_composio.py +11 -0
  219. lfx/components/composio/pandadoc_composio.py +11 -0
  220. lfx/components/composio/peopledatalabs_composio.py +11 -0
  221. lfx/components/composio/perplexityai_composio.py +11 -0
  222. lfx/components/composio/reddit_composio.py +11 -0
  223. lfx/components/composio/serpapi_composio.py +11 -0
  224. lfx/components/composio/slack_composio.py +11 -0
  225. lfx/components/composio/slackbot_composio.py +11 -0
  226. lfx/components/composio/snowflake_composio.py +11 -0
  227. lfx/components/composio/supabase_composio.py +11 -0
  228. lfx/components/composio/tavily_composio.py +11 -0
  229. lfx/components/composio/timelinesai_composio.py +11 -0
  230. lfx/components/composio/todoist_composio.py +11 -0
  231. lfx/components/composio/wrike_composio.py +11 -0
  232. lfx/components/composio/youtube_composio.py +11 -0
  233. lfx/components/confluence/__init__.py +3 -0
  234. lfx/components/confluence/confluence.py +84 -0
  235. lfx/components/couchbase/__init__.py +34 -0
  236. lfx/components/couchbase/couchbase.py +102 -0
  237. lfx/components/crewai/__init__.py +49 -0
  238. lfx/components/crewai/crewai.py +108 -0
  239. lfx/components/crewai/hierarchical_crew.py +47 -0
  240. lfx/components/crewai/hierarchical_task.py +45 -0
  241. lfx/components/crewai/sequential_crew.py +53 -0
  242. lfx/components/crewai/sequential_task.py +74 -0
  243. lfx/components/crewai/sequential_task_agent.py +144 -0
  244. lfx/components/cuga/__init__.py +34 -0
  245. lfx/components/cuga/cuga_agent.py +730 -0
  246. lfx/components/custom_component/__init__.py +34 -0
  247. lfx/components/custom_component/custom_component.py +31 -0
  248. lfx/components/data/__init__.py +114 -0
  249. lfx/components/data_source/__init__.py +58 -0
  250. lfx/components/data_source/api_request.py +577 -0
  251. lfx/components/data_source/csv_to_data.py +101 -0
  252. lfx/components/data_source/json_to_data.py +106 -0
  253. lfx/components/data_source/mock_data.py +398 -0
  254. lfx/components/data_source/news_search.py +166 -0
  255. lfx/components/data_source/rss.py +71 -0
  256. lfx/components/data_source/sql_executor.py +101 -0
  257. lfx/components/data_source/url.py +311 -0
  258. lfx/components/data_source/web_search.py +326 -0
  259. lfx/components/datastax/__init__.py +76 -0
  260. lfx/components/datastax/astradb_assistant_manager.py +307 -0
  261. lfx/components/datastax/astradb_chatmemory.py +40 -0
  262. lfx/components/datastax/astradb_cql.py +288 -0
  263. lfx/components/datastax/astradb_graph.py +217 -0
  264. lfx/components/datastax/astradb_tool.py +378 -0
  265. lfx/components/datastax/astradb_vectorize.py +122 -0
  266. lfx/components/datastax/astradb_vectorstore.py +449 -0
  267. lfx/components/datastax/create_assistant.py +59 -0
  268. lfx/components/datastax/create_thread.py +33 -0
  269. lfx/components/datastax/dotenv.py +36 -0
  270. lfx/components/datastax/get_assistant.py +38 -0
  271. lfx/components/datastax/getenvvar.py +31 -0
  272. lfx/components/datastax/graph_rag.py +141 -0
  273. lfx/components/datastax/hcd.py +315 -0
  274. lfx/components/datastax/list_assistants.py +26 -0
  275. lfx/components/datastax/run.py +90 -0
  276. lfx/components/deactivated/__init__.py +15 -0
  277. lfx/components/deactivated/amazon_kendra.py +66 -0
  278. lfx/components/deactivated/chat_litellm_model.py +158 -0
  279. lfx/components/deactivated/code_block_extractor.py +26 -0
  280. lfx/components/deactivated/documents_to_data.py +22 -0
  281. lfx/components/deactivated/embed.py +16 -0
  282. lfx/components/deactivated/extract_key_from_data.py +46 -0
  283. lfx/components/deactivated/json_document_builder.py +57 -0
  284. lfx/components/deactivated/list_flows.py +20 -0
  285. lfx/components/deactivated/mcp_sse.py +61 -0
  286. lfx/components/deactivated/mcp_stdio.py +62 -0
  287. lfx/components/deactivated/merge_data.py +93 -0
  288. lfx/components/deactivated/message.py +37 -0
  289. lfx/components/deactivated/metal.py +54 -0
  290. lfx/components/deactivated/multi_query.py +59 -0
  291. lfx/components/deactivated/retriever.py +43 -0
  292. lfx/components/deactivated/selective_passthrough.py +77 -0
  293. lfx/components/deactivated/should_run_next.py +40 -0
  294. lfx/components/deactivated/split_text.py +63 -0
  295. lfx/components/deactivated/store_message.py +24 -0
  296. lfx/components/deactivated/sub_flow.py +124 -0
  297. lfx/components/deactivated/vectara_self_query.py +76 -0
  298. lfx/components/deactivated/vector_store.py +24 -0
  299. lfx/components/deepseek/__init__.py +34 -0
  300. lfx/components/deepseek/deepseek.py +136 -0
  301. lfx/components/docling/__init__.py +43 -0
  302. lfx/components/docling/chunk_docling_document.py +186 -0
  303. lfx/components/docling/docling_inline.py +238 -0
  304. lfx/components/docling/docling_remote.py +195 -0
  305. lfx/components/docling/export_docling_document.py +117 -0
  306. lfx/components/documentloaders/__init__.py +3 -0
  307. lfx/components/duckduckgo/__init__.py +3 -0
  308. lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  309. lfx/components/elastic/__init__.py +37 -0
  310. lfx/components/elastic/elasticsearch.py +267 -0
  311. lfx/components/elastic/opensearch.py +789 -0
  312. lfx/components/elastic/opensearch_multimodal.py +1575 -0
  313. lfx/components/embeddings/__init__.py +37 -0
  314. lfx/components/embeddings/similarity.py +77 -0
  315. lfx/components/embeddings/text_embedder.py +65 -0
  316. lfx/components/exa/__init__.py +3 -0
  317. lfx/components/exa/exa_search.py +68 -0
  318. lfx/components/files_and_knowledge/__init__.py +47 -0
  319. lfx/components/files_and_knowledge/directory.py +113 -0
  320. lfx/components/files_and_knowledge/file.py +841 -0
  321. lfx/components/files_and_knowledge/ingestion.py +694 -0
  322. lfx/components/files_and_knowledge/retrieval.py +264 -0
  323. lfx/components/files_and_knowledge/save_file.py +746 -0
  324. lfx/components/firecrawl/__init__.py +43 -0
  325. lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
  326. lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
  327. lfx/components/firecrawl/firecrawl_map_api.py +89 -0
  328. lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
  329. lfx/components/flow_controls/__init__.py +58 -0
  330. lfx/components/flow_controls/conditional_router.py +208 -0
  331. lfx/components/flow_controls/data_conditional_router.py +126 -0
  332. lfx/components/flow_controls/flow_tool.py +111 -0
  333. lfx/components/flow_controls/listen.py +29 -0
  334. lfx/components/flow_controls/loop.py +163 -0
  335. lfx/components/flow_controls/notify.py +88 -0
  336. lfx/components/flow_controls/pass_message.py +36 -0
  337. lfx/components/flow_controls/run_flow.py +108 -0
  338. lfx/components/flow_controls/sub_flow.py +115 -0
  339. lfx/components/git/__init__.py +4 -0
  340. lfx/components/git/git.py +262 -0
  341. lfx/components/git/gitextractor.py +196 -0
  342. lfx/components/glean/__init__.py +3 -0
  343. lfx/components/glean/glean_search_api.py +173 -0
  344. lfx/components/google/__init__.py +17 -0
  345. lfx/components/google/gmail.py +193 -0
  346. lfx/components/google/google_bq_sql_executor.py +157 -0
  347. lfx/components/google/google_drive.py +92 -0
  348. lfx/components/google/google_drive_search.py +152 -0
  349. lfx/components/google/google_generative_ai.py +144 -0
  350. lfx/components/google/google_generative_ai_embeddings.py +141 -0
  351. lfx/components/google/google_oauth_token.py +89 -0
  352. lfx/components/google/google_search_api_core.py +68 -0
  353. lfx/components/google/google_serper_api_core.py +74 -0
  354. lfx/components/groq/__init__.py +34 -0
  355. lfx/components/groq/groq.py +143 -0
  356. lfx/components/helpers/__init__.py +154 -0
  357. lfx/components/homeassistant/__init__.py +7 -0
  358. lfx/components/homeassistant/home_assistant_control.py +152 -0
  359. lfx/components/homeassistant/list_home_assistant_states.py +137 -0
  360. lfx/components/huggingface/__init__.py +37 -0
  361. lfx/components/huggingface/huggingface.py +199 -0
  362. lfx/components/huggingface/huggingface_inference_api.py +106 -0
  363. lfx/components/ibm/__init__.py +34 -0
  364. lfx/components/ibm/watsonx.py +207 -0
  365. lfx/components/ibm/watsonx_embeddings.py +135 -0
  366. lfx/components/icosacomputing/__init__.py +5 -0
  367. lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
  368. lfx/components/input_output/__init__.py +40 -0
  369. lfx/components/input_output/chat.py +109 -0
  370. lfx/components/input_output/chat_output.py +184 -0
  371. lfx/components/input_output/text.py +27 -0
  372. lfx/components/input_output/text_output.py +29 -0
  373. lfx/components/input_output/webhook.py +56 -0
  374. lfx/components/jigsawstack/__init__.py +23 -0
  375. lfx/components/jigsawstack/ai_scrape.py +126 -0
  376. lfx/components/jigsawstack/ai_web_search.py +136 -0
  377. lfx/components/jigsawstack/file_read.py +115 -0
  378. lfx/components/jigsawstack/file_upload.py +94 -0
  379. lfx/components/jigsawstack/image_generation.py +205 -0
  380. lfx/components/jigsawstack/nsfw.py +60 -0
  381. lfx/components/jigsawstack/object_detection.py +124 -0
  382. lfx/components/jigsawstack/sentiment.py +112 -0
  383. lfx/components/jigsawstack/text_to_sql.py +90 -0
  384. lfx/components/jigsawstack/text_translate.py +77 -0
  385. lfx/components/jigsawstack/vocr.py +107 -0
  386. lfx/components/knowledge_bases/__init__.py +89 -0
  387. lfx/components/langchain_utilities/__init__.py +109 -0
  388. lfx/components/langchain_utilities/character.py +53 -0
  389. lfx/components/langchain_utilities/conversation.py +59 -0
  390. lfx/components/langchain_utilities/csv_agent.py +175 -0
  391. lfx/components/langchain_utilities/fake_embeddings.py +26 -0
  392. lfx/components/langchain_utilities/html_link_extractor.py +35 -0
  393. lfx/components/langchain_utilities/json_agent.py +100 -0
  394. lfx/components/langchain_utilities/langchain_hub.py +126 -0
  395. lfx/components/langchain_utilities/language_recursive.py +49 -0
  396. lfx/components/langchain_utilities/language_semantic.py +138 -0
  397. lfx/components/langchain_utilities/llm_checker.py +39 -0
  398. lfx/components/langchain_utilities/llm_math.py +42 -0
  399. lfx/components/langchain_utilities/natural_language.py +61 -0
  400. lfx/components/langchain_utilities/openai_tools.py +53 -0
  401. lfx/components/langchain_utilities/openapi.py +48 -0
  402. lfx/components/langchain_utilities/recursive_character.py +60 -0
  403. lfx/components/langchain_utilities/retrieval_qa.py +83 -0
  404. lfx/components/langchain_utilities/runnable_executor.py +137 -0
  405. lfx/components/langchain_utilities/self_query.py +80 -0
  406. lfx/components/langchain_utilities/spider.py +142 -0
  407. lfx/components/langchain_utilities/sql.py +40 -0
  408. lfx/components/langchain_utilities/sql_database.py +35 -0
  409. lfx/components/langchain_utilities/sql_generator.py +78 -0
  410. lfx/components/langchain_utilities/tool_calling.py +59 -0
  411. lfx/components/langchain_utilities/vector_store_info.py +49 -0
  412. lfx/components/langchain_utilities/vector_store_router.py +33 -0
  413. lfx/components/langchain_utilities/xml_agent.py +71 -0
  414. lfx/components/langwatch/__init__.py +3 -0
  415. lfx/components/langwatch/langwatch.py +278 -0
  416. lfx/components/link_extractors/__init__.py +3 -0
  417. lfx/components/llm_operations/__init__.py +46 -0
  418. lfx/components/llm_operations/batch_run.py +205 -0
  419. lfx/components/llm_operations/lambda_filter.py +218 -0
  420. lfx/components/llm_operations/llm_conditional_router.py +421 -0
  421. lfx/components/llm_operations/llm_selector.py +499 -0
  422. lfx/components/llm_operations/structured_output.py +244 -0
  423. lfx/components/lmstudio/__init__.py +34 -0
  424. lfx/components/lmstudio/lmstudioembeddings.py +89 -0
  425. lfx/components/lmstudio/lmstudiomodel.py +133 -0
  426. lfx/components/logic/__init__.py +181 -0
  427. lfx/components/maritalk/__init__.py +32 -0
  428. lfx/components/maritalk/maritalk.py +52 -0
  429. lfx/components/mem0/__init__.py +3 -0
  430. lfx/components/mem0/mem0_chat_memory.py +147 -0
  431. lfx/components/milvus/__init__.py +34 -0
  432. lfx/components/milvus/milvus.py +115 -0
  433. lfx/components/mistral/__init__.py +37 -0
  434. lfx/components/mistral/mistral.py +114 -0
  435. lfx/components/mistral/mistral_embeddings.py +58 -0
  436. lfx/components/models/__init__.py +89 -0
  437. lfx/components/models_and_agents/__init__.py +49 -0
  438. lfx/components/models_and_agents/agent.py +644 -0
  439. lfx/components/models_and_agents/embedding_model.py +423 -0
  440. lfx/components/models_and_agents/language_model.py +398 -0
  441. lfx/components/models_and_agents/mcp_component.py +594 -0
  442. lfx/components/models_and_agents/memory.py +268 -0
  443. lfx/components/models_and_agents/prompt.py +67 -0
  444. lfx/components/mongodb/__init__.py +34 -0
  445. lfx/components/mongodb/mongodb_atlas.py +213 -0
  446. lfx/components/needle/__init__.py +3 -0
  447. lfx/components/needle/needle.py +104 -0
  448. lfx/components/notdiamond/__init__.py +34 -0
  449. lfx/components/notdiamond/notdiamond.py +228 -0
  450. lfx/components/novita/__init__.py +32 -0
  451. lfx/components/novita/novita.py +130 -0
  452. lfx/components/nvidia/__init__.py +57 -0
  453. lfx/components/nvidia/nvidia.py +151 -0
  454. lfx/components/nvidia/nvidia_embedding.py +77 -0
  455. lfx/components/nvidia/nvidia_ingest.py +317 -0
  456. lfx/components/nvidia/nvidia_rerank.py +63 -0
  457. lfx/components/nvidia/system_assist.py +65 -0
  458. lfx/components/olivya/__init__.py +3 -0
  459. lfx/components/olivya/olivya.py +116 -0
  460. lfx/components/ollama/__init__.py +37 -0
  461. lfx/components/ollama/ollama.py +548 -0
  462. lfx/components/ollama/ollama_embeddings.py +103 -0
  463. lfx/components/openai/__init__.py +37 -0
  464. lfx/components/openai/openai.py +100 -0
  465. lfx/components/openai/openai_chat_model.py +176 -0
  466. lfx/components/openrouter/__init__.py +32 -0
  467. lfx/components/openrouter/openrouter.py +104 -0
  468. lfx/components/output_parsers/__init__.py +3 -0
  469. lfx/components/perplexity/__init__.py +34 -0
  470. lfx/components/perplexity/perplexity.py +75 -0
  471. lfx/components/pgvector/__init__.py +34 -0
  472. lfx/components/pgvector/pgvector.py +72 -0
  473. lfx/components/pinecone/__init__.py +34 -0
  474. lfx/components/pinecone/pinecone.py +134 -0
  475. lfx/components/processing/__init__.py +72 -0
  476. lfx/components/processing/alter_metadata.py +109 -0
  477. lfx/components/processing/combine_text.py +40 -0
  478. lfx/components/processing/converter.py +248 -0
  479. lfx/components/processing/create_data.py +111 -0
  480. lfx/components/processing/create_list.py +40 -0
  481. lfx/components/processing/data_operations.py +528 -0
  482. lfx/components/processing/data_to_dataframe.py +71 -0
  483. lfx/components/processing/dataframe_operations.py +313 -0
  484. lfx/components/processing/dataframe_to_toolset.py +259 -0
  485. lfx/components/processing/dynamic_create_data.py +357 -0
  486. lfx/components/processing/extract_key.py +54 -0
  487. lfx/components/processing/filter_data.py +43 -0
  488. lfx/components/processing/filter_data_values.py +89 -0
  489. lfx/components/processing/json_cleaner.py +104 -0
  490. lfx/components/processing/merge_data.py +91 -0
  491. lfx/components/processing/message_to_data.py +37 -0
  492. lfx/components/processing/output_parser.py +46 -0
  493. lfx/components/processing/parse_data.py +71 -0
  494. lfx/components/processing/parse_dataframe.py +69 -0
  495. lfx/components/processing/parse_json_data.py +91 -0
  496. lfx/components/processing/parser.py +148 -0
  497. lfx/components/processing/regex.py +83 -0
  498. lfx/components/processing/select_data.py +49 -0
  499. lfx/components/processing/split_text.py +141 -0
  500. lfx/components/processing/store_message.py +91 -0
  501. lfx/components/processing/update_data.py +161 -0
  502. lfx/components/prototypes/__init__.py +35 -0
  503. lfx/components/prototypes/python_function.py +73 -0
  504. lfx/components/qdrant/__init__.py +34 -0
  505. lfx/components/qdrant/qdrant.py +109 -0
  506. lfx/components/redis/__init__.py +37 -0
  507. lfx/components/redis/redis.py +89 -0
  508. lfx/components/redis/redis_chat.py +43 -0
  509. lfx/components/sambanova/__init__.py +32 -0
  510. lfx/components/sambanova/sambanova.py +84 -0
  511. lfx/components/scrapegraph/__init__.py +40 -0
  512. lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  513. lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
  514. lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  515. lfx/components/searchapi/__init__.py +34 -0
  516. lfx/components/searchapi/search.py +79 -0
  517. lfx/components/serpapi/__init__.py +3 -0
  518. lfx/components/serpapi/serp.py +115 -0
  519. lfx/components/supabase/__init__.py +34 -0
  520. lfx/components/supabase/supabase.py +76 -0
  521. lfx/components/tavily/__init__.py +4 -0
  522. lfx/components/tavily/tavily_extract.py +117 -0
  523. lfx/components/tavily/tavily_search.py +212 -0
  524. lfx/components/textsplitters/__init__.py +3 -0
  525. lfx/components/toolkits/__init__.py +3 -0
  526. lfx/components/tools/__init__.py +66 -0
  527. lfx/components/tools/calculator.py +109 -0
  528. lfx/components/tools/google_search_api.py +45 -0
  529. lfx/components/tools/google_serper_api.py +115 -0
  530. lfx/components/tools/python_code_structured_tool.py +328 -0
  531. lfx/components/tools/python_repl.py +98 -0
  532. lfx/components/tools/search_api.py +88 -0
  533. lfx/components/tools/searxng.py +145 -0
  534. lfx/components/tools/serp_api.py +120 -0
  535. lfx/components/tools/tavily_search_tool.py +345 -0
  536. lfx/components/tools/wikidata_api.py +103 -0
  537. lfx/components/tools/wikipedia_api.py +50 -0
  538. lfx/components/tools/yahoo_finance.py +130 -0
  539. lfx/components/twelvelabs/__init__.py +52 -0
  540. lfx/components/twelvelabs/convert_astra_results.py +84 -0
  541. lfx/components/twelvelabs/pegasus_index.py +311 -0
  542. lfx/components/twelvelabs/split_video.py +301 -0
  543. lfx/components/twelvelabs/text_embeddings.py +57 -0
  544. lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  545. lfx/components/twelvelabs/video_embeddings.py +100 -0
  546. lfx/components/twelvelabs/video_file.py +191 -0
  547. lfx/components/unstructured/__init__.py +3 -0
  548. lfx/components/unstructured/unstructured.py +121 -0
  549. lfx/components/upstash/__init__.py +34 -0
  550. lfx/components/upstash/upstash.py +124 -0
  551. lfx/components/utilities/__init__.py +43 -0
  552. lfx/components/utilities/calculator_core.py +89 -0
  553. lfx/components/utilities/current_date.py +42 -0
  554. lfx/components/utilities/id_generator.py +42 -0
  555. lfx/components/utilities/python_repl_core.py +98 -0
  556. lfx/components/vectara/__init__.py +37 -0
  557. lfx/components/vectara/vectara.py +97 -0
  558. lfx/components/vectara/vectara_rag.py +164 -0
  559. lfx/components/vectorstores/__init__.py +34 -0
  560. lfx/components/vectorstores/local_db.py +270 -0
  561. lfx/components/vertexai/__init__.py +37 -0
  562. lfx/components/vertexai/vertexai.py +71 -0
  563. lfx/components/vertexai/vertexai_embeddings.py +67 -0
  564. lfx/components/vlmrun/__init__.py +34 -0
  565. lfx/components/vlmrun/vlmrun_transcription.py +224 -0
  566. lfx/components/weaviate/__init__.py +34 -0
  567. lfx/components/weaviate/weaviate.py +89 -0
  568. lfx/components/wikipedia/__init__.py +4 -0
  569. lfx/components/wikipedia/wikidata.py +86 -0
  570. lfx/components/wikipedia/wikipedia.py +53 -0
  571. lfx/components/wolframalpha/__init__.py +3 -0
  572. lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
  573. lfx/components/xai/__init__.py +32 -0
  574. lfx/components/xai/xai.py +167 -0
  575. lfx/components/yahoosearch/__init__.py +3 -0
  576. lfx/components/yahoosearch/yahoo.py +137 -0
  577. lfx/components/youtube/__init__.py +52 -0
  578. lfx/components/youtube/channel.py +227 -0
  579. lfx/components/youtube/comments.py +231 -0
  580. lfx/components/youtube/playlist.py +33 -0
  581. lfx/components/youtube/search.py +120 -0
  582. lfx/components/youtube/trending.py +285 -0
  583. lfx/components/youtube/video_details.py +263 -0
  584. lfx/components/youtube/youtube_transcripts.py +206 -0
  585. lfx/components/zep/__init__.py +3 -0
  586. lfx/components/zep/zep.py +45 -0
  587. lfx/constants.py +6 -0
  588. lfx/custom/__init__.py +7 -0
  589. lfx/custom/attributes.py +87 -0
  590. lfx/custom/code_parser/__init__.py +3 -0
  591. lfx/custom/code_parser/code_parser.py +361 -0
  592. lfx/custom/custom_component/__init__.py +0 -0
  593. lfx/custom/custom_component/base_component.py +128 -0
  594. lfx/custom/custom_component/component.py +1890 -0
  595. lfx/custom/custom_component/component_with_cache.py +8 -0
  596. lfx/custom/custom_component/custom_component.py +650 -0
  597. lfx/custom/dependency_analyzer.py +165 -0
  598. lfx/custom/directory_reader/__init__.py +3 -0
  599. lfx/custom/directory_reader/directory_reader.py +359 -0
  600. lfx/custom/directory_reader/utils.py +171 -0
  601. lfx/custom/eval.py +12 -0
  602. lfx/custom/schema.py +32 -0
  603. lfx/custom/tree_visitor.py +21 -0
  604. lfx/custom/utils.py +877 -0
  605. lfx/custom/validate.py +523 -0
  606. lfx/events/__init__.py +1 -0
  607. lfx/events/event_manager.py +110 -0
  608. lfx/exceptions/__init__.py +0 -0
  609. lfx/exceptions/component.py +15 -0
  610. lfx/field_typing/__init__.py +91 -0
  611. lfx/field_typing/constants.py +216 -0
  612. lfx/field_typing/range_spec.py +35 -0
  613. lfx/graph/__init__.py +6 -0
  614. lfx/graph/edge/__init__.py +0 -0
  615. lfx/graph/edge/base.py +300 -0
  616. lfx/graph/edge/schema.py +119 -0
  617. lfx/graph/edge/utils.py +0 -0
  618. lfx/graph/graph/__init__.py +0 -0
  619. lfx/graph/graph/ascii.py +202 -0
  620. lfx/graph/graph/base.py +2298 -0
  621. lfx/graph/graph/constants.py +63 -0
  622. lfx/graph/graph/runnable_vertices_manager.py +133 -0
  623. lfx/graph/graph/schema.py +53 -0
  624. lfx/graph/graph/state_model.py +66 -0
  625. lfx/graph/graph/utils.py +1024 -0
  626. lfx/graph/schema.py +75 -0
  627. lfx/graph/state/__init__.py +0 -0
  628. lfx/graph/state/model.py +250 -0
  629. lfx/graph/utils.py +206 -0
  630. lfx/graph/vertex/__init__.py +0 -0
  631. lfx/graph/vertex/base.py +826 -0
  632. lfx/graph/vertex/constants.py +0 -0
  633. lfx/graph/vertex/exceptions.py +4 -0
  634. lfx/graph/vertex/param_handler.py +316 -0
  635. lfx/graph/vertex/schema.py +26 -0
  636. lfx/graph/vertex/utils.py +19 -0
  637. lfx/graph/vertex/vertex_types.py +489 -0
  638. lfx/helpers/__init__.py +141 -0
  639. lfx/helpers/base_model.py +71 -0
  640. lfx/helpers/custom.py +13 -0
  641. lfx/helpers/data.py +167 -0
  642. lfx/helpers/flow.py +308 -0
  643. lfx/inputs/__init__.py +68 -0
  644. lfx/inputs/constants.py +2 -0
  645. lfx/inputs/input_mixin.py +352 -0
  646. lfx/inputs/inputs.py +718 -0
  647. lfx/inputs/validators.py +19 -0
  648. lfx/interface/__init__.py +6 -0
  649. lfx/interface/components.py +897 -0
  650. lfx/interface/importing/__init__.py +5 -0
  651. lfx/interface/importing/utils.py +39 -0
  652. lfx/interface/initialize/__init__.py +3 -0
  653. lfx/interface/initialize/loading.py +317 -0
  654. lfx/interface/listing.py +26 -0
  655. lfx/interface/run.py +16 -0
  656. lfx/interface/utils.py +111 -0
  657. lfx/io/__init__.py +63 -0
  658. lfx/io/schema.py +295 -0
  659. lfx/load/__init__.py +8 -0
  660. lfx/load/load.py +256 -0
  661. lfx/load/utils.py +99 -0
  662. lfx/log/__init__.py +5 -0
  663. lfx/log/logger.py +411 -0
  664. lfx/logging/__init__.py +11 -0
  665. lfx/logging/logger.py +24 -0
  666. lfx/memory/__init__.py +70 -0
  667. lfx/memory/stubs.py +302 -0
  668. lfx/processing/__init__.py +1 -0
  669. lfx/processing/process.py +238 -0
  670. lfx/processing/utils.py +25 -0
  671. lfx/py.typed +0 -0
  672. lfx/schema/__init__.py +66 -0
  673. lfx/schema/artifact.py +83 -0
  674. lfx/schema/content_block.py +62 -0
  675. lfx/schema/content_types.py +91 -0
  676. lfx/schema/cross_module.py +80 -0
  677. lfx/schema/data.py +309 -0
  678. lfx/schema/dataframe.py +210 -0
  679. lfx/schema/dotdict.py +74 -0
  680. lfx/schema/encoders.py +13 -0
  681. lfx/schema/graph.py +47 -0
  682. lfx/schema/image.py +184 -0
  683. lfx/schema/json_schema.py +186 -0
  684. lfx/schema/log.py +62 -0
  685. lfx/schema/message.py +493 -0
  686. lfx/schema/openai_responses_schemas.py +74 -0
  687. lfx/schema/properties.py +41 -0
  688. lfx/schema/schema.py +180 -0
  689. lfx/schema/serialize.py +13 -0
  690. lfx/schema/table.py +142 -0
  691. lfx/schema/validators.py +114 -0
  692. lfx/serialization/__init__.py +5 -0
  693. lfx/serialization/constants.py +2 -0
  694. lfx/serialization/serialization.py +314 -0
  695. lfx/services/__init__.py +26 -0
  696. lfx/services/base.py +28 -0
  697. lfx/services/cache/__init__.py +6 -0
  698. lfx/services/cache/base.py +183 -0
  699. lfx/services/cache/service.py +166 -0
  700. lfx/services/cache/utils.py +169 -0
  701. lfx/services/chat/__init__.py +1 -0
  702. lfx/services/chat/config.py +2 -0
  703. lfx/services/chat/schema.py +10 -0
  704. lfx/services/database/__init__.py +5 -0
  705. lfx/services/database/service.py +25 -0
  706. lfx/services/deps.py +194 -0
  707. lfx/services/factory.py +19 -0
  708. lfx/services/initialize.py +19 -0
  709. lfx/services/interfaces.py +103 -0
  710. lfx/services/manager.py +185 -0
  711. lfx/services/mcp_composer/__init__.py +6 -0
  712. lfx/services/mcp_composer/factory.py +16 -0
  713. lfx/services/mcp_composer/service.py +1441 -0
  714. lfx/services/schema.py +21 -0
  715. lfx/services/session.py +87 -0
  716. lfx/services/settings/__init__.py +3 -0
  717. lfx/services/settings/auth.py +133 -0
  718. lfx/services/settings/base.py +668 -0
  719. lfx/services/settings/constants.py +43 -0
  720. lfx/services/settings/factory.py +23 -0
  721. lfx/services/settings/feature_flags.py +11 -0
  722. lfx/services/settings/service.py +35 -0
  723. lfx/services/settings/utils.py +40 -0
  724. lfx/services/shared_component_cache/__init__.py +1 -0
  725. lfx/services/shared_component_cache/factory.py +30 -0
  726. lfx/services/shared_component_cache/service.py +9 -0
  727. lfx/services/storage/__init__.py +5 -0
  728. lfx/services/storage/local.py +185 -0
  729. lfx/services/storage/service.py +177 -0
  730. lfx/services/tracing/__init__.py +1 -0
  731. lfx/services/tracing/service.py +21 -0
  732. lfx/settings.py +6 -0
  733. lfx/template/__init__.py +6 -0
  734. lfx/template/field/__init__.py +0 -0
  735. lfx/template/field/base.py +260 -0
  736. lfx/template/field/prompt.py +15 -0
  737. lfx/template/frontend_node/__init__.py +6 -0
  738. lfx/template/frontend_node/base.py +214 -0
  739. lfx/template/frontend_node/constants.py +65 -0
  740. lfx/template/frontend_node/custom_components.py +79 -0
  741. lfx/template/template/__init__.py +0 -0
  742. lfx/template/template/base.py +100 -0
  743. lfx/template/utils.py +217 -0
  744. lfx/type_extraction/__init__.py +19 -0
  745. lfx/type_extraction/type_extraction.py +75 -0
  746. lfx/type_extraction.py +80 -0
  747. lfx/utils/__init__.py +1 -0
  748. lfx/utils/async_helpers.py +42 -0
  749. lfx/utils/component_utils.py +154 -0
  750. lfx/utils/concurrency.py +60 -0
  751. lfx/utils/connection_string_parser.py +11 -0
  752. lfx/utils/constants.py +233 -0
  753. lfx/utils/data_structure.py +212 -0
  754. lfx/utils/exceptions.py +22 -0
  755. lfx/utils/helpers.py +34 -0
  756. lfx/utils/image.py +79 -0
  757. lfx/utils/langflow_utils.py +52 -0
  758. lfx/utils/lazy_load.py +15 -0
  759. lfx/utils/request_utils.py +18 -0
  760. lfx/utils/schemas.py +139 -0
  761. lfx/utils/ssrf_protection.py +384 -0
  762. lfx/utils/util.py +626 -0
  763. lfx/utils/util_strings.py +56 -0
  764. lfx/utils/validate_cloud.py +26 -0
  765. lfx/utils/version.py +24 -0
  766. lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
  767. lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
  768. lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
  769. lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
lfx/custom/validate.py ADDED
@@ -0,0 +1,523 @@
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. {type(e).__name__}({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 _import_module_with_warnings(module_name):
302
+ """Import module with appropriate warning suppression."""
303
+ if "langchain" in module_name:
304
+ with warnings.catch_warnings():
305
+ warnings.simplefilter("ignore", LangChainDeprecationWarning)
306
+ return importlib.import_module(module_name)
307
+ else:
308
+ return importlib.import_module(module_name)
309
+
310
+
311
+ def _handle_module_attributes(imported_module, node, module_name, exec_globals):
312
+ """Handle importing specific attributes from a module."""
313
+ for alias in node.names:
314
+ try:
315
+ # First try getting it as an attribute
316
+ exec_globals[alias.name] = getattr(imported_module, alias.name)
317
+ except AttributeError:
318
+ # If that fails, try importing the full module path
319
+ full_module_path = f"{module_name}.{alias.name}"
320
+ exec_globals[alias.name] = importlib.import_module(full_module_path)
321
+
322
+
323
+ def prepare_global_scope(module):
324
+ """Prepares the global scope with necessary imports from the provided code module.
325
+
326
+ Args:
327
+ module: AST parsed module
328
+
329
+ Returns:
330
+ Dictionary representing the global scope with imported modules
331
+
332
+ Raises:
333
+ ModuleNotFoundError: If a module is not found in the code
334
+ """
335
+ exec_globals = globals().copy()
336
+ imports = []
337
+ import_froms = []
338
+ definitions = []
339
+
340
+ for node in module.body:
341
+ if isinstance(node, ast.Import):
342
+ imports.append(node)
343
+ elif isinstance(node, ast.ImportFrom) and node.module is not None:
344
+ import_froms.append(node)
345
+ elif isinstance(node, ast.ClassDef | ast.FunctionDef | ast.Assign):
346
+ definitions.append(node)
347
+
348
+ for node in imports:
349
+ for alias in node.names:
350
+ module_name = alias.name
351
+ # Import the full module path to ensure submodules are loaded
352
+ module_obj = importlib.import_module(module_name)
353
+
354
+ # Determine the variable name
355
+ if alias.asname:
356
+ # For aliased imports like "import yfinance as yf", use the imported module directly
357
+ variable_name = alias.asname
358
+ exec_globals[variable_name] = module_obj
359
+ else:
360
+ # For dotted imports like "urllib.request", set the variable to the top-level package
361
+ variable_name = module_name.split(".")[0]
362
+ exec_globals[variable_name] = importlib.import_module(variable_name)
363
+
364
+ for node in import_froms:
365
+ module_names_to_try = [node.module]
366
+
367
+ # If original module starts with langflow, also try lfx equivalent
368
+ if node.module and node.module.startswith("langflow."):
369
+ lfx_module_name = node.module.replace("langflow.", "lfx.", 1)
370
+ module_names_to_try.append(lfx_module_name)
371
+
372
+ success = False
373
+ last_error = None
374
+
375
+ for module_name in module_names_to_try:
376
+ try:
377
+ imported_module = _import_module_with_warnings(module_name)
378
+ _handle_module_attributes(imported_module, node, module_name, exec_globals)
379
+
380
+ success = True
381
+ break
382
+
383
+ except ModuleNotFoundError as e:
384
+ last_error = e
385
+ continue
386
+
387
+ if not success:
388
+ # Re-raise the last error to preserve the actual missing module information
389
+ if last_error:
390
+ raise last_error
391
+ msg = f"Module {node.module} not found. Please install it and try again"
392
+ raise ModuleNotFoundError(msg)
393
+
394
+ if definitions:
395
+ combined_module = ast.Module(body=definitions, type_ignores=[])
396
+ compiled_code = compile(combined_module, "<string>", "exec")
397
+ exec(compiled_code, exec_globals)
398
+
399
+ return exec_globals
400
+
401
+
402
+ def extract_class_code(module, class_name):
403
+ """Extracts the AST node for the specified class from the module.
404
+
405
+ Args:
406
+ module: AST parsed module
407
+ class_name: Name of the class to extract
408
+
409
+ Returns:
410
+ AST node of the specified class
411
+ """
412
+ class_code = next(node for node in module.body if isinstance(node, ast.ClassDef) and node.name == class_name)
413
+
414
+ class_code.parent = None
415
+ return class_code
416
+
417
+
418
+ def compile_class_code(class_code):
419
+ """Compiles the AST node of a class into a code object.
420
+
421
+ Args:
422
+ class_code: AST node of the class
423
+
424
+ Returns:
425
+ Compiled code object of the class
426
+ """
427
+ return compile(ast.Module(body=[class_code], type_ignores=[]), "<string>", "exec")
428
+
429
+
430
+ def build_class_constructor(compiled_class, exec_globals, class_name):
431
+ """Builds a constructor function for the dynamically created class.
432
+
433
+ Args:
434
+ compiled_class: Compiled code object of the class
435
+ exec_globals: Global scope with necessary imports
436
+ class_name: Name of the class
437
+
438
+ Returns:
439
+ Constructor function for the class
440
+ """
441
+ exec_locals = dict(locals())
442
+ exec(compiled_class, exec_globals, exec_locals)
443
+ exec_globals[class_name] = exec_locals[class_name]
444
+
445
+ # Return a function that imports necessary modules and creates an instance of the target class
446
+ def build_custom_class():
447
+ for module_name, module in exec_globals.items():
448
+ if isinstance(module, type(importlib)):
449
+ globals()[module_name] = module
450
+
451
+ return exec_globals[class_name]
452
+
453
+ return build_custom_class()
454
+
455
+
456
+ # TODO: Remove this function
457
+ def get_default_imports(code_string):
458
+ """Returns a dictionary of default imports for the dynamic class constructor."""
459
+ default_imports = {
460
+ "Optional": Optional,
461
+ "List": list,
462
+ "Dict": dict,
463
+ "Union": Union,
464
+ }
465
+ langflow_imports = list(CUSTOM_COMPONENT_SUPPORTED_TYPES.keys())
466
+ necessary_imports = find_names_in_code(code_string, langflow_imports)
467
+ langflow_module = importlib.import_module("lfx.field_typing")
468
+ default_imports.update({name: getattr(langflow_module, name) for name in necessary_imports})
469
+
470
+ return default_imports
471
+
472
+
473
+ def find_names_in_code(code, names):
474
+ """Finds if any of the specified names are present in the given code string.
475
+
476
+ Args:
477
+ code: The source code as a string.
478
+ names: A list of names to check for in the code.
479
+
480
+ Returns:
481
+ A set of names that are found in the code.
482
+ """
483
+ return {name for name in names if name in code}
484
+
485
+
486
+ def extract_function_name(code):
487
+ module = ast.parse(code)
488
+ for node in module.body:
489
+ if isinstance(node, ast.FunctionDef):
490
+ return node.name
491
+ msg = "No function definition found in the code string"
492
+ raise ValueError(msg)
493
+
494
+
495
+ def extract_class_name(code: str) -> str:
496
+ """Extract the name of the first Component subclass found in the code.
497
+
498
+ Args:
499
+ code (str): The source code to parse
500
+
501
+ Returns:
502
+ str: Name of the first Component subclass found
503
+
504
+ Raises:
505
+ TypeError: If no Component subclass is found in the code
506
+ """
507
+ try:
508
+ module = ast.parse(code)
509
+ for node in module.body:
510
+ if not isinstance(node, ast.ClassDef):
511
+ continue
512
+
513
+ # Check bases for Component inheritance
514
+ # TODO: Build a more robust check for Component inheritance
515
+ for base in node.bases:
516
+ if isinstance(base, ast.Name) and any(pattern in base.id for pattern in ["Component", "LC"]):
517
+ return node.name
518
+
519
+ msg = f"No Component subclass found in the code string. Code snippet: {code[:100]}"
520
+ raise TypeError(msg)
521
+ except SyntaxError as e:
522
+ msg = f"Invalid Python code: {e!s}"
523
+ 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)