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,314 @@
1
+ import json
2
+ import urllib
3
+ from datetime import datetime, timezone
4
+ from http import HTTPStatus
5
+ from typing import Any
6
+
7
+ import requests
8
+ from langchain_core.tools import StructuredTool, Tool
9
+ from pydantic import BaseModel, Field, create_model
10
+
11
+ from lfx.base.langchain_utilities.model import LCToolComponent
12
+ from lfx.io import DictInput, IntInput, SecretStrInput, StrInput, TableInput
13
+ from lfx.log.logger import logger
14
+ from lfx.schema.data import Data
15
+ from lfx.schema.table import EditMode
16
+
17
+
18
+ class AstraDBCQLToolComponent(LCToolComponent):
19
+ display_name: str = "Astra DB CQL"
20
+ description: str = "Create a tool to get transactional data from DataStax Astra DB CQL Table"
21
+ documentation: str = "https://docs.langflow.org/Components/components-tools#astra-db-cql-tool"
22
+ icon: str = "AstraDB"
23
+
24
+ inputs = [
25
+ StrInput(name="tool_name", display_name="Tool Name", info="The name of the tool.", required=True),
26
+ StrInput(
27
+ name="tool_description",
28
+ display_name="Tool Description",
29
+ info="The tool description to be passed to the model.",
30
+ required=True,
31
+ ),
32
+ StrInput(
33
+ name="keyspace",
34
+ display_name="Keyspace",
35
+ value="default_keyspace",
36
+ info="The keyspace name within Astra DB where the data is stored.",
37
+ required=True,
38
+ advanced=True,
39
+ ),
40
+ StrInput(
41
+ name="table_name",
42
+ display_name="Table Name",
43
+ info="The name of the table within Astra DB where the data is stored.",
44
+ required=True,
45
+ ),
46
+ SecretStrInput(
47
+ name="token",
48
+ display_name="Astra DB Application Token",
49
+ info="Authentication token for accessing Astra DB.",
50
+ value="ASTRA_DB_APPLICATION_TOKEN",
51
+ required=True,
52
+ ),
53
+ StrInput(
54
+ name="api_endpoint",
55
+ display_name="API Endpoint",
56
+ info="API endpoint URL for the Astra DB service.",
57
+ value="ASTRA_DB_API_ENDPOINT",
58
+ required=True,
59
+ ),
60
+ StrInput(
61
+ name="projection_fields",
62
+ display_name="Projection fields",
63
+ info="Attributes to return separated by comma.",
64
+ required=True,
65
+ value="*",
66
+ advanced=True,
67
+ ),
68
+ TableInput(
69
+ name="tools_params",
70
+ display_name="Tools Parameters",
71
+ info="Define the structure for the tool parameters. Describe the parameters "
72
+ "in a way the LLM can understand how to use them. Add the parameters "
73
+ "respecting the table schema (Partition Keys, Clustering Keys and Indexed Fields).",
74
+ required=False,
75
+ table_schema=[
76
+ {
77
+ "name": "name",
78
+ "display_name": "Name",
79
+ "type": "str",
80
+ "description": "Name of the field/parameter to be used by the model.",
81
+ "default": "field",
82
+ "edit_mode": EditMode.INLINE,
83
+ },
84
+ {
85
+ "name": "field_name",
86
+ "display_name": "Field Name",
87
+ "type": "str",
88
+ "description": "Specify the column name to be filtered on the table. "
89
+ "Leave empty if the attribute name is the same as the name of the field.",
90
+ "default": "",
91
+ "edit_mode": EditMode.INLINE,
92
+ },
93
+ {
94
+ "name": "description",
95
+ "display_name": "Description",
96
+ "type": "str",
97
+ "description": "Describe the purpose of the parameter.",
98
+ "default": "description of tool parameter",
99
+ "edit_mode": EditMode.POPOVER,
100
+ },
101
+ {
102
+ "name": "mandatory",
103
+ "display_name": "Is Mandatory",
104
+ "type": "boolean",
105
+ "edit_mode": EditMode.INLINE,
106
+ "description": ("Indicate if the field is mandatory."),
107
+ "options": ["True", "False"],
108
+ "default": "False",
109
+ },
110
+ {
111
+ "name": "is_timestamp",
112
+ "display_name": "Is Timestamp",
113
+ "type": "boolean",
114
+ "edit_mode": EditMode.INLINE,
115
+ "description": ("Indicate if the field is a timestamp."),
116
+ "options": ["True", "False"],
117
+ "default": "False",
118
+ },
119
+ {
120
+ "name": "operator",
121
+ "display_name": "Operator",
122
+ "type": "str",
123
+ "description": "Set the operator for the field. "
124
+ "https://docs.datastax.com/en/astra-db-serverless/api-reference/documents.html#operators",
125
+ "default": "$eq",
126
+ "options": ["$gt", "$gte", "$lt", "$lte", "$eq", "$ne", "$in", "$nin", "$exists", "$all", "$size"],
127
+ "edit_mode": EditMode.INLINE,
128
+ },
129
+ ],
130
+ value=[],
131
+ ),
132
+ DictInput(
133
+ name="partition_keys",
134
+ display_name="DEPRECATED: Partition Keys",
135
+ is_list=True,
136
+ info="Field name and description to the model",
137
+ required=False,
138
+ advanced=True,
139
+ ),
140
+ DictInput(
141
+ name="clustering_keys",
142
+ display_name="DEPRECATED: Clustering Keys",
143
+ is_list=True,
144
+ info="Field name and description to the model",
145
+ required=False,
146
+ advanced=True,
147
+ ),
148
+ DictInput(
149
+ name="static_filters",
150
+ display_name="Static Filters",
151
+ is_list=True,
152
+ advanced=True,
153
+ info="Field name and value. When filled, it will not be generated by the LLM.",
154
+ ),
155
+ IntInput(
156
+ name="number_of_results",
157
+ display_name="Number of Results",
158
+ info="Number of results to return.",
159
+ advanced=True,
160
+ value=5,
161
+ ),
162
+ ]
163
+
164
+ def parse_timestamp(self, timestamp_str: str) -> str:
165
+ """Parse a timestamp string into Astra DB REST API format.
166
+
167
+ Args:
168
+ timestamp_str (str): Input timestamp string
169
+
170
+ Returns:
171
+ str: Formatted timestamp string in YYYY-MM-DDTHH:MI:SS.000Z format
172
+
173
+ Raises:
174
+ ValueError: If the timestamp cannot be parsed
175
+ """
176
+ # Common datetime formats to try
177
+ formats = [
178
+ "%Y-%m-%d", # 2024-03-21
179
+ "%Y-%m-%dT%H:%M:%S", # 2024-03-21T15:30:00
180
+ "%Y-%m-%dT%H:%M:%S%z", # 2024-03-21T15:30:00+0000
181
+ "%Y-%m-%d %H:%M:%S", # 2024-03-21 15:30:00
182
+ "%d/%m/%Y", # 21/03/2024
183
+ "%Y/%m/%d", # 2024/03/21
184
+ ]
185
+
186
+ for fmt in formats:
187
+ try:
188
+ # Parse the date string
189
+ date_obj = datetime.strptime(timestamp_str, fmt).astimezone()
190
+
191
+ # If the parsed date has no timezone info, assume UTC
192
+ if date_obj.tzinfo is None:
193
+ date_obj = date_obj.replace(tzinfo=timezone.utc)
194
+
195
+ # Convert to UTC and format
196
+ utc_date = date_obj.astimezone(timezone.utc)
197
+ return utc_date.strftime("%Y-%m-%dT%H:%M:%S.000Z")
198
+ except ValueError:
199
+ continue
200
+
201
+ msg = f"Could not parse date: {timestamp_str}"
202
+ logger.error(msg)
203
+ raise ValueError(msg)
204
+
205
+ def astra_rest(self, args):
206
+ headers = {"Accept": "application/json", "X-Cassandra-Token": f"{self.token}"}
207
+ astra_url = f"{self.api_endpoint}/api/rest/v2/keyspaces/{self.keyspace}/{self.table_name}/"
208
+ where = {}
209
+
210
+ for param in self.tools_params:
211
+ field_name = param["field_name"] if param["field_name"] else param["name"]
212
+ field_value = None
213
+
214
+ if field_name in self.static_filters:
215
+ field_value = self.static_filters[field_name]
216
+ elif param["name"] in args:
217
+ field_value = args[param["name"]]
218
+
219
+ if field_value is None:
220
+ continue
221
+
222
+ if param["is_timestamp"] == True: # noqa: E712
223
+ try:
224
+ field_value = self.parse_timestamp(field_value)
225
+ except ValueError as e:
226
+ msg = f"Error parsing timestamp: {e} - Use the prompt to specify the date in the correct format"
227
+ logger.error(msg)
228
+ raise ValueError(msg) from e
229
+
230
+ if param["operator"] == "$exists":
231
+ where[field_name] = {**where.get(field_name, {}), param["operator"]: True}
232
+ elif param["operator"] in ["$in", "$nin", "$all"]:
233
+ where[field_name] = {
234
+ **where.get(field_name, {}),
235
+ param["operator"]: field_value.split(",") if isinstance(field_value, str) else field_value,
236
+ }
237
+ else:
238
+ where[field_name] = {**where.get(field_name, {}), param["operator"]: field_value}
239
+
240
+ url = f"{astra_url}?page-size={self.number_of_results}"
241
+ url += f"&where={json.dumps(where)}"
242
+
243
+ if self.projection_fields != "*":
244
+ url += f"&fields={urllib.parse.quote(self.projection_fields.replace(' ', ''))}"
245
+
246
+ res = requests.request("GET", url=url, headers=headers, timeout=10)
247
+
248
+ if int(res.status_code) >= HTTPStatus.BAD_REQUEST:
249
+ msg = f"Error on Astra DB CQL Tool {self.tool_name} request: {res.text}"
250
+ logger.error(msg)
251
+ raise ValueError(msg)
252
+
253
+ try:
254
+ res_data = res.json()
255
+ return res_data["data"]
256
+ except ValueError:
257
+ return res.status_code
258
+
259
+ def create_args_schema(self) -> dict[str, BaseModel]:
260
+ args: dict[str, tuple[Any, Field]] = {}
261
+
262
+ for param in self.tools_params:
263
+ field_name = param["field_name"] if param["field_name"] else param["name"]
264
+ if field_name not in self.static_filters:
265
+ if param["mandatory"]:
266
+ args[param["name"]] = (str, Field(description=param["description"]))
267
+ else:
268
+ args[param["name"]] = (str | None, Field(description=param["description"], default=None))
269
+
270
+ model = create_model("ToolInput", **args, __base__=BaseModel)
271
+ return {"ToolInput": model}
272
+
273
+ def build_tool(self) -> Tool:
274
+ """Builds a Astra DB CQL Table tool.
275
+
276
+ Args:
277
+ name (str, optional): The name of the tool.
278
+
279
+ Returns:
280
+ Tool: The built Astra DB tool.
281
+ """
282
+ schema_dict = self.create_args_schema()
283
+ return StructuredTool.from_function(
284
+ name=self.tool_name,
285
+ args_schema=schema_dict["ToolInput"],
286
+ description=self.tool_description,
287
+ func=self.run_model,
288
+ return_direct=False,
289
+ )
290
+
291
+ def projection_args(self, input_str: str) -> dict:
292
+ elements = input_str.split(",")
293
+ result = {}
294
+
295
+ for element in elements:
296
+ if element.startswith("!"):
297
+ result[element[1:]] = False
298
+ else:
299
+ result[element] = True
300
+
301
+ return result
302
+
303
+ def run_model(self, **args) -> Data | list[Data]:
304
+ results = self.astra_rest(args)
305
+ data: list[Data] = []
306
+
307
+ if isinstance(results, list):
308
+ data = [Data(data=doc) for doc in results]
309
+ else:
310
+ self.status = results
311
+ return []
312
+
313
+ self.status = data
314
+ return data
@@ -0,0 +1,330 @@
1
+ import os
2
+
3
+ import orjson
4
+
5
+ from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
6
+ from lfx.helpers.data import docs_to_data
7
+ from lfx.inputs.inputs import (
8
+ BoolInput,
9
+ DictInput,
10
+ DropdownInput,
11
+ FloatInput,
12
+ HandleInput,
13
+ IntInput,
14
+ SecretStrInput,
15
+ StrInput,
16
+ )
17
+ from lfx.schema.data import Data
18
+
19
+
20
+ class AstraDBGraphVectorStoreComponent(LCVectorStoreComponent):
21
+ display_name: str = "Astra DB Graph"
22
+ description: str = "Implementation of Graph Vector Store using Astra DB"
23
+ name = "AstraDBGraph"
24
+ icon: str = "AstraDB"
25
+
26
+ inputs = [
27
+ SecretStrInput(
28
+ name="token",
29
+ display_name="Astra DB Application Token",
30
+ info="Authentication token for accessing Astra DB.",
31
+ value="ASTRA_DB_APPLICATION_TOKEN",
32
+ required=True,
33
+ advanced=os.getenv("ASTRA_ENHANCED", "false").lower() == "true",
34
+ ),
35
+ SecretStrInput(
36
+ name="api_endpoint",
37
+ display_name="Database" if os.getenv("ASTRA_ENHANCED", "false").lower() == "true" else "API Endpoint",
38
+ info="API endpoint URL for the Astra DB service.",
39
+ value="ASTRA_DB_API_ENDPOINT",
40
+ required=True,
41
+ ),
42
+ StrInput(
43
+ name="collection_name",
44
+ display_name="Collection Name",
45
+ info="The name of the collection within Astra DB where the vectors will be stored.",
46
+ required=True,
47
+ ),
48
+ StrInput(
49
+ name="metadata_incoming_links_key",
50
+ display_name="Metadata incoming links key",
51
+ info="Metadata key used for incoming links.",
52
+ advanced=True,
53
+ ),
54
+ *LCVectorStoreComponent.inputs,
55
+ StrInput(
56
+ name="keyspace",
57
+ display_name="Keyspace",
58
+ info="Optional keyspace within Astra DB to use for the collection.",
59
+ advanced=True,
60
+ ),
61
+ HandleInput(
62
+ name="embedding_model",
63
+ display_name="Embedding Model",
64
+ input_types=["Embeddings"],
65
+ info="Allows an embedding model configuration.",
66
+ ),
67
+ DropdownInput(
68
+ name="metric",
69
+ display_name="Metric",
70
+ info="Optional distance metric for vector comparisons in the vector store.",
71
+ options=["cosine", "dot_product", "euclidean"],
72
+ value="cosine",
73
+ advanced=True,
74
+ ),
75
+ IntInput(
76
+ name="batch_size",
77
+ display_name="Batch Size",
78
+ info="Optional number of data to process in a single batch.",
79
+ advanced=True,
80
+ ),
81
+ IntInput(
82
+ name="bulk_insert_batch_concurrency",
83
+ display_name="Bulk Insert Batch Concurrency",
84
+ info="Optional concurrency level for bulk insert operations.",
85
+ advanced=True,
86
+ ),
87
+ IntInput(
88
+ name="bulk_insert_overwrite_concurrency",
89
+ display_name="Bulk Insert Overwrite Concurrency",
90
+ info="Optional concurrency level for bulk insert operations that overwrite existing data.",
91
+ advanced=True,
92
+ ),
93
+ IntInput(
94
+ name="bulk_delete_concurrency",
95
+ display_name="Bulk Delete Concurrency",
96
+ info="Optional concurrency level for bulk delete operations.",
97
+ advanced=True,
98
+ ),
99
+ DropdownInput(
100
+ name="setup_mode",
101
+ display_name="Setup Mode",
102
+ info="Configuration mode for setting up the vector store, with options like 'Sync', or 'Off'.",
103
+ options=["Sync", "Off"],
104
+ advanced=True,
105
+ value="Sync",
106
+ ),
107
+ BoolInput(
108
+ name="pre_delete_collection",
109
+ display_name="Pre Delete Collection",
110
+ info="Boolean flag to determine whether to delete the collection before creating a new one.",
111
+ advanced=True,
112
+ value=False,
113
+ ),
114
+ StrInput(
115
+ name="metadata_indexing_include",
116
+ display_name="Metadata Indexing Include",
117
+ info="Optional list of metadata fields to include in the indexing.",
118
+ advanced=True,
119
+ list=True,
120
+ ),
121
+ StrInput(
122
+ name="metadata_indexing_exclude",
123
+ display_name="Metadata Indexing Exclude",
124
+ info="Optional list of metadata fields to exclude from the indexing.",
125
+ advanced=True,
126
+ list=True,
127
+ ),
128
+ StrInput(
129
+ name="collection_indexing_policy",
130
+ display_name="Collection Indexing Policy",
131
+ info='Optional JSON string for the "indexing" field of the collection. '
132
+ "See https://docs.datastax.com/en/astra-db-serverless/api-reference/collections.html#the-indexing-option",
133
+ advanced=True,
134
+ ),
135
+ IntInput(
136
+ name="number_of_results",
137
+ display_name="Number of Results",
138
+ info="Number of results to return.",
139
+ advanced=True,
140
+ value=4,
141
+ ),
142
+ DropdownInput(
143
+ name="search_type",
144
+ display_name="Search Type",
145
+ info="Search type to use",
146
+ options=[
147
+ "Similarity",
148
+ "Similarity with score threshold",
149
+ "MMR (Max Marginal Relevance)",
150
+ "Graph Traversal",
151
+ "MMR (Max Marginal Relevance) Graph Traversal",
152
+ ],
153
+ value="MMR (Max Marginal Relevance) Graph Traversal",
154
+ advanced=True,
155
+ ),
156
+ FloatInput(
157
+ name="search_score_threshold",
158
+ display_name="Search Score Threshold",
159
+ info="Minimum similarity score threshold for search results. "
160
+ "(when using 'Similarity with score threshold')",
161
+ value=0,
162
+ advanced=True,
163
+ ),
164
+ DictInput(
165
+ name="search_filter",
166
+ display_name="Search Metadata Filter",
167
+ info="Optional dictionary of filters to apply to the search query.",
168
+ advanced=True,
169
+ is_list=True,
170
+ ),
171
+ ]
172
+
173
+ @check_cached_vector_store
174
+ def build_vector_store(self):
175
+ try:
176
+ from astrapy.admin import parse_api_endpoint
177
+ from langchain_astradb import AstraDBGraphVectorStore
178
+ from langchain_astradb.utils.astradb import SetupMode
179
+ except ImportError as e:
180
+ msg = (
181
+ "Could not import langchain Astra DB integration package. "
182
+ "Please install it with `pip install langchain-astradb`."
183
+ )
184
+ raise ImportError(msg) from e
185
+
186
+ try:
187
+ if not self.setup_mode:
188
+ self.setup_mode = self._inputs["setup_mode"].options[0]
189
+
190
+ setup_mode_value = SetupMode[self.setup_mode.upper()]
191
+ except KeyError as e:
192
+ msg = f"Invalid setup mode: {self.setup_mode}"
193
+ raise ValueError(msg) from e
194
+
195
+ try:
196
+ self.log(f"Initializing Graph Vector Store {self.collection_name}")
197
+
198
+ # Handle environment parsing with try-except to avoid circular import
199
+ environment = None
200
+ if self.api_endpoint:
201
+ try:
202
+ from astrapy.admin import parse_api_endpoint
203
+
204
+ environment = parse_api_endpoint(self.api_endpoint).environment
205
+ except ImportError:
206
+ self.log("Warning: Could not import parse_api_endpoint, using None for environment")
207
+ environment = None
208
+
209
+ vector_store = AstraDBGraphVectorStore(
210
+ embedding=self.embedding_model,
211
+ collection_name=self.collection_name,
212
+ metadata_incoming_links_key=self.metadata_incoming_links_key or "incoming_links",
213
+ token=self.token,
214
+ api_endpoint=self.api_endpoint,
215
+ namespace=self.keyspace or None,
216
+ environment=environment,
217
+ metric=self.metric or None,
218
+ batch_size=self.batch_size or None,
219
+ bulk_insert_batch_concurrency=self.bulk_insert_batch_concurrency or None,
220
+ bulk_insert_overwrite_concurrency=self.bulk_insert_overwrite_concurrency or None,
221
+ bulk_delete_concurrency=self.bulk_delete_concurrency or None,
222
+ setup_mode=setup_mode_value,
223
+ pre_delete_collection=self.pre_delete_collection,
224
+ metadata_indexing_include=[s for s in self.metadata_indexing_include if s] or None,
225
+ metadata_indexing_exclude=[s for s in self.metadata_indexing_exclude if s] or None,
226
+ collection_indexing_policy=orjson.loads(self.collection_indexing_policy.encode("utf-8"))
227
+ if self.collection_indexing_policy
228
+ else None,
229
+ )
230
+ except Exception as e:
231
+ msg = f"Error initializing AstraDBGraphVectorStore: {e}"
232
+ raise ValueError(msg) from e
233
+
234
+ self.log(f"Vector Store initialized: {vector_store.astra_env.collection_name}")
235
+ self._add_documents_to_vector_store(vector_store)
236
+
237
+ return vector_store
238
+
239
+ def _add_documents_to_vector_store(self, vector_store) -> None:
240
+ self.ingest_data = self._prepare_ingest_data()
241
+
242
+ documents = []
243
+ for _input in self.ingest_data or []:
244
+ if isinstance(_input, Data):
245
+ documents.append(_input.to_lc_document())
246
+ else:
247
+ msg = "Vector Store Inputs must be Data objects."
248
+ raise TypeError(msg)
249
+
250
+ if documents:
251
+ self.log(f"Adding {len(documents)} documents to the Vector Store.")
252
+ try:
253
+ vector_store.add_documents(documents)
254
+ except Exception as e:
255
+ msg = f"Error adding documents to AstraDBGraphVectorStore: {e}"
256
+ raise ValueError(msg) from e
257
+ else:
258
+ self.log("No documents to add to the Vector Store.")
259
+
260
+ def _map_search_type(self) -> str:
261
+ match self.search_type:
262
+ case "Similarity":
263
+ return "similarity"
264
+ case "Similarity with score threshold":
265
+ return "similarity_score_threshold"
266
+ case "MMR (Max Marginal Relevance)":
267
+ return "mmr"
268
+ case "Graph Traversal":
269
+ return "traversal"
270
+ case "MMR (Max Marginal Relevance) Graph Traversal":
271
+ return "mmr_traversal"
272
+ case _:
273
+ return "similarity"
274
+
275
+ def _build_search_args(self):
276
+ args = {
277
+ "k": self.number_of_results,
278
+ "score_threshold": self.search_score_threshold,
279
+ }
280
+
281
+ if self.search_filter:
282
+ clean_filter = {k: v for k, v in self.search_filter.items() if k and v}
283
+ if len(clean_filter) > 0:
284
+ args["filter"] = clean_filter
285
+ return args
286
+
287
+ def search_documents(self, vector_store=None) -> list[Data]:
288
+ if not vector_store:
289
+ vector_store = self.build_vector_store()
290
+
291
+ self.log("Searching for documents in AstraDBGraphVectorStore.")
292
+ self.log(f"Search query: {self.search_query}")
293
+ self.log(f"Search type: {self.search_type}")
294
+ self.log(f"Number of results: {self.number_of_results}")
295
+
296
+ if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
297
+ try:
298
+ search_type = self._map_search_type()
299
+ search_args = self._build_search_args()
300
+
301
+ docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)
302
+
303
+ # Drop links from the metadata. At this point the links don't add any value for building the
304
+ # context and haven't been restored to json which causes the conversion to fail.
305
+ self.log("Removing links from metadata.")
306
+ for doc in docs:
307
+ if "links" in doc.metadata:
308
+ doc.metadata.pop("links")
309
+
310
+ except Exception as e:
311
+ msg = f"Error performing search in AstraDBGraphVectorStore: {e}"
312
+ raise ValueError(msg) from e
313
+
314
+ self.log(f"Retrieved documents: {len(docs)}")
315
+
316
+ data = docs_to_data(docs)
317
+
318
+ self.log(f"Converted documents to data: {len(data)}")
319
+
320
+ self.status = data
321
+ return data
322
+ self.log("No search input provided. Skipping search.")
323
+ return []
324
+
325
+ def get_retriever_kwargs(self):
326
+ search_args = self._build_search_args()
327
+ return {
328
+ "search_type": self._map_search_type(),
329
+ "search_kwargs": search_args,
330
+ }