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

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

Potentially problematic release.


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

Files changed (769) hide show
  1. lfx/__init__.py +0 -0
  2. lfx/__main__.py +25 -0
  3. lfx/_assets/component_index.json +1 -0
  4. lfx/base/__init__.py +0 -0
  5. lfx/base/agents/__init__.py +0 -0
  6. lfx/base/agents/agent.py +375 -0
  7. lfx/base/agents/altk_base_agent.py +380 -0
  8. lfx/base/agents/altk_tool_wrappers.py +565 -0
  9. lfx/base/agents/callback.py +130 -0
  10. lfx/base/agents/context.py +109 -0
  11. lfx/base/agents/crewai/__init__.py +0 -0
  12. lfx/base/agents/crewai/crew.py +231 -0
  13. lfx/base/agents/crewai/tasks.py +12 -0
  14. lfx/base/agents/default_prompts.py +23 -0
  15. lfx/base/agents/errors.py +15 -0
  16. lfx/base/agents/events.py +430 -0
  17. lfx/base/agents/utils.py +237 -0
  18. lfx/base/astra_assistants/__init__.py +0 -0
  19. lfx/base/astra_assistants/util.py +171 -0
  20. lfx/base/chains/__init__.py +0 -0
  21. lfx/base/chains/model.py +19 -0
  22. lfx/base/composio/__init__.py +0 -0
  23. lfx/base/composio/composio_base.py +2584 -0
  24. lfx/base/compressors/__init__.py +0 -0
  25. lfx/base/compressors/model.py +60 -0
  26. lfx/base/constants.py +46 -0
  27. lfx/base/curl/__init__.py +0 -0
  28. lfx/base/curl/parse.py +188 -0
  29. lfx/base/data/__init__.py +5 -0
  30. lfx/base/data/base_file.py +810 -0
  31. lfx/base/data/docling_utils.py +338 -0
  32. lfx/base/data/storage_utils.py +192 -0
  33. lfx/base/data/utils.py +362 -0
  34. lfx/base/datastax/__init__.py +5 -0
  35. lfx/base/datastax/astradb_base.py +896 -0
  36. lfx/base/document_transformers/__init__.py +0 -0
  37. lfx/base/document_transformers/model.py +43 -0
  38. lfx/base/embeddings/__init__.py +0 -0
  39. lfx/base/embeddings/aiml_embeddings.py +62 -0
  40. lfx/base/embeddings/embeddings_class.py +113 -0
  41. lfx/base/embeddings/model.py +26 -0
  42. lfx/base/flow_processing/__init__.py +0 -0
  43. lfx/base/flow_processing/utils.py +86 -0
  44. lfx/base/huggingface/__init__.py +0 -0
  45. lfx/base/huggingface/model_bridge.py +133 -0
  46. lfx/base/io/__init__.py +0 -0
  47. lfx/base/io/chat.py +21 -0
  48. lfx/base/io/text.py +22 -0
  49. lfx/base/knowledge_bases/__init__.py +3 -0
  50. lfx/base/knowledge_bases/knowledge_base_utils.py +137 -0
  51. lfx/base/langchain_utilities/__init__.py +0 -0
  52. lfx/base/langchain_utilities/model.py +35 -0
  53. lfx/base/langchain_utilities/spider_constants.py +1 -0
  54. lfx/base/langwatch/__init__.py +0 -0
  55. lfx/base/langwatch/utils.py +18 -0
  56. lfx/base/mcp/__init__.py +0 -0
  57. lfx/base/mcp/constants.py +2 -0
  58. lfx/base/mcp/util.py +1659 -0
  59. lfx/base/memory/__init__.py +0 -0
  60. lfx/base/memory/memory.py +49 -0
  61. lfx/base/memory/model.py +38 -0
  62. lfx/base/models/__init__.py +3 -0
  63. lfx/base/models/aiml_constants.py +51 -0
  64. lfx/base/models/anthropic_constants.py +51 -0
  65. lfx/base/models/aws_constants.py +151 -0
  66. lfx/base/models/chat_result.py +76 -0
  67. lfx/base/models/cometapi_constants.py +54 -0
  68. lfx/base/models/google_generative_ai_constants.py +70 -0
  69. lfx/base/models/google_generative_ai_model.py +38 -0
  70. lfx/base/models/groq_constants.py +150 -0
  71. lfx/base/models/groq_model_discovery.py +265 -0
  72. lfx/base/models/model.py +375 -0
  73. lfx/base/models/model_input_constants.py +378 -0
  74. lfx/base/models/model_metadata.py +41 -0
  75. lfx/base/models/model_utils.py +108 -0
  76. lfx/base/models/novita_constants.py +35 -0
  77. lfx/base/models/ollama_constants.py +52 -0
  78. lfx/base/models/openai_constants.py +129 -0
  79. lfx/base/models/sambanova_constants.py +18 -0
  80. lfx/base/models/watsonx_constants.py +36 -0
  81. lfx/base/processing/__init__.py +0 -0
  82. lfx/base/prompts/__init__.py +0 -0
  83. lfx/base/prompts/api_utils.py +224 -0
  84. lfx/base/prompts/utils.py +61 -0
  85. lfx/base/textsplitters/__init__.py +0 -0
  86. lfx/base/textsplitters/model.py +28 -0
  87. lfx/base/tools/__init__.py +0 -0
  88. lfx/base/tools/base.py +26 -0
  89. lfx/base/tools/component_tool.py +325 -0
  90. lfx/base/tools/constants.py +49 -0
  91. lfx/base/tools/flow_tool.py +132 -0
  92. lfx/base/tools/run_flow.py +698 -0
  93. lfx/base/vectorstores/__init__.py +0 -0
  94. lfx/base/vectorstores/model.py +193 -0
  95. lfx/base/vectorstores/utils.py +22 -0
  96. lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
  97. lfx/cli/__init__.py +5 -0
  98. lfx/cli/commands.py +327 -0
  99. lfx/cli/common.py +650 -0
  100. lfx/cli/run.py +506 -0
  101. lfx/cli/script_loader.py +289 -0
  102. lfx/cli/serve_app.py +546 -0
  103. lfx/cli/validation.py +69 -0
  104. lfx/components/FAISS/__init__.py +34 -0
  105. lfx/components/FAISS/faiss.py +111 -0
  106. lfx/components/Notion/__init__.py +19 -0
  107. lfx/components/Notion/add_content_to_page.py +269 -0
  108. lfx/components/Notion/create_page.py +94 -0
  109. lfx/components/Notion/list_database_properties.py +68 -0
  110. lfx/components/Notion/list_pages.py +122 -0
  111. lfx/components/Notion/list_users.py +77 -0
  112. lfx/components/Notion/page_content_viewer.py +93 -0
  113. lfx/components/Notion/search.py +111 -0
  114. lfx/components/Notion/update_page_property.py +114 -0
  115. lfx/components/__init__.py +428 -0
  116. lfx/components/_importing.py +42 -0
  117. lfx/components/agentql/__init__.py +3 -0
  118. lfx/components/agentql/agentql_api.py +151 -0
  119. lfx/components/aiml/__init__.py +37 -0
  120. lfx/components/aiml/aiml.py +115 -0
  121. lfx/components/aiml/aiml_embeddings.py +37 -0
  122. lfx/components/altk/__init__.py +34 -0
  123. lfx/components/altk/altk_agent.py +193 -0
  124. lfx/components/amazon/__init__.py +36 -0
  125. lfx/components/amazon/amazon_bedrock_converse.py +195 -0
  126. lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
  127. lfx/components/amazon/amazon_bedrock_model.py +130 -0
  128. lfx/components/amazon/s3_bucket_uploader.py +211 -0
  129. lfx/components/anthropic/__init__.py +34 -0
  130. lfx/components/anthropic/anthropic.py +187 -0
  131. lfx/components/apify/__init__.py +5 -0
  132. lfx/components/apify/apify_actor.py +325 -0
  133. lfx/components/arxiv/__init__.py +3 -0
  134. lfx/components/arxiv/arxiv.py +169 -0
  135. lfx/components/assemblyai/__init__.py +46 -0
  136. lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  137. lfx/components/assemblyai/assemblyai_lemur.py +183 -0
  138. lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  139. lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  140. lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
  141. lfx/components/azure/__init__.py +37 -0
  142. lfx/components/azure/azure_openai.py +95 -0
  143. lfx/components/azure/azure_openai_embeddings.py +83 -0
  144. lfx/components/baidu/__init__.py +32 -0
  145. lfx/components/baidu/baidu_qianfan_chat.py +113 -0
  146. lfx/components/bing/__init__.py +3 -0
  147. lfx/components/bing/bing_search_api.py +61 -0
  148. lfx/components/cassandra/__init__.py +40 -0
  149. lfx/components/cassandra/cassandra.py +264 -0
  150. lfx/components/cassandra/cassandra_chat.py +92 -0
  151. lfx/components/cassandra/cassandra_graph.py +238 -0
  152. lfx/components/chains/__init__.py +3 -0
  153. lfx/components/chroma/__init__.py +34 -0
  154. lfx/components/chroma/chroma.py +169 -0
  155. lfx/components/cleanlab/__init__.py +40 -0
  156. lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
  157. lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  158. lfx/components/cleanlab/cleanlab_remediator.py +131 -0
  159. lfx/components/clickhouse/__init__.py +34 -0
  160. lfx/components/clickhouse/clickhouse.py +135 -0
  161. lfx/components/cloudflare/__init__.py +32 -0
  162. lfx/components/cloudflare/cloudflare.py +81 -0
  163. lfx/components/cohere/__init__.py +40 -0
  164. lfx/components/cohere/cohere_embeddings.py +81 -0
  165. lfx/components/cohere/cohere_models.py +46 -0
  166. lfx/components/cohere/cohere_rerank.py +51 -0
  167. lfx/components/cometapi/__init__.py +32 -0
  168. lfx/components/cometapi/cometapi.py +166 -0
  169. lfx/components/composio/__init__.py +222 -0
  170. lfx/components/composio/agentql_composio.py +11 -0
  171. lfx/components/composio/agiled_composio.py +11 -0
  172. lfx/components/composio/airtable_composio.py +11 -0
  173. lfx/components/composio/apollo_composio.py +11 -0
  174. lfx/components/composio/asana_composio.py +11 -0
  175. lfx/components/composio/attio_composio.py +11 -0
  176. lfx/components/composio/bitbucket_composio.py +11 -0
  177. lfx/components/composio/bolna_composio.py +11 -0
  178. lfx/components/composio/brightdata_composio.py +11 -0
  179. lfx/components/composio/calendly_composio.py +11 -0
  180. lfx/components/composio/canva_composio.py +11 -0
  181. lfx/components/composio/canvas_composio.py +11 -0
  182. lfx/components/composio/coda_composio.py +11 -0
  183. lfx/components/composio/composio_api.py +278 -0
  184. lfx/components/composio/contentful_composio.py +11 -0
  185. lfx/components/composio/digicert_composio.py +11 -0
  186. lfx/components/composio/discord_composio.py +11 -0
  187. lfx/components/composio/dropbox_compnent.py +11 -0
  188. lfx/components/composio/elevenlabs_composio.py +11 -0
  189. lfx/components/composio/exa_composio.py +11 -0
  190. lfx/components/composio/figma_composio.py +11 -0
  191. lfx/components/composio/finage_composio.py +11 -0
  192. lfx/components/composio/firecrawl_composio.py +11 -0
  193. lfx/components/composio/fireflies_composio.py +11 -0
  194. lfx/components/composio/fixer_composio.py +11 -0
  195. lfx/components/composio/flexisign_composio.py +11 -0
  196. lfx/components/composio/freshdesk_composio.py +11 -0
  197. lfx/components/composio/github_composio.py +11 -0
  198. lfx/components/composio/gmail_composio.py +38 -0
  199. lfx/components/composio/googlebigquery_composio.py +11 -0
  200. lfx/components/composio/googlecalendar_composio.py +11 -0
  201. lfx/components/composio/googleclassroom_composio.py +11 -0
  202. lfx/components/composio/googledocs_composio.py +11 -0
  203. lfx/components/composio/googlemeet_composio.py +11 -0
  204. lfx/components/composio/googlesheets_composio.py +11 -0
  205. lfx/components/composio/googletasks_composio.py +8 -0
  206. lfx/components/composio/heygen_composio.py +11 -0
  207. lfx/components/composio/instagram_composio.py +11 -0
  208. lfx/components/composio/jira_composio.py +11 -0
  209. lfx/components/composio/jotform_composio.py +11 -0
  210. lfx/components/composio/klaviyo_composio.py +11 -0
  211. lfx/components/composio/linear_composio.py +11 -0
  212. lfx/components/composio/listennotes_composio.py +11 -0
  213. lfx/components/composio/mem0_composio.py +11 -0
  214. lfx/components/composio/miro_composio.py +11 -0
  215. lfx/components/composio/missive_composio.py +11 -0
  216. lfx/components/composio/notion_composio.py +11 -0
  217. lfx/components/composio/onedrive_composio.py +11 -0
  218. lfx/components/composio/outlook_composio.py +11 -0
  219. lfx/components/composio/pandadoc_composio.py +11 -0
  220. lfx/components/composio/peopledatalabs_composio.py +11 -0
  221. lfx/components/composio/perplexityai_composio.py +11 -0
  222. lfx/components/composio/reddit_composio.py +11 -0
  223. lfx/components/composio/serpapi_composio.py +11 -0
  224. lfx/components/composio/slack_composio.py +11 -0
  225. lfx/components/composio/slackbot_composio.py +11 -0
  226. lfx/components/composio/snowflake_composio.py +11 -0
  227. lfx/components/composio/supabase_composio.py +11 -0
  228. lfx/components/composio/tavily_composio.py +11 -0
  229. lfx/components/composio/timelinesai_composio.py +11 -0
  230. lfx/components/composio/todoist_composio.py +11 -0
  231. lfx/components/composio/wrike_composio.py +11 -0
  232. lfx/components/composio/youtube_composio.py +11 -0
  233. lfx/components/confluence/__init__.py +3 -0
  234. lfx/components/confluence/confluence.py +84 -0
  235. lfx/components/couchbase/__init__.py +34 -0
  236. lfx/components/couchbase/couchbase.py +102 -0
  237. lfx/components/crewai/__init__.py +49 -0
  238. lfx/components/crewai/crewai.py +108 -0
  239. lfx/components/crewai/hierarchical_crew.py +47 -0
  240. lfx/components/crewai/hierarchical_task.py +45 -0
  241. lfx/components/crewai/sequential_crew.py +53 -0
  242. lfx/components/crewai/sequential_task.py +74 -0
  243. lfx/components/crewai/sequential_task_agent.py +144 -0
  244. lfx/components/cuga/__init__.py +34 -0
  245. lfx/components/cuga/cuga_agent.py +730 -0
  246. lfx/components/custom_component/__init__.py +34 -0
  247. lfx/components/custom_component/custom_component.py +31 -0
  248. lfx/components/data/__init__.py +114 -0
  249. lfx/components/data_source/__init__.py +58 -0
  250. lfx/components/data_source/api_request.py +577 -0
  251. lfx/components/data_source/csv_to_data.py +101 -0
  252. lfx/components/data_source/json_to_data.py +106 -0
  253. lfx/components/data_source/mock_data.py +398 -0
  254. lfx/components/data_source/news_search.py +166 -0
  255. lfx/components/data_source/rss.py +71 -0
  256. lfx/components/data_source/sql_executor.py +101 -0
  257. lfx/components/data_source/url.py +311 -0
  258. lfx/components/data_source/web_search.py +326 -0
  259. lfx/components/datastax/__init__.py +76 -0
  260. lfx/components/datastax/astradb_assistant_manager.py +307 -0
  261. lfx/components/datastax/astradb_chatmemory.py +40 -0
  262. lfx/components/datastax/astradb_cql.py +288 -0
  263. lfx/components/datastax/astradb_graph.py +217 -0
  264. lfx/components/datastax/astradb_tool.py +378 -0
  265. lfx/components/datastax/astradb_vectorize.py +122 -0
  266. lfx/components/datastax/astradb_vectorstore.py +449 -0
  267. lfx/components/datastax/create_assistant.py +59 -0
  268. lfx/components/datastax/create_thread.py +33 -0
  269. lfx/components/datastax/dotenv.py +36 -0
  270. lfx/components/datastax/get_assistant.py +38 -0
  271. lfx/components/datastax/getenvvar.py +31 -0
  272. lfx/components/datastax/graph_rag.py +141 -0
  273. lfx/components/datastax/hcd.py +315 -0
  274. lfx/components/datastax/list_assistants.py +26 -0
  275. lfx/components/datastax/run.py +90 -0
  276. lfx/components/deactivated/__init__.py +15 -0
  277. lfx/components/deactivated/amazon_kendra.py +66 -0
  278. lfx/components/deactivated/chat_litellm_model.py +158 -0
  279. lfx/components/deactivated/code_block_extractor.py +26 -0
  280. lfx/components/deactivated/documents_to_data.py +22 -0
  281. lfx/components/deactivated/embed.py +16 -0
  282. lfx/components/deactivated/extract_key_from_data.py +46 -0
  283. lfx/components/deactivated/json_document_builder.py +57 -0
  284. lfx/components/deactivated/list_flows.py +20 -0
  285. lfx/components/deactivated/mcp_sse.py +61 -0
  286. lfx/components/deactivated/mcp_stdio.py +62 -0
  287. lfx/components/deactivated/merge_data.py +93 -0
  288. lfx/components/deactivated/message.py +37 -0
  289. lfx/components/deactivated/metal.py +54 -0
  290. lfx/components/deactivated/multi_query.py +59 -0
  291. lfx/components/deactivated/retriever.py +43 -0
  292. lfx/components/deactivated/selective_passthrough.py +77 -0
  293. lfx/components/deactivated/should_run_next.py +40 -0
  294. lfx/components/deactivated/split_text.py +63 -0
  295. lfx/components/deactivated/store_message.py +24 -0
  296. lfx/components/deactivated/sub_flow.py +124 -0
  297. lfx/components/deactivated/vectara_self_query.py +76 -0
  298. lfx/components/deactivated/vector_store.py +24 -0
  299. lfx/components/deepseek/__init__.py +34 -0
  300. lfx/components/deepseek/deepseek.py +136 -0
  301. lfx/components/docling/__init__.py +43 -0
  302. lfx/components/docling/chunk_docling_document.py +186 -0
  303. lfx/components/docling/docling_inline.py +238 -0
  304. lfx/components/docling/docling_remote.py +195 -0
  305. lfx/components/docling/export_docling_document.py +117 -0
  306. lfx/components/documentloaders/__init__.py +3 -0
  307. lfx/components/duckduckgo/__init__.py +3 -0
  308. lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  309. lfx/components/elastic/__init__.py +37 -0
  310. lfx/components/elastic/elasticsearch.py +267 -0
  311. lfx/components/elastic/opensearch.py +789 -0
  312. lfx/components/elastic/opensearch_multimodal.py +1575 -0
  313. lfx/components/embeddings/__init__.py +37 -0
  314. lfx/components/embeddings/similarity.py +77 -0
  315. lfx/components/embeddings/text_embedder.py +65 -0
  316. lfx/components/exa/__init__.py +3 -0
  317. lfx/components/exa/exa_search.py +68 -0
  318. lfx/components/files_and_knowledge/__init__.py +47 -0
  319. lfx/components/files_and_knowledge/directory.py +113 -0
  320. lfx/components/files_and_knowledge/file.py +841 -0
  321. lfx/components/files_and_knowledge/ingestion.py +694 -0
  322. lfx/components/files_and_knowledge/retrieval.py +264 -0
  323. lfx/components/files_and_knowledge/save_file.py +746 -0
  324. lfx/components/firecrawl/__init__.py +43 -0
  325. lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
  326. lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
  327. lfx/components/firecrawl/firecrawl_map_api.py +89 -0
  328. lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
  329. lfx/components/flow_controls/__init__.py +58 -0
  330. lfx/components/flow_controls/conditional_router.py +208 -0
  331. lfx/components/flow_controls/data_conditional_router.py +126 -0
  332. lfx/components/flow_controls/flow_tool.py +111 -0
  333. lfx/components/flow_controls/listen.py +29 -0
  334. lfx/components/flow_controls/loop.py +163 -0
  335. lfx/components/flow_controls/notify.py +88 -0
  336. lfx/components/flow_controls/pass_message.py +36 -0
  337. lfx/components/flow_controls/run_flow.py +108 -0
  338. lfx/components/flow_controls/sub_flow.py +115 -0
  339. lfx/components/git/__init__.py +4 -0
  340. lfx/components/git/git.py +262 -0
  341. lfx/components/git/gitextractor.py +196 -0
  342. lfx/components/glean/__init__.py +3 -0
  343. lfx/components/glean/glean_search_api.py +173 -0
  344. lfx/components/google/__init__.py +17 -0
  345. lfx/components/google/gmail.py +193 -0
  346. lfx/components/google/google_bq_sql_executor.py +157 -0
  347. lfx/components/google/google_drive.py +92 -0
  348. lfx/components/google/google_drive_search.py +152 -0
  349. lfx/components/google/google_generative_ai.py +144 -0
  350. lfx/components/google/google_generative_ai_embeddings.py +141 -0
  351. lfx/components/google/google_oauth_token.py +89 -0
  352. lfx/components/google/google_search_api_core.py +68 -0
  353. lfx/components/google/google_serper_api_core.py +74 -0
  354. lfx/components/groq/__init__.py +34 -0
  355. lfx/components/groq/groq.py +143 -0
  356. lfx/components/helpers/__init__.py +154 -0
  357. lfx/components/homeassistant/__init__.py +7 -0
  358. lfx/components/homeassistant/home_assistant_control.py +152 -0
  359. lfx/components/homeassistant/list_home_assistant_states.py +137 -0
  360. lfx/components/huggingface/__init__.py +37 -0
  361. lfx/components/huggingface/huggingface.py +199 -0
  362. lfx/components/huggingface/huggingface_inference_api.py +106 -0
  363. lfx/components/ibm/__init__.py +34 -0
  364. lfx/components/ibm/watsonx.py +207 -0
  365. lfx/components/ibm/watsonx_embeddings.py +135 -0
  366. lfx/components/icosacomputing/__init__.py +5 -0
  367. lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
  368. lfx/components/input_output/__init__.py +40 -0
  369. lfx/components/input_output/chat.py +109 -0
  370. lfx/components/input_output/chat_output.py +184 -0
  371. lfx/components/input_output/text.py +27 -0
  372. lfx/components/input_output/text_output.py +29 -0
  373. lfx/components/input_output/webhook.py +56 -0
  374. lfx/components/jigsawstack/__init__.py +23 -0
  375. lfx/components/jigsawstack/ai_scrape.py +126 -0
  376. lfx/components/jigsawstack/ai_web_search.py +136 -0
  377. lfx/components/jigsawstack/file_read.py +115 -0
  378. lfx/components/jigsawstack/file_upload.py +94 -0
  379. lfx/components/jigsawstack/image_generation.py +205 -0
  380. lfx/components/jigsawstack/nsfw.py +60 -0
  381. lfx/components/jigsawstack/object_detection.py +124 -0
  382. lfx/components/jigsawstack/sentiment.py +112 -0
  383. lfx/components/jigsawstack/text_to_sql.py +90 -0
  384. lfx/components/jigsawstack/text_translate.py +77 -0
  385. lfx/components/jigsawstack/vocr.py +107 -0
  386. lfx/components/knowledge_bases/__init__.py +89 -0
  387. lfx/components/langchain_utilities/__init__.py +109 -0
  388. lfx/components/langchain_utilities/character.py +53 -0
  389. lfx/components/langchain_utilities/conversation.py +59 -0
  390. lfx/components/langchain_utilities/csv_agent.py +175 -0
  391. lfx/components/langchain_utilities/fake_embeddings.py +26 -0
  392. lfx/components/langchain_utilities/html_link_extractor.py +35 -0
  393. lfx/components/langchain_utilities/json_agent.py +100 -0
  394. lfx/components/langchain_utilities/langchain_hub.py +126 -0
  395. lfx/components/langchain_utilities/language_recursive.py +49 -0
  396. lfx/components/langchain_utilities/language_semantic.py +138 -0
  397. lfx/components/langchain_utilities/llm_checker.py +39 -0
  398. lfx/components/langchain_utilities/llm_math.py +42 -0
  399. lfx/components/langchain_utilities/natural_language.py +61 -0
  400. lfx/components/langchain_utilities/openai_tools.py +53 -0
  401. lfx/components/langchain_utilities/openapi.py +48 -0
  402. lfx/components/langchain_utilities/recursive_character.py +60 -0
  403. lfx/components/langchain_utilities/retrieval_qa.py +83 -0
  404. lfx/components/langchain_utilities/runnable_executor.py +137 -0
  405. lfx/components/langchain_utilities/self_query.py +80 -0
  406. lfx/components/langchain_utilities/spider.py +142 -0
  407. lfx/components/langchain_utilities/sql.py +40 -0
  408. lfx/components/langchain_utilities/sql_database.py +35 -0
  409. lfx/components/langchain_utilities/sql_generator.py +78 -0
  410. lfx/components/langchain_utilities/tool_calling.py +59 -0
  411. lfx/components/langchain_utilities/vector_store_info.py +49 -0
  412. lfx/components/langchain_utilities/vector_store_router.py +33 -0
  413. lfx/components/langchain_utilities/xml_agent.py +71 -0
  414. lfx/components/langwatch/__init__.py +3 -0
  415. lfx/components/langwatch/langwatch.py +278 -0
  416. lfx/components/link_extractors/__init__.py +3 -0
  417. lfx/components/llm_operations/__init__.py +46 -0
  418. lfx/components/llm_operations/batch_run.py +205 -0
  419. lfx/components/llm_operations/lambda_filter.py +218 -0
  420. lfx/components/llm_operations/llm_conditional_router.py +421 -0
  421. lfx/components/llm_operations/llm_selector.py +499 -0
  422. lfx/components/llm_operations/structured_output.py +244 -0
  423. lfx/components/lmstudio/__init__.py +34 -0
  424. lfx/components/lmstudio/lmstudioembeddings.py +89 -0
  425. lfx/components/lmstudio/lmstudiomodel.py +133 -0
  426. lfx/components/logic/__init__.py +181 -0
  427. lfx/components/maritalk/__init__.py +32 -0
  428. lfx/components/maritalk/maritalk.py +52 -0
  429. lfx/components/mem0/__init__.py +3 -0
  430. lfx/components/mem0/mem0_chat_memory.py +147 -0
  431. lfx/components/milvus/__init__.py +34 -0
  432. lfx/components/milvus/milvus.py +115 -0
  433. lfx/components/mistral/__init__.py +37 -0
  434. lfx/components/mistral/mistral.py +114 -0
  435. lfx/components/mistral/mistral_embeddings.py +58 -0
  436. lfx/components/models/__init__.py +89 -0
  437. lfx/components/models_and_agents/__init__.py +49 -0
  438. lfx/components/models_and_agents/agent.py +644 -0
  439. lfx/components/models_and_agents/embedding_model.py +423 -0
  440. lfx/components/models_and_agents/language_model.py +398 -0
  441. lfx/components/models_and_agents/mcp_component.py +594 -0
  442. lfx/components/models_and_agents/memory.py +268 -0
  443. lfx/components/models_and_agents/prompt.py +67 -0
  444. lfx/components/mongodb/__init__.py +34 -0
  445. lfx/components/mongodb/mongodb_atlas.py +213 -0
  446. lfx/components/needle/__init__.py +3 -0
  447. lfx/components/needle/needle.py +104 -0
  448. lfx/components/notdiamond/__init__.py +34 -0
  449. lfx/components/notdiamond/notdiamond.py +228 -0
  450. lfx/components/novita/__init__.py +32 -0
  451. lfx/components/novita/novita.py +130 -0
  452. lfx/components/nvidia/__init__.py +57 -0
  453. lfx/components/nvidia/nvidia.py +151 -0
  454. lfx/components/nvidia/nvidia_embedding.py +77 -0
  455. lfx/components/nvidia/nvidia_ingest.py +317 -0
  456. lfx/components/nvidia/nvidia_rerank.py +63 -0
  457. lfx/components/nvidia/system_assist.py +65 -0
  458. lfx/components/olivya/__init__.py +3 -0
  459. lfx/components/olivya/olivya.py +116 -0
  460. lfx/components/ollama/__init__.py +37 -0
  461. lfx/components/ollama/ollama.py +548 -0
  462. lfx/components/ollama/ollama_embeddings.py +103 -0
  463. lfx/components/openai/__init__.py +37 -0
  464. lfx/components/openai/openai.py +100 -0
  465. lfx/components/openai/openai_chat_model.py +176 -0
  466. lfx/components/openrouter/__init__.py +32 -0
  467. lfx/components/openrouter/openrouter.py +104 -0
  468. lfx/components/output_parsers/__init__.py +3 -0
  469. lfx/components/perplexity/__init__.py +34 -0
  470. lfx/components/perplexity/perplexity.py +75 -0
  471. lfx/components/pgvector/__init__.py +34 -0
  472. lfx/components/pgvector/pgvector.py +72 -0
  473. lfx/components/pinecone/__init__.py +34 -0
  474. lfx/components/pinecone/pinecone.py +134 -0
  475. lfx/components/processing/__init__.py +72 -0
  476. lfx/components/processing/alter_metadata.py +109 -0
  477. lfx/components/processing/combine_text.py +40 -0
  478. lfx/components/processing/converter.py +248 -0
  479. lfx/components/processing/create_data.py +111 -0
  480. lfx/components/processing/create_list.py +40 -0
  481. lfx/components/processing/data_operations.py +528 -0
  482. lfx/components/processing/data_to_dataframe.py +71 -0
  483. lfx/components/processing/dataframe_operations.py +313 -0
  484. lfx/components/processing/dataframe_to_toolset.py +259 -0
  485. lfx/components/processing/dynamic_create_data.py +357 -0
  486. lfx/components/processing/extract_key.py +54 -0
  487. lfx/components/processing/filter_data.py +43 -0
  488. lfx/components/processing/filter_data_values.py +89 -0
  489. lfx/components/processing/json_cleaner.py +104 -0
  490. lfx/components/processing/merge_data.py +91 -0
  491. lfx/components/processing/message_to_data.py +37 -0
  492. lfx/components/processing/output_parser.py +46 -0
  493. lfx/components/processing/parse_data.py +71 -0
  494. lfx/components/processing/parse_dataframe.py +69 -0
  495. lfx/components/processing/parse_json_data.py +91 -0
  496. lfx/components/processing/parser.py +148 -0
  497. lfx/components/processing/regex.py +83 -0
  498. lfx/components/processing/select_data.py +49 -0
  499. lfx/components/processing/split_text.py +141 -0
  500. lfx/components/processing/store_message.py +91 -0
  501. lfx/components/processing/update_data.py +161 -0
  502. lfx/components/prototypes/__init__.py +35 -0
  503. lfx/components/prototypes/python_function.py +73 -0
  504. lfx/components/qdrant/__init__.py +34 -0
  505. lfx/components/qdrant/qdrant.py +109 -0
  506. lfx/components/redis/__init__.py +37 -0
  507. lfx/components/redis/redis.py +89 -0
  508. lfx/components/redis/redis_chat.py +43 -0
  509. lfx/components/sambanova/__init__.py +32 -0
  510. lfx/components/sambanova/sambanova.py +84 -0
  511. lfx/components/scrapegraph/__init__.py +40 -0
  512. lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  513. lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
  514. lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  515. lfx/components/searchapi/__init__.py +34 -0
  516. lfx/components/searchapi/search.py +79 -0
  517. lfx/components/serpapi/__init__.py +3 -0
  518. lfx/components/serpapi/serp.py +115 -0
  519. lfx/components/supabase/__init__.py +34 -0
  520. lfx/components/supabase/supabase.py +76 -0
  521. lfx/components/tavily/__init__.py +4 -0
  522. lfx/components/tavily/tavily_extract.py +117 -0
  523. lfx/components/tavily/tavily_search.py +212 -0
  524. lfx/components/textsplitters/__init__.py +3 -0
  525. lfx/components/toolkits/__init__.py +3 -0
  526. lfx/components/tools/__init__.py +66 -0
  527. lfx/components/tools/calculator.py +109 -0
  528. lfx/components/tools/google_search_api.py +45 -0
  529. lfx/components/tools/google_serper_api.py +115 -0
  530. lfx/components/tools/python_code_structured_tool.py +328 -0
  531. lfx/components/tools/python_repl.py +98 -0
  532. lfx/components/tools/search_api.py +88 -0
  533. lfx/components/tools/searxng.py +145 -0
  534. lfx/components/tools/serp_api.py +120 -0
  535. lfx/components/tools/tavily_search_tool.py +345 -0
  536. lfx/components/tools/wikidata_api.py +103 -0
  537. lfx/components/tools/wikipedia_api.py +50 -0
  538. lfx/components/tools/yahoo_finance.py +130 -0
  539. lfx/components/twelvelabs/__init__.py +52 -0
  540. lfx/components/twelvelabs/convert_astra_results.py +84 -0
  541. lfx/components/twelvelabs/pegasus_index.py +311 -0
  542. lfx/components/twelvelabs/split_video.py +301 -0
  543. lfx/components/twelvelabs/text_embeddings.py +57 -0
  544. lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  545. lfx/components/twelvelabs/video_embeddings.py +100 -0
  546. lfx/components/twelvelabs/video_file.py +191 -0
  547. lfx/components/unstructured/__init__.py +3 -0
  548. lfx/components/unstructured/unstructured.py +121 -0
  549. lfx/components/upstash/__init__.py +34 -0
  550. lfx/components/upstash/upstash.py +124 -0
  551. lfx/components/utilities/__init__.py +43 -0
  552. lfx/components/utilities/calculator_core.py +89 -0
  553. lfx/components/utilities/current_date.py +42 -0
  554. lfx/components/utilities/id_generator.py +42 -0
  555. lfx/components/utilities/python_repl_core.py +98 -0
  556. lfx/components/vectara/__init__.py +37 -0
  557. lfx/components/vectara/vectara.py +97 -0
  558. lfx/components/vectara/vectara_rag.py +164 -0
  559. lfx/components/vectorstores/__init__.py +34 -0
  560. lfx/components/vectorstores/local_db.py +270 -0
  561. lfx/components/vertexai/__init__.py +37 -0
  562. lfx/components/vertexai/vertexai.py +71 -0
  563. lfx/components/vertexai/vertexai_embeddings.py +67 -0
  564. lfx/components/vlmrun/__init__.py +34 -0
  565. lfx/components/vlmrun/vlmrun_transcription.py +224 -0
  566. lfx/components/weaviate/__init__.py +34 -0
  567. lfx/components/weaviate/weaviate.py +89 -0
  568. lfx/components/wikipedia/__init__.py +4 -0
  569. lfx/components/wikipedia/wikidata.py +86 -0
  570. lfx/components/wikipedia/wikipedia.py +53 -0
  571. lfx/components/wolframalpha/__init__.py +3 -0
  572. lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
  573. lfx/components/xai/__init__.py +32 -0
  574. lfx/components/xai/xai.py +167 -0
  575. lfx/components/yahoosearch/__init__.py +3 -0
  576. lfx/components/yahoosearch/yahoo.py +137 -0
  577. lfx/components/youtube/__init__.py +52 -0
  578. lfx/components/youtube/channel.py +227 -0
  579. lfx/components/youtube/comments.py +231 -0
  580. lfx/components/youtube/playlist.py +33 -0
  581. lfx/components/youtube/search.py +120 -0
  582. lfx/components/youtube/trending.py +285 -0
  583. lfx/components/youtube/video_details.py +263 -0
  584. lfx/components/youtube/youtube_transcripts.py +206 -0
  585. lfx/components/zep/__init__.py +3 -0
  586. lfx/components/zep/zep.py +45 -0
  587. lfx/constants.py +6 -0
  588. lfx/custom/__init__.py +7 -0
  589. lfx/custom/attributes.py +87 -0
  590. lfx/custom/code_parser/__init__.py +3 -0
  591. lfx/custom/code_parser/code_parser.py +361 -0
  592. lfx/custom/custom_component/__init__.py +0 -0
  593. lfx/custom/custom_component/base_component.py +128 -0
  594. lfx/custom/custom_component/component.py +1890 -0
  595. lfx/custom/custom_component/component_with_cache.py +8 -0
  596. lfx/custom/custom_component/custom_component.py +650 -0
  597. lfx/custom/dependency_analyzer.py +165 -0
  598. lfx/custom/directory_reader/__init__.py +3 -0
  599. lfx/custom/directory_reader/directory_reader.py +359 -0
  600. lfx/custom/directory_reader/utils.py +171 -0
  601. lfx/custom/eval.py +12 -0
  602. lfx/custom/schema.py +32 -0
  603. lfx/custom/tree_visitor.py +21 -0
  604. lfx/custom/utils.py +877 -0
  605. lfx/custom/validate.py +523 -0
  606. lfx/events/__init__.py +1 -0
  607. lfx/events/event_manager.py +110 -0
  608. lfx/exceptions/__init__.py +0 -0
  609. lfx/exceptions/component.py +15 -0
  610. lfx/field_typing/__init__.py +91 -0
  611. lfx/field_typing/constants.py +216 -0
  612. lfx/field_typing/range_spec.py +35 -0
  613. lfx/graph/__init__.py +6 -0
  614. lfx/graph/edge/__init__.py +0 -0
  615. lfx/graph/edge/base.py +300 -0
  616. lfx/graph/edge/schema.py +119 -0
  617. lfx/graph/edge/utils.py +0 -0
  618. lfx/graph/graph/__init__.py +0 -0
  619. lfx/graph/graph/ascii.py +202 -0
  620. lfx/graph/graph/base.py +2298 -0
  621. lfx/graph/graph/constants.py +63 -0
  622. lfx/graph/graph/runnable_vertices_manager.py +133 -0
  623. lfx/graph/graph/schema.py +53 -0
  624. lfx/graph/graph/state_model.py +66 -0
  625. lfx/graph/graph/utils.py +1024 -0
  626. lfx/graph/schema.py +75 -0
  627. lfx/graph/state/__init__.py +0 -0
  628. lfx/graph/state/model.py +250 -0
  629. lfx/graph/utils.py +206 -0
  630. lfx/graph/vertex/__init__.py +0 -0
  631. lfx/graph/vertex/base.py +826 -0
  632. lfx/graph/vertex/constants.py +0 -0
  633. lfx/graph/vertex/exceptions.py +4 -0
  634. lfx/graph/vertex/param_handler.py +316 -0
  635. lfx/graph/vertex/schema.py +26 -0
  636. lfx/graph/vertex/utils.py +19 -0
  637. lfx/graph/vertex/vertex_types.py +489 -0
  638. lfx/helpers/__init__.py +141 -0
  639. lfx/helpers/base_model.py +71 -0
  640. lfx/helpers/custom.py +13 -0
  641. lfx/helpers/data.py +167 -0
  642. lfx/helpers/flow.py +308 -0
  643. lfx/inputs/__init__.py +68 -0
  644. lfx/inputs/constants.py +2 -0
  645. lfx/inputs/input_mixin.py +352 -0
  646. lfx/inputs/inputs.py +718 -0
  647. lfx/inputs/validators.py +19 -0
  648. lfx/interface/__init__.py +6 -0
  649. lfx/interface/components.py +897 -0
  650. lfx/interface/importing/__init__.py +5 -0
  651. lfx/interface/importing/utils.py +39 -0
  652. lfx/interface/initialize/__init__.py +3 -0
  653. lfx/interface/initialize/loading.py +317 -0
  654. lfx/interface/listing.py +26 -0
  655. lfx/interface/run.py +16 -0
  656. lfx/interface/utils.py +111 -0
  657. lfx/io/__init__.py +63 -0
  658. lfx/io/schema.py +295 -0
  659. lfx/load/__init__.py +8 -0
  660. lfx/load/load.py +256 -0
  661. lfx/load/utils.py +99 -0
  662. lfx/log/__init__.py +5 -0
  663. lfx/log/logger.py +411 -0
  664. lfx/logging/__init__.py +11 -0
  665. lfx/logging/logger.py +24 -0
  666. lfx/memory/__init__.py +70 -0
  667. lfx/memory/stubs.py +302 -0
  668. lfx/processing/__init__.py +1 -0
  669. lfx/processing/process.py +238 -0
  670. lfx/processing/utils.py +25 -0
  671. lfx/py.typed +0 -0
  672. lfx/schema/__init__.py +66 -0
  673. lfx/schema/artifact.py +83 -0
  674. lfx/schema/content_block.py +62 -0
  675. lfx/schema/content_types.py +91 -0
  676. lfx/schema/cross_module.py +80 -0
  677. lfx/schema/data.py +309 -0
  678. lfx/schema/dataframe.py +210 -0
  679. lfx/schema/dotdict.py +74 -0
  680. lfx/schema/encoders.py +13 -0
  681. lfx/schema/graph.py +47 -0
  682. lfx/schema/image.py +184 -0
  683. lfx/schema/json_schema.py +186 -0
  684. lfx/schema/log.py +62 -0
  685. lfx/schema/message.py +493 -0
  686. lfx/schema/openai_responses_schemas.py +74 -0
  687. lfx/schema/properties.py +41 -0
  688. lfx/schema/schema.py +180 -0
  689. lfx/schema/serialize.py +13 -0
  690. lfx/schema/table.py +142 -0
  691. lfx/schema/validators.py +114 -0
  692. lfx/serialization/__init__.py +5 -0
  693. lfx/serialization/constants.py +2 -0
  694. lfx/serialization/serialization.py +314 -0
  695. lfx/services/__init__.py +26 -0
  696. lfx/services/base.py +28 -0
  697. lfx/services/cache/__init__.py +6 -0
  698. lfx/services/cache/base.py +183 -0
  699. lfx/services/cache/service.py +166 -0
  700. lfx/services/cache/utils.py +169 -0
  701. lfx/services/chat/__init__.py +1 -0
  702. lfx/services/chat/config.py +2 -0
  703. lfx/services/chat/schema.py +10 -0
  704. lfx/services/database/__init__.py +5 -0
  705. lfx/services/database/service.py +25 -0
  706. lfx/services/deps.py +194 -0
  707. lfx/services/factory.py +19 -0
  708. lfx/services/initialize.py +19 -0
  709. lfx/services/interfaces.py +103 -0
  710. lfx/services/manager.py +185 -0
  711. lfx/services/mcp_composer/__init__.py +6 -0
  712. lfx/services/mcp_composer/factory.py +16 -0
  713. lfx/services/mcp_composer/service.py +1441 -0
  714. lfx/services/schema.py +21 -0
  715. lfx/services/session.py +87 -0
  716. lfx/services/settings/__init__.py +3 -0
  717. lfx/services/settings/auth.py +133 -0
  718. lfx/services/settings/base.py +668 -0
  719. lfx/services/settings/constants.py +43 -0
  720. lfx/services/settings/factory.py +23 -0
  721. lfx/services/settings/feature_flags.py +11 -0
  722. lfx/services/settings/service.py +35 -0
  723. lfx/services/settings/utils.py +40 -0
  724. lfx/services/shared_component_cache/__init__.py +1 -0
  725. lfx/services/shared_component_cache/factory.py +30 -0
  726. lfx/services/shared_component_cache/service.py +9 -0
  727. lfx/services/storage/__init__.py +5 -0
  728. lfx/services/storage/local.py +185 -0
  729. lfx/services/storage/service.py +177 -0
  730. lfx/services/tracing/__init__.py +1 -0
  731. lfx/services/tracing/service.py +21 -0
  732. lfx/settings.py +6 -0
  733. lfx/template/__init__.py +6 -0
  734. lfx/template/field/__init__.py +0 -0
  735. lfx/template/field/base.py +260 -0
  736. lfx/template/field/prompt.py +15 -0
  737. lfx/template/frontend_node/__init__.py +6 -0
  738. lfx/template/frontend_node/base.py +214 -0
  739. lfx/template/frontend_node/constants.py +65 -0
  740. lfx/template/frontend_node/custom_components.py +79 -0
  741. lfx/template/template/__init__.py +0 -0
  742. lfx/template/template/base.py +100 -0
  743. lfx/template/utils.py +217 -0
  744. lfx/type_extraction/__init__.py +19 -0
  745. lfx/type_extraction/type_extraction.py +75 -0
  746. lfx/type_extraction.py +80 -0
  747. lfx/utils/__init__.py +1 -0
  748. lfx/utils/async_helpers.py +42 -0
  749. lfx/utils/component_utils.py +154 -0
  750. lfx/utils/concurrency.py +60 -0
  751. lfx/utils/connection_string_parser.py +11 -0
  752. lfx/utils/constants.py +233 -0
  753. lfx/utils/data_structure.py +212 -0
  754. lfx/utils/exceptions.py +22 -0
  755. lfx/utils/helpers.py +34 -0
  756. lfx/utils/image.py +79 -0
  757. lfx/utils/langflow_utils.py +52 -0
  758. lfx/utils/lazy_load.py +15 -0
  759. lfx/utils/request_utils.py +18 -0
  760. lfx/utils/schemas.py +139 -0
  761. lfx/utils/ssrf_protection.py +384 -0
  762. lfx/utils/util.py +626 -0
  763. lfx/utils/util_strings.py +56 -0
  764. lfx/utils/validate_cloud.py +26 -0
  765. lfx/utils/version.py +24 -0
  766. lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
  767. lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
  768. lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
  769. lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,8 @@
