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,213 @@
1
+ import tempfile
2
+ import time
3
+
4
+ import certifi
5
+ from langchain_community.vectorstores import MongoDBAtlasVectorSearch
6
+ from pymongo.collection import Collection
7
+ from pymongo.operations import SearchIndexModel
8
+
9
+ from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
10
+ from lfx.helpers.data import docs_to_data
11
+ from lfx.io import BoolInput, DropdownInput, HandleInput, IntInput, SecretStrInput, StrInput
12
+ from lfx.schema.data import Data
13
+
14
+
15
+ class MongoVectorStoreComponent(LCVectorStoreComponent):
16
+ display_name = "MongoDB Atlas"
17
+ description = "MongoDB Atlas Vector Store with search capabilities"
18
+ name = "MongoDBAtlasVector"
19
+ icon = "MongoDB"
20
+ INSERT_MODES = ["append", "overwrite"]
21
+ SIMILARITY_OPTIONS = ["cosine", "euclidean", "dotProduct"]
22
+ QUANTIZATION_OPTIONS = ["scalar", "binary"]
23
+ inputs = [
24
+ SecretStrInput(name="mongodb_atlas_cluster_uri", display_name="MongoDB Atlas Cluster URI", required=True),
25
+ BoolInput(name="enable_mtls", display_name="Enable mTLS", value=False, advanced=True, required=True),
26
+ SecretStrInput(
27
+ name="mongodb_atlas_client_cert",
28
+ display_name="MongoDB Atlas Combined Client Certificate",
29
+ required=False,
30
+ info="Client Certificate combined with the private key in the following format:\n "
31
+ "-----BEGIN PRIVATE KEY-----\n...\n -----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\n"
32
+ "...\n-----END CERTIFICATE-----\n",
33
+ ),
34
+ StrInput(name="db_name", display_name="Database Name", required=True),
35
+ StrInput(name="collection_name", display_name="Collection Name", required=True),
36
+ StrInput(
37
+ name="index_name",
38
+ display_name="Index Name",
39
+ required=True,
40
+ info="The name of Atlas Search index, it should be a Vector Search.",
41
+ ),
42
+ *LCVectorStoreComponent.inputs,
43
+ DropdownInput(
44
+ name="insert_mode",
45
+ display_name="Insert Mode",
46
+ options=INSERT_MODES,
47
+ value=INSERT_MODES[0],
48
+ info="How to insert new documents into the collection.",
49
+ advanced=True,
50
+ ),
51
+ HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
52
+ IntInput(
53
+ name="number_of_results",
54
+ display_name="Number of Results",
55
+ info="Number of results to return.",
56
+ value=4,
57
+ advanced=True,
58
+ ),
59
+ StrInput(
60
+ name="index_field",
61
+ display_name="Index Field",
62
+ advanced=True,
63
+ required=True,
64
+ info="The field to index.",
65
+ value="embedding",
66
+ ),
67
+ StrInput(
68
+ name="filter_field", display_name="Filter Field", advanced=True, info="The field to filter the index."
69
+ ),
70
+ IntInput(
71
+ name="number_dimensions",
72
+ display_name="Number of Dimensions",
73
+ info="Embedding Context Length.",
74
+ value=1536,
75
+ advanced=True,
76
+ required=True,
77
+ ),
78
+ DropdownInput(
79
+ name="similarity",
80
+ display_name="Similarity",
81
+ options=SIMILARITY_OPTIONS,
82
+ value=SIMILARITY_OPTIONS[0],
83
+ info="The method used to measure the similarity between vectors.",
84
+ advanced=True,
85
+ ),
86
+ DropdownInput(
87
+ name="quantization",
88
+ display_name="Quantization",
89
+ options=QUANTIZATION_OPTIONS,
90
+ value=None,
91
+ info="Quantization reduces memory costs converting 32-bit floats to smaller data types",
92
+ advanced=True,
93
+ ),
94
+ ]
95
+
96
+ @check_cached_vector_store
97
+ def build_vector_store(self) -> MongoDBAtlasVectorSearch:
98
+ try:
99
+ from pymongo import MongoClient
100
+ except ImportError as e:
101
+ msg = "Please install pymongo to use MongoDB Atlas Vector Store"
102
+ raise ImportError(msg) from e
103
+
104
+ # Create temporary files for the client certificate
105
+ if self.enable_mtls:
106
+ client_cert_path = None
107
+ try:
108
+ client_cert = self.mongodb_atlas_client_cert.replace(" ", "\n")
109
+ client_cert = client_cert.replace("-----BEGIN\nPRIVATE\nKEY-----", "-----BEGIN PRIVATE KEY-----")
110
+ client_cert = client_cert.replace(
111
+ "-----END\nPRIVATE\nKEY-----\n-----BEGIN\nCERTIFICATE-----",
112
+ "-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----",
113
+ )
114
+ client_cert = client_cert.replace("-----END\nCERTIFICATE-----", "-----END CERTIFICATE-----")
115
+ with tempfile.NamedTemporaryFile(delete=False) as client_cert_file:
116
+ client_cert_file.write(client_cert.encode("utf-8"))
117
+ client_cert_path = client_cert_file.name
118
+
119
+ except Exception as e:
120
+ msg = f"Failed to write certificate to temporary file: {e}"
121
+ raise ValueError(msg) from e
122
+
123
+ try:
124
+ mongo_client: MongoClient = (
125
+ MongoClient(
126
+ self.mongodb_atlas_cluster_uri,
127
+ tls=True,
128
+ tlsCertificateKeyFile=client_cert_path,
129
+ tlsCAFile=certifi.where(),
130
+ )
131
+ if self.enable_mtls
132
+ else MongoClient(self.mongodb_atlas_cluster_uri)
133
+ )
134
+
135
+ collection = mongo_client[self.db_name][self.collection_name]
136
+
137
+ except Exception as e:
138
+ msg = f"Failed to connect to MongoDB Atlas: {e}"
139
+ raise ValueError(msg) from e
140
+
141
+ # Convert DataFrame to Data if needed using parent's method
142
+ self.ingest_data = self._prepare_ingest_data()
143
+
144
+ documents = []
145
+ for _input in self.ingest_data or []:
146
+ if isinstance(_input, Data):
147
+ documents.append(_input.to_lc_document())
148
+ else:
149
+ documents.append(_input)
150
+
151
+ if documents:
152
+ self.__insert_mode(collection)
153
+
154
+ return MongoDBAtlasVectorSearch.from_documents(
155
+ documents=documents, embedding=self.embedding, collection=collection, index_name=self.index_name
156
+ )
157
+ return MongoDBAtlasVectorSearch(embedding=self.embedding, collection=collection, index_name=self.index_name)
158
+
159
+ def search_documents(self) -> list[Data]:
160
+ from bson.objectid import ObjectId
161
+
162
+ vector_store = self.build_vector_store()
163
+
164
+ self.verify_search_index(vector_store._collection)
165
+
166
+ if self.search_query and isinstance(self.search_query, str):
167
+ docs = vector_store.similarity_search(
168
+ query=self.search_query,
169
+ k=self.number_of_results,
170
+ )
171
+ for doc in docs:
172
+ doc.metadata = {
173
+ key: str(value) if isinstance(value, ObjectId) else value for key, value in doc.metadata.items()
174
+ }
175
+
176
+ data = docs_to_data(docs)
177
+ self.status = data
178
+ return data
179
+ return []
180
+
181
+ def __insert_mode(self, collection: Collection) -> None:
182
+ if self.insert_mode == "overwrite":
183
+ collection.delete_many({}) # Delete all documents while preserving collection structure
184
+
185
+ def verify_search_index(self, collection: Collection) -> None:
186
+ """Verify if the search index exists, if not, create it.
187
+
188
+ Args:
189
+ collection (Collection): The collection to verify the search index on.
190
+ """
191
+ indexes = collection.list_search_indexes()
192
+
193
+ index_names_types = {idx["name"]: idx["type"] for idx in indexes}
194
+ index_names = list(index_names_types.keys())
195
+ index_type = index_names_types.get(self.index_name)
196
+ if self.index_name not in index_names and index_type != "vectorSearch":
197
+ collection.create_search_index(self.__create_index_definition())
198
+
199
+ time.sleep(20) # Give some time for index to be ready
200
+
201
+ def __create_index_definition(self) -> SearchIndexModel:
202
+ fields = [
203
+ {
204
+ "type": "vector",
205
+ "path": self.index_field,
206
+ "numDimensions": self.number_dimensions,
207
+ "similarity": self.similarity,
208
+ "quantization": self.quantization,
209
+ }
210
+ ]
211
+ if self.filter_field:
212
+ fields.append({"type": "filter", "path": self.filter_field})
213
+ return SearchIndexModel(definition={"fields": fields}, name=self.index_name, type="vectorSearch")
@@ -0,0 +1,243 @@
1
+ import json
2
+ from typing import Any
3
+
4
+ from langchain_community.vectorstores import OpenSearchVectorSearch
5
+
6
+ from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
7
+ from lfx.base.vectorstores.vector_store_connection_decorator import vector_store_connection
8
+ from lfx.io import (
9
+ BoolInput,
10
+ DropdownInput,
11
+ FloatInput,
12
+ HandleInput,
13
+ IntInput,
14
+ MultilineInput,
15
+ SecretStrInput,
16
+ StrInput,
17
+ )
18
+ from lfx.schema.data import Data
19
+
20
+
21
+ @vector_store_connection
22
+ class OpenSearchVectorStoreComponent(LCVectorStoreComponent):
23
+ """OpenSearch Vector Store with advanced, customizable search capabilities."""
24
+
25
+ display_name: str = "OpenSearch"
26
+ description: str = "OpenSearch Vector Store with advanced, customizable search capabilities."
27
+ name = "OpenSearch"
28
+ icon = "OpenSearch"
29
+
30
+ inputs = [
31
+ StrInput(
32
+ name="opensearch_url",
33
+ display_name="OpenSearch URL",
34
+ value="http://localhost:9200",
35
+ info="URL for OpenSearch cluster (e.g. https://192.168.1.1:9200).",
36
+ ),
37
+ StrInput(
38
+ name="index_name",
39
+ display_name="Index Name",
40
+ value="langflow",
41
+ info="The index name where the vectors will be stored in OpenSearch cluster.",
42
+ ),
43
+ *LCVectorStoreComponent.inputs,
44
+ HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
45
+ DropdownInput(
46
+ name="search_type",
47
+ display_name="Search Type",
48
+ options=["similarity", "similarity_score_threshold", "mmr"],
49
+ value="similarity",
50
+ advanced=True,
51
+ ),
52
+ IntInput(
53
+ name="number_of_results",
54
+ display_name="Number of Results",
55
+ info="Number of results to return.",
56
+ advanced=True,
57
+ value=4,
58
+ ),
59
+ FloatInput(
60
+ name="search_score_threshold",
61
+ display_name="Search Score Threshold",
62
+ info="Minimum similarity score threshold for search results.",
63
+ value=0.0,
64
+ advanced=True,
65
+ ),
66
+ StrInput(
67
+ name="username",
68
+ display_name="Username",
69
+ value="admin",
70
+ advanced=True,
71
+ ),
72
+ SecretStrInput(
73
+ name="password",
74
+ display_name="Password",
75
+ value="admin",
76
+ advanced=True,
77
+ ),
78
+ BoolInput(
79
+ name="use_ssl",
80
+ display_name="Use SSL",
81
+ value=True,
82
+ advanced=True,
83
+ ),
84
+ BoolInput(
85
+ name="verify_certs",
86
+ display_name="Verify Certificates",
87
+ value=False,
88
+ advanced=True,
89
+ ),
90
+ MultilineInput(
91
+ name="hybrid_search_query",
92
+ display_name="Hybrid Search Query",
93
+ value="",
94
+ advanced=True,
95
+ info=(
96
+ "Provide a custom hybrid search query in JSON format. This allows you to combine "
97
+ "vector similarity and keyword matching."
98
+ ),
99
+ ),
100
+ ]
101
+
102
+ @check_cached_vector_store
103
+ def build_vector_store(self) -> OpenSearchVectorSearch:
104
+ """Builds the OpenSearch Vector Store object."""
105
+ try:
106
+ from langchain_community.vectorstores import OpenSearchVectorSearch
107
+ except ImportError as e:
108
+ error_message = f"Failed to import required modules: {e}"
109
+ self.log(error_message)
110
+ raise ImportError(error_message) from e
111
+
112
+ try:
113
+ opensearch = OpenSearchVectorSearch(
114
+ index_name=self.index_name,
115
+ embedding_function=self.embedding,
116
+ opensearch_url=self.opensearch_url,
117
+ http_auth=(self.username, self.password),
118
+ use_ssl=self.use_ssl,
119
+ verify_certs=self.verify_certs,
120
+ ssl_assert_hostname=False,
121
+ ssl_show_warn=False,
122
+ )
123
+ except Exception as e:
124
+ error_message = f"Failed to create OpenSearchVectorSearch instance: {e}"
125
+ self.log(error_message)
126
+ raise RuntimeError(error_message) from e
127
+
128
+ if self.ingest_data:
129
+ self._add_documents_to_vector_store(opensearch)
130
+
131
+ return opensearch
132
+
133
+ def _add_documents_to_vector_store(self, vector_store: "OpenSearchVectorSearch") -> None:
134
+ """Adds documents to the Vector Store."""
135
+ # Convert DataFrame to Data if needed using parent's method
136
+ self.ingest_data = self._prepare_ingest_data()
137
+
138
+ documents = []
139
+ for _input in self.ingest_data or []:
140
+ if isinstance(_input, Data):
141
+ documents.append(_input.to_lc_document())
142
+ else:
143
+ error_message = f"Expected Data object, got {type(_input)}"
144
+ self.log(error_message)
145
+ raise TypeError(error_message)
146
+
147
+ if documents and self.embedding is not None:
148
+ self.log(f"Adding {len(documents)} documents to the Vector Store.")
149
+ try:
150
+ vector_store.add_documents(documents)
151
+ except Exception as e:
152
+ error_message = f"Error adding documents to Vector Store: {e}"
153
+ self.log(error_message)
154
+ raise RuntimeError(error_message) from e
155
+ else:
156
+ self.log("No documents to add to the Vector Store.")
157
+
158
+ def search(self, query: str | None = None) -> list[dict[str, Any]]:
159
+ """Search for similar documents in the vector store or retrieve all documents if no query is provided."""
160
+ try:
161
+ vector_store = self.build_vector_store()
162
+
163
+ query = query or ""
164
+
165
+ if self.hybrid_search_query.strip():
166
+ try:
167
+ hybrid_query = json.loads(self.hybrid_search_query)
168
+ except json.JSONDecodeError as e:
169
+ error_message = f"Invalid hybrid search query JSON: {e}"
170
+ self.log(error_message)
171
+ raise ValueError(error_message) from e
172
+
173
+ results = vector_store.client.search(index=self.index_name, body=hybrid_query)
174
+
175
+ processed_results = []
176
+ for hit in results.get("hits", {}).get("hits", []):
177
+ source = hit.get("_source", {})
178
+ text = source.get("text", "")
179
+ metadata = source.get("metadata", {})
180
+
181
+ if isinstance(text, dict):
182
+ text = text.get("text", "")
183
+
184
+ processed_results.append(
185
+ {
186
+ "page_content": text,
187
+ "metadata": metadata,
188
+ }
189
+ )
190
+ return processed_results
191
+
192
+ search_kwargs = {"k": self.number_of_results}
193
+ search_type = self.search_type.lower()
194
+
195
+ if search_type == "similarity":
196
+ results = vector_store.similarity_search(query, **search_kwargs)
197
+ return [{"page_content": doc.page_content, "metadata": doc.metadata} for doc in results]
198
+ if search_type == "similarity_score_threshold":
199
+ search_kwargs["score_threshold"] = self.search_score_threshold
200
+ results = vector_store.similarity_search_with_relevance_scores(query, **search_kwargs)
201
+ return [
202
+ {
203
+ "page_content": doc.page_content,
204
+ "metadata": doc.metadata,
205
+ "score": score,
206
+ }
207
+ for doc, score in results
208
+ ]
209
+ if search_type == "mmr":
210
+ results = vector_store.max_marginal_relevance_search(query, **search_kwargs)
211
+ return [{"page_content": doc.page_content, "metadata": doc.metadata} for doc in results]
212
+
213
+ except Exception as e:
214
+ error_message = f"Error during search: {e}"
215
+ self.log(error_message)
216
+ raise RuntimeError(error_message) from e
217
+
218
+ error_message = f"Error during search. Invalid search type: {self.search_type}"
219
+ self.log(error_message)
220
+ raise ValueError(error_message)
221
+
222
+ def search_documents(self) -> list[Data]:
223
+ """Search for documents in the vector store based on the search input.
224
+
225
+ If no search input is provided, retrieve all documents.
226
+ """
227
+ try:
228
+ query = self.search_query.strip() if self.search_query else None
229
+ results = self.search(query)
230
+ retrieved_data = [
231
+ Data(
232
+ file_path=result["metadata"].get("file_path", ""),
233
+ text=result["page_content"],
234
+ )
235
+ for result in results
236
+ ]
237
+ except Exception as e:
238
+ error_message = f"Error during document search: {e}"
239
+ self.log(error_message)
240
+ raise RuntimeError(error_message) from e
241
+
242
+ self.status = retrieved_data
243
+ return retrieved_data
@@ -0,0 +1,72 @@
1
+ from langchain_community.vectorstores import PGVector
2
+
3
+ from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
4
+ from lfx.helpers.data import docs_to_data
5
+ from lfx.io import HandleInput, IntInput, SecretStrInput, StrInput
6
+ from lfx.schema.data import Data
7
+ from lfx.utils.connection_string_parser import transform_connection_string
8
+
9
+
10
+ class PGVectorStoreComponent(LCVectorStoreComponent):
11
+ display_name = "PGVector"
12
+ description = "PGVector Vector Store with search capabilities"
13
+ name = "pgvector"
14
+ icon = "cpu"
15
+
16
+ inputs = [
17
+ SecretStrInput(name="pg_server_url", display_name="PostgreSQL Server Connection String", required=True),
18
+ StrInput(name="collection_name", display_name="Table", required=True),
19
+ *LCVectorStoreComponent.inputs,
20
+ HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"], required=True),
21
+ IntInput(
22
+ name="number_of_results",
23
+ display_name="Number of Results",
24
+ info="Number of results to return.",
25
+ value=4,
26
+ advanced=True,
27
+ ),
28
+ ]
29
+
30
+ @check_cached_vector_store
31
+ def build_vector_store(self) -> PGVector:
32
+ # Convert DataFrame to Data if needed using parent's method
33
+ self.ingest_data = self._prepare_ingest_data()
34
+
35
+ documents = []
36
+ for _input in self.ingest_data or []:
37
+ if isinstance(_input, Data):
38
+ documents.append(_input.to_lc_document())
39
+ else:
40
+ documents.append(_input)
41
+
42
+ connection_string_parsed = transform_connection_string(self.pg_server_url)
43
+
44
+ if documents:
45
+ pgvector = PGVector.from_documents(
46
+ embedding=self.embedding,
47
+ documents=documents,
48
+ collection_name=self.collection_name,
49
+ connection_string=connection_string_parsed,
50
+ )
51
+ else:
52
+ pgvector = PGVector.from_existing_index(
53
+ embedding=self.embedding,
54
+ collection_name=self.collection_name,
55
+ connection_string=connection_string_parsed,
56
+ )
57
+
58
+ return pgvector
59
+
60
+ def search_documents(self) -> list[Data]:
61
+ vector_store = self.build_vector_store()
62
+
63
+ if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
64
+ docs = vector_store.similarity_search(
65
+ query=self.search_query,
66
+ k=self.number_of_results,
67
+ )
68
+
69
+ data = docs_to_data(docs)
70
+ self.status = data
71
+ return data
72
+ return []
@@ -0,0 +1,134 @@
1
+ import numpy as np
2
+ from langchain_core.vectorstores import VectorStore
3
+
4
+ from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
5
+ from lfx.helpers.data import docs_to_data
6
+ from lfx.io import DropdownInput, HandleInput, IntInput, SecretStrInput, StrInput
7
+ from lfx.schema.data import Data
8
+
9
+
10
+ class PineconeVectorStoreComponent(LCVectorStoreComponent):
11
+ display_name = "Pinecone"
12
+ description = "Pinecone Vector Store with search capabilities"
13
+ name = "Pinecone"
14
+ icon = "Pinecone"
15
+ inputs = [
16
+ StrInput(name="index_name", display_name="Index Name", required=True),
17
+ StrInput(name="namespace", display_name="Namespace", info="Namespace for the index."),
18
+ DropdownInput(
19
+ name="distance_strategy",
20
+ display_name="Distance Strategy",
21
+ options=["Cosine", "Euclidean", "Dot Product"],
22
+ value="Cosine",
23
+ advanced=True,
24
+ ),
25
+ SecretStrInput(name="pinecone_api_key", display_name="Pinecone API Key", required=True),
26
+ StrInput(
27
+ name="text_key",
28
+ display_name="Text Key",
29
+ info="Key in the record to use as text.",
30
+ value="text",
31
+ advanced=True,
32
+ ),
33
+ *LCVectorStoreComponent.inputs,
34
+ HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
35
+ IntInput(
36
+ name="number_of_results",
37
+ display_name="Number of Results",
38
+ info="Number of results to return.",
39
+ value=4,
40
+ advanced=True,
41
+ ),
42
+ ]
43
+
44
+ @check_cached_vector_store
45
+ def build_vector_store(self) -> VectorStore:
46
+ """Build and return a Pinecone vector store instance."""
47
+ try:
48
+ from langchain_pinecone import PineconeVectorStore
49
+ except ImportError as e:
50
+ msg = "langchain-pinecone is not installed. Please install it with `pip install langchain-pinecone`."
51
+ raise ValueError(msg) from e
52
+
53
+ try:
54
+ from langchain_pinecone._utilities import DistanceStrategy
55
+
56
+ # Wrap the embedding model to ensure float32 output
57
+ wrapped_embeddings = Float32Embeddings(self.embedding)
58
+
59
+ # Convert distance strategy
60
+ distance_strategy = self.distance_strategy.replace(" ", "_").upper()
61
+ distance_strategy = DistanceStrategy[distance_strategy]
62
+
63
+ # Initialize Pinecone instance with wrapped embeddings
64
+ pinecone = PineconeVectorStore(
65
+ index_name=self.index_name,
66
+ embedding=wrapped_embeddings, # Use wrapped embeddings
67
+ text_key=self.text_key,
68
+ namespace=self.namespace,
69
+ distance_strategy=distance_strategy,
70
+ pinecone_api_key=self.pinecone_api_key,
71
+ )
72
+ except Exception as e:
73
+ error_msg = "Error building Pinecone vector store"
74
+ raise ValueError(error_msg) from e
75
+ else:
76
+ self.ingest_data = self._prepare_ingest_data()
77
+
78
+ # Process documents if any
79
+ documents = []
80
+ if self.ingest_data:
81
+ # Convert DataFrame to Data if needed using parent's method
82
+
83
+ for doc in self.ingest_data:
84
+ if isinstance(doc, Data):
85
+ documents.append(doc.to_lc_document())
86
+ else:
87
+ documents.append(doc)
88
+
89
+ if documents:
90
+ pinecone.add_documents(documents)
91
+
92
+ return pinecone
93
+
94
+ def search_documents(self) -> list[Data]:
95
+ """Search documents in the vector store."""
96
+ try:
97
+ if not self.search_query or not isinstance(self.search_query, str) or not self.search_query.strip():
98
+ return []
99
+
100
+ vector_store = self.build_vector_store()
101
+ docs = vector_store.similarity_search(
102
+ query=self.search_query,
103
+ k=self.number_of_results,
104
+ )
105
+ except Exception as e:
106
+ error_msg = "Error searching documents"
107
+ raise ValueError(error_msg) from e
108
+ else:
109
+ data = docs_to_data(docs)
110
+ self.status = data
111
+ return data
112
+
113
+
114
+ class Float32Embeddings:
115
+ """Wrapper class to ensure float32 embeddings."""
116
+
117
+ def __init__(self, base_embeddings):
118
+ self.base_embeddings = base_embeddings
119
+
120
+ def embed_documents(self, texts):
121
+ embeddings = self.base_embeddings.embed_documents(texts)
122
+ if isinstance(embeddings, np.ndarray):
123
+ return [[self._force_float32(x) for x in vec] for vec in embeddings]
124
+ return [[self._force_float32(x) for x in vec] for vec in embeddings]
125
+
126
+ def embed_query(self, text):
127
+ embedding = self.base_embeddings.embed_query(text)
128
+ if isinstance(embedding, np.ndarray):
129
+ return [self._force_float32(x) for x in embedding]
130
+ return [self._force_float32(x) for x in embedding]
131
+
132
+ def _force_float32(self, value):
133
+ """Convert any numeric type to Python float."""
134
+ return float(np.float32(value))