lfx-nightly 0.1.11.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. lfx/__init__.py +0 -0
  2. lfx/__main__.py +25 -0
  3. lfx/base/__init__.py +0 -0
  4. lfx/base/agents/__init__.py +0 -0
  5. lfx/base/agents/agent.py +268 -0
  6. lfx/base/agents/callback.py +130 -0
  7. lfx/base/agents/context.py +109 -0
  8. lfx/base/agents/crewai/__init__.py +0 -0
  9. lfx/base/agents/crewai/crew.py +231 -0
  10. lfx/base/agents/crewai/tasks.py +12 -0
  11. lfx/base/agents/default_prompts.py +23 -0
  12. lfx/base/agents/errors.py +15 -0
  13. lfx/base/agents/events.py +346 -0
  14. lfx/base/agents/utils.py +205 -0
  15. lfx/base/astra_assistants/__init__.py +0 -0
  16. lfx/base/astra_assistants/util.py +171 -0
  17. lfx/base/chains/__init__.py +0 -0
  18. lfx/base/chains/model.py +19 -0
  19. lfx/base/composio/__init__.py +0 -0
  20. lfx/base/composio/composio_base.py +1291 -0
  21. lfx/base/compressors/__init__.py +0 -0
  22. lfx/base/compressors/model.py +60 -0
  23. lfx/base/constants.py +46 -0
  24. lfx/base/curl/__init__.py +0 -0
  25. lfx/base/curl/parse.py +188 -0
  26. lfx/base/data/__init__.py +5 -0
  27. lfx/base/data/base_file.py +685 -0
  28. lfx/base/data/docling_utils.py +245 -0
  29. lfx/base/data/utils.py +198 -0
  30. lfx/base/document_transformers/__init__.py +0 -0
  31. lfx/base/document_transformers/model.py +43 -0
  32. lfx/base/embeddings/__init__.py +0 -0
  33. lfx/base/embeddings/aiml_embeddings.py +62 -0
  34. lfx/base/embeddings/model.py +26 -0
  35. lfx/base/flow_processing/__init__.py +0 -0
  36. lfx/base/flow_processing/utils.py +86 -0
  37. lfx/base/huggingface/__init__.py +0 -0
  38. lfx/base/huggingface/model_bridge.py +133 -0
  39. lfx/base/io/__init__.py +0 -0
  40. lfx/base/io/chat.py +20 -0
  41. lfx/base/io/text.py +22 -0
  42. lfx/base/langchain_utilities/__init__.py +0 -0
  43. lfx/base/langchain_utilities/model.py +35 -0
  44. lfx/base/langchain_utilities/spider_constants.py +1 -0
  45. lfx/base/langwatch/__init__.py +0 -0
  46. lfx/base/langwatch/utils.py +18 -0
  47. lfx/base/mcp/__init__.py +0 -0
  48. lfx/base/mcp/constants.py +2 -0
  49. lfx/base/mcp/util.py +1398 -0
  50. lfx/base/memory/__init__.py +0 -0
  51. lfx/base/memory/memory.py +49 -0
  52. lfx/base/memory/model.py +38 -0
  53. lfx/base/models/__init__.py +3 -0
  54. lfx/base/models/aiml_constants.py +51 -0
  55. lfx/base/models/anthropic_constants.py +47 -0
  56. lfx/base/models/aws_constants.py +151 -0
  57. lfx/base/models/chat_result.py +76 -0
  58. lfx/base/models/google_generative_ai_constants.py +70 -0
  59. lfx/base/models/groq_constants.py +134 -0
  60. lfx/base/models/model.py +375 -0
  61. lfx/base/models/model_input_constants.py +307 -0
  62. lfx/base/models/model_metadata.py +41 -0
  63. lfx/base/models/model_utils.py +8 -0
  64. lfx/base/models/novita_constants.py +35 -0
  65. lfx/base/models/ollama_constants.py +49 -0
  66. lfx/base/models/openai_constants.py +122 -0
  67. lfx/base/models/sambanova_constants.py +18 -0
  68. lfx/base/processing/__init__.py +0 -0
  69. lfx/base/prompts/__init__.py +0 -0
  70. lfx/base/prompts/api_utils.py +224 -0
  71. lfx/base/prompts/utils.py +61 -0
  72. lfx/base/textsplitters/__init__.py +0 -0
  73. lfx/base/textsplitters/model.py +28 -0
  74. lfx/base/tools/__init__.py +0 -0
  75. lfx/base/tools/base.py +26 -0
  76. lfx/base/tools/component_tool.py +325 -0
  77. lfx/base/tools/constants.py +49 -0
  78. lfx/base/tools/flow_tool.py +132 -0
  79. lfx/base/tools/run_flow.py +224 -0
  80. lfx/base/vectorstores/__init__.py +0 -0
  81. lfx/base/vectorstores/model.py +193 -0
  82. lfx/base/vectorstores/utils.py +22 -0
  83. lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
  84. lfx/cli/__init__.py +5 -0
  85. lfx/cli/commands.py +319 -0
  86. lfx/cli/common.py +650 -0
  87. lfx/cli/run.py +441 -0
  88. lfx/cli/script_loader.py +247 -0
  89. lfx/cli/serve_app.py +546 -0
  90. lfx/cli/validation.py +69 -0
  91. lfx/components/FAISS/__init__.py +34 -0
  92. lfx/components/FAISS/faiss.py +111 -0
  93. lfx/components/Notion/__init__.py +19 -0
  94. lfx/components/Notion/add_content_to_page.py +269 -0
  95. lfx/components/Notion/create_page.py +94 -0
  96. lfx/components/Notion/list_database_properties.py +68 -0
  97. lfx/components/Notion/list_pages.py +122 -0
  98. lfx/components/Notion/list_users.py +77 -0
  99. lfx/components/Notion/page_content_viewer.py +93 -0
  100. lfx/components/Notion/search.py +111 -0
  101. lfx/components/Notion/update_page_property.py +114 -0
  102. lfx/components/__init__.py +411 -0
  103. lfx/components/_importing.py +42 -0
  104. lfx/components/agentql/__init__.py +3 -0
  105. lfx/components/agentql/agentql_api.py +151 -0
  106. lfx/components/agents/__init__.py +34 -0
  107. lfx/components/agents/agent.py +558 -0
  108. lfx/components/agents/mcp_component.py +501 -0
  109. lfx/components/aiml/__init__.py +37 -0
  110. lfx/components/aiml/aiml.py +112 -0
  111. lfx/components/aiml/aiml_embeddings.py +37 -0
  112. lfx/components/amazon/__init__.py +36 -0
  113. lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
  114. lfx/components/amazon/amazon_bedrock_model.py +124 -0
  115. lfx/components/amazon/s3_bucket_uploader.py +211 -0
  116. lfx/components/anthropic/__init__.py +34 -0
  117. lfx/components/anthropic/anthropic.py +187 -0
  118. lfx/components/apify/__init__.py +5 -0
  119. lfx/components/apify/apify_actor.py +325 -0
  120. lfx/components/arxiv/__init__.py +3 -0
  121. lfx/components/arxiv/arxiv.py +163 -0
  122. lfx/components/assemblyai/__init__.py +46 -0
  123. lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  124. lfx/components/assemblyai/assemblyai_lemur.py +183 -0
  125. lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  126. lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  127. lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
  128. lfx/components/azure/__init__.py +37 -0
  129. lfx/components/azure/azure_openai.py +95 -0
  130. lfx/components/azure/azure_openai_embeddings.py +83 -0
  131. lfx/components/baidu/__init__.py +32 -0
  132. lfx/components/baidu/baidu_qianfan_chat.py +113 -0
  133. lfx/components/bing/__init__.py +3 -0
  134. lfx/components/bing/bing_search_api.py +61 -0
  135. lfx/components/cassandra/__init__.py +40 -0
  136. lfx/components/cassandra/cassandra.py +264 -0
  137. lfx/components/cassandra/cassandra_chat.py +92 -0
  138. lfx/components/cassandra/cassandra_graph.py +238 -0
  139. lfx/components/chains/__init__.py +3 -0
  140. lfx/components/chroma/__init__.py +34 -0
  141. lfx/components/chroma/chroma.py +167 -0
  142. lfx/components/cleanlab/__init__.py +40 -0
  143. lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
  144. lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  145. lfx/components/cleanlab/cleanlab_remediator.py +131 -0
  146. lfx/components/clickhouse/__init__.py +34 -0
  147. lfx/components/clickhouse/clickhouse.py +135 -0
  148. lfx/components/cloudflare/__init__.py +32 -0
  149. lfx/components/cloudflare/cloudflare.py +81 -0
  150. lfx/components/cohere/__init__.py +40 -0
  151. lfx/components/cohere/cohere_embeddings.py +81 -0
  152. lfx/components/cohere/cohere_models.py +46 -0
  153. lfx/components/cohere/cohere_rerank.py +51 -0
  154. lfx/components/composio/__init__.py +74 -0
  155. lfx/components/composio/composio_api.py +268 -0
  156. lfx/components/composio/dropbox_compnent.py +11 -0
  157. lfx/components/composio/github_composio.py +11 -0
  158. lfx/components/composio/gmail_composio.py +38 -0
  159. lfx/components/composio/googlecalendar_composio.py +11 -0
  160. lfx/components/composio/googlemeet_composio.py +11 -0
  161. lfx/components/composio/googletasks_composio.py +8 -0
  162. lfx/components/composio/linear_composio.py +11 -0
  163. lfx/components/composio/outlook_composio.py +11 -0
  164. lfx/components/composio/reddit_composio.py +11 -0
  165. lfx/components/composio/slack_composio.py +582 -0
  166. lfx/components/composio/slackbot_composio.py +11 -0
  167. lfx/components/composio/supabase_composio.py +11 -0
  168. lfx/components/composio/todoist_composio.py +11 -0
  169. lfx/components/composio/youtube_composio.py +11 -0
  170. lfx/components/confluence/__init__.py +3 -0
  171. lfx/components/confluence/confluence.py +84 -0
  172. lfx/components/couchbase/__init__.py +34 -0
  173. lfx/components/couchbase/couchbase.py +102 -0
  174. lfx/components/crewai/__init__.py +49 -0
  175. lfx/components/crewai/crewai.py +107 -0
  176. lfx/components/crewai/hierarchical_crew.py +46 -0
  177. lfx/components/crewai/hierarchical_task.py +44 -0
  178. lfx/components/crewai/sequential_crew.py +52 -0
  179. lfx/components/crewai/sequential_task.py +73 -0
  180. lfx/components/crewai/sequential_task_agent.py +143 -0
  181. lfx/components/custom_component/__init__.py +34 -0
  182. lfx/components/custom_component/custom_component.py +31 -0
  183. lfx/components/data/__init__.py +64 -0
  184. lfx/components/data/api_request.py +544 -0
  185. lfx/components/data/csv_to_data.py +95 -0
  186. lfx/components/data/directory.py +113 -0
  187. lfx/components/data/file.py +577 -0
  188. lfx/components/data/json_to_data.py +98 -0
  189. lfx/components/data/news_search.py +164 -0
  190. lfx/components/data/rss.py +69 -0
  191. lfx/components/data/sql_executor.py +101 -0
  192. lfx/components/data/url.py +311 -0
  193. lfx/components/data/web_search.py +112 -0
  194. lfx/components/data/webhook.py +56 -0
  195. lfx/components/datastax/__init__.py +70 -0
  196. lfx/components/datastax/astra_assistant_manager.py +306 -0
  197. lfx/components/datastax/astra_db.py +75 -0
  198. lfx/components/datastax/astra_vectorize.py +124 -0
  199. lfx/components/datastax/astradb.py +1285 -0
  200. lfx/components/datastax/astradb_cql.py +314 -0
  201. lfx/components/datastax/astradb_graph.py +330 -0
  202. lfx/components/datastax/astradb_tool.py +414 -0
  203. lfx/components/datastax/astradb_vectorstore.py +1285 -0
  204. lfx/components/datastax/cassandra.py +92 -0
  205. lfx/components/datastax/create_assistant.py +58 -0
  206. lfx/components/datastax/create_thread.py +32 -0
  207. lfx/components/datastax/dotenv.py +35 -0
  208. lfx/components/datastax/get_assistant.py +37 -0
  209. lfx/components/datastax/getenvvar.py +30 -0
  210. lfx/components/datastax/graph_rag.py +141 -0
  211. lfx/components/datastax/hcd.py +314 -0
  212. lfx/components/datastax/list_assistants.py +25 -0
  213. lfx/components/datastax/run.py +89 -0
  214. lfx/components/deactivated/__init__.py +15 -0
  215. lfx/components/deactivated/amazon_kendra.py +66 -0
  216. lfx/components/deactivated/chat_litellm_model.py +158 -0
  217. lfx/components/deactivated/code_block_extractor.py +26 -0
  218. lfx/components/deactivated/documents_to_data.py +22 -0
  219. lfx/components/deactivated/embed.py +16 -0
  220. lfx/components/deactivated/extract_key_from_data.py +46 -0
  221. lfx/components/deactivated/json_document_builder.py +57 -0
  222. lfx/components/deactivated/list_flows.py +20 -0
  223. lfx/components/deactivated/mcp_sse.py +61 -0
  224. lfx/components/deactivated/mcp_stdio.py +62 -0
  225. lfx/components/deactivated/merge_data.py +93 -0
  226. lfx/components/deactivated/message.py +37 -0
  227. lfx/components/deactivated/metal.py +54 -0
  228. lfx/components/deactivated/multi_query.py +59 -0
  229. lfx/components/deactivated/retriever.py +43 -0
  230. lfx/components/deactivated/selective_passthrough.py +77 -0
  231. lfx/components/deactivated/should_run_next.py +40 -0
  232. lfx/components/deactivated/split_text.py +63 -0
  233. lfx/components/deactivated/store_message.py +24 -0
  234. lfx/components/deactivated/sub_flow.py +124 -0
  235. lfx/components/deactivated/vectara_self_query.py +76 -0
  236. lfx/components/deactivated/vector_store.py +24 -0
  237. lfx/components/deepseek/__init__.py +34 -0
  238. lfx/components/deepseek/deepseek.py +136 -0
  239. lfx/components/docling/__init__.py +43 -0
  240. lfx/components/docling/chunk_docling_document.py +186 -0
  241. lfx/components/docling/docling_inline.py +231 -0
  242. lfx/components/docling/docling_remote.py +193 -0
  243. lfx/components/docling/export_docling_document.py +117 -0
  244. lfx/components/documentloaders/__init__.py +3 -0
  245. lfx/components/duckduckgo/__init__.py +3 -0
  246. lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  247. lfx/components/elastic/__init__.py +37 -0
  248. lfx/components/elastic/elasticsearch.py +267 -0
  249. lfx/components/elastic/opensearch.py +243 -0
  250. lfx/components/embeddings/__init__.py +37 -0
  251. lfx/components/embeddings/similarity.py +76 -0
  252. lfx/components/embeddings/text_embedder.py +64 -0
  253. lfx/components/exa/__init__.py +3 -0
  254. lfx/components/exa/exa_search.py +68 -0
  255. lfx/components/firecrawl/__init__.py +43 -0
  256. lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
  257. lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
  258. lfx/components/firecrawl/firecrawl_map_api.py +89 -0
  259. lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
  260. lfx/components/git/__init__.py +4 -0
  261. lfx/components/git/git.py +262 -0
  262. lfx/components/git/gitextractor.py +196 -0
  263. lfx/components/glean/__init__.py +3 -0
  264. lfx/components/glean/glean_search_api.py +173 -0
  265. lfx/components/google/__init__.py +17 -0
  266. lfx/components/google/gmail.py +192 -0
  267. lfx/components/google/google_bq_sql_executor.py +157 -0
  268. lfx/components/google/google_drive.py +92 -0
  269. lfx/components/google/google_drive_search.py +152 -0
  270. lfx/components/google/google_generative_ai.py +147 -0
  271. lfx/components/google/google_generative_ai_embeddings.py +141 -0
  272. lfx/components/google/google_oauth_token.py +89 -0
  273. lfx/components/google/google_search_api_core.py +68 -0
  274. lfx/components/google/google_serper_api_core.py +74 -0
  275. lfx/components/groq/__init__.py +34 -0
  276. lfx/components/groq/groq.py +136 -0
  277. lfx/components/helpers/__init__.py +52 -0
  278. lfx/components/helpers/calculator_core.py +89 -0
  279. lfx/components/helpers/create_list.py +40 -0
  280. lfx/components/helpers/current_date.py +42 -0
  281. lfx/components/helpers/id_generator.py +42 -0
  282. lfx/components/helpers/memory.py +251 -0
  283. lfx/components/helpers/output_parser.py +45 -0
  284. lfx/components/helpers/store_message.py +90 -0
  285. lfx/components/homeassistant/__init__.py +7 -0
  286. lfx/components/homeassistant/home_assistant_control.py +152 -0
  287. lfx/components/homeassistant/list_home_assistant_states.py +137 -0
  288. lfx/components/huggingface/__init__.py +37 -0
  289. lfx/components/huggingface/huggingface.py +197 -0
  290. lfx/components/huggingface/huggingface_inference_api.py +106 -0
  291. lfx/components/ibm/__init__.py +34 -0
  292. lfx/components/ibm/watsonx.py +203 -0
  293. lfx/components/ibm/watsonx_embeddings.py +135 -0
  294. lfx/components/icosacomputing/__init__.py +5 -0
  295. lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
  296. lfx/components/input_output/__init__.py +38 -0
  297. lfx/components/input_output/chat.py +120 -0
  298. lfx/components/input_output/chat_output.py +200 -0
  299. lfx/components/input_output/text.py +27 -0
  300. lfx/components/input_output/text_output.py +29 -0
  301. lfx/components/jigsawstack/__init__.py +23 -0
  302. lfx/components/jigsawstack/ai_scrape.py +126 -0
  303. lfx/components/jigsawstack/ai_web_search.py +136 -0
  304. lfx/components/jigsawstack/file_read.py +115 -0
  305. lfx/components/jigsawstack/file_upload.py +94 -0
  306. lfx/components/jigsawstack/image_generation.py +205 -0
  307. lfx/components/jigsawstack/nsfw.py +60 -0
  308. lfx/components/jigsawstack/object_detection.py +124 -0
  309. lfx/components/jigsawstack/sentiment.py +112 -0
  310. lfx/components/jigsawstack/text_to_sql.py +90 -0
  311. lfx/components/jigsawstack/text_translate.py +77 -0
  312. lfx/components/jigsawstack/vocr.py +107 -0
  313. lfx/components/langchain_utilities/__init__.py +109 -0
  314. lfx/components/langchain_utilities/character.py +53 -0
  315. lfx/components/langchain_utilities/conversation.py +59 -0
  316. lfx/components/langchain_utilities/csv_agent.py +107 -0
  317. lfx/components/langchain_utilities/fake_embeddings.py +26 -0
  318. lfx/components/langchain_utilities/html_link_extractor.py +35 -0
  319. lfx/components/langchain_utilities/json_agent.py +45 -0
  320. lfx/components/langchain_utilities/langchain_hub.py +126 -0
  321. lfx/components/langchain_utilities/language_recursive.py +49 -0
  322. lfx/components/langchain_utilities/language_semantic.py +138 -0
  323. lfx/components/langchain_utilities/llm_checker.py +39 -0
  324. lfx/components/langchain_utilities/llm_math.py +42 -0
  325. lfx/components/langchain_utilities/natural_language.py +61 -0
  326. lfx/components/langchain_utilities/openai_tools.py +53 -0
  327. lfx/components/langchain_utilities/openapi.py +48 -0
  328. lfx/components/langchain_utilities/recursive_character.py +60 -0
  329. lfx/components/langchain_utilities/retrieval_qa.py +83 -0
  330. lfx/components/langchain_utilities/runnable_executor.py +137 -0
  331. lfx/components/langchain_utilities/self_query.py +80 -0
  332. lfx/components/langchain_utilities/spider.py +142 -0
  333. lfx/components/langchain_utilities/sql.py +40 -0
  334. lfx/components/langchain_utilities/sql_database.py +35 -0
  335. lfx/components/langchain_utilities/sql_generator.py +78 -0
  336. lfx/components/langchain_utilities/tool_calling.py +59 -0
  337. lfx/components/langchain_utilities/vector_store_info.py +49 -0
  338. lfx/components/langchain_utilities/vector_store_router.py +33 -0
  339. lfx/components/langchain_utilities/xml_agent.py +71 -0
  340. lfx/components/langwatch/__init__.py +3 -0
  341. lfx/components/langwatch/langwatch.py +278 -0
  342. lfx/components/link_extractors/__init__.py +3 -0
  343. lfx/components/lmstudio/__init__.py +34 -0
  344. lfx/components/lmstudio/lmstudioembeddings.py +89 -0
  345. lfx/components/lmstudio/lmstudiomodel.py +129 -0
  346. lfx/components/logic/__init__.py +52 -0
  347. lfx/components/logic/conditional_router.py +171 -0
  348. lfx/components/logic/data_conditional_router.py +125 -0
  349. lfx/components/logic/flow_tool.py +110 -0
  350. lfx/components/logic/listen.py +29 -0
  351. lfx/components/logic/loop.py +125 -0
  352. lfx/components/logic/notify.py +88 -0
  353. lfx/components/logic/pass_message.py +35 -0
  354. lfx/components/logic/run_flow.py +71 -0
  355. lfx/components/logic/sub_flow.py +114 -0
  356. lfx/components/maritalk/__init__.py +32 -0
  357. lfx/components/maritalk/maritalk.py +52 -0
  358. lfx/components/mem0/__init__.py +3 -0
  359. lfx/components/mem0/mem0_chat_memory.py +136 -0
  360. lfx/components/milvus/__init__.py +34 -0
  361. lfx/components/milvus/milvus.py +115 -0
  362. lfx/components/mistral/__init__.py +37 -0
  363. lfx/components/mistral/mistral.py +114 -0
  364. lfx/components/mistral/mistral_embeddings.py +58 -0
  365. lfx/components/models/__init__.py +34 -0
  366. lfx/components/models/embedding_model.py +114 -0
  367. lfx/components/models/language_model.py +144 -0
  368. lfx/components/mongodb/__init__.py +34 -0
  369. lfx/components/mongodb/mongodb_atlas.py +213 -0
  370. lfx/components/needle/__init__.py +3 -0
  371. lfx/components/needle/needle.py +104 -0
  372. lfx/components/notdiamond/__init__.py +34 -0
  373. lfx/components/notdiamond/notdiamond.py +228 -0
  374. lfx/components/novita/__init__.py +32 -0
  375. lfx/components/novita/novita.py +130 -0
  376. lfx/components/nvidia/__init__.py +57 -0
  377. lfx/components/nvidia/nvidia.py +157 -0
  378. lfx/components/nvidia/nvidia_embedding.py +77 -0
  379. lfx/components/nvidia/nvidia_ingest.py +317 -0
  380. lfx/components/nvidia/nvidia_rerank.py +63 -0
  381. lfx/components/nvidia/system_assist.py +65 -0
  382. lfx/components/olivya/__init__.py +3 -0
  383. lfx/components/olivya/olivya.py +116 -0
  384. lfx/components/ollama/__init__.py +37 -0
  385. lfx/components/ollama/ollama.py +330 -0
  386. lfx/components/ollama/ollama_embeddings.py +106 -0
  387. lfx/components/openai/__init__.py +37 -0
  388. lfx/components/openai/openai.py +100 -0
  389. lfx/components/openai/openai_chat_model.py +176 -0
  390. lfx/components/openrouter/__init__.py +32 -0
  391. lfx/components/openrouter/openrouter.py +202 -0
  392. lfx/components/output_parsers/__init__.py +3 -0
  393. lfx/components/perplexity/__init__.py +34 -0
  394. lfx/components/perplexity/perplexity.py +75 -0
  395. lfx/components/pgvector/__init__.py +34 -0
  396. lfx/components/pgvector/pgvector.py +72 -0
  397. lfx/components/pinecone/__init__.py +34 -0
  398. lfx/components/pinecone/pinecone.py +134 -0
  399. lfx/components/processing/__init__.py +117 -0
  400. lfx/components/processing/alter_metadata.py +108 -0
  401. lfx/components/processing/batch_run.py +205 -0
  402. lfx/components/processing/combine_text.py +39 -0
  403. lfx/components/processing/converter.py +159 -0
  404. lfx/components/processing/create_data.py +110 -0
  405. lfx/components/processing/data_operations.py +438 -0
  406. lfx/components/processing/data_to_dataframe.py +70 -0
  407. lfx/components/processing/dataframe_operations.py +313 -0
  408. lfx/components/processing/extract_key.py +53 -0
  409. lfx/components/processing/filter_data.py +42 -0
  410. lfx/components/processing/filter_data_values.py +88 -0
  411. lfx/components/processing/json_cleaner.py +103 -0
  412. lfx/components/processing/lambda_filter.py +154 -0
  413. lfx/components/processing/llm_router.py +499 -0
  414. lfx/components/processing/merge_data.py +90 -0
  415. lfx/components/processing/message_to_data.py +36 -0
  416. lfx/components/processing/parse_data.py +70 -0
  417. lfx/components/processing/parse_dataframe.py +68 -0
  418. lfx/components/processing/parse_json_data.py +90 -0
  419. lfx/components/processing/parser.py +143 -0
  420. lfx/components/processing/prompt.py +67 -0
  421. lfx/components/processing/python_repl_core.py +98 -0
  422. lfx/components/processing/regex.py +82 -0
  423. lfx/components/processing/save_file.py +225 -0
  424. lfx/components/processing/select_data.py +48 -0
  425. lfx/components/processing/split_text.py +141 -0
  426. lfx/components/processing/structured_output.py +202 -0
  427. lfx/components/processing/update_data.py +160 -0
  428. lfx/components/prototypes/__init__.py +34 -0
  429. lfx/components/prototypes/python_function.py +73 -0
  430. lfx/components/qdrant/__init__.py +34 -0
  431. lfx/components/qdrant/qdrant.py +109 -0
  432. lfx/components/redis/__init__.py +37 -0
  433. lfx/components/redis/redis.py +89 -0
  434. lfx/components/redis/redis_chat.py +43 -0
  435. lfx/components/sambanova/__init__.py +32 -0
  436. lfx/components/sambanova/sambanova.py +84 -0
  437. lfx/components/scrapegraph/__init__.py +40 -0
  438. lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  439. lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
  440. lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  441. lfx/components/searchapi/__init__.py +34 -0
  442. lfx/components/searchapi/search.py +79 -0
  443. lfx/components/serpapi/__init__.py +3 -0
  444. lfx/components/serpapi/serp.py +115 -0
  445. lfx/components/supabase/__init__.py +34 -0
  446. lfx/components/supabase/supabase.py +76 -0
  447. lfx/components/tavily/__init__.py +4 -0
  448. lfx/components/tavily/tavily_extract.py +117 -0
  449. lfx/components/tavily/tavily_search.py +212 -0
  450. lfx/components/textsplitters/__init__.py +3 -0
  451. lfx/components/toolkits/__init__.py +3 -0
  452. lfx/components/tools/__init__.py +72 -0
  453. lfx/components/tools/calculator.py +108 -0
  454. lfx/components/tools/google_search_api.py +45 -0
  455. lfx/components/tools/google_serper_api.py +115 -0
  456. lfx/components/tools/python_code_structured_tool.py +327 -0
  457. lfx/components/tools/python_repl.py +97 -0
  458. lfx/components/tools/search_api.py +87 -0
  459. lfx/components/tools/searxng.py +145 -0
  460. lfx/components/tools/serp_api.py +119 -0
  461. lfx/components/tools/tavily_search_tool.py +344 -0
  462. lfx/components/tools/wikidata_api.py +102 -0
  463. lfx/components/tools/wikipedia_api.py +49 -0
  464. lfx/components/tools/yahoo_finance.py +129 -0
  465. lfx/components/twelvelabs/__init__.py +52 -0
  466. lfx/components/twelvelabs/convert_astra_results.py +84 -0
  467. lfx/components/twelvelabs/pegasus_index.py +311 -0
  468. lfx/components/twelvelabs/split_video.py +291 -0
  469. lfx/components/twelvelabs/text_embeddings.py +57 -0
  470. lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  471. lfx/components/twelvelabs/video_embeddings.py +100 -0
  472. lfx/components/twelvelabs/video_file.py +179 -0
  473. lfx/components/unstructured/__init__.py +3 -0
  474. lfx/components/unstructured/unstructured.py +121 -0
  475. lfx/components/upstash/__init__.py +34 -0
  476. lfx/components/upstash/upstash.py +124 -0
  477. lfx/components/vectara/__init__.py +37 -0
  478. lfx/components/vectara/vectara.py +97 -0
  479. lfx/components/vectara/vectara_rag.py +164 -0
  480. lfx/components/vectorstores/__init__.py +40 -0
  481. lfx/components/vectorstores/astradb.py +1285 -0
  482. lfx/components/vectorstores/astradb_graph.py +319 -0
  483. lfx/components/vectorstores/cassandra.py +264 -0
  484. lfx/components/vectorstores/cassandra_graph.py +238 -0
  485. lfx/components/vectorstores/chroma.py +167 -0
  486. lfx/components/vectorstores/clickhouse.py +135 -0
  487. lfx/components/vectorstores/couchbase.py +102 -0
  488. lfx/components/vectorstores/elasticsearch.py +267 -0
  489. lfx/components/vectorstores/faiss.py +111 -0
  490. lfx/components/vectorstores/graph_rag.py +141 -0
  491. lfx/components/vectorstores/hcd.py +314 -0
  492. lfx/components/vectorstores/local_db.py +261 -0
  493. lfx/components/vectorstores/milvus.py +115 -0
  494. lfx/components/vectorstores/mongodb_atlas.py +213 -0
  495. lfx/components/vectorstores/opensearch.py +243 -0
  496. lfx/components/vectorstores/pgvector.py +72 -0
  497. lfx/components/vectorstores/pinecone.py +134 -0
  498. lfx/components/vectorstores/qdrant.py +109 -0
  499. lfx/components/vectorstores/supabase.py +76 -0
  500. lfx/components/vectorstores/upstash.py +124 -0
  501. lfx/components/vectorstores/vectara.py +97 -0
  502. lfx/components/vectorstores/vectara_rag.py +164 -0
  503. lfx/components/vectorstores/weaviate.py +89 -0
  504. lfx/components/vertexai/__init__.py +37 -0
  505. lfx/components/vertexai/vertexai.py +71 -0
  506. lfx/components/vertexai/vertexai_embeddings.py +67 -0
  507. lfx/components/weaviate/__init__.py +34 -0
  508. lfx/components/weaviate/weaviate.py +89 -0
  509. lfx/components/wikipedia/__init__.py +4 -0
  510. lfx/components/wikipedia/wikidata.py +86 -0
  511. lfx/components/wikipedia/wikipedia.py +53 -0
  512. lfx/components/wolframalpha/__init__.py +3 -0
  513. lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
  514. lfx/components/xai/__init__.py +32 -0
  515. lfx/components/xai/xai.py +167 -0
  516. lfx/components/yahoosearch/__init__.py +3 -0
  517. lfx/components/yahoosearch/yahoo.py +137 -0
  518. lfx/components/youtube/__init__.py +52 -0
  519. lfx/components/youtube/channel.py +227 -0
  520. lfx/components/youtube/comments.py +231 -0
  521. lfx/components/youtube/playlist.py +33 -0
  522. lfx/components/youtube/search.py +120 -0
  523. lfx/components/youtube/trending.py +285 -0
  524. lfx/components/youtube/video_details.py +263 -0
  525. lfx/components/youtube/youtube_transcripts.py +118 -0
  526. lfx/components/zep/__init__.py +3 -0
  527. lfx/components/zep/zep.py +44 -0
  528. lfx/constants.py +6 -0
  529. lfx/custom/__init__.py +7 -0
  530. lfx/custom/attributes.py +86 -0
  531. lfx/custom/code_parser/__init__.py +3 -0
  532. lfx/custom/code_parser/code_parser.py +361 -0
  533. lfx/custom/custom_component/__init__.py +0 -0
  534. lfx/custom/custom_component/base_component.py +128 -0
  535. lfx/custom/custom_component/component.py +1808 -0
  536. lfx/custom/custom_component/component_with_cache.py +8 -0
  537. lfx/custom/custom_component/custom_component.py +588 -0
  538. lfx/custom/dependency_analyzer.py +165 -0
  539. lfx/custom/directory_reader/__init__.py +3 -0
  540. lfx/custom/directory_reader/directory_reader.py +359 -0
  541. lfx/custom/directory_reader/utils.py +171 -0
  542. lfx/custom/eval.py +12 -0
  543. lfx/custom/schema.py +32 -0
  544. lfx/custom/tree_visitor.py +21 -0
  545. lfx/custom/utils.py +877 -0
  546. lfx/custom/validate.py +488 -0
  547. lfx/events/__init__.py +1 -0
  548. lfx/events/event_manager.py +110 -0
  549. lfx/exceptions/__init__.py +0 -0
  550. lfx/exceptions/component.py +15 -0
  551. lfx/field_typing/__init__.py +91 -0
  552. lfx/field_typing/constants.py +215 -0
  553. lfx/field_typing/range_spec.py +35 -0
  554. lfx/graph/__init__.py +6 -0
  555. lfx/graph/edge/__init__.py +0 -0
  556. lfx/graph/edge/base.py +277 -0
  557. lfx/graph/edge/schema.py +119 -0
  558. lfx/graph/edge/utils.py +0 -0
  559. lfx/graph/graph/__init__.py +0 -0
  560. lfx/graph/graph/ascii.py +202 -0
  561. lfx/graph/graph/base.py +2238 -0
  562. lfx/graph/graph/constants.py +63 -0
  563. lfx/graph/graph/runnable_vertices_manager.py +133 -0
  564. lfx/graph/graph/schema.py +52 -0
  565. lfx/graph/graph/state_model.py +66 -0
  566. lfx/graph/graph/utils.py +1024 -0
  567. lfx/graph/schema.py +75 -0
  568. lfx/graph/state/__init__.py +0 -0
  569. lfx/graph/state/model.py +237 -0
  570. lfx/graph/utils.py +200 -0
  571. lfx/graph/vertex/__init__.py +0 -0
  572. lfx/graph/vertex/base.py +823 -0
  573. lfx/graph/vertex/constants.py +0 -0
  574. lfx/graph/vertex/exceptions.py +4 -0
  575. lfx/graph/vertex/param_handler.py +264 -0
  576. lfx/graph/vertex/schema.py +26 -0
  577. lfx/graph/vertex/utils.py +19 -0
  578. lfx/graph/vertex/vertex_types.py +489 -0
  579. lfx/helpers/__init__.py +1 -0
  580. lfx/helpers/base_model.py +71 -0
  581. lfx/helpers/custom.py +13 -0
  582. lfx/helpers/data.py +167 -0
  583. lfx/helpers/flow.py +194 -0
  584. lfx/inputs/__init__.py +68 -0
  585. lfx/inputs/constants.py +2 -0
  586. lfx/inputs/input_mixin.py +328 -0
  587. lfx/inputs/inputs.py +714 -0
  588. lfx/inputs/validators.py +19 -0
  589. lfx/interface/__init__.py +6 -0
  590. lfx/interface/components.py +489 -0
  591. lfx/interface/importing/__init__.py +5 -0
  592. lfx/interface/importing/utils.py +39 -0
  593. lfx/interface/initialize/__init__.py +3 -0
  594. lfx/interface/initialize/loading.py +224 -0
  595. lfx/interface/listing.py +26 -0
  596. lfx/interface/run.py +16 -0
  597. lfx/interface/utils.py +111 -0
  598. lfx/io/__init__.py +63 -0
  599. lfx/io/schema.py +289 -0
  600. lfx/load/__init__.py +8 -0
  601. lfx/load/load.py +256 -0
  602. lfx/load/utils.py +99 -0
  603. lfx/log/__init__.py +5 -0
  604. lfx/log/logger.py +385 -0
  605. lfx/memory/__init__.py +90 -0
  606. lfx/memory/stubs.py +283 -0
  607. lfx/processing/__init__.py +1 -0
  608. lfx/processing/process.py +238 -0
  609. lfx/processing/utils.py +25 -0
  610. lfx/py.typed +0 -0
  611. lfx/schema/__init__.py +66 -0
  612. lfx/schema/artifact.py +83 -0
  613. lfx/schema/content_block.py +62 -0
  614. lfx/schema/content_types.py +91 -0
  615. lfx/schema/data.py +308 -0
  616. lfx/schema/dataframe.py +210 -0
  617. lfx/schema/dotdict.py +74 -0
  618. lfx/schema/encoders.py +13 -0
  619. lfx/schema/graph.py +47 -0
  620. lfx/schema/image.py +131 -0
  621. lfx/schema/json_schema.py +141 -0
  622. lfx/schema/log.py +61 -0
  623. lfx/schema/message.py +473 -0
  624. lfx/schema/openai_responses_schemas.py +74 -0
  625. lfx/schema/properties.py +41 -0
  626. lfx/schema/schema.py +171 -0
  627. lfx/schema/serialize.py +13 -0
  628. lfx/schema/table.py +140 -0
  629. lfx/schema/validators.py +114 -0
  630. lfx/serialization/__init__.py +5 -0
  631. lfx/serialization/constants.py +2 -0
  632. lfx/serialization/serialization.py +314 -0
  633. lfx/services/__init__.py +23 -0
  634. lfx/services/base.py +28 -0
  635. lfx/services/cache/__init__.py +6 -0
  636. lfx/services/cache/base.py +183 -0
  637. lfx/services/cache/service.py +166 -0
  638. lfx/services/cache/utils.py +169 -0
  639. lfx/services/chat/__init__.py +1 -0
  640. lfx/services/chat/config.py +2 -0
  641. lfx/services/chat/schema.py +10 -0
  642. lfx/services/deps.py +129 -0
  643. lfx/services/factory.py +19 -0
  644. lfx/services/initialize.py +19 -0
  645. lfx/services/interfaces.py +103 -0
  646. lfx/services/manager.py +172 -0
  647. lfx/services/schema.py +20 -0
  648. lfx/services/session.py +82 -0
  649. lfx/services/settings/__init__.py +3 -0
  650. lfx/services/settings/auth.py +130 -0
  651. lfx/services/settings/base.py +539 -0
  652. lfx/services/settings/constants.py +31 -0
  653. lfx/services/settings/factory.py +23 -0
  654. lfx/services/settings/feature_flags.py +12 -0
  655. lfx/services/settings/service.py +35 -0
  656. lfx/services/settings/utils.py +40 -0
  657. lfx/services/shared_component_cache/__init__.py +1 -0
  658. lfx/services/shared_component_cache/factory.py +30 -0
  659. lfx/services/shared_component_cache/service.py +9 -0
  660. lfx/services/storage/__init__.py +5 -0
  661. lfx/services/storage/local.py +155 -0
  662. lfx/services/storage/service.py +54 -0
  663. lfx/services/tracing/__init__.py +1 -0
  664. lfx/services/tracing/service.py +21 -0
  665. lfx/settings.py +6 -0
  666. lfx/template/__init__.py +6 -0
  667. lfx/template/field/__init__.py +0 -0
  668. lfx/template/field/base.py +257 -0
  669. lfx/template/field/prompt.py +15 -0
  670. lfx/template/frontend_node/__init__.py +6 -0
  671. lfx/template/frontend_node/base.py +212 -0
  672. lfx/template/frontend_node/constants.py +65 -0
  673. lfx/template/frontend_node/custom_components.py +79 -0
  674. lfx/template/template/__init__.py +0 -0
  675. lfx/template/template/base.py +100 -0
  676. lfx/template/utils.py +217 -0
  677. lfx/type_extraction/__init__.py +19 -0
  678. lfx/type_extraction/type_extraction.py +75 -0
  679. lfx/type_extraction.py +80 -0
  680. lfx/utils/__init__.py +1 -0
  681. lfx/utils/async_helpers.py +42 -0
  682. lfx/utils/component_utils.py +154 -0
  683. lfx/utils/concurrency.py +60 -0
  684. lfx/utils/connection_string_parser.py +11 -0
  685. lfx/utils/constants.py +205 -0
  686. lfx/utils/data_structure.py +212 -0
  687. lfx/utils/exceptions.py +22 -0
  688. lfx/utils/helpers.py +28 -0
  689. lfx/utils/image.py +73 -0
  690. lfx/utils/lazy_load.py +15 -0
  691. lfx/utils/request_utils.py +18 -0
  692. lfx/utils/schemas.py +139 -0
  693. lfx/utils/util.py +481 -0
  694. lfx/utils/util_strings.py +56 -0
  695. lfx/utils/version.py +24 -0
  696. lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
  697. lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
  698. lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
  699. lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,111 @@