1
+ from lfx.custom.custom_component.component import Component
2
+ from lfx.services.deps import get_shared_component_cache_service
3
+
4
+
5
+ class ComponentWithCache(Component):
6
+ def __init__(self, **data) -> None:
7
+ super().__init__(**data)
8
+ self._shared_component_cache = get_shared_component_cache_service()
@@ -0,0 +1,650 @@
1
+ from __future__ import annotations
2
+
3
+ import uuid
4
+ from collections.abc import Callable, Sequence
5
+ from pathlib import Path
6
+ from typing import TYPE_CHECKING, Any, ClassVar
7
+
8
+ import yaml
9
+ from cachetools import TTLCache
10
+ from langchain_core.documents import Document
11
+ from pydantic import BaseModel
12
+
13
+ from lfx.custom import validate
14
+ from lfx.custom.custom_component.base_component import BaseComponent
15
+ from lfx.helpers import (
16
+ get_flow_by_id_or_name,
17
+ list_flows,
18
+ list_flows_by_flow_folder,
19
+ list_flows_by_folder_id,
20
+ load_flow,
21
+ run_flow,
22
+ )
23
+ from lfx.log.logger import logger
24
+ from lfx.schema.data import Data
25
+ from lfx.services.deps import get_storage_service, get_variable_service, session_scope
26
+ from lfx.services.storage.service import StorageService
27
+ from lfx.template.utils import update_frontend_node_with_template_values
28
+ from lfx.type_extraction import post_process_type
29
+ from lfx.utils.async_helpers import run_until_complete
30
+
31
+ if TYPE_CHECKING:
32
+ from langchain.callbacks.base import BaseCallbackHandler
33
+
34
+ from lfx.graph.graph.base import Graph
35
+ from lfx.graph.vertex.base import Vertex
36
+ from lfx.schema.dotdict import dotdict
37
+ from lfx.schema.log import Log
38
+ from lfx.schema.schema import OutputValue
39
+ from lfx.services.storage.service import StorageService
40
+ from lfx.services.tracing.service import TracingService
41
+
42
+
43
+ class CustomComponent(BaseComponent):
44
+ """Represents a custom component in Langflow.
45
+
46
+ Attributes:
47
+ name (Optional[str]): This attribute helps the frontend apply styles to known components.
48
+ display_name (Optional[str]): The display name of the custom component.
49
+ description (Optional[str]): The description of the custom component.
50
+ code (Optional[str]): The code of the custom component.
51
+ field_config (dict): The field configuration of the custom component.
52
+ code_class_base_inheritance (ClassVar[str]): The base class name for the custom component.
53
+ function_entrypoint_name (ClassVar[str]): The name of the function entrypoint for the custom component.
54
+ function (Optional[Callable]): The function associated with the custom component.
55
+ repr_value (Optional[Any]): The representation value of the custom component.
56
+ user_id (Optional[Union[UUID, str]]): The user ID associated with the custom component.
57
+ status (Optional[Any]): The status of the custom component.
58
+ _tree (Optional[dict]): The code tree of the custom component.
59
+ """
60
+
61
+ # True constants that should be shared (using ClassVar)
62
+ _code_class_base_inheritance: ClassVar[str] = "CustomComponent"
63
+ function_entrypoint_name: ClassVar[str] = "build"
64
+ name: str | None = None
65
+ """The name of the component used to styles. Defaults to None."""
66
+ display_name: str | None = None
67
+ """The display name of the component. Defaults to None."""
68
+ description: str | None = None
69
+ """The description of the component. Defaults to None."""
70
+ icon: str | None = None
71
+ """The icon of the component. It should be an emoji. Defaults to None."""
72
+ priority: int | None = None
73
+ """The priority of the component in the category. Lower priority means it will be displayed first. Defaults to None.
74
+ """
75
+
76
+ def __init__(self, **data) -> None:
77
+ """Initializes a new instance of the CustomComponent class.
78
+
79
+ Args:
80
+ **data: Additional keyword arguments to initialize the custom component.
81
+ """
82
+ # Initialize instance-specific attributes first
83
+ self.is_input: bool | None = None
84
+ self.is_output: bool | None = None
85
+ self.add_tool_output: bool = False
86
+ self.field_config: dict = {}
87
+ self.field_order: list[str] | None = None
88
+ self.frozen: bool = False
89
+ self.build_parameters: dict | None = None
90
+ self._vertex: Vertex | None = None
91
+ self.function: Callable | None = None
92
+ self.repr_value: Any = ""
93
+ self.status: Any | None = None
94
+
95
+ # Initialize collections with empty defaults
96
+ self._flows_data: list[Data] | None = None
97
+ self._outputs: list[OutputValue] = []
98
+ self._logs: list[Log] = []
99
+ self._output_logs: dict[str, list[Log] | Log] = {}
100
+ self._tracing_service: TracingService | None = None
101
+ self._tree: dict | None = None
102
+
103
+ # Initialize additional instance state
104
+ self.cache: TTLCache = TTLCache(maxsize=1024, ttl=60)
105
+ self._results: dict = {}
106
+ self._artifacts: dict = {}
107
+ # Call parent's init after setting up our attributes
108
+ super().__init__(**data)
109
+
110
+ def set_attributes(self, parameters: dict) -> None:
111
+ pass
112
+
113
+ def set_parameters(self, parameters: dict) -> None:
114
+ self._parameters = parameters
115
+ self.set_attributes(self._parameters)
116
+
117
+ def get_vertex(self):
118
+ return self._vertex
119
+
120
+ def get_results(self):
121
+ return self._results
122
+
123
+ def get_artifacts(self):
124
+ return self._artifacts
125
+
126
+ def set_results(self, results: dict):
127
+ self._results = results
128
+
129
+ def set_artifacts(self, artifacts: dict):
130
+ self._artifacts = artifacts
131
+
132
+ @property
133
+ def trace_name(self) -> str:
134
+ if hasattr(self, "_id") and self._id is None:
135
+ msg = "Component id is not set"
136
+ raise ValueError(msg)
137
+ if hasattr(self, "_id"):
138
+ return f"{self.display_name} ({self._id})"
139
+ return f"{self.display_name}"
140
+
141
+ def stop(self, output_name: str | None = None) -> None:
142
+ if not output_name and self._vertex and len(self._vertex.outputs) == 1:
143
+ output_name = self._vertex.outputs[0]["name"]
144
+ elif not output_name:
145
+ msg = "You must specify an output name to call stop"
146
+ raise ValueError(msg)
147
+ if not self._vertex:
148
+ msg = "Vertex is not set"
149
+ raise ValueError(msg)
150
+ try:
151
+ self.graph.mark_branch(vertex_id=self._vertex.id, output_name=output_name, state="INACTIVE")
152
+ except Exception as e:
153
+ msg = f"Error stopping {self.display_name}: {e}"
154
+ raise ValueError(msg) from e
155
+
156
+ def start(self, output_name: str | None = None) -> None:
157
+ if not output_name and self._vertex and len(self._vertex.outputs) == 1:
158
+ output_name = self._vertex.outputs[0]["name"]
159
+ elif not output_name:
160
+ msg = "You must specify an output name to call start"
161
+ raise ValueError(msg)
162
+ if not self._vertex:
163
+ msg = "Vertex is not set"
164
+ raise ValueError(msg)
165
+ try:
166
+ self.graph.mark_branch(vertex_id=self._vertex.id, output_name=output_name, state="ACTIVE")
167
+ except Exception as e:
168
+ msg = f"Error starting {self.display_name}: {e}"
169
+ raise ValueError(msg) from e
170
+
171
+ @staticmethod
172
+ def resolve_path(path: str) -> str:
173
+ """Resolves the path to an absolute path."""
174
+ if not path:
175
+ return path
176
+ path_object = Path(path)
177
+
178
+ if path_object.parts and path_object.parts[0] == "~":
179
+ path_object = path_object.expanduser()
180
+ elif path_object.is_relative_to("."):
181
+ path_object = path_object.resolve()
182
+ return str(path_object)
183
+
184
+ def get_full_path(self, path: str) -> str:
185
+ storage_svc: StorageService = get_storage_service()
186
+
187
+ flow_id, file_name = path.split("/", 1)
188
+ return storage_svc.build_full_path(flow_id, file_name)
189
+
190
+ @property
191
+ def graph(self):
192
+ return self._vertex.graph
193
+
194
+ @property
195
+ def user_id(self):
196
+ if hasattr(self, "_user_id") and self._user_id:
197
+ return self._user_id
198
+ return self.graph.user_id
199
+
200
+ @property
201
+ def flow_id(self):
202
+ return self.graph.flow_id
203
+
204
+ @property
205
+ def flow_name(self):
206
+ return self.graph.flow_name
207
+
208
+ @property
209
+ def tracing_service(self):
210
+ """Lazily initialize tracing service only when accessed."""
211
+ if self._tracing_service is None:
212
+ from lfx.services.deps import get_tracing_service
213
+
214
+ try:
215
+ self._tracing_service = get_tracing_service()
216
+ except Exception: # noqa: BLE001
217
+ # Broad exception is intentional - we want to gracefully handle any service initialization error
218
+ self._tracing_service = None
219
+ return self._tracing_service
220
+
221
+ def _get_field_order(self):
222
+ return self.field_order or list(self.field_config.keys())
223
+
224
+ def get_field_order(self):
225
+ """Get the field order for the component."""
226
+ return self._get_field_order()
227
+
228
+ def get_function_entrypoint_return_type(self) -> list[Any]:
229
+ """Get the return type of the function entrypoint for the custom component."""
230
+ return self._get_function_entrypoint_return_type
231
+
232
+ def custom_repr(self):
233
+ """Returns the custom representation of the custom component.
234
+
235
+ Returns:
236
+ str: The custom representation of the custom component.
237
+ """
238
+ if self.repr_value == "":
239
+ self.repr_value = self.status
240
+ if isinstance(self.repr_value, dict):
241
+ return yaml.dump(self.repr_value)
242
+ if isinstance(self.repr_value, str):
243
+ return self.repr_value
244
+ if isinstance(self.repr_value, BaseModel) and not isinstance(self.repr_value, Data):
245
+ return str(self.repr_value)
246
+ return self.repr_value
247
+
248
+ def build_config(self):
249
+ """Builds the configuration for the custom component.
250
+
251
+ Returns:
252
+ dict: The configuration for the custom component.
253
+ """
254
+ return self.field_config
255
+
256
+ def update_build_config(
257
+ self,
258
+ build_config: dotdict,
259
+ field_value: Any,
260
+ field_name: str | None = None,
261
+ ):
262
+ """Updates the build configuration for the custom component.
263
+
264
+ Do not call directly as implementation can be a coroutine.
265
+ """
266
+ build_config[field_name]["value"] = field_value
267
+ return build_config
268
+
269
+ @property
270
+ def tree(self):
271
+ """Gets the code tree of the custom component.
272
+
273
+ Returns:
274
+ dict: The code tree of the custom component.
275
+ """
276
+ return self.get_code_tree(self._code or "")
277
+
278
+ def to_data(self, data: Any, *, keys: list[str] | None = None, silent_errors: bool = False) -> list[Data]:
279
+ """Converts input data into a list of Data objects.
280
+
281
+ Args:
282
+ data (Any): The input data to be converted. It can be a single item or a sequence of items.
283
+ If the input data is a Langchain Document, text_key and data_key are ignored.
284
+
285
+ keys (List[str], optional): The keys to access the text and data values in each item.
286
+ It should be a list of strings where the first element is the text key and the second element
287
+ is the data key.
288
+ Defaults to None, in which case the default keys "text" and "data" are used.
289
+ silent_errors (bool, optional): Whether to suppress errors when the specified keys are not found
290
+ in the data.
291
+
292
+ Returns:
293
+ List[Data]: A list of Data objects.
294
+
295
+ Raises:
296
+ ValueError: If the input data is not of a valid type or if the specified keys are not found in the data.
297
+
298
+ """
299
+ if not keys:
300
+ keys = []
301
+ data_objects = []
302
+ if not isinstance(data, Sequence):
303
+ data = [data]
304
+ for item in data:
305
+ data_dict = {}
306
+ if isinstance(item, Document):
307
+ data_dict = item.metadata
308
+ data_dict["text"] = item.page_content
309
+ elif isinstance(item, BaseModel):
310
+ model_dump = item.model_dump()
311
+ for key in keys:
312
+ if silent_errors:
313
+ data_dict[key] = model_dump.get(key, "")
314
+ else:
315
+ try:
316
+ data_dict[key] = model_dump[key]
317
+ except KeyError as e:
318
+ msg = f"Key {key} not found in {item}"
319
+ raise ValueError(msg) from e
320
+
321
+ elif isinstance(item, str):
322
+ data_dict = {"text": item}
323
+ elif isinstance(item, dict):
324
+ data_dict = item.copy()
325
+ else:
326
+ msg = f"Invalid data type: {type(item)}"
327
+ raise TypeError(msg)
328
+
329
+ data_objects.append(Data(data=data_dict))
330
+
331
+ return data_objects
332
+
333
+ def get_method_return_type(self, method_name: str):
334
+ build_method = self.get_method(method_name)
335
+ if not build_method or not build_method.get("has_return"):
336
+ return []
337
+ return_type = build_method["return_type"]
338
+
339
+ return self._extract_return_type(return_type)
340
+
341
+ def create_references_from_data(self, data: list[Data], *, include_data: bool = False) -> str:
342
+ """Create references from a list of data.
343
+
344
+ Args:
345
+ data (List[dict]): A list of data, where each record is a dictionary.
346
+ include_data (bool, optional): Whether to include data in the references. Defaults to False.
347
+
348
+ Returns:
349
+ str: A string containing the references in markdown format.
350
+ """
351
+ if not data:
352
+ return ""
353
+ markdown_string = "---\n"
354
+ for value in data:
355
+ markdown_string += f"- Text: {value.get_text()}"
356
+ if include_data:
357
+ markdown_string += f" Data: {value.data}"
358
+ markdown_string += "\n"
359
+ return markdown_string
360
+
361
+ @property
362
+ def get_function_entrypoint_args(self) -> list:
363
+ """Gets the arguments of the function entrypoint for the custom component.
364
+
365
+ Returns:
366
+ list: The arguments of the function entrypoint.
367
+ """
368
+ build_method = self.get_method(self._function_entrypoint_name)
369
+ if not build_method:
370
+ return []
371
+
372
+ args = build_method["args"]
373
+ for arg in args:
374
+ if not arg.get("type") and arg.get("name") != "self":
375
+ # Set the type to Data
376
+ arg["type"] = "Data"
377
+ return args
378
+
379
+ def get_method(self, method_name: str):
380
+ """Gets the build method for the custom component.
381
+
382
+ Returns:
383
+ dict: The build method for the custom component.
384
+ """
385
+ if not self._code:
386
+ return {}
387
+
388
+ component_classes = [
389
+ cls for cls in self.tree["classes"] if "Component" in cls["bases"] or "CustomComponent" in cls["bases"]
390
+ ]
391
+ if not component_classes:
392
+ return {}
393
+
394
+ # Assume the first Component class is the one we're interested in
395
+ component_class = component_classes[0]
396
+ build_methods = [method for method in component_class["methods"] if method["name"] == (method_name)]
397
+
398
+ return build_methods[0] if build_methods else {}
399
+
400
+ @property
401
+ def _get_function_entrypoint_return_type(self) -> list[Any]:
402
+ """Gets the return type of the function entrypoint for the custom component.
403
+
404
+ Returns:
405
+ List[Any]: The return type of the function entrypoint.
406
+ """
407
+ return self.get_method_return_type(self._function_entrypoint_name)
408
+
409
+ def _extract_return_type(self, return_type: Any) -> list[Any]:
410
+ return post_process_type(return_type)
411
+
412
+ @property
413
+ def get_main_class_name(self):
414
+ """Gets the main class name of the custom component.
415
+
416
+ Returns:
417
+ str: The main class name of the custom component.
418
+ """
419
+ if not self._code:
420
+ return ""
421
+
422
+ base_name = self._code_class_base_inheritance
423
+ method_name = self._function_entrypoint_name
424
+
425
+ classes = []
426
+ for item in self.tree.get("classes", []):
427
+ if base_name in item["bases"]:
428
+ method_names = [method["name"] for method in item["methods"]]
429
+ if method_name in method_names:
430
+ classes.append(item["name"])
431
+
432
+ # Get just the first item
433
+ return next(iter(classes), "")
434
+
435
+ @property
436
+ def template_config(self):
437
+ """Gets the template configuration for the custom component.
438
+
439
+ Returns:
440
+ dict: The template configuration for the custom component.
441
+ """
442
+ if not self._template_config:
443
+ self._template_config = self.build_template_config()
444
+ return self._template_config
445
+
446
+ def variables(self, name: str, field: str):
447
+ """DEPRECATED - This is kept for backward compatibility. Use get_variables instead."""
448
+ return run_until_complete(self.get_variables(name, field))
449
+
450
+ async def get_variables(self, name: str, field: str):
451
+ """DEPRECATED - This is kept for backward compatibility. Use get_variable instead."""
452
+ async with session_scope() as session:
453
+ return await self.get_variable(name, field, session)
454
+
455
+ async def get_variable(self, name: str, field: str, session):
456
+ """Returns the variable for the current user with the specified name.
457
+
458
+ Raises:
459
+ ValueError: If the user id is not set.
460
+
461
+ Returns:
462
+ The variable for the current user with the specified name.
463
+ """
464
+ if hasattr(self, "_user_id") and not self.user_id:
465
+ msg = f"User id is not set for {self.__class__.__name__}"
466
+ raise ValueError(msg)
467
+
468
+ # Check graph context for request-level variable overrides first
469
+ if hasattr(self, "graph") and self.graph and hasattr(self.graph, "context"):
470
+ context = self.graph.context
471
+ if context and "request_variables" in context:
472
+ request_variables = context["request_variables"]
473
+ if name in request_variables:
474
+ logger.debug(f"Found context override for variable '{name}': {request_variables[name]}")
475
+ return request_variables[name]
476
+
477
+ variable_service = get_variable_service() # Get service instance
478
+ # Retrieve and decrypt the variable by name for the current user
479
+ if isinstance(self.user_id, str):
480
+ user_id = uuid.UUID(self.user_id)
481
+ elif isinstance(self.user_id, uuid.UUID):
482
+ user_id = self.user_id
483
+ else:
484
+ msg = f"Invalid user id: {self.user_id}"
485
+ raise TypeError(msg)
486
+ return await variable_service.get_variable(user_id=user_id, name=name, field=field, session=session)
487
+
488
+ async def list_key_names(self):
489
+ """Lists the names of the variables for the current user.
490
+
491
+ Raises:
492
+ ValueError: If the user id is not set.
493
+
494
+ Returns:
495
+ List[str]: The names of the variables for the current user.
496
+ """
497
+ if hasattr(self, "_user_id") and not self.user_id:
498
+ msg = f"User id is not set for {self.__class__.__name__}"
499
+ raise ValueError(msg)
500
+ variable_service = get_variable_service()
501
+
502
+ async with session_scope() as session:
503
+ return await variable_service.list_variables(user_id=self.user_id, session=session)
504
+
505
+ def index(self, value: int = 0):
506
+ """Returns a function that returns the value at the given index in the iterable.
507
+
508
+ Args:
509
+ value (int): The index value.
510
+
511
+ Returns:
512
+ Callable: A function that returns the value at the given index.
513
+ """
514
+
515
+ def get_index(iterable: list[Any]):
516
+ return iterable[value] if iterable else iterable
517
+
518
+ return get_index
519
+
520
+ def get_function(self):
521
+ """Gets the function associated with the custom component.
522
+
523
+ Returns:
524
+ Callable: The function associated with the custom component.
525
+ """
526
+ return validate.create_function(self._code, self._function_entrypoint_name)
527
+
528
+ async def load_flow(self, flow_id: str, tweaks: dict | None = None) -> Graph:
529
+ if not self.user_id:
530
+ msg = "Session is invalid"
531
+ raise ValueError(msg)
532
+ return await load_flow(user_id=str(self.user_id), flow_id=flow_id, tweaks=tweaks)
533
+
534
+ async def run_flow(
535
+ self,
536
+ inputs: dict | list[dict] | None = None,
537
+ flow_id: str | None = None,
538
+ flow_name: str | None = None,
539
+ output_type: str | None = "chat",
540
+ tweaks: dict | None = None,
541
+ ) -> Any:
542
+ return await run_flow(
543
+ inputs=inputs,
544
+ output_type=output_type,
545
+ flow_id=flow_id,
546
+ flow_name=flow_name,
547
+ tweaks=tweaks,
548
+ user_id=str(self.user_id),
549
+ run_id=self.graph.run_id,
550
+ )
551
+
552
+ def list_flows(self) -> list[Data]:
553
+ """DEPRECATED - This is kept for backward compatibility. Using alist_flows instead is recommended."""
554
+ return run_until_complete(self.alist_flows())
555
+
556
+ async def alist_flows(self) -> list[Data]:
557
+ """List all flows for the current user."""
558
+ try: # user id is validated in the function
559
+ return await list_flows(user_id=str(self.user_id))
560
+ except Exception as e:
561
+ msg = f"Error listing flows: {e}"
562
+ raise ValueError(msg) from e
563
+
564
+ async def alist_flows_by_flow_folder(self) -> list[Data]:
565
+ """List all flows for the current user in the same folder as the current flow."""
566
+ flow_id = self._get_runtime_or_frontend_node_attr("flow_id")
567
+ if flow_id is not None:
568
+ try: # user and flow ids are validated in the function
569
+ return await list_flows_by_flow_folder(user_id=str(self.user_id), flow_id=str(flow_id))
570
+ except Exception as e:
571
+ msg = f"Error listing flows: {e}"
572
+ raise ValueError(msg) from e
573
+ return []
574
+
575
+ async def alist_flows_by_folder_id(self) -> list[Data]:
576
+ """List all flows for the current user in the same folder as the current flow."""
577
+ folder_id = self._get_runtime_or_frontend_node_attr("folder_id")
578
+ if folder_id is not None:
579
+ try: # user and flow ids are validated in the function
580
+ return await list_flows_by_folder_id(
581
+ user_id=str(self.user_id),
582
+ folder_id=str(folder_id),
583
+ )
584
+ except Exception as e:
585
+ msg = f"Error listing flows: {e}"
586
+ raise ValueError(msg) from e
587
+ return []
588
+
589
+ async def aget_flow_by_id_or_name(self) -> Data | None:
590
+ flow_id = self._get_runtime_or_frontend_node_attr("flow_id")
591
+ flow_name = self._get_runtime_or_frontend_node_attr("flow_name")
592
+ if flow_id or flow_name:
593
+ try: # user and flow ids are validated in the function
594
+ return await get_flow_by_id_or_name(
595
+ user_id=str(self.user_id), flow_id=str(flow_id) if flow_id else None, flow_name=flow_name
596
+ )
597
+ except Exception as e:
598
+ msg = f"Error listing flows: {e}"
599
+ raise ValueError(msg) from e
600
+ return None
601
+
602
+ def build(self, *args: Any, **kwargs: Any) -> Any:
603
+ """Builds the custom component.
604
+
605
+ Args:
606
+ *args: The positional arguments.
607
+ **kwargs: The keyword arguments.
608
+
609
+ Returns:
610
+ Any: The result of the build process.
611
+ """
612
+ raise NotImplementedError
613
+
614
+ def post_code_processing(self, new_frontend_node: dict, current_frontend_node: dict):
615
+ """DEPRECATED - Kept for backward compatibility. Use update_frontend_node instead."""
616
+ run_until_complete(self.update_frontend_node(new_frontend_node, current_frontend_node))
617
+
618
+ async def update_frontend_node(self, new_frontend_node: dict, current_frontend_node: dict):
619
+ """Updates the given new frontend node with values from the current frontend node.
620
+
621
+ This function is called after the code validation is done.
622
+ """
623
+ return update_frontend_node_with_template_values(
624
+ frontend_node=new_frontend_node, raw_frontend_node=current_frontend_node
625
+ )
626
+
627
+ def get_langchain_callbacks(self) -> list[BaseCallbackHandler]:
628
+ if self.tracing_service and hasattr(self.tracing_service, "get_langchain_callbacks"):
629
+ return self.tracing_service.get_langchain_callbacks()
630
+ return []
631
+
632
+ def _get_runtime_or_frontend_node_attr(self, attr_name: str) -> Any:
633
+ """Get attribute value from the attribute name.
634
+
635
+ Falls back to frontend node attribute version
636
+ if it was provided (expected when updating the component's
637
+ build config).
638
+
639
+ Args:
640
+ attr_name: The attribute name (e.g., "flow_id", "flow_name")
641
+
642
+ Returns:
643
+ The attribute value from runtime or frontend node attribute, or None if neither exists.
644
+ """
645
+ value = getattr(self, attr_name, None)
646
+ if value is None:
647
+ attr = f"_frontend_node_{attr_name}"
648
+ if hasattr(self, attr):
649
+ value = getattr(self, attr)
650
+ return value