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,594 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import json
5
+ import uuid
6
+
7
+ from langchain_core.tools import StructuredTool # noqa: TC002
8
+
9
+ from lfx.base.agents.utils import maybe_unflatten_dict, safe_cache_get, safe_cache_set
10
+ from lfx.base.mcp.util import (
11
+ MCPStdioClient,
12
+ MCPStreamableHttpClient,
13
+ create_input_schema_from_json_schema,
14
+ update_tools,
15
+ )
16
+ from lfx.custom.custom_component.component_with_cache import ComponentWithCache
17
+ from lfx.inputs.inputs import InputTypes # noqa: TC001
18
+ from lfx.io import BoolInput, DropdownInput, McpInput, MessageTextInput, Output
19
+ from lfx.io.schema import flatten_schema, schema_to_langflow_inputs
20
+ from lfx.log.logger import logger
21
+ from lfx.schema.dataframe import DataFrame
22
+ from lfx.schema.message import Message
23
+ from lfx.services.deps import get_settings_service, get_storage_service, session_scope
24
+
25
+
26
+ class MCPToolsComponent(ComponentWithCache):
27
+ schema_inputs: list = []
28
+ tools: list[StructuredTool] = []
29
+ _not_load_actions: bool = False
30
+ _tool_cache: dict = {}
31
+ _last_selected_server: str | None = None # Cache for the last selected server
32
+
33
+ def __init__(self, **data) -> None:
34
+ super().__init__(**data)
35
+ # Initialize cache keys to avoid CacheMiss when accessing them
36
+ self._ensure_cache_structure()
37
+
38
+ # Initialize clients with access to the component cache
39
+ self.stdio_client: MCPStdioClient = MCPStdioClient(component_cache=self._shared_component_cache)
40
+ self.streamable_http_client: MCPStreamableHttpClient = MCPStreamableHttpClient(
41
+ component_cache=self._shared_component_cache
42
+ )
43
+
44
+ def _ensure_cache_structure(self):
45
+ """Ensure the cache has the required structure."""
46
+ # Check if servers key exists and is not CacheMiss
47
+ servers_value = safe_cache_get(self._shared_component_cache, "servers")
48
+ if servers_value is None:
49
+ safe_cache_set(self._shared_component_cache, "servers", {})
50
+
51
+ # Check if last_selected_server key exists and is not CacheMiss
52
+ last_server_value = safe_cache_get(self._shared_component_cache, "last_selected_server")
53
+ if last_server_value is None:
54
+ safe_cache_set(self._shared_component_cache, "last_selected_server", "")
55
+
56
+ default_keys: list[str] = [
57
+ "code",
58
+ "_type",
59
+ "tool_mode",
60
+ "tool_placeholder",
61
+ "mcp_server",
62
+ "tool",
63
+ "use_cache",
64
+ "verify_ssl",
65
+ ]
66
+
67
+ display_name = "MCP Tools"
68
+ description = "Connect to an MCP server to use its tools."
69
+ documentation: str = "https://docs.langflow.org/mcp-tools"
70
+ icon = "Mcp"
71
+ name = "MCPTools"
72
+
73
+ inputs = [
74
+ McpInput(
75
+ name="mcp_server",
76
+ display_name="MCP Server",
77
+ info="Select the MCP Server that will be used by this component",
78
+ real_time_refresh=True,
79
+ ),
80
+ BoolInput(
81
+ name="use_cache",
82
+ display_name="Use Cached Server",
83
+ info=(
84
+ "Enable caching of MCP Server and tools to improve performance. "
85
+ "Disable to always fetch fresh tools and server updates."
86
+ ),
87
+ value=False,
88
+ advanced=True,
89
+ ),
90
+ BoolInput(
91
+ name="verify_ssl",
92
+ display_name="Verify SSL Certificate",
93
+ info=(
94
+ "Enable SSL certificate verification for HTTPS connections. "
95
+ "Disable only for development/testing with self-signed certificates."
96
+ ),
97
+ value=True,
98
+ advanced=True,
99
+ ),
100
+ DropdownInput(
101
+ name="tool",
102
+ display_name="Tool",
103
+ options=[],
104
+ value="",
105
+ info="Select the tool to execute",
106
+ show=False,
107
+ required=True,
108
+ real_time_refresh=True,
109
+ ),
110
+ MessageTextInput(
111
+ name="tool_placeholder",
112
+ display_name="Tool Placeholder",
113
+ info="Placeholder for the tool",
114
+ value="",
115
+ show=False,
116
+ tool_mode=False,
117
+ ),
118
+ ]
119
+
120
+ outputs = [
121
+ Output(display_name="Response", name="response", method="build_output"),
122
+ ]
123
+
124
+ async def _validate_schema_inputs(self, tool_obj) -> list[InputTypes]:
125
+ """Validate and process schema inputs for a tool."""
126
+ try:
127
+ if not tool_obj or not hasattr(tool_obj, "args_schema"):
128
+ msg = "Invalid tool object or missing input schema"
129
+ raise ValueError(msg)
130
+
131
+ flat_schema = flatten_schema(tool_obj.args_schema.schema())
132
+ input_schema = create_input_schema_from_json_schema(flat_schema)
133
+ if not input_schema:
134
+ msg = f"Empty input schema for tool '{tool_obj.name}'"
135
+ raise ValueError(msg)
136
+
137
+ schema_inputs = schema_to_langflow_inputs(input_schema)
138
+ if not schema_inputs:
139
+ msg = f"No input parameters defined for tool '{tool_obj.name}'"
140
+ await logger.awarning(msg)
141
+ return []
142
+
143
+ except Exception as e:
144
+ msg = f"Error validating schema inputs: {e!s}"
145
+ await logger.aexception(msg)
146
+ raise ValueError(msg) from e
147
+ else:
148
+ return schema_inputs
149
+
150
+ async def update_tool_list(self, mcp_server_value=None):
151
+ # Accepts mcp_server_value as dict {name, config} or uses self.mcp_server
152
+ mcp_server = mcp_server_value if mcp_server_value is not None else getattr(self, "mcp_server", None)
153
+ server_name = None
154
+ server_config_from_value = None
155
+ if isinstance(mcp_server, dict):
156
+ server_name = mcp_server.get("name")
157
+ server_config_from_value = mcp_server.get("config")
158
+ else:
159
+ server_name = mcp_server
160
+ if not server_name:
161
+ self.tools = []
162
+ return [], {"name": server_name, "config": server_config_from_value}
163
+
164
+ # Check if caching is enabled, default to False
165
+ use_cache = getattr(self, "use_cache", False)
166
+
167
+ # Use shared cache if available and caching is enabled
168
+ cached = None
169
+ if use_cache:
170
+ servers_cache = safe_cache_get(self._shared_component_cache, "servers", {})
171
+ cached = servers_cache.get(server_name) if isinstance(servers_cache, dict) else None
172
+
173
+ if cached is not None:
174
+ try:
175
+ self.tools = cached["tools"]
176
+ self.tool_names = cached["tool_names"]
177
+ self._tool_cache = cached["tool_cache"]
178
+ server_config_from_value = cached["config"]
179
+ except (TypeError, KeyError, AttributeError) as e:
180
+ # Handle corrupted cache data by clearing it and continuing to fetch fresh tools
181
+ msg = f"Unable to use cached data for MCP Server{server_name}: {e}"
182
+ await logger.awarning(msg)
183
+ # Clear the corrupted cache entry
184
+ current_servers_cache = safe_cache_get(self._shared_component_cache, "servers", {})
185
+ if isinstance(current_servers_cache, dict) and server_name in current_servers_cache:
186
+ current_servers_cache.pop(server_name)
187
+ safe_cache_set(self._shared_component_cache, "servers", current_servers_cache)
188
+ else:
189
+ return self.tools, {"name": server_name, "config": server_config_from_value}
190
+
191
+ try:
192
+ try:
193
+ from langflow.api.v2.mcp import get_server
194
+ from langflow.services.database.models.user.crud import get_user_by_id
195
+ except ImportError as e:
196
+ msg = (
197
+ "Langflow MCP server functionality is not available. "
198
+ "This feature requires the full Langflow installation."
199
+ )
200
+ raise ImportError(msg) from e
201
+ async with session_scope() as db:
202
+ if not self.user_id:
203
+ msg = "User ID is required for fetching MCP tools."
204
+ raise ValueError(msg)
205
+ current_user = await get_user_by_id(db, self.user_id)
206
+
207
+ # Try to get server config from DB/API
208
+ server_config = await get_server(
209
+ server_name,
210
+ current_user,
211
+ db,
212
+ storage_service=get_storage_service(),
213
+ settings_service=get_settings_service(),
214
+ )
215
+
216
+ # If get_server returns empty but we have a config, use it
217
+ if not server_config and server_config_from_value:
218
+ server_config = server_config_from_value
219
+
220
+ if not server_config:
221
+ self.tools = []
222
+ return [], {"name": server_name, "config": server_config}
223
+
224
+ # Add verify_ssl option to server config if not present
225
+ if "verify_ssl" not in server_config:
226
+ verify_ssl = getattr(self, "verify_ssl", True)
227
+ server_config["verify_ssl"] = verify_ssl
228
+
229
+ _, tool_list, tool_cache = await update_tools(
230
+ server_name=server_name,
231
+ server_config=server_config,
232
+ mcp_stdio_client=self.stdio_client,
233
+ mcp_streamable_http_client=self.streamable_http_client,
234
+ )
235
+
236
+ self.tool_names = [tool.name for tool in tool_list if hasattr(tool, "name")]
237
+ self._tool_cache = tool_cache
238
+ self.tools = tool_list
239
+
240
+ # Cache the result only if caching is enabled
241
+ if use_cache:
242
+ cache_data = {
243
+ "tools": tool_list,
244
+ "tool_names": self.tool_names,
245
+ "tool_cache": tool_cache,
246
+ "config": server_config,
247
+ }
248
+
249
+ # Safely update the servers cache
250
+ current_servers_cache = safe_cache_get(self._shared_component_cache, "servers", {})
251
+ if isinstance(current_servers_cache, dict):
252
+ current_servers_cache[server_name] = cache_data
253
+ safe_cache_set(self._shared_component_cache, "servers", current_servers_cache)
254
+
255
+ except (TimeoutError, asyncio.TimeoutError) as e:
256
+ msg = f"Timeout updating tool list: {e!s}"
257
+ await logger.aexception(msg)
258
+ raise TimeoutError(msg) from e
259
+ except Exception as e:
260
+ msg = f"Error updating tool list: {e!s}"
261
+ await logger.aexception(msg)
262
+ raise ValueError(msg) from e
263
+ else:
264
+ return tool_list, {"name": server_name, "config": server_config}
265
+
266
+ async def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None) -> dict:
267
+ """Toggle the visibility of connection-specific fields based on the selected mode."""
268
+ try:
269
+ if field_name == "tool":
270
+ try:
271
+ if len(self.tools) == 0:
272
+ try:
273
+ self.tools, build_config["mcp_server"]["value"] = await self.update_tool_list()
274
+ build_config["tool"]["options"] = [tool.name for tool in self.tools]
275
+ build_config["tool"]["placeholder"] = "Select a tool"
276
+ except (TimeoutError, asyncio.TimeoutError) as e:
277
+ msg = f"Timeout updating tool list: {e!s}"
278
+ await logger.aexception(msg)
279
+ if not build_config["tools_metadata"]["show"]:
280
+ build_config["tool"]["show"] = True
281
+ build_config["tool"]["options"] = []
282
+ build_config["tool"]["value"] = ""
283
+ build_config["tool"]["placeholder"] = "Timeout on MCP server"
284
+ else:
285
+ build_config["tool"]["show"] = False
286
+ except ValueError:
287
+ if not build_config["tools_metadata"]["show"]:
288
+ build_config["tool"]["show"] = True
289
+ build_config["tool"]["options"] = []
290
+ build_config["tool"]["value"] = ""
291
+ build_config["tool"]["placeholder"] = "Error on MCP Server"
292
+ else:
293
+ build_config["tool"]["show"] = False
294
+
295
+ if field_value == "":
296
+ return build_config
297
+ tool_obj = None
298
+ for tool in self.tools:
299
+ if tool.name == field_value:
300
+ tool_obj = tool
301
+ break
302
+ if tool_obj is None:
303
+ msg = f"Tool {field_value} not found in available tools: {self.tools}"
304
+ await logger.awarning(msg)
305
+ return build_config
306
+ await self._update_tool_config(build_config, field_value)
307
+ except Exception as e:
308
+ build_config["tool"]["options"] = []
309
+ msg = f"Failed to update tools: {e!s}"
310
+ raise ValueError(msg) from e
311
+ else:
312
+ return build_config
313
+ elif field_name == "mcp_server":
314
+ if not field_value:
315
+ build_config["tool"]["show"] = False
316
+ build_config["tool"]["options"] = []
317
+ build_config["tool"]["value"] = ""
318
+ build_config["tool"]["placeholder"] = ""
319
+ build_config["tool_placeholder"]["tool_mode"] = False
320
+ self.remove_non_default_keys(build_config)
321
+ return build_config
322
+
323
+ build_config["tool_placeholder"]["tool_mode"] = True
324
+
325
+ current_server_name = field_value.get("name") if isinstance(field_value, dict) else field_value
326
+ _last_selected_server = safe_cache_get(self._shared_component_cache, "last_selected_server", "")
327
+ server_changed = current_server_name != _last_selected_server
328
+
329
+ # Determine if "Tool Mode" is active by checking if the tool dropdown is hidden.
330
+ is_in_tool_mode = build_config["tools_metadata"]["show"]
331
+
332
+ # Get use_cache setting to determine if we should use cached data
333
+ use_cache = getattr(self, "use_cache", False)
334
+
335
+ # Fast path: if server didn't change and we already have options, keep them as-is
336
+ # BUT only if caching is enabled or we're in tool mode
337
+ existing_options = build_config.get("tool", {}).get("options") or []
338
+ if not server_changed and existing_options:
339
+ # In non-tool mode with cache disabled, skip the fast path to force refresh
340
+ if not is_in_tool_mode and not use_cache:
341
+ pass # Continue to refresh logic below
342
+ else:
343
+ if not is_in_tool_mode:
344
+ build_config["tool"]["show"] = True
345
+ return build_config
346
+
347
+ # To avoid unnecessary updates, only proceed if the server has actually changed
348
+ # OR if caching is disabled (to force refresh in non-tool mode)
349
+ if (_last_selected_server in (current_server_name, "")) and build_config["tool"]["show"] and use_cache:
350
+ if current_server_name:
351
+ servers_cache = safe_cache_get(self._shared_component_cache, "servers", {})
352
+ if isinstance(servers_cache, dict):
353
+ cached = servers_cache.get(current_server_name)
354
+ if cached is not None and cached.get("tool_names"):
355
+ cached_tools = cached["tool_names"]
356
+ current_tools = build_config["tool"]["options"]
357
+ if current_tools == cached_tools:
358
+ return build_config
359
+ else:
360
+ return build_config
361
+ safe_cache_set(self._shared_component_cache, "last_selected_server", current_server_name)
362
+
363
+ # Check if tools are already cached for this server before clearing
364
+ cached_tools = None
365
+ if current_server_name and use_cache:
366
+ servers_cache = safe_cache_get(self._shared_component_cache, "servers", {})
367
+ if isinstance(servers_cache, dict):
368
+ cached = servers_cache.get(current_server_name)
369
+ if cached is not None:
370
+ try:
371
+ cached_tools = cached["tools"]
372
+ self.tools = cached_tools
373
+ self.tool_names = cached["tool_names"]
374
+ self._tool_cache = cached["tool_cache"]
375
+ except (TypeError, KeyError, AttributeError) as e:
376
+ # Handle corrupted cache data by ignoring it
377
+ msg = f"Unable to use cached data for MCP Server,{current_server_name}: {e}"
378
+ await logger.awarning(msg)
379
+ cached_tools = None
380
+
381
+ # Only clear tools if we don't have cached tools for the current server
382
+ if not cached_tools:
383
+ self.tools = [] # Clear previous tools only if no cache
384
+
385
+ # Clear previous tool inputs if:
386
+ # 1. Server actually changed
387
+ # 2. Cache is disabled (meaning tool list will be refreshed)
388
+ if server_changed or not use_cache:
389
+ self.remove_non_default_keys(build_config)
390
+
391
+ # Only show the tool dropdown if not in tool_mode
392
+ if not is_in_tool_mode:
393
+ build_config["tool"]["show"] = True
394
+ if cached_tools:
395
+ # Use cached tools to populate options immediately
396
+ build_config["tool"]["options"] = [tool.name for tool in cached_tools]
397
+ build_config["tool"]["placeholder"] = "Select a tool"
398
+ else:
399
+ # Show loading state only when we need to fetch tools
400
+ build_config["tool"]["placeholder"] = "Loading tools..."
401
+ build_config["tool"]["options"] = []
402
+ # Force a value refresh when:
403
+ # 1. Server changed
404
+ # 2. We don't have cached tools
405
+ # 3. Cache is disabled (to force refresh on config changes)
406
+ if server_changed or not cached_tools or not use_cache:
407
+ build_config["tool"]["value"] = uuid.uuid4()
408
+ else:
409
+ # Keep the tool dropdown hidden if in tool_mode
410
+ self._not_load_actions = True
411
+ build_config["tool"]["show"] = False
412
+
413
+ elif field_name == "tool_mode":
414
+ build_config["tool"]["placeholder"] = ""
415
+ build_config["tool"]["show"] = not bool(field_value) and bool(build_config["mcp_server"])
416
+ self.remove_non_default_keys(build_config)
417
+ self.tool = build_config["tool"]["value"]
418
+ if field_value:
419
+ self._not_load_actions = True
420
+ else:
421
+ build_config["tool"]["value"] = uuid.uuid4()
422
+ build_config["tool"]["options"] = []
423
+ build_config["tool"]["show"] = True
424
+ build_config["tool"]["placeholder"] = "Loading tools..."
425
+ elif field_name == "tools_metadata":
426
+ self._not_load_actions = False
427
+
428
+ except Exception as e:
429
+ msg = f"Error in update_build_config: {e!s}"
430
+ await logger.aexception(msg)
431
+ raise ValueError(msg) from e
432
+ else:
433
+ return build_config
434
+
435
+ def get_inputs_for_all_tools(self, tools: list) -> dict:
436
+ """Get input schemas for all tools."""
437
+ inputs = {}
438
+ for tool in tools:
439
+ if not tool or not hasattr(tool, "name"):
440
+ continue
441
+ try:
442
+ flat_schema = flatten_schema(tool.args_schema.schema())
443
+ input_schema = create_input_schema_from_json_schema(flat_schema)
444
+ langflow_inputs = schema_to_langflow_inputs(input_schema)
445
+ inputs[tool.name] = langflow_inputs
446
+ except (AttributeError, ValueError, TypeError, KeyError) as e:
447
+ msg = f"Error getting inputs for tool {getattr(tool, 'name', 'unknown')}: {e!s}"
448
+ logger.exception(msg)
449
+ continue
450
+ return inputs
451
+
452
+ def remove_non_default_keys(self, build_config: dict) -> None:
453
+ """Remove non-default keys from the build config."""
454
+ for key in list(build_config.keys()):
455
+ if key not in self.default_keys:
456
+ build_config.pop(key)
457
+
458
+ async def _update_tool_config(self, build_config: dict, tool_name: str) -> None:
459
+ """Update tool configuration with proper error handling."""
460
+ if not self.tools:
461
+ self.tools, build_config["mcp_server"]["value"] = await self.update_tool_list()
462
+
463
+ if not tool_name:
464
+ return
465
+
466
+ tool_obj = next((tool for tool in self.tools if tool.name == tool_name), None)
467
+ if not tool_obj:
468
+ msg = f"Tool {tool_name} not found in available tools: {self.tools}"
469
+ self.remove_non_default_keys(build_config)
470
+ build_config["tool"]["value"] = ""
471
+ await logger.awarning(msg)
472
+ return
473
+
474
+ try:
475
+ # Store current values before removing inputs (only for the current tool)
476
+ current_values = {}
477
+ for key, value in build_config.items():
478
+ if key not in self.default_keys and isinstance(value, dict) and "value" in value:
479
+ current_values[key] = value["value"]
480
+
481
+ # Remove ALL non-default keys (all previous tool inputs)
482
+ self.remove_non_default_keys(build_config)
483
+
484
+ # Get and validate new inputs for the selected tool
485
+ self.schema_inputs = await self._validate_schema_inputs(tool_obj)
486
+ if not self.schema_inputs:
487
+ msg = f"No input parameters to configure for tool '{tool_name}'"
488
+ await logger.ainfo(msg)
489
+ return
490
+
491
+ # Add new inputs to build config for the selected tool only
492
+ for schema_input in self.schema_inputs:
493
+ if not schema_input or not hasattr(schema_input, "name"):
494
+ msg = "Invalid schema input detected, skipping"
495
+ await logger.awarning(msg)
496
+ continue
497
+
498
+ try:
499
+ name = schema_input.name
500
+ input_dict = schema_input.to_dict()
501
+ input_dict.setdefault("value", None)
502
+ input_dict.setdefault("required", True)
503
+
504
+ build_config[name] = input_dict
505
+
506
+ # Preserve existing value if the parameter name exists in current_values
507
+ if name in current_values:
508
+ build_config[name]["value"] = current_values[name]
509
+
510
+ except (AttributeError, KeyError, TypeError) as e:
511
+ msg = f"Error processing schema input {schema_input}: {e!s}"
512
+ await logger.aexception(msg)
513
+ continue
514
+ except ValueError as e:
515
+ msg = f"Schema validation error for tool {tool_name}: {e!s}"
516
+ await logger.aexception(msg)
517
+ self.schema_inputs = []
518
+ return
519
+ except (AttributeError, KeyError, TypeError) as e:
520
+ msg = f"Error updating tool config: {e!s}"
521
+ await logger.aexception(msg)
522
+ raise ValueError(msg) from e
523
+
524
+ async def build_output(self) -> DataFrame:
525
+ """Build output with improved error handling and validation."""
526
+ try:
527
+ self.tools, _ = await self.update_tool_list()
528
+ if self.tool != "":
529
+ # Set session context for persistent MCP sessions using Langflow session ID
530
+ session_context = self._get_session_context()
531
+ if session_context:
532
+ self.stdio_client.set_session_context(session_context)
533
+ self.streamable_http_client.set_session_context(session_context)
534
+ exec_tool = self._tool_cache[self.tool]
535
+ tool_args = self.get_inputs_for_all_tools(self.tools)[self.tool]
536
+ kwargs = {}
537
+ for arg in tool_args:
538
+ value = getattr(self, arg.name, None)
539
+ if value is not None:
540
+ if isinstance(value, Message):
541
+ kwargs[arg.name] = value.text
542
+ else:
543
+ kwargs[arg.name] = value
544
+
545
+ unflattened_kwargs = maybe_unflatten_dict(kwargs)
546
+
547
+ output = await exec_tool.coroutine(**unflattened_kwargs)
548
+ tool_content = []
549
+ for item in output.content:
550
+ item_dict = item.model_dump()
551
+ item_dict = self.process_output_item(item_dict)
552
+ tool_content.append(item_dict)
553
+
554
+ if isinstance(tool_content, list) and all(isinstance(x, dict) for x in tool_content):
555
+ return DataFrame(tool_content)
556
+ return DataFrame(data=tool_content)
557
+ return DataFrame(data=[{"error": "You must select a tool"}])
558
+ except Exception as e:
559
+ msg = f"Error in build_output: {e!s}"
560
+ await logger.aexception(msg)
561
+ raise ValueError(msg) from e
562
+
563
+ def process_output_item(self, item_dict):
564
+ """Process the output of a tool."""
565
+ if item_dict.get("type") == "text":
566
+ text = item_dict.get("text")
567
+ try:
568
+ return json.loads(text)
569
+ except json.JSONDecodeError:
570
+ return item_dict
571
+ return item_dict
572
+
573
+ def _get_session_context(self) -> str | None:
574
+ """Get the Langflow session ID for MCP session caching."""
575
+ # Try to get session ID from the component's execution context
576
+ if hasattr(self, "graph") and hasattr(self.graph, "session_id"):
577
+ session_id = self.graph.session_id
578
+ # Include server name to ensure different servers get different sessions
579
+ server_name = ""
580
+ mcp_server = getattr(self, "mcp_server", None)
581
+ if isinstance(mcp_server, dict):
582
+ server_name = mcp_server.get("name", "")
583
+ elif mcp_server:
584
+ server_name = str(mcp_server)
585
+ return f"{session_id}_{server_name}" if session_id else None
586
+ return None
587
+
588
+ async def _get_tools(self):
589
+ """Get cached tools or update if necessary."""
590
+ mcp_server = getattr(self, "mcp_server", None)
591
+ if not self._not_load_actions:
592
+ tools, _ = await self.update_tool_list(mcp_server)
593
+ return tools
594
+ return []