1
+ from pathlib import Path
2
+
3
+ from langchain_community.vectorstores import FAISS
4
+
5
+ from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
6
+ from lfx.helpers.data import docs_to_data
7
+ from lfx.io import BoolInput, HandleInput, IntInput, StrInput
8
+ from lfx.schema.data import Data
9
+
10
+
11
+ class FaissVectorStoreComponent(LCVectorStoreComponent):
12
+ """FAISS Vector Store with search capabilities."""
13
+
14
+ display_name: str = "FAISS"
15
+ description: str = "FAISS Vector Store with search capabilities"
16
+ name = "FAISS"
17
+ icon = "FAISS"
18
+
19
+ inputs = [
20
+ StrInput(
21
+ name="index_name",
22
+ display_name="Index Name",
23
+ value="langflow_index",
24
+ ),
25
+ StrInput(
26
+ name="persist_directory",
27
+ display_name="Persist Directory",
28
+ info="Path to save the FAISS index. It will be relative to where Langflow is running.",
29
+ ),
30
+ *LCVectorStoreComponent.inputs,
31
+ BoolInput(
32
+ name="allow_dangerous_deserialization",
33
+ display_name="Allow Dangerous Deserialization",
34
+ info="Set to True to allow loading pickle files from untrusted sources. "
35
+ "Only enable this if you trust the source of the data.",
36
+ advanced=True,
37
+ value=True,
38
+ ),
39
+ HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
40
+ IntInput(
41
+ name="number_of_results",
42
+ display_name="Number of Results",
43
+ info="Number of results to return.",
44
+ advanced=True,
45
+ value=4,
46
+ ),
47
+ ]
48
+
49
+ @staticmethod
50
+ def resolve_path(path: str) -> str:
51
+ """Resolve the path relative to the Langflow root.
52
+
53
+ Args:
54
+ path: The path to resolve
55
+ Returns:
56
+ str: The resolved path as a string
57
+ """
58
+ return str(Path(path).resolve())
59
+
60
+ def get_persist_directory(self) -> Path:
61
+ """Returns the resolved persist directory path or the current directory if not set."""
62
+ if self.persist_directory:
63
+ return Path(self.resolve_path(self.persist_directory))
64
+ return Path()
65
+
66
+ @check_cached_vector_store
67
+ def build_vector_store(self) -> FAISS:
68
+ """Builds the FAISS object."""
69
+ path = self.get_persist_directory()
70
+ path.mkdir(parents=True, exist_ok=True)
71
+
72
+ # Convert DataFrame to Data if needed using parent's method
73
+ self.ingest_data = self._prepare_ingest_data()
74
+
75
+ documents = []
76
+ for _input in self.ingest_data or []:
77
+ if isinstance(_input, Data):
78
+ documents.append(_input.to_lc_document())
79
+ else:
80
+ documents.append(_input)
81
+
82
+ faiss = FAISS.from_documents(documents=documents, embedding=self.embedding)
83
+ faiss.save_local(str(path), self.index_name)
84
+ return faiss
85
+
86
+ def search_documents(self) -> list[Data]:
87
+ """Search for documents in the FAISS vector store."""
88
+ path = self.get_persist_directory()
89
+ index_path = path / f"{self.index_name}.faiss"
90
+
91
+ if not index_path.exists():
92
+ vector_store = self.build_vector_store()
93
+ else:
94
+ vector_store = FAISS.load_local(
95
+ folder_path=str(path),
96
+ embeddings=self.embedding,
97
+ index_name=self.index_name,
98
+ allow_dangerous_deserialization=self.allow_dangerous_deserialization,
99
+ )
100
+
101
+ if not vector_store:
102
+ msg = "Failed to load the FAISS index."
103
+ raise ValueError(msg)
104
+
105
+ if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
106
+ docs = vector_store.similarity_search(
107
+ query=self.search_query,
108
+ k=self.number_of_results,
109
+ )
110
+ return docs_to_data(docs)
111
+ return []
@@ -0,0 +1,19 @@
1
+ from .add_content_to_page import AddContentToPage
2
+ from .create_page import NotionPageCreator
3
+ from .list_database_properties import NotionDatabaseProperties
4
+ from .list_pages import NotionListPages
5
+ from .list_users import NotionUserList
6
+ from .page_content_viewer import NotionPageContent
7
+ from .search import NotionSearch
8
+ from .update_page_property import NotionPageUpdate
9
+
10
+ __all__ = [
11
+ "AddContentToPage",
12
+ "NotionDatabaseProperties",
13
+ "NotionListPages",
14
+ "NotionPageContent",
15
+ "NotionPageCreator",
16
+ "NotionPageUpdate",
17
+ "NotionSearch",
18
+ "NotionUserList",
19
+ ]
@@ -0,0 +1,269 @@
1
+ import json
2
+ from typing import Any
3
+
4
+ import requests
5
+ from bs4 import BeautifulSoup
6
+ from langchain.tools import StructuredTool
7
+ from markdown import markdown
8
+ from pydantic import BaseModel, Field
9
+
10
+ from lfx.base.langchain_utilities.model import LCToolComponent
11
+ from lfx.field_typing import Tool
12
+ from lfx.inputs.inputs import MultilineInput, SecretStrInput, StrInput
13
+ from lfx.log.logger import logger
14
+ from lfx.schema.data import Data
15
+
16
+ MIN_ROWS_IN_TABLE = 3
17
+
18
+
19
+ class AddContentToPage(LCToolComponent):
20
+ display_name: str = "Add Content to Page "
21
+ description: str = "Convert markdown text to Notion blocks and append them to a Notion page."
22
+ documentation: str = "https://developers.notion.com/reference/patch-block-children"
23
+ icon = "NotionDirectoryLoader"
24
+
25
+ inputs = [
26
+ MultilineInput(
27
+ name="markdown_text",
28
+ display_name="Markdown Text",
29
+ info="The markdown text to convert to Notion blocks.",
30
+ ),
31
+ StrInput(
32
+ name="block_id",
33
+ display_name="Page/Block ID",
34
+ info="The ID of the page/block to add the content.",
35
+ ),
36
+ SecretStrInput(
37
+ name="notion_secret",
38
+ display_name="Notion Secret",
39
+ info="The Notion integration token.",
40
+ required=True,
41
+ ),
42
+ ]
43
+
44
+ class AddContentToPageSchema(BaseModel):
45
+ markdown_text: str = Field(..., description="The markdown text to convert to Notion blocks.")
46
+ block_id: str = Field(..., description="The ID of the page/block to add the content.")
47
+
48
+ def run_model(self) -> Data:
49
+ result = self._add_content_to_page(self.markdown_text, self.block_id)
50
+ return Data(data=result, text=json.dumps(result))
51
+
52
+ def build_tool(self) -> Tool:
53
+ return StructuredTool.from_function(
54
+ name="add_content_to_notion_page",
55
+ description="Convert markdown text to Notion blocks and append them to a Notion page.",
56
+ func=self._add_content_to_page,
57
+ args_schema=self.AddContentToPageSchema,
58
+ )
59
+
60
+ def _add_content_to_page(self, markdown_text: str, block_id: str) -> dict[str, Any] | str:
61
+ try:
62
+ html_text = markdown(markdown_text)
63
+ soup = BeautifulSoup(html_text, "html.parser")
64
+ blocks = self.process_node(soup)
65
+
66
+ url = f"https://api.notion.com/v1/blocks/{block_id}/children"
67
+ headers = {
68
+ "Authorization": f"Bearer {self.notion_secret}",
69
+ "Content-Type": "application/json",
70
+ "Notion-Version": "2022-06-28",
71
+ }
72
+
73
+ data = {
74
+ "children": blocks,
75
+ }
76
+
77
+ response = requests.patch(url, headers=headers, json=data, timeout=10)
78
+ response.raise_for_status()
79
+
80
+ return response.json()
81
+ except requests.exceptions.RequestException as e:
82
+ error_message = f"Error: Failed to add content to Notion page. {e}"
83
+ if hasattr(e, "response") and e.response is not None:
84
+ error_message += f" Status code: {e.response.status_code}, Response: {e.response.text}"
85
+ return error_message
86
+ except Exception as e: # noqa: BLE001
87
+ logger.debug("Error adding content to Notion page", exc_info=True)
88
+ return f"Error: An unexpected error occurred while adding content to Notion page. {e}"
89
+
90
+ def process_node(self, node):
91
+ blocks = []
92
+ if isinstance(node, str):
93
+ text = node.strip()
94
+ if text:
95
+ if text.startswith("#"):
96
+ heading_level = text.count("#", 0, 6)
97
+ heading_text = text[heading_level:].strip()
98
+ if heading_level in range(3):
99
+ blocks.append(self.create_block(f"heading_{heading_level + 1}", heading_text))
100
+ else:
101
+ blocks.append(self.create_block("paragraph", text))
102
+ elif node.name == "h1":
103
+ blocks.append(self.create_block("heading_1", node.get_text(strip=True)))
104
+ elif node.name == "h2":
105
+ blocks.append(self.create_block("heading_2", node.get_text(strip=True)))
106
+ elif node.name == "h3":
107
+ blocks.append(self.create_block("heading_3", node.get_text(strip=True)))
108
+ elif node.name == "p":
109
+ code_node = node.find("code")
110
+ if code_node:
111
+ code_text = code_node.get_text()
112
+ language, code = self.extract_language_and_code(code_text)
113
+ blocks.append(self.create_block("code", code, language=language))
114
+ elif self.is_table(str(node)):
115
+ blocks.extend(self.process_table(node))
116
+ else:
117
+ blocks.append(self.create_block("paragraph", node.get_text(strip=True)))
118
+ elif node.name == "ul":
119
+ blocks.extend(self.process_list(node, "bulleted_list_item"))
120
+ elif node.name == "ol":
121
+ blocks.extend(self.process_list(node, "numbered_list_item"))
122
+ elif node.name == "blockquote":
123
+ blocks.append(self.create_block("quote", node.get_text(strip=True)))
124
+ elif node.name == "hr":
125
+ blocks.append(self.create_block("divider", ""))
126
+ elif node.name == "img":
127
+ blocks.append(self.create_block("image", "", image_url=node.get("src")))
128
+ elif node.name == "a":
129
+ blocks.append(self.create_block("bookmark", node.get_text(strip=True), link_url=node.get("href")))
130
+ elif node.name == "table":
131
+ blocks.extend(self.process_table(node))
132
+
133
+ for child in node.children:
134
+ if isinstance(child, str):
135
+ continue
136
+ blocks.extend(self.process_node(child))
137
+
138
+ return blocks
139
+
140
+ def extract_language_and_code(self, code_text):
141
+ lines = code_text.split("\n")
142
+ language = lines[0].strip()
143
+ code = "\n".join(lines[1:]).strip()
144
+ return language, code
145
+
146
+ def is_code_block(self, text):
147
+ return text.startswith("```")
148
+
149
+ def extract_code_block(self, text):
150
+ lines = text.split("\n")
151
+ language = lines[0].strip("`").strip()
152
+ code = "\n".join(lines[1:]).strip("`").strip()
153
+ return language, code
154
+
155
+ def is_table(self, text):
156
+ rows = text.split("\n")
157
+ if len(rows) < MIN_ROWS_IN_TABLE:
158
+ return False
159
+
160
+ has_separator = False
161
+ for i, row in enumerate(rows):
162
+ if "|" in row:
163
+ cells = [cell.strip() for cell in row.split("|")]
164
+ cells = [cell for cell in cells if cell] # Remove empty cells
165
+ if i == 1 and all(set(cell) <= set("-|") for cell in cells):
166
+ has_separator = True
167
+ elif not cells:
168
+ return False
169
+
170
+ return has_separator
171
+
172
+ def process_list(self, node, list_type):
173
+ blocks = []
174
+ for item in node.find_all("li"):
175
+ item_text = item.get_text(strip=True)
176
+ checked = item_text.startswith("[x]")
177
+ is_checklist = item_text.startswith("[ ]") or checked
178
+
179
+ if is_checklist:
180
+ item_text = item_text.replace("[x]", "").replace("[ ]", "").strip()
181
+ blocks.append(self.create_block("to_do", item_text, checked=checked))
182
+ else:
183
+ blocks.append(self.create_block(list_type, item_text))
184
+ return blocks
185
+
186
+ def process_table(self, node):
187
+ blocks = []
188
+ header_row = node.find("thead").find("tr") if node.find("thead") else None
189
+ body_rows = node.find("tbody").find_all("tr") if node.find("tbody") else []
190
+
191
+ if header_row or body_rows:
192
+ table_width = max(
193
+ len(header_row.find_all(["th", "td"])) if header_row else 0,
194
+ *(len(row.find_all(["th", "td"])) for row in body_rows),
195
+ )
196
+
197
+ table_block = self.create_block("table", "", table_width=table_width, has_column_header=bool(header_row))
198
+ blocks.append(table_block)
199
+
200
+ if header_row:
201
+ header_cells = [cell.get_text(strip=True) for cell in header_row.find_all(["th", "td"])]
202
+ header_row_block = self.create_block("table_row", header_cells)
203
+ blocks.append(header_row_block)
204
+
205
+ for row in body_rows:
206
+ cells = [cell.get_text(strip=True) for cell in row.find_all(["th", "td"])]
207
+ row_block = self.create_block("table_row", cells)
208
+ blocks.append(row_block)
209
+
210
+ return blocks
211
+
212
+ def create_block(self, block_type: str, content: str, **kwargs) -> dict[str, Any]:
213
+ block: dict[str, Any] = {
214
+ "object": "block",
215
+ "type": block_type,
216
+ block_type: {},
217
+ }
218
+
219
+ if block_type in {
220
+ "paragraph",
221
+ "heading_1",
222
+ "heading_2",
223
+ "heading_3",
224
+ "bulleted_list_item",
225
+ "numbered_list_item",
226
+ "quote",
227
+ }:
228
+ block[block_type]["rich_text"] = [
229
+ {
230
+ "type": "text",
231
+ "text": {
232
+ "content": content,
233
+ },
234
+ }
235
+ ]
236
+ elif block_type == "to_do":
237
+ block[block_type]["rich_text"] = [
238
+ {
239
+ "type": "text",
240
+ "text": {
241
+ "content": content,
242
+ },
243
+ }
244
+ ]
245
+ block[block_type]["checked"] = kwargs.get("checked", False)
246
+ elif block_type == "code":
247
+ block[block_type]["rich_text"] = [
248
+ {
249
+ "type": "text",
250
+ "text": {
251
+ "content": content,
252
+ },
253
+ }
254
+ ]
255
+ block[block_type]["language"] = kwargs.get("language", "plain text")
256
+ elif block_type == "image":
257
+ block[block_type] = {"type": "external", "external": {"url": kwargs.get("image_url", "")}}
258
+ elif block_type == "divider":
259
+ pass
260
+ elif block_type == "bookmark":
261
+ block[block_type]["url"] = kwargs.get("link_url", "")
262
+ elif block_type == "table":
263
+ block[block_type]["table_width"] = kwargs.get("table_width", 0)
264
+ block[block_type]["has_column_header"] = kwargs.get("has_column_header", False)
265
+ block[block_type]["has_row_header"] = kwargs.get("has_row_header", False)
266
+ elif block_type == "table_row":
267
+ block[block_type]["cells"] = [[{"type": "text", "text": {"content": cell}} for cell in content]]
268
+
269
+ return block
@@ -0,0 +1,94 @@
1
+ import json
2
+ from typing import Any
3
+
4
+ import requests
5
+ from langchain.tools import StructuredTool
6
+ from pydantic import BaseModel, Field
7
+
8
+ from lfx.base.langchain_utilities.model import LCToolComponent
9
+ from lfx.field_typing import Tool
10
+ from lfx.inputs.inputs import MultilineInput, SecretStrInput, StrInput
11
+ from lfx.schema.data import Data
12
+
13
+
14
+ class NotionPageCreator(LCToolComponent):
15
+ display_name: str = "Create Page "
16
+ description: str = "A component for creating Notion pages."
17
+ documentation: str = "https://docs.langflow.org/integrations/notion/page-create"
18
+ icon = "NotionDirectoryLoader"
19
+
20
+ inputs = [
21
+ StrInput(
22
+ name="database_id",
23
+ display_name="Database ID",
24
+ info="The ID of the Notion database.",
25
+ ),
26
+ SecretStrInput(
27
+ name="notion_secret",
28
+ display_name="Notion Secret",
29
+ info="The Notion integration token.",
30
+ required=True,
31
+ ),
32
+ MultilineInput(
33
+ name="properties_json",
34
+ display_name="Properties (JSON)",
35
+ info="The properties of the new page as a JSON string.",
36
+ ),
37
+ ]
38
+
39
+ class NotionPageCreatorSchema(BaseModel):
40
+ database_id: str = Field(..., description="The ID of the Notion database.")
41
+ properties_json: str = Field(..., description="The properties of the new page as a JSON string.")
42
+
43
+ def run_model(self) -> Data:
44
+ result = self._create_notion_page(self.database_id, self.properties_json)
45
+ if isinstance(result, str):
46
+ # An error occurred, return it as text
47
+ return Data(text=result)
48
+ # Success, return the created page data
49
+ output = "Created page properties:\n"
50
+ for prop_name, prop_value in result.get("properties", {}).items():
51
+ output += f"{prop_name}: {prop_value}\n"
52
+ return Data(text=output, data=result)
53
+
54
+ def build_tool(self) -> Tool:
55
+ return StructuredTool.from_function(
56
+ name="create_notion_page",
57
+ description="Create a new page in a Notion database. "
58
+ "IMPORTANT: Use the tool to check the Database properties for more details before using this tool.",
59
+ func=self._create_notion_page,
60
+ args_schema=self.NotionPageCreatorSchema,
61
+ )
62
+
63
+ def _create_notion_page(self, database_id: str, properties_json: str) -> dict[str, Any] | str:
64
+ if not database_id or not properties_json:
65
+ return "Invalid input. Please provide 'database_id' and 'properties_json'."
66
+
67
+ try:
68
+ properties = json.loads(properties_json)
69
+ except json.JSONDecodeError as e:
70
+ return f"Invalid properties format. Please provide a valid JSON string. Error: {e}"
71
+
72
+ headers = {
73
+ "Authorization": f"Bearer {self.notion_secret}",
74
+ "Content-Type": "application/json",
75
+ "Notion-Version": "2022-06-28",
76
+ }
77
+
78
+ data = {
79
+ "parent": {"database_id": database_id},
80
+ "properties": properties,
81
+ }
82
+
83
+ try:
84
+ response = requests.post("https://api.notion.com/v1/pages", headers=headers, json=data, timeout=10)
85
+ response.raise_for_status()
86
+ return response.json()
87
+ except requests.exceptions.RequestException as e:
88
+ error_message = f"Failed to create Notion page. Error: {e}"
89
+ if hasattr(e, "response") and e.response is not None:
90
+ error_message += f" Status code: {e.response.status_code}, Response: {e.response.text}"
91
+ return error_message
92
+
93
+ def __call__(self, *args, **kwargs):
94
+ return self._create_notion_page(*args, **kwargs)
@@ -0,0 +1,68 @@
1
+ import requests
2
+ from langchain.tools import StructuredTool
3
+ from pydantic import BaseModel, Field
4
+
5
+ from lfx.base.langchain_utilities.model import LCToolComponent
6
+ from lfx.field_typing import Tool
7
+ from lfx.inputs.inputs import SecretStrInput, StrInput
8
+ from lfx.log.logger import logger
9
+ from lfx.schema.data import Data
10
+
11
+
12
+ class NotionDatabaseProperties(LCToolComponent):
13
+ display_name: str = "List Database Properties "
14
+ description: str = "Retrieve properties of a Notion database."
15
+ documentation: str = "https://docs.langflow.org/integrations/notion/list-database-properties"
16
+ icon = "NotionDirectoryLoader"
17
+
18
+ inputs = [
19
+ StrInput(
20
+ name="database_id",
21
+ display_name="Database ID",
22
+ info="The ID of the Notion database.",
23
+ ),
24
+ SecretStrInput(
25
+ name="notion_secret",
26
+ display_name="Notion Secret",
27
+ info="The Notion integration token.",
28
+ required=True,
29
+ ),
30
+ ]
31
+
32
+ class NotionDatabasePropertiesSchema(BaseModel):
33
+ database_id: str = Field(..., description="The ID of the Notion database.")
34
+
35
+ def run_model(self) -> Data:
36
+ result = self._fetch_database_properties(self.database_id)
37
+ if isinstance(result, str):
38
+ # An error occurred, return it as text
39
+ return Data(text=result)
40
+ # Success, return the properties
41
+ return Data(text=str(result), data=result)
42
+
43
+ def build_tool(self) -> Tool:
44
+ return StructuredTool.from_function(
45
+ name="notion_database_properties",
46
+ description="Retrieve properties of a Notion database. Input should include the database ID.",
47
+ func=self._fetch_database_properties,
48
+ args_schema=self.NotionDatabasePropertiesSchema,
49
+ )
50
+
51
+ def _fetch_database_properties(self, database_id: str) -> dict | str:
52
+ url = f"https://api.notion.com/v1/databases/{database_id}"
53
+ headers = {
54
+ "Authorization": f"Bearer {self.notion_secret}",
55
+ "Notion-Version": "2022-06-28", # Use the latest supported version
56
+ }
57
+ try:
58
+ response = requests.get(url, headers=headers, timeout=10)
59
+ response.raise_for_status()
60
+ data = response.json()
61
+ return data.get("properties", {})
62
+ except requests.exceptions.RequestException as e:
63
+ return f"Error fetching Notion database properties: {e}"
64
+ except ValueError as e:
65
+ return f"Error parsing Notion API response: {e}"
66
+ except Exception as e: # noqa: BLE001
67
+ logger.debug("Error fetching Notion database properties", exc_info=True)
68
+ return f"An unexpected error occurred: {e}"
@@ -0,0 +1,122 @@
1
+ import json
2
+ from typing import Any
3
+
4
+ import requests
5
+ from langchain.tools import StructuredTool
6
+ from pydantic import BaseModel, Field
7
+
8
+ from lfx.base.langchain_utilities.model import LCToolComponent
9
+ from lfx.field_typing import Tool
10
+ from lfx.inputs.inputs import MultilineInput, SecretStrInput, StrInput
11
+ from lfx.log.logger import logger
12
+ from lfx.schema.data import Data
13
+
14
+
15
+ class NotionListPages(LCToolComponent):
16
+ display_name: str = "List Pages "
17
+ description: str = (
18
+ "Query a Notion database with filtering and sorting. "
19
+ "The input should be a JSON string containing the 'filter' and 'sorts' objects. "
20
+ "Example input:\n"
21
+ '{"filter": {"property": "Status", "select": {"equals": "Done"}}, '
22
+ '"sorts": [{"timestamp": "created_time", "direction": "descending"}]}'
23
+ )
24
+ documentation: str = "https://docs.langflow.org/integrations/notion/list-pages"
25
+ icon = "NotionDirectoryLoader"
26
+
27
+ inputs = [
28
+ SecretStrInput(
29
+ name="notion_secret",
30
+ display_name="Notion Secret",
31
+ info="The Notion integration token.",
32
+ required=True,
33
+ ),
34
+ StrInput(
35
+ name="database_id",
36
+ display_name="Database ID",
37
+ info="The ID of the Notion database to query.",
38
+ ),
39
+ MultilineInput(
40
+ name="query_json",
41
+ display_name="Database query (JSON)",
42
+ info="A JSON string containing the filters and sorts that will be used for querying the database. "
43
+ "Leave empty for no filters or sorts.",
44
+ ),
45
+ ]
46
+
47
+ class NotionListPagesSchema(BaseModel):
48
+ database_id: str = Field(..., description="The ID of the Notion database to query.")
49
+ query_json: str | None = Field(
50
+ default="",
51
+ description="A JSON string containing the filters and sorts for querying the database. "
52
+ "Leave empty for no filters or sorts.",
53
+ )
54
+
55
+ def run_model(self) -> list[Data]:
56
+ result = self._query_notion_database(self.database_id, self.query_json)
57
+
58
+ if isinstance(result, str):
59
+ # An error occurred, return it as a single record
60
+ return [Data(text=result)]
61
+
62
+ records = []
63
+ combined_text = f"Pages found: {len(result)}\n\n"
64
+
65
+ for page in result:
66
+ page_data = {
67
+ "id": page["id"],
68
+ "url": page["url"],
69
+ "created_time": page["created_time"],
70
+ "last_edited_time": page["last_edited_time"],
71
+ "properties": page["properties"],
72
+ }
73
+
74
+ text = (
75
+ f"id: {page['id']}\n"
76
+ f"url: {page['url']}\n"
77
+ f"created_time: {page['created_time']}\n"
78
+ f"last_edited_time: {page['last_edited_time']}\n"
79
+ f"properties: {json.dumps(page['properties'], indent=2)}\n\n"
80
+ )
81
+
82
+ combined_text += text
83
+ records.append(Data(text=text, **page_data))
84
+
85
+ self.status = records
86
+ return records
87
+
88
+ def build_tool(self) -> Tool:
89
+ return StructuredTool.from_function(
90
+ name="notion_list_pages",
91
+ description=self.description,
92
+ func=self._query_notion_database,
93
+ args_schema=self.NotionListPagesSchema,
94
+ )
95
+
96
+ def _query_notion_database(self, database_id: str, query_json: str | None = None) -> list[dict[str, Any]] | str:
97
+ url = f"https://api.notion.com/v1/databases/{database_id}/query"
98
+ headers = {
99
+ "Authorization": f"Bearer {self.notion_secret}",
100
+ "Content-Type": "application/json",
101
+ "Notion-Version": "2022-06-28",
102
+ }
103
+
104
+ query_payload = {}
105
+ if query_json and query_json.strip():
106
+ try:
107
+ query_payload = json.loads(query_json)
108
+ except json.JSONDecodeError as e:
109
+ return f"Invalid JSON format for query: {e}"
110
+
111
+ try:
112
+ response = requests.post(url, headers=headers, json=query_payload, timeout=10)
113
+ response.raise_for_status()
114
+ results = response.json()
115
+ return results["results"]
116
+ except requests.exceptions.RequestException as e:
117
+ return f"Error querying Notion database: {e}"
118
+ except KeyError:
119
+ return "Unexpected response format from Notion API"
120
+ except Exception as e: # noqa: BLE001
121
+ logger.debug("Error querying Notion database", exc_info=True)
122
+ return f"An unexpected error occurred: {e}"