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,3 @@
1
+ from .needle import NeedleComponent
2
+
3
+ __all__ = ["NeedleComponent"]
@@ -0,0 +1,104 @@
1
+ from langchain_community.retrievers.needle import NeedleRetriever
2
+
3
+ from lfx.custom.custom_component.component import Component
4
+ from lfx.io import IntInput, MessageTextInput, Output, SecretStrInput
5
+ from lfx.schema.message import Message
6
+ from lfx.utils.constants import MESSAGE_SENDER_AI
7
+
8
+
9
+ class NeedleComponent(Component):
10
+ display_name = "Needle Retriever"
11
+ description = "A retriever that uses the Needle API to search collections."
12
+ documentation = "https://docs.needle-ai.com"
13
+ icon = "Needle"
14
+ name = "needle"
15
+
16
+ inputs = [
17
+ SecretStrInput(
18
+ name="needle_api_key",
19
+ display_name="Needle API Key",
20
+ info="Your Needle API key.",
21
+ required=True,
22
+ ),
23
+ MessageTextInput(
24
+ name="collection_id",
25
+ display_name="Collection ID",
26
+ info="The ID of the Needle collection.",
27
+ required=True,
28
+ ),
29
+ MessageTextInput(
30
+ name="query",
31
+ display_name="User Query",
32
+ info="Enter your question here. In tool mode, you can also specify top_k parameter (min: 20).",
33
+ required=True,
34
+ tool_mode=True,
35
+ ),
36
+ IntInput(
37
+ name="top_k",
38
+ display_name="Top K Results",
39
+ info="Number of search results to return (min: 20).",
40
+ value=20,
41
+ required=True,
42
+ ),
43
+ ]
44
+
45
+ outputs = [Output(display_name="Result", name="result", type_="Message", method="run")]
46
+
47
+ def run(self) -> Message:
48
+ # Extract query and top_k
49
+ query_input = self.query
50
+ actual_query = query_input.get("query", "") if isinstance(query_input, dict) else query_input
51
+
52
+ # Parse top_k from tool input or use default, always enforcing minimum of 20
53
+ try:
54
+ if isinstance(query_input, dict) and "top_k" in query_input:
55
+ agent_top_k = query_input.get("top_k")
56
+ # Check if agent_top_k is not None before converting to int
57
+ top_k = max(20, int(agent_top_k)) if agent_top_k is not None else max(20, self.top_k)
58
+ else:
59
+ top_k = max(20, self.top_k)
60
+ except (ValueError, TypeError):
61
+ top_k = max(20, self.top_k)
62
+
63
+ # Validate required inputs
64
+ if not self.needle_api_key or not self.needle_api_key.strip():
65
+ error_msg = "The Needle API key cannot be empty."
66
+ raise ValueError(error_msg)
67
+ if not self.collection_id or not self.collection_id.strip():
68
+ error_msg = "The Collection ID cannot be empty."
69
+ raise ValueError(error_msg)
70
+ if not actual_query or not actual_query.strip():
71
+ error_msg = "The query cannot be empty."
72
+ raise ValueError(error_msg)
73
+
74
+ try:
75
+ # Initialize the retriever and get documents
76
+ retriever = NeedleRetriever(
77
+ needle_api_key=self.needle_api_key,
78
+ collection_id=self.collection_id,
79
+ top_k=top_k,
80
+ )
81
+
82
+ docs = retriever.get_relevant_documents(actual_query)
83
+
84
+ # Format the response
85
+ if not docs:
86
+ text_content = "No relevant documents found for the query."
87
+ else:
88
+ context = "\n\n".join([f"Document {i + 1}:\n{doc.page_content}" for i, doc in enumerate(docs)])
89
+ text_content = f"Question: {actual_query}\n\nContext:\n{context}"
90
+
91
+ # Return formatted message
92
+ return Message(
93
+ text=text_content,
94
+ type="assistant",
95
+ sender=MESSAGE_SENDER_AI,
96
+ additional_kwargs={
97
+ "source_documents": [{"page_content": doc.page_content, "metadata": doc.metadata} for doc in docs],
98
+ "top_k_used": top_k,
99
+ },
100
+ )
101
+
102
+ except Exception as e:
103
+ error_msg = f"Error processing query: {e!s}"
104
+ raise ValueError(error_msg) from e
@@ -0,0 +1,34 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from lfx.components._importing import import_mod
6
+
7
+ if TYPE_CHECKING:
8
+ from lfx.components.notdiamond.notdiamond import NotDiamondComponent
9
+
10
+ _dynamic_imports = {
11
+ "NotDiamondComponent": "notdiamond",
12
+ }
13
+
14
+ __all__ = [
15
+ "NotDiamondComponent",
16
+ ]
17
+
18
+
19
+ def __getattr__(attr_name: str) -> Any:
20
+ """Lazily import notdiamond components on attribute access."""
21
+ if attr_name not in _dynamic_imports:
22
+ msg = f"module '{__name__}' has no attribute '{attr_name}'"
23
+ raise AttributeError(msg)
24
+ try:
25
+ result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
26
+ except (ModuleNotFoundError, ImportError, AttributeError) as e:
27
+ msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
28
+ raise AttributeError(msg) from e
29
+ globals()[attr_name] = result
30
+ return result
31
+
32
+
33
+ def __dir__() -> list[str]:
34
+ return list(__all__)
@@ -0,0 +1,228 @@
1
+ import warnings
2
+
3
+ import requests
4
+ from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, SystemMessage
5
+ from pydantic.v1 import SecretStr
6
+
7
+ from lfx.base.models.chat_result import get_chat_result
8
+ from lfx.base.models.model_utils import get_model_name
9
+ from lfx.custom.custom_component.component import Component
10
+ from lfx.io import (
11
+ BoolInput,
12
+ DropdownInput,
13
+ HandleInput,
14
+ MessageInput,
15
+ MessageTextInput,
16
+ Output,
17
+ SecretStrInput,
18
+ StrInput,
19
+ )
20
+ from lfx.schema.message import Message
21
+
22
+ ND_MODEL_MAPPING = {
23
+ "gpt-4o": {"provider": "openai", "model": "gpt-4o"},
24
+ "gpt-4o-mini": {"provider": "openai", "model": "gpt-4o-mini"},
25
+ "gpt-4-turbo": {"provider": "openai", "model": "gpt-4-turbo-2024-04-09"},
26
+ "claude-3-5-haiku-20241022": {"provider": "anthropic", "model": "claude-3-5-haiku-20241022"},
27
+ "claude-3-5-sonnet-20241022": {"provider": "anthropic", "model": "claude-3-5-sonnet-20241022"},
28
+ "anthropic.claude-3-5-sonnet-20241022-v2:0": {"provider": "anthropic", "model": "claude-3-5-sonnet-20241022"},
29
+ "anthropic.claude-3-5-haiku-20241022-v1:0": {"provider": "anthropic", "model": "claude-3-5-haiku-20241022"},
30
+ "gemini-1.5-pro": {"provider": "google", "model": "gemini-1.5-pro-latest"},
31
+ "gemini-1.5-flash": {"provider": "google", "model": "gemini-1.5-flash-latest"},
32
+ "llama-3.1-sonar-large-128k-online": {"provider": "perplexity", "model": "llama-3.1-sonar-large-128k-online"},
33
+ "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo": {
34
+ "provider": "togetherai",
35
+ "model": "Meta-Llama-3.1-70B-Instruct-Turbo",
36
+ },
37
+ "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo": {
38
+ "provider": "togetherai",
39
+ "model": "Meta-Llama-3.1-405B-Instruct-Turbo",
40
+ },
41
+ "mistral-large-latest": {"provider": "mistral", "model": "mistral-large-2407"},
42
+ }
43
+
44
+
45
+ class NotDiamondComponent(Component):
46
+ display_name = "Not Diamond Router"
47
+ description = "Call the right model at the right time with the world's most powerful AI model router."
48
+ documentation: str = "https://docs.notdiamond.ai/"
49
+ icon = "NotDiamond"
50
+ name = "NotDiamond"
51
+
52
+ def __init__(self, *args, **kwargs):
53
+ super().__init__(*args, **kwargs)
54
+ self._selected_model_name = None
55
+
56
+ inputs = [
57
+ MessageInput(name="input_value", display_name="Input", required=True),
58
+ MessageTextInput(
59
+ name="system_message",
60
+ display_name="System Message",
61
+ info="System message to pass to the model.",
62
+ advanced=False,
63
+ ),
64
+ HandleInput(
65
+ name="models",
66
+ display_name="Language Models",
67
+ input_types=["LanguageModel"],
68
+ required=True,
69
+ is_list=True,
70
+ info="Link the models you want to route between.",
71
+ ),
72
+ SecretStrInput(
73
+ name="api_key",
74
+ display_name="Not Diamond API Key",
75
+ info="The Not Diamond API Key to use for routing.",
76
+ advanced=False,
77
+ value="NOTDIAMOND_API_KEY",
78
+ required=True,
79
+ ),
80
+ StrInput(
81
+ name="preference_id",
82
+ display_name="Preference ID",
83
+ info="The ID of the router preference that was configured via the Dashboard.",
84
+ advanced=False,
85
+ ),
86
+ DropdownInput(
87
+ name="tradeoff",
88
+ display_name="Tradeoff",
89
+ info="The tradeoff between cost and latency for the router to determine the best LLM for a given query.",
90
+ advanced=False,
91
+ options=["quality", "cost", "latency"],
92
+ value="quality",
93
+ ),
94
+ BoolInput(
95
+ name="hash_content",
96
+ display_name="Hash Content",
97
+ info="Whether to hash the content before being sent to the NotDiamond API.",
98
+ advanced=False,
99
+ value=False,
100
+ ),
101
+ ]
102
+
103
+ outputs = [
104
+ Output(display_name="Output", name="output", method="model_select"),
105
+ Output(
106
+ display_name="Selected Model",
107
+ name="selected_model",
108
+ method="get_selected_model",
109
+ required_inputs=["output"],
110
+ ),
111
+ ]
112
+
113
+ def get_selected_model(self) -> str:
114
+ return self._selected_model_name
115
+
116
+ def model_select(self) -> Message:
117
+ api_key = SecretStr(self.api_key).get_secret_value() if self.api_key else None
118
+ input_value = self.input_value
119
+ system_message = self.system_message
120
+ messages = self._format_input(input_value, system_message)
121
+
122
+ selected_models = []
123
+ mapped_selected_models = []
124
+ for model in self.models:
125
+ model_name = get_model_name(model)
126
+
127
+ if model_name in ND_MODEL_MAPPING:
128
+ selected_models.append(model)
129
+ mapped_selected_models.append(ND_MODEL_MAPPING[model_name])
130
+
131
+ payload = {
132
+ "messages": messages,
133
+ "llm_providers": mapped_selected_models,
134
+ "hash_content": self.hash_content,
135
+ }
136
+
137
+ if self.tradeoff != "quality":
138
+ payload["tradeoff"] = self.tradeoff
139
+
140
+ if self.preference_id and self.preference_id != "":
141
+ payload["preference_id"] = self.preference_id
142
+
143
+ header = {
144
+ "Authorization": f"Bearer {api_key}",
145
+ "accept": "application/json",
146
+ "content-type": "application/json",
147
+ }
148
+
149
+ response = requests.post(
150
+ "https://api.notdiamond.ai/v2/modelRouter/modelSelect",
151
+ json=payload,
152
+ headers=header,
153
+ timeout=10,
154
+ )
155
+
156
+ result = response.json()
157
+ chosen_model = self.models[0] # By default there is a fallback model
158
+ self._selected_model_name = get_model_name(chosen_model)
159
+
160
+ if "providers" not in result:
161
+ # No provider returned by NotDiamond API, likely failed. Fallback to first model.
162
+ return self._call_get_chat_result(chosen_model, input_value, system_message)
163
+
164
+ providers = result["providers"]
165
+
166
+ if len(providers) == 0:
167
+ # No provider returned by NotDiamond API, likely failed. Fallback to first model.
168
+ return self._call_get_chat_result(chosen_model, input_value, system_message)
169
+
170
+ nd_result = providers[0]
171
+
172
+ for nd_model, selected_model in zip(mapped_selected_models, selected_models, strict=False):
173
+ if nd_model["provider"] == nd_result["provider"] and nd_model["model"] == nd_result["model"]:
174
+ chosen_model = selected_model
175
+ self._selected_model_name = get_model_name(chosen_model)
176
+ break
177
+
178
+ return self._call_get_chat_result(chosen_model, input_value, system_message)
179
+
180
+ def _call_get_chat_result(self, chosen_model, input_value, system_message):
181
+ return get_chat_result(
182
+ runnable=chosen_model,
183
+ input_value=input_value,
184
+ system_message=system_message,
185
+ )
186
+
187
+ def _format_input(
188
+ self,
189
+ input_value: str | Message,
190
+ system_message: str | None = None,
191
+ ):
192
+ messages: list[BaseMessage] = []
193
+ if not input_value and not system_message:
194
+ msg = "The message you want to send to the router is empty."
195
+ raise ValueError(msg)
196
+ system_message_added = False
197
+ if input_value:
198
+ if isinstance(input_value, Message):
199
+ with warnings.catch_warnings():
200
+ warnings.simplefilter("ignore")
201
+ if "prompt" in input_value:
202
+ prompt = input_value.load_lc_prompt()
203
+ if system_message:
204
+ prompt.messages = [
205
+ SystemMessage(content=system_message),
206
+ *prompt.messages, # type: ignore[has-type]
207
+ ]
208
+ system_message_added = True
209
+ messages.extend(prompt.messages)
210
+ else:
211
+ messages.append(input_value.to_lc_message())
212
+ else:
213
+ messages.append(HumanMessage(content=input_value))
214
+
215
+ if system_message and not system_message_added:
216
+ messages.insert(0, SystemMessage(content=system_message))
217
+
218
+ # Convert Langchain messages to OpenAI format
219
+ openai_messages = []
220
+ for msg in messages:
221
+ if isinstance(msg, HumanMessage):
222
+ openai_messages.append({"role": "user", "content": msg.content})
223
+ elif isinstance(msg, AIMessage):
224
+ openai_messages.append({"role": "assistant", "content": msg.content})
225
+ elif isinstance(msg, SystemMessage):
226
+ openai_messages.append({"role": "system", "content": msg.content})
227
+
228
+ return openai_messages
@@ -0,0 +1,32 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from lfx.components._importing import import_mod
6
+
7
+ if TYPE_CHECKING:
8
+ from lfx.components.novita.novita import NovitaModelComponent
9
+
10
+ _dynamic_imports = {
11
+ "NovitaModelComponent": "novita",
12
+ }
13
+
14
+ __all__ = ["NovitaModelComponent"]
15
+
16
+
17
+ def __getattr__(attr_name: str) -> Any:
18
+ """Lazily import novita components on attribute access."""
19
+ if attr_name not in _dynamic_imports:
20
+ msg = f"module '{__name__}' has no attribute '{attr_name}'"
21
+ raise AttributeError(msg)
22
+ try:
23
+ result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
24
+ except (ModuleNotFoundError, ImportError, AttributeError) as e:
25
+ msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
26
+ raise AttributeError(msg) from e
27
+ globals()[attr_name] = result
28
+ return result
29
+
30
+
31
+ def __dir__() -> list[str]:
32
+ return list(__all__)