lfx-nightly 0.2.0.dev25__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of lfx-nightly might be problematic. Click here for more details.

Files changed (769) hide show
  1. lfx/__init__.py +0 -0
  2. lfx/__main__.py +25 -0
  3. lfx/_assets/component_index.json +1 -0
  4. lfx/base/__init__.py +0 -0
  5. lfx/base/agents/__init__.py +0 -0
  6. lfx/base/agents/agent.py +375 -0
  7. lfx/base/agents/altk_base_agent.py +380 -0
  8. lfx/base/agents/altk_tool_wrappers.py +565 -0
  9. lfx/base/agents/callback.py +130 -0
  10. lfx/base/agents/context.py +109 -0
  11. lfx/base/agents/crewai/__init__.py +0 -0
  12. lfx/base/agents/crewai/crew.py +231 -0
  13. lfx/base/agents/crewai/tasks.py +12 -0
  14. lfx/base/agents/default_prompts.py +23 -0
  15. lfx/base/agents/errors.py +15 -0
  16. lfx/base/agents/events.py +430 -0
  17. lfx/base/agents/utils.py +237 -0
  18. lfx/base/astra_assistants/__init__.py +0 -0
  19. lfx/base/astra_assistants/util.py +171 -0
  20. lfx/base/chains/__init__.py +0 -0
  21. lfx/base/chains/model.py +19 -0
  22. lfx/base/composio/__init__.py +0 -0
  23. lfx/base/composio/composio_base.py +2584 -0
  24. lfx/base/compressors/__init__.py +0 -0
  25. lfx/base/compressors/model.py +60 -0
  26. lfx/base/constants.py +46 -0
  27. lfx/base/curl/__init__.py +0 -0
  28. lfx/base/curl/parse.py +188 -0
  29. lfx/base/data/__init__.py +5 -0
  30. lfx/base/data/base_file.py +810 -0
  31. lfx/base/data/docling_utils.py +338 -0
  32. lfx/base/data/storage_utils.py +192 -0
  33. lfx/base/data/utils.py +362 -0
  34. lfx/base/datastax/__init__.py +5 -0
  35. lfx/base/datastax/astradb_base.py +896 -0
  36. lfx/base/document_transformers/__init__.py +0 -0
  37. lfx/base/document_transformers/model.py +43 -0
  38. lfx/base/embeddings/__init__.py +0 -0
  39. lfx/base/embeddings/aiml_embeddings.py +62 -0
  40. lfx/base/embeddings/embeddings_class.py +113 -0
  41. lfx/base/embeddings/model.py +26 -0
  42. lfx/base/flow_processing/__init__.py +0 -0
  43. lfx/base/flow_processing/utils.py +86 -0
  44. lfx/base/huggingface/__init__.py +0 -0
  45. lfx/base/huggingface/model_bridge.py +133 -0
  46. lfx/base/io/__init__.py +0 -0
  47. lfx/base/io/chat.py +21 -0
  48. lfx/base/io/text.py +22 -0
  49. lfx/base/knowledge_bases/__init__.py +3 -0
  50. lfx/base/knowledge_bases/knowledge_base_utils.py +137 -0
  51. lfx/base/langchain_utilities/__init__.py +0 -0
  52. lfx/base/langchain_utilities/model.py +35 -0
  53. lfx/base/langchain_utilities/spider_constants.py +1 -0
  54. lfx/base/langwatch/__init__.py +0 -0
  55. lfx/base/langwatch/utils.py +18 -0
  56. lfx/base/mcp/__init__.py +0 -0
  57. lfx/base/mcp/constants.py +2 -0
  58. lfx/base/mcp/util.py +1659 -0
  59. lfx/base/memory/__init__.py +0 -0
  60. lfx/base/memory/memory.py +49 -0
  61. lfx/base/memory/model.py +38 -0
  62. lfx/base/models/__init__.py +3 -0
  63. lfx/base/models/aiml_constants.py +51 -0
  64. lfx/base/models/anthropic_constants.py +51 -0
  65. lfx/base/models/aws_constants.py +151 -0
  66. lfx/base/models/chat_result.py +76 -0
  67. lfx/base/models/cometapi_constants.py +54 -0
  68. lfx/base/models/google_generative_ai_constants.py +70 -0
  69. lfx/base/models/google_generative_ai_model.py +38 -0
  70. lfx/base/models/groq_constants.py +150 -0
  71. lfx/base/models/groq_model_discovery.py +265 -0
  72. lfx/base/models/model.py +375 -0
  73. lfx/base/models/model_input_constants.py +378 -0
  74. lfx/base/models/model_metadata.py +41 -0
  75. lfx/base/models/model_utils.py +108 -0
  76. lfx/base/models/novita_constants.py +35 -0
  77. lfx/base/models/ollama_constants.py +52 -0
  78. lfx/base/models/openai_constants.py +129 -0
  79. lfx/base/models/sambanova_constants.py +18 -0
  80. lfx/base/models/watsonx_constants.py +36 -0
  81. lfx/base/processing/__init__.py +0 -0
  82. lfx/base/prompts/__init__.py +0 -0
  83. lfx/base/prompts/api_utils.py +224 -0
  84. lfx/base/prompts/utils.py +61 -0
  85. lfx/base/textsplitters/__init__.py +0 -0
  86. lfx/base/textsplitters/model.py +28 -0
  87. lfx/base/tools/__init__.py +0 -0
  88. lfx/base/tools/base.py +26 -0
  89. lfx/base/tools/component_tool.py +325 -0
  90. lfx/base/tools/constants.py +49 -0
  91. lfx/base/tools/flow_tool.py +132 -0
  92. lfx/base/tools/run_flow.py +698 -0
  93. lfx/base/vectorstores/__init__.py +0 -0
  94. lfx/base/vectorstores/model.py +193 -0
  95. lfx/base/vectorstores/utils.py +22 -0
  96. lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
  97. lfx/cli/__init__.py +5 -0
  98. lfx/cli/commands.py +327 -0
  99. lfx/cli/common.py +650 -0
  100. lfx/cli/run.py +506 -0
  101. lfx/cli/script_loader.py +289 -0
  102. lfx/cli/serve_app.py +546 -0
  103. lfx/cli/validation.py +69 -0
  104. lfx/components/FAISS/__init__.py +34 -0
  105. lfx/components/FAISS/faiss.py +111 -0
  106. lfx/components/Notion/__init__.py +19 -0
  107. lfx/components/Notion/add_content_to_page.py +269 -0
  108. lfx/components/Notion/create_page.py +94 -0
  109. lfx/components/Notion/list_database_properties.py +68 -0
  110. lfx/components/Notion/list_pages.py +122 -0
  111. lfx/components/Notion/list_users.py +77 -0
  112. lfx/components/Notion/page_content_viewer.py +93 -0
  113. lfx/components/Notion/search.py +111 -0
  114. lfx/components/Notion/update_page_property.py +114 -0
  115. lfx/components/__init__.py +428 -0
  116. lfx/components/_importing.py +42 -0
  117. lfx/components/agentql/__init__.py +3 -0
  118. lfx/components/agentql/agentql_api.py +151 -0
  119. lfx/components/aiml/__init__.py +37 -0
  120. lfx/components/aiml/aiml.py +115 -0
  121. lfx/components/aiml/aiml_embeddings.py +37 -0
  122. lfx/components/altk/__init__.py +34 -0
  123. lfx/components/altk/altk_agent.py +193 -0
  124. lfx/components/amazon/__init__.py +36 -0
  125. lfx/components/amazon/amazon_bedrock_converse.py +195 -0
  126. lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
  127. lfx/components/amazon/amazon_bedrock_model.py +130 -0
  128. lfx/components/amazon/s3_bucket_uploader.py +211 -0
  129. lfx/components/anthropic/__init__.py +34 -0
  130. lfx/components/anthropic/anthropic.py +187 -0
  131. lfx/components/apify/__init__.py +5 -0
  132. lfx/components/apify/apify_actor.py +325 -0
  133. lfx/components/arxiv/__init__.py +3 -0
  134. lfx/components/arxiv/arxiv.py +169 -0
  135. lfx/components/assemblyai/__init__.py +46 -0
  136. lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  137. lfx/components/assemblyai/assemblyai_lemur.py +183 -0
  138. lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  139. lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  140. lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
  141. lfx/components/azure/__init__.py +37 -0
  142. lfx/components/azure/azure_openai.py +95 -0
  143. lfx/components/azure/azure_openai_embeddings.py +83 -0
  144. lfx/components/baidu/__init__.py +32 -0
  145. lfx/components/baidu/baidu_qianfan_chat.py +113 -0
  146. lfx/components/bing/__init__.py +3 -0
  147. lfx/components/bing/bing_search_api.py +61 -0
  148. lfx/components/cassandra/__init__.py +40 -0
  149. lfx/components/cassandra/cassandra.py +264 -0
  150. lfx/components/cassandra/cassandra_chat.py +92 -0
  151. lfx/components/cassandra/cassandra_graph.py +238 -0
  152. lfx/components/chains/__init__.py +3 -0
  153. lfx/components/chroma/__init__.py +34 -0
  154. lfx/components/chroma/chroma.py +169 -0
  155. lfx/components/cleanlab/__init__.py +40 -0
  156. lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
  157. lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  158. lfx/components/cleanlab/cleanlab_remediator.py +131 -0
  159. lfx/components/clickhouse/__init__.py +34 -0
  160. lfx/components/clickhouse/clickhouse.py +135 -0
  161. lfx/components/cloudflare/__init__.py +32 -0
  162. lfx/components/cloudflare/cloudflare.py +81 -0
  163. lfx/components/cohere/__init__.py +40 -0
  164. lfx/components/cohere/cohere_embeddings.py +81 -0
  165. lfx/components/cohere/cohere_models.py +46 -0
  166. lfx/components/cohere/cohere_rerank.py +51 -0
  167. lfx/components/cometapi/__init__.py +32 -0
  168. lfx/components/cometapi/cometapi.py +166 -0
  169. lfx/components/composio/__init__.py +222 -0
  170. lfx/components/composio/agentql_composio.py +11 -0
  171. lfx/components/composio/agiled_composio.py +11 -0
  172. lfx/components/composio/airtable_composio.py +11 -0
  173. lfx/components/composio/apollo_composio.py +11 -0
  174. lfx/components/composio/asana_composio.py +11 -0
  175. lfx/components/composio/attio_composio.py +11 -0
  176. lfx/components/composio/bitbucket_composio.py +11 -0
  177. lfx/components/composio/bolna_composio.py +11 -0
  178. lfx/components/composio/brightdata_composio.py +11 -0
  179. lfx/components/composio/calendly_composio.py +11 -0
  180. lfx/components/composio/canva_composio.py +11 -0
  181. lfx/components/composio/canvas_composio.py +11 -0
  182. lfx/components/composio/coda_composio.py +11 -0
  183. lfx/components/composio/composio_api.py +278 -0
  184. lfx/components/composio/contentful_composio.py +11 -0
  185. lfx/components/composio/digicert_composio.py +11 -0
  186. lfx/components/composio/discord_composio.py +11 -0
  187. lfx/components/composio/dropbox_compnent.py +11 -0
  188. lfx/components/composio/elevenlabs_composio.py +11 -0
  189. lfx/components/composio/exa_composio.py +11 -0
  190. lfx/components/composio/figma_composio.py +11 -0
  191. lfx/components/composio/finage_composio.py +11 -0
  192. lfx/components/composio/firecrawl_composio.py +11 -0
  193. lfx/components/composio/fireflies_composio.py +11 -0
  194. lfx/components/composio/fixer_composio.py +11 -0
  195. lfx/components/composio/flexisign_composio.py +11 -0
  196. lfx/components/composio/freshdesk_composio.py +11 -0
  197. lfx/components/composio/github_composio.py +11 -0
  198. lfx/components/composio/gmail_composio.py +38 -0
  199. lfx/components/composio/googlebigquery_composio.py +11 -0
  200. lfx/components/composio/googlecalendar_composio.py +11 -0
  201. lfx/components/composio/googleclassroom_composio.py +11 -0
  202. lfx/components/composio/googledocs_composio.py +11 -0
  203. lfx/components/composio/googlemeet_composio.py +11 -0
  204. lfx/components/composio/googlesheets_composio.py +11 -0
  205. lfx/components/composio/googletasks_composio.py +8 -0
  206. lfx/components/composio/heygen_composio.py +11 -0
  207. lfx/components/composio/instagram_composio.py +11 -0
  208. lfx/components/composio/jira_composio.py +11 -0
  209. lfx/components/composio/jotform_composio.py +11 -0
  210. lfx/components/composio/klaviyo_composio.py +11 -0
  211. lfx/components/composio/linear_composio.py +11 -0
  212. lfx/components/composio/listennotes_composio.py +11 -0
  213. lfx/components/composio/mem0_composio.py +11 -0
  214. lfx/components/composio/miro_composio.py +11 -0
  215. lfx/components/composio/missive_composio.py +11 -0
  216. lfx/components/composio/notion_composio.py +11 -0
  217. lfx/components/composio/onedrive_composio.py +11 -0
  218. lfx/components/composio/outlook_composio.py +11 -0
  219. lfx/components/composio/pandadoc_composio.py +11 -0
  220. lfx/components/composio/peopledatalabs_composio.py +11 -0
  221. lfx/components/composio/perplexityai_composio.py +11 -0
  222. lfx/components/composio/reddit_composio.py +11 -0
  223. lfx/components/composio/serpapi_composio.py +11 -0
  224. lfx/components/composio/slack_composio.py +11 -0
  225. lfx/components/composio/slackbot_composio.py +11 -0
  226. lfx/components/composio/snowflake_composio.py +11 -0
  227. lfx/components/composio/supabase_composio.py +11 -0
  228. lfx/components/composio/tavily_composio.py +11 -0
  229. lfx/components/composio/timelinesai_composio.py +11 -0
  230. lfx/components/composio/todoist_composio.py +11 -0
  231. lfx/components/composio/wrike_composio.py +11 -0
  232. lfx/components/composio/youtube_composio.py +11 -0
  233. lfx/components/confluence/__init__.py +3 -0
  234. lfx/components/confluence/confluence.py +84 -0
  235. lfx/components/couchbase/__init__.py +34 -0
  236. lfx/components/couchbase/couchbase.py +102 -0
  237. lfx/components/crewai/__init__.py +49 -0
  238. lfx/components/crewai/crewai.py +108 -0
  239. lfx/components/crewai/hierarchical_crew.py +47 -0
  240. lfx/components/crewai/hierarchical_task.py +45 -0
  241. lfx/components/crewai/sequential_crew.py +53 -0
  242. lfx/components/crewai/sequential_task.py +74 -0
  243. lfx/components/crewai/sequential_task_agent.py +144 -0
  244. lfx/components/cuga/__init__.py +34 -0
  245. lfx/components/cuga/cuga_agent.py +730 -0
  246. lfx/components/custom_component/__init__.py +34 -0
  247. lfx/components/custom_component/custom_component.py +31 -0
  248. lfx/components/data/__init__.py +114 -0
  249. lfx/components/data_source/__init__.py +58 -0
  250. lfx/components/data_source/api_request.py +577 -0
  251. lfx/components/data_source/csv_to_data.py +101 -0
  252. lfx/components/data_source/json_to_data.py +106 -0
  253. lfx/components/data_source/mock_data.py +398 -0
  254. lfx/components/data_source/news_search.py +166 -0
  255. lfx/components/data_source/rss.py +71 -0
  256. lfx/components/data_source/sql_executor.py +101 -0
  257. lfx/components/data_source/url.py +311 -0
  258. lfx/components/data_source/web_search.py +326 -0
  259. lfx/components/datastax/__init__.py +76 -0
  260. lfx/components/datastax/astradb_assistant_manager.py +307 -0
  261. lfx/components/datastax/astradb_chatmemory.py +40 -0
  262. lfx/components/datastax/astradb_cql.py +288 -0
  263. lfx/components/datastax/astradb_graph.py +217 -0
  264. lfx/components/datastax/astradb_tool.py +378 -0
  265. lfx/components/datastax/astradb_vectorize.py +122 -0
  266. lfx/components/datastax/astradb_vectorstore.py +449 -0
  267. lfx/components/datastax/create_assistant.py +59 -0
  268. lfx/components/datastax/create_thread.py +33 -0
  269. lfx/components/datastax/dotenv.py +36 -0
  270. lfx/components/datastax/get_assistant.py +38 -0
  271. lfx/components/datastax/getenvvar.py +31 -0
  272. lfx/components/datastax/graph_rag.py +141 -0
  273. lfx/components/datastax/hcd.py +315 -0
  274. lfx/components/datastax/list_assistants.py +26 -0
  275. lfx/components/datastax/run.py +90 -0
  276. lfx/components/deactivated/__init__.py +15 -0
  277. lfx/components/deactivated/amazon_kendra.py +66 -0
  278. lfx/components/deactivated/chat_litellm_model.py +158 -0
  279. lfx/components/deactivated/code_block_extractor.py +26 -0
  280. lfx/components/deactivated/documents_to_data.py +22 -0
  281. lfx/components/deactivated/embed.py +16 -0
  282. lfx/components/deactivated/extract_key_from_data.py +46 -0
  283. lfx/components/deactivated/json_document_builder.py +57 -0
  284. lfx/components/deactivated/list_flows.py +20 -0
  285. lfx/components/deactivated/mcp_sse.py +61 -0
  286. lfx/components/deactivated/mcp_stdio.py +62 -0
  287. lfx/components/deactivated/merge_data.py +93 -0
  288. lfx/components/deactivated/message.py +37 -0
  289. lfx/components/deactivated/metal.py +54 -0
  290. lfx/components/deactivated/multi_query.py +59 -0
  291. lfx/components/deactivated/retriever.py +43 -0
  292. lfx/components/deactivated/selective_passthrough.py +77 -0
  293. lfx/components/deactivated/should_run_next.py +40 -0
  294. lfx/components/deactivated/split_text.py +63 -0
  295. lfx/components/deactivated/store_message.py +24 -0
  296. lfx/components/deactivated/sub_flow.py +124 -0
  297. lfx/components/deactivated/vectara_self_query.py +76 -0
  298. lfx/components/deactivated/vector_store.py +24 -0
  299. lfx/components/deepseek/__init__.py +34 -0
  300. lfx/components/deepseek/deepseek.py +136 -0
  301. lfx/components/docling/__init__.py +43 -0
  302. lfx/components/docling/chunk_docling_document.py +186 -0
  303. lfx/components/docling/docling_inline.py +238 -0
  304. lfx/components/docling/docling_remote.py +195 -0
  305. lfx/components/docling/export_docling_document.py +117 -0
  306. lfx/components/documentloaders/__init__.py +3 -0
  307. lfx/components/duckduckgo/__init__.py +3 -0
  308. lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  309. lfx/components/elastic/__init__.py +37 -0
  310. lfx/components/elastic/elasticsearch.py +267 -0
  311. lfx/components/elastic/opensearch.py +789 -0
  312. lfx/components/elastic/opensearch_multimodal.py +1575 -0
  313. lfx/components/embeddings/__init__.py +37 -0
  314. lfx/components/embeddings/similarity.py +77 -0
  315. lfx/components/embeddings/text_embedder.py +65 -0
  316. lfx/components/exa/__init__.py +3 -0
  317. lfx/components/exa/exa_search.py +68 -0
  318. lfx/components/files_and_knowledge/__init__.py +47 -0
  319. lfx/components/files_and_knowledge/directory.py +113 -0
  320. lfx/components/files_and_knowledge/file.py +841 -0
  321. lfx/components/files_and_knowledge/ingestion.py +694 -0
  322. lfx/components/files_and_knowledge/retrieval.py +264 -0
  323. lfx/components/files_and_knowledge/save_file.py +746 -0
  324. lfx/components/firecrawl/__init__.py +43 -0
  325. lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
  326. lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
  327. lfx/components/firecrawl/firecrawl_map_api.py +89 -0
  328. lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
  329. lfx/components/flow_controls/__init__.py +58 -0
  330. lfx/components/flow_controls/conditional_router.py +208 -0
  331. lfx/components/flow_controls/data_conditional_router.py +126 -0
  332. lfx/components/flow_controls/flow_tool.py +111 -0
  333. lfx/components/flow_controls/listen.py +29 -0
  334. lfx/components/flow_controls/loop.py +163 -0
  335. lfx/components/flow_controls/notify.py +88 -0
  336. lfx/components/flow_controls/pass_message.py +36 -0
  337. lfx/components/flow_controls/run_flow.py +108 -0
  338. lfx/components/flow_controls/sub_flow.py +115 -0
  339. lfx/components/git/__init__.py +4 -0
  340. lfx/components/git/git.py +262 -0
  341. lfx/components/git/gitextractor.py +196 -0
  342. lfx/components/glean/__init__.py +3 -0
  343. lfx/components/glean/glean_search_api.py +173 -0
  344. lfx/components/google/__init__.py +17 -0
  345. lfx/components/google/gmail.py +193 -0
  346. lfx/components/google/google_bq_sql_executor.py +157 -0
  347. lfx/components/google/google_drive.py +92 -0
  348. lfx/components/google/google_drive_search.py +152 -0
  349. lfx/components/google/google_generative_ai.py +144 -0
  350. lfx/components/google/google_generative_ai_embeddings.py +141 -0
  351. lfx/components/google/google_oauth_token.py +89 -0
  352. lfx/components/google/google_search_api_core.py +68 -0
  353. lfx/components/google/google_serper_api_core.py +74 -0
  354. lfx/components/groq/__init__.py +34 -0
  355. lfx/components/groq/groq.py +143 -0
  356. lfx/components/helpers/__init__.py +154 -0
  357. lfx/components/homeassistant/__init__.py +7 -0
  358. lfx/components/homeassistant/home_assistant_control.py +152 -0
  359. lfx/components/homeassistant/list_home_assistant_states.py +137 -0
  360. lfx/components/huggingface/__init__.py +37 -0
  361. lfx/components/huggingface/huggingface.py +199 -0
  362. lfx/components/huggingface/huggingface_inference_api.py +106 -0
  363. lfx/components/ibm/__init__.py +34 -0
  364. lfx/components/ibm/watsonx.py +207 -0
  365. lfx/components/ibm/watsonx_embeddings.py +135 -0
  366. lfx/components/icosacomputing/__init__.py +5 -0
  367. lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
  368. lfx/components/input_output/__init__.py +40 -0
  369. lfx/components/input_output/chat.py +109 -0
  370. lfx/components/input_output/chat_output.py +184 -0
  371. lfx/components/input_output/text.py +27 -0
  372. lfx/components/input_output/text_output.py +29 -0
  373. lfx/components/input_output/webhook.py +56 -0
  374. lfx/components/jigsawstack/__init__.py +23 -0
  375. lfx/components/jigsawstack/ai_scrape.py +126 -0
  376. lfx/components/jigsawstack/ai_web_search.py +136 -0
  377. lfx/components/jigsawstack/file_read.py +115 -0
  378. lfx/components/jigsawstack/file_upload.py +94 -0
  379. lfx/components/jigsawstack/image_generation.py +205 -0
  380. lfx/components/jigsawstack/nsfw.py +60 -0
  381. lfx/components/jigsawstack/object_detection.py +124 -0
  382. lfx/components/jigsawstack/sentiment.py +112 -0
  383. lfx/components/jigsawstack/text_to_sql.py +90 -0
  384. lfx/components/jigsawstack/text_translate.py +77 -0
  385. lfx/components/jigsawstack/vocr.py +107 -0
  386. lfx/components/knowledge_bases/__init__.py +89 -0
  387. lfx/components/langchain_utilities/__init__.py +109 -0
  388. lfx/components/langchain_utilities/character.py +53 -0
  389. lfx/components/langchain_utilities/conversation.py +59 -0
  390. lfx/components/langchain_utilities/csv_agent.py +175 -0
  391. lfx/components/langchain_utilities/fake_embeddings.py +26 -0
  392. lfx/components/langchain_utilities/html_link_extractor.py +35 -0
  393. lfx/components/langchain_utilities/json_agent.py +100 -0
  394. lfx/components/langchain_utilities/langchain_hub.py +126 -0
  395. lfx/components/langchain_utilities/language_recursive.py +49 -0
  396. lfx/components/langchain_utilities/language_semantic.py +138 -0
  397. lfx/components/langchain_utilities/llm_checker.py +39 -0
  398. lfx/components/langchain_utilities/llm_math.py +42 -0
  399. lfx/components/langchain_utilities/natural_language.py +61 -0
  400. lfx/components/langchain_utilities/openai_tools.py +53 -0
  401. lfx/components/langchain_utilities/openapi.py +48 -0
  402. lfx/components/langchain_utilities/recursive_character.py +60 -0
  403. lfx/components/langchain_utilities/retrieval_qa.py +83 -0
  404. lfx/components/langchain_utilities/runnable_executor.py +137 -0
  405. lfx/components/langchain_utilities/self_query.py +80 -0
  406. lfx/components/langchain_utilities/spider.py +142 -0
  407. lfx/components/langchain_utilities/sql.py +40 -0
  408. lfx/components/langchain_utilities/sql_database.py +35 -0
  409. lfx/components/langchain_utilities/sql_generator.py +78 -0
  410. lfx/components/langchain_utilities/tool_calling.py +59 -0
  411. lfx/components/langchain_utilities/vector_store_info.py +49 -0
  412. lfx/components/langchain_utilities/vector_store_router.py +33 -0
  413. lfx/components/langchain_utilities/xml_agent.py +71 -0
  414. lfx/components/langwatch/__init__.py +3 -0
  415. lfx/components/langwatch/langwatch.py +278 -0
  416. lfx/components/link_extractors/__init__.py +3 -0
  417. lfx/components/llm_operations/__init__.py +46 -0
  418. lfx/components/llm_operations/batch_run.py +205 -0
  419. lfx/components/llm_operations/lambda_filter.py +218 -0
  420. lfx/components/llm_operations/llm_conditional_router.py +421 -0
  421. lfx/components/llm_operations/llm_selector.py +499 -0
  422. lfx/components/llm_operations/structured_output.py +244 -0
  423. lfx/components/lmstudio/__init__.py +34 -0
  424. lfx/components/lmstudio/lmstudioembeddings.py +89 -0
  425. lfx/components/lmstudio/lmstudiomodel.py +133 -0
  426. lfx/components/logic/__init__.py +181 -0
  427. lfx/components/maritalk/__init__.py +32 -0
  428. lfx/components/maritalk/maritalk.py +52 -0
  429. lfx/components/mem0/__init__.py +3 -0
  430. lfx/components/mem0/mem0_chat_memory.py +147 -0
  431. lfx/components/milvus/__init__.py +34 -0
  432. lfx/components/milvus/milvus.py +115 -0
  433. lfx/components/mistral/__init__.py +37 -0
  434. lfx/components/mistral/mistral.py +114 -0
  435. lfx/components/mistral/mistral_embeddings.py +58 -0
  436. lfx/components/models/__init__.py +89 -0
  437. lfx/components/models_and_agents/__init__.py +49 -0
  438. lfx/components/models_and_agents/agent.py +644 -0
  439. lfx/components/models_and_agents/embedding_model.py +423 -0
  440. lfx/components/models_and_agents/language_model.py +398 -0
  441. lfx/components/models_and_agents/mcp_component.py +594 -0
  442. lfx/components/models_and_agents/memory.py +268 -0
  443. lfx/components/models_and_agents/prompt.py +67 -0
  444. lfx/components/mongodb/__init__.py +34 -0
  445. lfx/components/mongodb/mongodb_atlas.py +213 -0
  446. lfx/components/needle/__init__.py +3 -0
  447. lfx/components/needle/needle.py +104 -0
  448. lfx/components/notdiamond/__init__.py +34 -0
  449. lfx/components/notdiamond/notdiamond.py +228 -0
  450. lfx/components/novita/__init__.py +32 -0
  451. lfx/components/novita/novita.py +130 -0
  452. lfx/components/nvidia/__init__.py +57 -0
  453. lfx/components/nvidia/nvidia.py +151 -0
  454. lfx/components/nvidia/nvidia_embedding.py +77 -0
  455. lfx/components/nvidia/nvidia_ingest.py +317 -0
  456. lfx/components/nvidia/nvidia_rerank.py +63 -0
  457. lfx/components/nvidia/system_assist.py +65 -0
  458. lfx/components/olivya/__init__.py +3 -0
  459. lfx/components/olivya/olivya.py +116 -0
  460. lfx/components/ollama/__init__.py +37 -0
  461. lfx/components/ollama/ollama.py +548 -0
  462. lfx/components/ollama/ollama_embeddings.py +103 -0
  463. lfx/components/openai/__init__.py +37 -0
  464. lfx/components/openai/openai.py +100 -0
  465. lfx/components/openai/openai_chat_model.py +176 -0
  466. lfx/components/openrouter/__init__.py +32 -0
  467. lfx/components/openrouter/openrouter.py +104 -0
  468. lfx/components/output_parsers/__init__.py +3 -0
  469. lfx/components/perplexity/__init__.py +34 -0
  470. lfx/components/perplexity/perplexity.py +75 -0
  471. lfx/components/pgvector/__init__.py +34 -0
  472. lfx/components/pgvector/pgvector.py +72 -0
  473. lfx/components/pinecone/__init__.py +34 -0
  474. lfx/components/pinecone/pinecone.py +134 -0
  475. lfx/components/processing/__init__.py +72 -0
  476. lfx/components/processing/alter_metadata.py +109 -0
  477. lfx/components/processing/combine_text.py +40 -0
  478. lfx/components/processing/converter.py +248 -0
  479. lfx/components/processing/create_data.py +111 -0
  480. lfx/components/processing/create_list.py +40 -0
  481. lfx/components/processing/data_operations.py +528 -0
  482. lfx/components/processing/data_to_dataframe.py +71 -0
  483. lfx/components/processing/dataframe_operations.py +313 -0
  484. lfx/components/processing/dataframe_to_toolset.py +259 -0
  485. lfx/components/processing/dynamic_create_data.py +357 -0
  486. lfx/components/processing/extract_key.py +54 -0
  487. lfx/components/processing/filter_data.py +43 -0
  488. lfx/components/processing/filter_data_values.py +89 -0
  489. lfx/components/processing/json_cleaner.py +104 -0
  490. lfx/components/processing/merge_data.py +91 -0
  491. lfx/components/processing/message_to_data.py +37 -0
  492. lfx/components/processing/output_parser.py +46 -0
  493. lfx/components/processing/parse_data.py +71 -0
  494. lfx/components/processing/parse_dataframe.py +69 -0
  495. lfx/components/processing/parse_json_data.py +91 -0
  496. lfx/components/processing/parser.py +148 -0
  497. lfx/components/processing/regex.py +83 -0
  498. lfx/components/processing/select_data.py +49 -0
  499. lfx/components/processing/split_text.py +141 -0
  500. lfx/components/processing/store_message.py +91 -0
  501. lfx/components/processing/update_data.py +161 -0
  502. lfx/components/prototypes/__init__.py +35 -0
  503. lfx/components/prototypes/python_function.py +73 -0
  504. lfx/components/qdrant/__init__.py +34 -0
  505. lfx/components/qdrant/qdrant.py +109 -0
  506. lfx/components/redis/__init__.py +37 -0
  507. lfx/components/redis/redis.py +89 -0
  508. lfx/components/redis/redis_chat.py +43 -0
  509. lfx/components/sambanova/__init__.py +32 -0
  510. lfx/components/sambanova/sambanova.py +84 -0
  511. lfx/components/scrapegraph/__init__.py +40 -0
  512. lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  513. lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
  514. lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  515. lfx/components/searchapi/__init__.py +34 -0
  516. lfx/components/searchapi/search.py +79 -0
  517. lfx/components/serpapi/__init__.py +3 -0
  518. lfx/components/serpapi/serp.py +115 -0
  519. lfx/components/supabase/__init__.py +34 -0
  520. lfx/components/supabase/supabase.py +76 -0
  521. lfx/components/tavily/__init__.py +4 -0
  522. lfx/components/tavily/tavily_extract.py +117 -0
  523. lfx/components/tavily/tavily_search.py +212 -0
  524. lfx/components/textsplitters/__init__.py +3 -0
  525. lfx/components/toolkits/__init__.py +3 -0
  526. lfx/components/tools/__init__.py +66 -0
  527. lfx/components/tools/calculator.py +109 -0
  528. lfx/components/tools/google_search_api.py +45 -0
  529. lfx/components/tools/google_serper_api.py +115 -0
  530. lfx/components/tools/python_code_structured_tool.py +328 -0
  531. lfx/components/tools/python_repl.py +98 -0
  532. lfx/components/tools/search_api.py +88 -0
  533. lfx/components/tools/searxng.py +145 -0
  534. lfx/components/tools/serp_api.py +120 -0
  535. lfx/components/tools/tavily_search_tool.py +345 -0
  536. lfx/components/tools/wikidata_api.py +103 -0
  537. lfx/components/tools/wikipedia_api.py +50 -0
  538. lfx/components/tools/yahoo_finance.py +130 -0
  539. lfx/components/twelvelabs/__init__.py +52 -0
  540. lfx/components/twelvelabs/convert_astra_results.py +84 -0
  541. lfx/components/twelvelabs/pegasus_index.py +311 -0
  542. lfx/components/twelvelabs/split_video.py +301 -0
  543. lfx/components/twelvelabs/text_embeddings.py +57 -0
  544. lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  545. lfx/components/twelvelabs/video_embeddings.py +100 -0
  546. lfx/components/twelvelabs/video_file.py +191 -0
  547. lfx/components/unstructured/__init__.py +3 -0
  548. lfx/components/unstructured/unstructured.py +121 -0
  549. lfx/components/upstash/__init__.py +34 -0
  550. lfx/components/upstash/upstash.py +124 -0
  551. lfx/components/utilities/__init__.py +43 -0
  552. lfx/components/utilities/calculator_core.py +89 -0
  553. lfx/components/utilities/current_date.py +42 -0
  554. lfx/components/utilities/id_generator.py +42 -0
  555. lfx/components/utilities/python_repl_core.py +98 -0
  556. lfx/components/vectara/__init__.py +37 -0
  557. lfx/components/vectara/vectara.py +97 -0
  558. lfx/components/vectara/vectara_rag.py +164 -0
  559. lfx/components/vectorstores/__init__.py +34 -0
  560. lfx/components/vectorstores/local_db.py +270 -0
  561. lfx/components/vertexai/__init__.py +37 -0
  562. lfx/components/vertexai/vertexai.py +71 -0
  563. lfx/components/vertexai/vertexai_embeddings.py +67 -0
  564. lfx/components/vlmrun/__init__.py +34 -0
  565. lfx/components/vlmrun/vlmrun_transcription.py +224 -0
  566. lfx/components/weaviate/__init__.py +34 -0
  567. lfx/components/weaviate/weaviate.py +89 -0
  568. lfx/components/wikipedia/__init__.py +4 -0
  569. lfx/components/wikipedia/wikidata.py +86 -0
  570. lfx/components/wikipedia/wikipedia.py +53 -0
  571. lfx/components/wolframalpha/__init__.py +3 -0
  572. lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
  573. lfx/components/xai/__init__.py +32 -0
  574. lfx/components/xai/xai.py +167 -0
  575. lfx/components/yahoosearch/__init__.py +3 -0
  576. lfx/components/yahoosearch/yahoo.py +137 -0
  577. lfx/components/youtube/__init__.py +52 -0
  578. lfx/components/youtube/channel.py +227 -0
  579. lfx/components/youtube/comments.py +231 -0
  580. lfx/components/youtube/playlist.py +33 -0
  581. lfx/components/youtube/search.py +120 -0
  582. lfx/components/youtube/trending.py +285 -0
  583. lfx/components/youtube/video_details.py +263 -0
  584. lfx/components/youtube/youtube_transcripts.py +206 -0
  585. lfx/components/zep/__init__.py +3 -0
  586. lfx/components/zep/zep.py +45 -0
  587. lfx/constants.py +6 -0
  588. lfx/custom/__init__.py +7 -0
  589. lfx/custom/attributes.py +87 -0
  590. lfx/custom/code_parser/__init__.py +3 -0
  591. lfx/custom/code_parser/code_parser.py +361 -0
  592. lfx/custom/custom_component/__init__.py +0 -0
  593. lfx/custom/custom_component/base_component.py +128 -0
  594. lfx/custom/custom_component/component.py +1890 -0
  595. lfx/custom/custom_component/component_with_cache.py +8 -0
  596. lfx/custom/custom_component/custom_component.py +650 -0
  597. lfx/custom/dependency_analyzer.py +165 -0
  598. lfx/custom/directory_reader/__init__.py +3 -0
  599. lfx/custom/directory_reader/directory_reader.py +359 -0
  600. lfx/custom/directory_reader/utils.py +171 -0
  601. lfx/custom/eval.py +12 -0
  602. lfx/custom/schema.py +32 -0
  603. lfx/custom/tree_visitor.py +21 -0
  604. lfx/custom/utils.py +877 -0
  605. lfx/custom/validate.py +523 -0
  606. lfx/events/__init__.py +1 -0
  607. lfx/events/event_manager.py +110 -0
  608. lfx/exceptions/__init__.py +0 -0
  609. lfx/exceptions/component.py +15 -0
  610. lfx/field_typing/__init__.py +91 -0
  611. lfx/field_typing/constants.py +216 -0
  612. lfx/field_typing/range_spec.py +35 -0
  613. lfx/graph/__init__.py +6 -0
  614. lfx/graph/edge/__init__.py +0 -0
  615. lfx/graph/edge/base.py +300 -0
  616. lfx/graph/edge/schema.py +119 -0
  617. lfx/graph/edge/utils.py +0 -0
  618. lfx/graph/graph/__init__.py +0 -0
  619. lfx/graph/graph/ascii.py +202 -0
  620. lfx/graph/graph/base.py +2298 -0
  621. lfx/graph/graph/constants.py +63 -0
  622. lfx/graph/graph/runnable_vertices_manager.py +133 -0
  623. lfx/graph/graph/schema.py +53 -0
  624. lfx/graph/graph/state_model.py +66 -0
  625. lfx/graph/graph/utils.py +1024 -0
  626. lfx/graph/schema.py +75 -0
  627. lfx/graph/state/__init__.py +0 -0
  628. lfx/graph/state/model.py +250 -0
  629. lfx/graph/utils.py +206 -0
  630. lfx/graph/vertex/__init__.py +0 -0
  631. lfx/graph/vertex/base.py +826 -0
  632. lfx/graph/vertex/constants.py +0 -0
  633. lfx/graph/vertex/exceptions.py +4 -0
  634. lfx/graph/vertex/param_handler.py +316 -0
  635. lfx/graph/vertex/schema.py +26 -0
  636. lfx/graph/vertex/utils.py +19 -0
  637. lfx/graph/vertex/vertex_types.py +489 -0
  638. lfx/helpers/__init__.py +141 -0
  639. lfx/helpers/base_model.py +71 -0
  640. lfx/helpers/custom.py +13 -0
  641. lfx/helpers/data.py +167 -0
  642. lfx/helpers/flow.py +308 -0
  643. lfx/inputs/__init__.py +68 -0
  644. lfx/inputs/constants.py +2 -0
  645. lfx/inputs/input_mixin.py +352 -0
  646. lfx/inputs/inputs.py +718 -0
  647. lfx/inputs/validators.py +19 -0
  648. lfx/interface/__init__.py +6 -0
  649. lfx/interface/components.py +897 -0
  650. lfx/interface/importing/__init__.py +5 -0
  651. lfx/interface/importing/utils.py +39 -0
  652. lfx/interface/initialize/__init__.py +3 -0
  653. lfx/interface/initialize/loading.py +317 -0
  654. lfx/interface/listing.py +26 -0
  655. lfx/interface/run.py +16 -0
  656. lfx/interface/utils.py +111 -0
  657. lfx/io/__init__.py +63 -0
  658. lfx/io/schema.py +295 -0
  659. lfx/load/__init__.py +8 -0
  660. lfx/load/load.py +256 -0
  661. lfx/load/utils.py +99 -0
  662. lfx/log/__init__.py +5 -0
  663. lfx/log/logger.py +411 -0
  664. lfx/logging/__init__.py +11 -0
  665. lfx/logging/logger.py +24 -0
  666. lfx/memory/__init__.py +70 -0
  667. lfx/memory/stubs.py +302 -0
  668. lfx/processing/__init__.py +1 -0
  669. lfx/processing/process.py +238 -0
  670. lfx/processing/utils.py +25 -0
  671. lfx/py.typed +0 -0
  672. lfx/schema/__init__.py +66 -0
  673. lfx/schema/artifact.py +83 -0
  674. lfx/schema/content_block.py +62 -0
  675. lfx/schema/content_types.py +91 -0
  676. lfx/schema/cross_module.py +80 -0
  677. lfx/schema/data.py +309 -0
  678. lfx/schema/dataframe.py +210 -0
  679. lfx/schema/dotdict.py +74 -0
  680. lfx/schema/encoders.py +13 -0
  681. lfx/schema/graph.py +47 -0
  682. lfx/schema/image.py +184 -0
  683. lfx/schema/json_schema.py +186 -0
  684. lfx/schema/log.py +62 -0
  685. lfx/schema/message.py +493 -0
  686. lfx/schema/openai_responses_schemas.py +74 -0
  687. lfx/schema/properties.py +41 -0
  688. lfx/schema/schema.py +180 -0
  689. lfx/schema/serialize.py +13 -0
  690. lfx/schema/table.py +142 -0
  691. lfx/schema/validators.py +114 -0
  692. lfx/serialization/__init__.py +5 -0
  693. lfx/serialization/constants.py +2 -0
  694. lfx/serialization/serialization.py +314 -0
  695. lfx/services/__init__.py +26 -0
  696. lfx/services/base.py +28 -0
  697. lfx/services/cache/__init__.py +6 -0
  698. lfx/services/cache/base.py +183 -0
  699. lfx/services/cache/service.py +166 -0
  700. lfx/services/cache/utils.py +169 -0
  701. lfx/services/chat/__init__.py +1 -0
  702. lfx/services/chat/config.py +2 -0
  703. lfx/services/chat/schema.py +10 -0
  704. lfx/services/database/__init__.py +5 -0
  705. lfx/services/database/service.py +25 -0
  706. lfx/services/deps.py +194 -0
  707. lfx/services/factory.py +19 -0
  708. lfx/services/initialize.py +19 -0
  709. lfx/services/interfaces.py +103 -0
  710. lfx/services/manager.py +185 -0
  711. lfx/services/mcp_composer/__init__.py +6 -0
  712. lfx/services/mcp_composer/factory.py +16 -0
  713. lfx/services/mcp_composer/service.py +1441 -0
  714. lfx/services/schema.py +21 -0
  715. lfx/services/session.py +87 -0
  716. lfx/services/settings/__init__.py +3 -0
  717. lfx/services/settings/auth.py +133 -0
  718. lfx/services/settings/base.py +668 -0
  719. lfx/services/settings/constants.py +43 -0
  720. lfx/services/settings/factory.py +23 -0
  721. lfx/services/settings/feature_flags.py +11 -0
  722. lfx/services/settings/service.py +35 -0
  723. lfx/services/settings/utils.py +40 -0
  724. lfx/services/shared_component_cache/__init__.py +1 -0
  725. lfx/services/shared_component_cache/factory.py +30 -0
  726. lfx/services/shared_component_cache/service.py +9 -0
  727. lfx/services/storage/__init__.py +5 -0
  728. lfx/services/storage/local.py +185 -0
  729. lfx/services/storage/service.py +177 -0
  730. lfx/services/tracing/__init__.py +1 -0
  731. lfx/services/tracing/service.py +21 -0
  732. lfx/settings.py +6 -0
  733. lfx/template/__init__.py +6 -0
  734. lfx/template/field/__init__.py +0 -0
  735. lfx/template/field/base.py +260 -0
  736. lfx/template/field/prompt.py +15 -0
  737. lfx/template/frontend_node/__init__.py +6 -0
  738. lfx/template/frontend_node/base.py +214 -0
  739. lfx/template/frontend_node/constants.py +65 -0
  740. lfx/template/frontend_node/custom_components.py +79 -0
  741. lfx/template/template/__init__.py +0 -0
  742. lfx/template/template/base.py +100 -0
  743. lfx/template/utils.py +217 -0
  744. lfx/type_extraction/__init__.py +19 -0
  745. lfx/type_extraction/type_extraction.py +75 -0
  746. lfx/type_extraction.py +80 -0
  747. lfx/utils/__init__.py +1 -0
  748. lfx/utils/async_helpers.py +42 -0
  749. lfx/utils/component_utils.py +154 -0
  750. lfx/utils/concurrency.py +60 -0
  751. lfx/utils/connection_string_parser.py +11 -0
  752. lfx/utils/constants.py +233 -0
  753. lfx/utils/data_structure.py +212 -0
  754. lfx/utils/exceptions.py +22 -0
  755. lfx/utils/helpers.py +34 -0
  756. lfx/utils/image.py +79 -0
  757. lfx/utils/langflow_utils.py +52 -0
  758. lfx/utils/lazy_load.py +15 -0
  759. lfx/utils/request_utils.py +18 -0
  760. lfx/utils/schemas.py +139 -0
  761. lfx/utils/ssrf_protection.py +384 -0
  762. lfx/utils/util.py +626 -0
  763. lfx/utils/util_strings.py +56 -0
  764. lfx/utils/validate_cloud.py +26 -0
  765. lfx/utils/version.py +24 -0
  766. lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
  767. lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
  768. lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
  769. lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,896 @@
1
+ import re
2
+ from collections import defaultdict
3
+ from dataclasses import asdict, dataclass, field
4
+ from typing import Any
5
+
6
+ from astrapy import DataAPIClient, Database
7
+ from langchain_astradb.utils.astradb import _AstraDBCollectionEnvironment
8
+
9
+ from lfx.custom.custom_component.component import Component
10
+ from lfx.io import (
11
+ BoolInput,
12
+ DropdownInput,
13
+ IntInput,
14
+ SecretStrInput,
15
+ StrInput,
16
+ )
17
+ from lfx.log.logger import logger
18
+
19
+
20
+ class AstraDBBaseComponent(Component):
21
+ """Base class for AstraDB components with common functionality."""
22
+
23
+ @dataclass
24
+ class NewDatabaseInput:
25
+ functionality: str = "create"
26
+ fields: dict[str, dict] = field(
27
+ default_factory=lambda: {
28
+ "data": {
29
+ "node": {
30
+ "name": "create_database",
31
+ "description": "Please allow several minutes for creation to complete.",
32
+ "display_name": "Create new database",
33
+ "field_order": ["01_new_database_name", "02_cloud_provider", "03_region"],
34
+ "template": {
35
+ "01_new_database_name": StrInput(
36
+ name="new_database_name",
37
+ display_name="Name",
38
+ info="Name of the new database to create in Astra DB.",
39
+ required=True,
40
+ ),
41
+ "02_cloud_provider": DropdownInput(
42
+ name="cloud_provider",
43
+ display_name="Cloud provider",
44
+ info="Cloud provider for the new database.",
45
+ options=[],
46
+ required=True,
47
+ real_time_refresh=True,
48
+ ),
49
+ "03_region": DropdownInput(
50
+ name="region",
51
+ display_name="Region",
52
+ info="Region for the new database.",
53
+ options=[],
54
+ required=True,
55
+ ),
56
+ },
57
+ },
58
+ }
59
+ }
60
+ )
61
+
62
+ @dataclass
63
+ class NewCollectionInput:
64
+ functionality: str = "create"
65
+ fields: dict[str, dict] = field(
66
+ default_factory=lambda: {
67
+ "data": {
68
+ "node": {
69
+ "name": "create_collection",
70
+ "description": "Please allow several seconds for creation to complete.",
71
+ "display_name": "Create new collection",
72
+ "field_order": [
73
+ "01_new_collection_name",
74
+ "02_embedding_generation_provider",
75
+ "03_embedding_generation_model",
76
+ "04_dimension",
77
+ ],
78
+ "template": {
79
+ "01_new_collection_name": StrInput(
80
+ name="new_collection_name",
81
+ display_name="Name",
82
+ info="Name of the new collection to create in Astra DB.",
83
+ required=True,
84
+ ),
85
+ "02_embedding_generation_provider": DropdownInput(
86
+ name="embedding_generation_provider",
87
+ display_name="Embedding generation method",
88
+ info="Provider to use for generating embeddings.",
89
+ helper_text=(
90
+ "To create collections with more embedding provider options, go to "
91
+ '<a class="underline" href="https://astra.datastax.com/" target=" _blank" '
92
+ 'rel="noopener noreferrer">your database in Astra DB</a>'
93
+ ),
94
+ real_time_refresh=True,
95
+ required=True,
96
+ options=[],
97
+ ),
98
+ "03_embedding_generation_model": DropdownInput(
99
+ name="embedding_generation_model",
100
+ display_name="Embedding model",
101
+ info="Model to use for generating embeddings.",
102
+ real_time_refresh=True,
103
+ options=[],
104
+ ),
105
+ "04_dimension": IntInput(
106
+ name="dimension",
107
+ display_name="Dimensions",
108
+ info="Dimensions of the embeddings to generate.",
109
+ value=None,
110
+ ),
111
+ },
112
+ },
113
+ }
114
+ }
115
+ )
116
+
117
+ inputs = [
118
+ SecretStrInput(
119
+ name="token",
120
+ display_name="Astra DB Application Token",
121
+ info="Authentication token for accessing Astra DB.",
122
+ value="ASTRA_DB_APPLICATION_TOKEN",
123
+ required=True,
124
+ real_time_refresh=True,
125
+ input_types=[],
126
+ ),
127
+ DropdownInput(
128
+ name="environment",
129
+ display_name="Environment",
130
+ info="The environment for the Astra DB API Endpoint.",
131
+ options=["prod", "test", "dev"],
132
+ value="prod",
133
+ advanced=True,
134
+ real_time_refresh=True,
135
+ combobox=True,
136
+ ),
137
+ DropdownInput(
138
+ name="database_name",
139
+ display_name="Database",
140
+ info="The Database name for the Astra DB instance.",
141
+ required=True,
142
+ refresh_button=True,
143
+ real_time_refresh=True,
144
+ dialog_inputs=asdict(NewDatabaseInput()),
145
+ combobox=True,
146
+ ),
147
+ DropdownInput(
148
+ name="api_endpoint",
149
+ display_name="Astra DB API Endpoint",
150
+ info="The API Endpoint for the Astra DB instance. Supercedes database selection.",
151
+ advanced=True,
152
+ ),
153
+ DropdownInput(
154
+ name="keyspace",
155
+ display_name="Keyspace",
156
+ info="Optional keyspace within Astra DB to use for the collection.",
157
+ advanced=True,
158
+ options=[],
159
+ real_time_refresh=True,
160
+ ),
161
+ DropdownInput(
162
+ name="collection_name",
163
+ display_name="Collection",
164
+ info="The name of the collection within Astra DB where the vectors will be stored.",
165
+ required=True,
166
+ refresh_button=True,
167
+ real_time_refresh=True,
168
+ dialog_inputs=asdict(NewCollectionInput()),
169
+ combobox=True,
170
+ show=False,
171
+ ),
172
+ BoolInput(
173
+ name="autodetect_collection",
174
+ display_name="Autodetect Collection",
175
+ info="Boolean flag to determine whether to autodetect the collection.",
176
+ advanced=True,
177
+ value=True,
178
+ ),
179
+ ]
180
+
181
+ @classmethod
182
+ def get_environment(cls, environment: str | None = None) -> str:
183
+ if not environment:
184
+ return "prod"
185
+ return environment
186
+
187
+ @classmethod
188
+ def map_cloud_providers(cls, token: str, environment: str | None = None) -> dict[str, dict[str, Any]]:
189
+ """Fetch all available cloud providers and regions."""
190
+ # Get the admin object
191
+ client = DataAPIClient(environment=cls.get_environment(environment))
192
+ admin_client = client.get_admin(token=token)
193
+
194
+ # Get the list of available regions
195
+ available_regions = admin_client.find_available_regions(only_org_enabled_regions=True)
196
+
197
+ provider_mapping: dict[str, dict[str, str]] = {
198
+ "AWS": {"name": "Amazon Web Services", "id": "aws"},
199
+ "GCP": {"name": "Google Cloud Platform", "id": "gcp"},
200
+ "Azure": {"name": "Microsoft Azure", "id": "azure"},
201
+ }
202
+
203
+ result: dict[str, dict[str, Any]] = {}
204
+ for region_info in available_regions:
205
+ cloud_provider = region_info.cloud_provider
206
+ region = region_info.name
207
+
208
+ if cloud_provider in provider_mapping:
209
+ provider_name = provider_mapping[cloud_provider]["name"]
210
+ provider_id = provider_mapping[cloud_provider]["id"]
211
+
212
+ if provider_name not in result:
213
+ result[provider_name] = {"id": provider_id, "regions": []}
214
+
215
+ result[provider_name]["regions"].append(region)
216
+
217
+ return result
218
+
219
+ @classmethod
220
+ def get_vectorize_providers(cls, token: str, environment: str | None = None, api_endpoint: str | None = None):
221
+ try:
222
+ # Get the admin object
223
+ client = DataAPIClient(environment=cls.get_environment(environment))
224
+ admin_client = client.get_admin()
225
+ db_admin = admin_client.get_database_admin(api_endpoint, token=token)
226
+
227
+ # Get the list of embedding providers
228
+ embedding_providers = db_admin.find_embedding_providers()
229
+
230
+ vectorize_providers_mapping = {}
231
+ # Map the provider display name to the provider key and models
232
+ for provider_key, provider_data in embedding_providers.embedding_providers.items():
233
+ # Get the provider display name and models
234
+ display_name = provider_data.display_name
235
+ models = [model.name for model in provider_data.models]
236
+
237
+ # Build our mapping
238
+ vectorize_providers_mapping[display_name] = [provider_key, models]
239
+
240
+ # Sort the resulting dictionary
241
+ return defaultdict(list, dict(sorted(vectorize_providers_mapping.items())))
242
+ except Exception as _: # noqa: BLE001
243
+ return {}
244
+
245
+ @classmethod
246
+ async def create_database_api(
247
+ cls,
248
+ new_database_name: str,
249
+ cloud_provider: str,
250
+ region: str,
251
+ token: str,
252
+ environment: str | None = None,
253
+ keyspace: str | None = None,
254
+ ):
255
+ # Get the environment, set to prod if null like
256
+ my_env = cls.get_environment(environment)
257
+
258
+ # Initialize the Data API client
259
+ client = DataAPIClient(environment=my_env)
260
+
261
+ # Get the admin object
262
+ admin_client = client.get_admin(token=token)
263
+
264
+ # Raise a value error if name isn't provided
265
+ if not new_database_name:
266
+ msg = "Database name is required to create a new database."
267
+ raise ValueError(msg)
268
+
269
+ # Call the create database function
270
+ return await admin_client.async_create_database(
271
+ name=new_database_name,
272
+ cloud_provider=cls.map_cloud_providers(token=token, environment=my_env)[cloud_provider]["id"],
273
+ region=region,
274
+ keyspace=keyspace,
275
+ wait_until_active=False,
276
+ )
277
+
278
+ @classmethod
279
+ async def create_collection_api(
280
+ cls,
281
+ new_collection_name: str,
282
+ token: str,
283
+ api_endpoint: str,
284
+ environment: str | None = None,
285
+ keyspace: str | None = None,
286
+ dimension: int | None = None,
287
+ embedding_generation_provider: str | None = None,
288
+ embedding_generation_model: str | None = None,
289
+ ):
290
+ # Build vectorize options, if needed
291
+ vectorize_options = None
292
+ if not dimension:
293
+ try:
294
+ from langchain_astradb import VectorServiceOptions
295
+ except ImportError as e:
296
+ msg = (
297
+ "langchain-astradb is required to create AstraDB collections with "
298
+ "Astra Vectorize embeddings. Please install it with "
299
+ "`pip install langchain-astradb`."
300
+ )
301
+ raise ImportError(msg) from e
302
+
303
+ environment = cls.get_environment(environment)
304
+ providers = cls.get_vectorize_providers(token=token, environment=environment, api_endpoint=api_endpoint)
305
+ vectorize_options = VectorServiceOptions(
306
+ provider=providers.get(embedding_generation_provider, [None, []])[0],
307
+ model_name=embedding_generation_model,
308
+ )
309
+
310
+ # Raise a value error if name isn't provided
311
+ if not new_collection_name:
312
+ msg = "Collection name is required to create a new collection."
313
+ raise ValueError(msg)
314
+
315
+ # Define the base arguments being passed to the create collection function
316
+ base_args = {
317
+ "collection_name": new_collection_name,
318
+ "token": token,
319
+ "api_endpoint": api_endpoint,
320
+ "keyspace": keyspace,
321
+ "environment": environment,
322
+ "embedding_dimension": dimension,
323
+ "collection_vector_service_options": vectorize_options,
324
+ }
325
+
326
+ _AstraDBCollectionEnvironment(**base_args)
327
+
328
+ @classmethod
329
+ def get_database_list_static(cls, token: str, environment: str | None = None):
330
+ environment = cls.get_environment(environment)
331
+ client = DataAPIClient(environment=environment)
332
+
333
+ # Get the admin object
334
+ admin_client = client.get_admin(token=token)
335
+
336
+ # Get the list of databases
337
+ db_list = admin_client.list_databases()
338
+
339
+ # Generate the api endpoint for each database
340
+ db_info_dict = {}
341
+ for db in db_list:
342
+ try:
343
+ # Get the API endpoint for the database
344
+ api_endpoints = [db_reg.api_endpoint for db_reg in db.regions]
345
+
346
+ # Get the number of collections
347
+ try:
348
+ # Get the number of collections in the database
349
+ num_collections = len(
350
+ client.get_database(
351
+ api_endpoints[0],
352
+ token=token,
353
+ ).list_collection_names()
354
+ )
355
+ except Exception: # noqa: BLE001
356
+ if db.status != "PENDING":
357
+ continue
358
+ num_collections = 0
359
+
360
+ # Add the database to the dictionary
361
+ db_info_dict[db.name] = {
362
+ "api_endpoints": api_endpoints,
363
+ "keyspaces": db.keyspaces,
364
+ "collections": num_collections,
365
+ "status": db.status if db.status != "ACTIVE" else None,
366
+ "org_id": db.org_id if db.org_id else None,
367
+ }
368
+ except Exception as e: # noqa: BLE001
369
+ logger.debug("Failed to get metadata for database %s: %s", db.name, e)
370
+
371
+ return db_info_dict
372
+
373
+ def get_database_list(self):
374
+ return self.get_database_list_static(
375
+ token=self.token,
376
+ environment=self.environment,
377
+ )
378
+
379
+ @classmethod
380
+ def get_api_endpoint_static(
381
+ cls,
382
+ token: str,
383
+ environment: str | None = None,
384
+ api_endpoint: str | None = None,
385
+ database_name: str | None = None,
386
+ ):
387
+ # If the api_endpoint is set, return it
388
+ if api_endpoint:
389
+ return api_endpoint
390
+
391
+ # Check if the database_name is like a url
392
+ if database_name and database_name.startswith("https://"):
393
+ return database_name
394
+
395
+ # If the database is not set, nothing we can do.
396
+ if not database_name:
397
+ return None
398
+
399
+ # Grab the database object
400
+ environment = cls.get_environment(environment)
401
+ db = cls.get_database_list_static(token=token, environment=environment).get(database_name)
402
+ if not db:
403
+ return None
404
+
405
+ # Otherwise, get the URL from the database list
406
+ endpoints = db.get("api_endpoints") or []
407
+ return endpoints[0] if endpoints else None
408
+
409
+ def get_api_endpoint(self):
410
+ return self.get_api_endpoint_static(
411
+ token=self.token,
412
+ environment=self.environment,
413
+ api_endpoint=self.api_endpoint,
414
+ database_name=self.database_name,
415
+ )
416
+
417
+ @classmethod
418
+ def get_database_id_static(cls, api_endpoint: str) -> str | None:
419
+ # Pattern matches standard UUID format: 8-4-4-4-12 hexadecimal characters
420
+ uuid_pattern = r"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"
421
+ match = re.search(uuid_pattern, api_endpoint)
422
+
423
+ return match.group(0) if match else None
424
+
425
+ def get_database_id(self):
426
+ return self.get_database_id_static(api_endpoint=self.get_api_endpoint())
427
+
428
+ def get_keyspace(self):
429
+ keyspace = self.keyspace
430
+
431
+ if keyspace:
432
+ return keyspace.strip()
433
+
434
+ return "default_keyspace"
435
+
436
+ def get_database_object(self, api_endpoint: str | None = None):
437
+ try:
438
+ client = DataAPIClient(environment=self.environment)
439
+
440
+ return client.get_database(
441
+ api_endpoint or self.get_api_endpoint(),
442
+ token=self.token,
443
+ keyspace=self.get_keyspace(),
444
+ )
445
+ except Exception as e:
446
+ msg = f"Error fetching database object: {e}"
447
+ raise ValueError(msg) from e
448
+
449
+ def collection_data(self, collection_name: str, database: Database = None):
450
+ try:
451
+ if not database:
452
+ client = DataAPIClient(environment=self.environment)
453
+
454
+ database = client.get_database(
455
+ self.get_api_endpoint(),
456
+ token=self.token,
457
+ keyspace=self.get_keyspace(),
458
+ )
459
+
460
+ collection = database.get_collection(collection_name)
461
+
462
+ return collection.estimated_document_count()
463
+ except Exception as e: # noqa: BLE001
464
+ self.log(f"Error checking collection data: {e}")
465
+
466
+ return None
467
+
468
+ def _initialize_database_options(self):
469
+ try:
470
+ return [
471
+ {
472
+ "name": name,
473
+ "status": info["status"],
474
+ "collections": info["collections"],
475
+ "api_endpoints": info["api_endpoints"],
476
+ "keyspaces": info["keyspaces"],
477
+ "org_id": info["org_id"],
478
+ }
479
+ for name, info in self.get_database_list().items()
480
+ ]
481
+ except Exception as e:
482
+ msg = f"Error fetching database options: {e}"
483
+ raise ValueError(msg) from e
484
+
485
+ @classmethod
486
+ def get_provider_icon(cls, collection=None, provider_name: str | None = None) -> str:
487
+ # Get the provider name from the collection
488
+ provider_name = provider_name or (
489
+ collection.definition.vector.service.provider
490
+ if (
491
+ collection
492
+ and collection.definition
493
+ and collection.definition.vector
494
+ and collection.definition.vector.service
495
+ )
496
+ else None
497
+ )
498
+
499
+ # If there is no provider, use the vector store icon
500
+ if not provider_name or provider_name.lower() == "bring your own":
501
+ return "vectorstores"
502
+
503
+ # Map provider casings
504
+ case_map = {
505
+ "nvidia": "NVIDIA",
506
+ "openai": "OpenAI",
507
+ "amazon bedrock": "AmazonBedrockEmbeddings",
508
+ "azure openai": "AzureOpenAiEmbeddings",
509
+ "cohere": "Cohere",
510
+ "jina ai": "JinaAI",
511
+ "mistral ai": "MistralAI",
512
+ "upstage": "Upstage",
513
+ "voyage ai": "VoyageAI",
514
+ }
515
+
516
+ # Adjust the casing on some like nvidia
517
+ return case_map[provider_name.lower()] if provider_name.lower() in case_map else provider_name.title()
518
+
519
+ def _initialize_collection_options(self, api_endpoint: str | None = None):
520
+ # Nothing to generate if we don't have an API endpoint yet
521
+ api_endpoint = api_endpoint or self.get_api_endpoint()
522
+ if not api_endpoint:
523
+ return []
524
+
525
+ # Retrieve the database object
526
+ database = self.get_database_object(api_endpoint=api_endpoint)
527
+
528
+ # Get the list of collections
529
+ collection_list = database.list_collections(keyspace=self.get_keyspace())
530
+
531
+ # Return the list of collections and metadata associated
532
+ return [
533
+ {
534
+ "name": col.name,
535
+ "records": self.collection_data(collection_name=col.name, database=database),
536
+ "provider": (
537
+ col.definition.vector.service.provider
538
+ if col.definition.vector and col.definition.vector.service
539
+ else None
540
+ ),
541
+ "icon": self.get_provider_icon(collection=col),
542
+ "model": (
543
+ col.definition.vector.service.model_name
544
+ if col.definition.vector and col.definition.vector.service
545
+ else None
546
+ ),
547
+ }
548
+ for col in collection_list
549
+ ]
550
+
551
+ def reset_provider_options(self, build_config: dict) -> dict:
552
+ """Reset provider options and related configurations in the build_config dictionary."""
553
+ # Extract template path for cleaner access
554
+ template = build_config["collection_name"]["dialog_inputs"]["fields"]["data"]["node"]["template"]
555
+
556
+ # Get vectorize providers
557
+ vectorize_providers_api = self.get_vectorize_providers(
558
+ token=self.token,
559
+ environment=self.environment,
560
+ api_endpoint=build_config["api_endpoint"]["value"],
561
+ )
562
+
563
+ # Create a new dictionary with "Bring your own" first
564
+ vectorize_providers: dict[str, list[list[str]]] = {"Bring your own": [[], []]}
565
+
566
+ # Add the remaining items (only Nvidia) from the original dictionary
567
+ vectorize_providers.update(
568
+ {
569
+ k: v
570
+ for k, v in vectorize_providers_api.items()
571
+ if k.lower() in ["nvidia"] # TODO: Eventually support more
572
+ }
573
+ )
574
+
575
+ # Set provider options
576
+ provider_field = "02_embedding_generation_provider"
577
+ template[provider_field]["options"] = list(vectorize_providers.keys())
578
+
579
+ # Add metadata for each provider option
580
+ template[provider_field]["options_metadata"] = [
581
+ {"icon": self.get_provider_icon(provider_name=provider)} for provider in template[provider_field]["options"]
582
+ ]
583
+
584
+ # Get selected embedding provider
585
+ embedding_provider = template[provider_field]["value"]
586
+ is_bring_your_own = embedding_provider and embedding_provider == "Bring your own"
587
+
588
+ # Configure embedding model field
589
+ model_field = "03_embedding_generation_model"
590
+ template[model_field].update(
591
+ {
592
+ "options": vectorize_providers.get(embedding_provider, [[], []])[1],
593
+ "placeholder": "Bring your own" if is_bring_your_own else None,
594
+ "readonly": is_bring_your_own,
595
+ "required": not is_bring_your_own,
596
+ "value": None,
597
+ }
598
+ )
599
+
600
+ # If this is a bring your own, set dimensions to 0
601
+ return self.reset_dimension_field(build_config)
602
+
603
+ def reset_dimension_field(self, build_config: dict) -> dict:
604
+ """Reset dimension field options based on provided configuration."""
605
+ # Extract template path for cleaner access
606
+ template = build_config["collection_name"]["dialog_inputs"]["fields"]["data"]["node"]["template"]
607
+
608
+ # Get selected embedding model
609
+ provider_field = "02_embedding_generation_provider"
610
+ embedding_provider = template[provider_field]["value"]
611
+ is_bring_your_own = embedding_provider and embedding_provider == "Bring your own"
612
+
613
+ # Configure dimension field
614
+ dimension_field = "04_dimension"
615
+ dimension_value = 1024 if not is_bring_your_own else None # TODO: Dynamically figure this out
616
+ template[dimension_field].update(
617
+ {
618
+ "placeholder": dimension_value,
619
+ "value": dimension_value,
620
+ "readonly": not is_bring_your_own,
621
+ "required": is_bring_your_own,
622
+ }
623
+ )
624
+
625
+ return build_config
626
+
627
+ def reset_collection_list(self, build_config: dict) -> dict:
628
+ """Reset collection list options based on provided configuration."""
629
+ # Get collection options
630
+ collection_options = self._initialize_collection_options(api_endpoint=build_config["api_endpoint"]["value"])
631
+ # Update collection configuration
632
+ collection_config = build_config["collection_name"]
633
+ collection_config.update(
634
+ {
635
+ "options": [col["name"] for col in collection_options],
636
+ "options_metadata": [{k: v for k, v in col.items() if k != "name"} for col in collection_options],
637
+ }
638
+ )
639
+
640
+ # Reset selected collection if not in options
641
+ if collection_config["value"] not in collection_config["options"]:
642
+ collection_config["value"] = ""
643
+
644
+ # Set advanced status based on database selection
645
+ collection_config["show"] = bool(build_config["database_name"]["value"])
646
+
647
+ return build_config
648
+
649
+ def reset_database_list(self, build_config: dict) -> dict:
650
+ """Reset database list options and related configurations."""
651
+ # Get database options
652
+ database_options = self._initialize_database_options()
653
+
654
+ # Update cloud provider options
655
+ template = build_config["database_name"]["dialog_inputs"]["fields"]["data"]["node"]["template"]
656
+ template["02_cloud_provider"]["options"] = list(
657
+ self.map_cloud_providers(
658
+ token=self.token,
659
+ environment=self.environment,
660
+ ).keys()
661
+ )
662
+
663
+ # Update database configuration
664
+ database_config = build_config["database_name"]
665
+ database_config.update(
666
+ {
667
+ "options": [db["name"] for db in database_options],
668
+ "options_metadata": [{k: v for k, v in db.items() if k != "name"} for db in database_options],
669
+ }
670
+ )
671
+
672
+ # Reset selections if value not in options
673
+ if database_config["value"] not in database_config["options"]:
674
+ database_config["value"] = ""
675
+ build_config["api_endpoint"]["options"] = []
676
+ build_config["api_endpoint"]["value"] = ""
677
+ build_config["collection_name"]["show"] = False
678
+
679
+ # Set advanced status based on token presence
680
+ database_config["show"] = bool(build_config["token"]["value"])
681
+
682
+ return build_config
683
+
684
+ def reset_build_config(self, build_config: dict) -> dict:
685
+ """Reset all build configuration options to default empty state."""
686
+ # Reset database configuration
687
+ database_config = build_config["database_name"]
688
+ database_config.update({"options": [], "options_metadata": [], "value": "", "show": False})
689
+ build_config["api_endpoint"]["options"] = []
690
+ build_config["api_endpoint"]["value"] = ""
691
+
692
+ # Reset collection configuration
693
+ collection_config = build_config["collection_name"]
694
+ collection_config.update({"options": [], "options_metadata": [], "value": "", "show": False})
695
+
696
+ return build_config
697
+
698
+ async def update_build_config(
699
+ self,
700
+ build_config: dict,
701
+ field_value: str | dict,
702
+ field_name: str | None = None,
703
+ ) -> dict:
704
+ """Update build configuration based on field name and value."""
705
+ # Early return if no token provided
706
+ if not self.token:
707
+ return self.reset_build_config(build_config)
708
+
709
+ # Database creation callback
710
+ if field_name == "database_name" and isinstance(field_value, dict):
711
+ if "01_new_database_name" in field_value:
712
+ await self._create_new_database(build_config, field_value)
713
+ return self.reset_collection_list(build_config)
714
+ return self._update_cloud_regions(build_config, field_value)
715
+
716
+ # Collection creation callback
717
+ if field_name == "collection_name" and isinstance(field_value, dict):
718
+ # Case 1: New collection creation
719
+ if "01_new_collection_name" in field_value:
720
+ await self._create_new_collection(build_config, field_value)
721
+ return build_config
722
+
723
+ # Case 2: Update embedding provider options
724
+ if "02_embedding_generation_provider" in field_value:
725
+ return self.reset_provider_options(build_config)
726
+
727
+ # Case 3: Update dimension field
728
+ if "03_embedding_generation_model" in field_value:
729
+ return self.reset_dimension_field(build_config)
730
+
731
+ # Initial execution or token/environment change
732
+ first_run = field_name == "collection_name" and not field_value and not build_config["database_name"]["options"]
733
+ if first_run or field_name in {"token", "environment"}:
734
+ return self.reset_database_list(build_config)
735
+
736
+ # Database selection change
737
+ if field_name == "database_name" and not isinstance(field_value, dict):
738
+ return self._handle_database_selection(build_config, field_value)
739
+
740
+ # Keyspace selection change
741
+ if field_name == "keyspace":
742
+ return self.reset_collection_list(build_config)
743
+
744
+ # Collection selection change
745
+ if field_name == "collection_name" and not isinstance(field_value, dict):
746
+ return self._handle_collection_selection(build_config, field_value)
747
+
748
+ return build_config
749
+
750
+ async def _create_new_database(self, build_config: dict, field_value: dict) -> None:
751
+ """Create a new database and update build config options."""
752
+ try:
753
+ await self.create_database_api(
754
+ new_database_name=field_value["01_new_database_name"],
755
+ token=self.token,
756
+ keyspace=self.get_keyspace(),
757
+ environment=self.environment,
758
+ cloud_provider=field_value["02_cloud_provider"],
759
+ region=field_value["03_region"],
760
+ )
761
+ except Exception as e:
762
+ msg = f"Error creating database: {e}"
763
+ raise ValueError(msg) from e
764
+
765
+ build_config["database_name"]["options"].append(field_value["01_new_database_name"])
766
+ build_config["database_name"]["options_metadata"].append(
767
+ {
768
+ "status": "PENDING",
769
+ "collections": 0,
770
+ "api_endpoints": [],
771
+ "keyspaces": [self.get_keyspace()],
772
+ "org_id": None,
773
+ }
774
+ )
775
+
776
+ def _update_cloud_regions(self, build_config: dict, field_value: dict) -> dict:
777
+ """Update cloud provider regions in build config."""
778
+ cloud_provider = field_value["02_cloud_provider"]
779
+
780
+ # Update the region options based on the selected cloud provider
781
+ template = build_config["database_name"]["dialog_inputs"]["fields"]["data"]["node"]["template"]
782
+ template["03_region"]["options"] = self.map_cloud_providers(
783
+ token=self.token,
784
+ environment=self.environment,
785
+ )[cloud_provider]["regions"]
786
+
787
+ # Reset the the 03_region value if it's not in the new options
788
+ if template["03_region"]["value"] not in template["03_region"]["options"]:
789
+ template["03_region"]["value"] = None
790
+
791
+ return build_config
792
+
793
+ async def _create_new_collection(self, build_config: dict, field_value: dict) -> None:
794
+ """Create a new collection and update build config options."""
795
+ embedding_provider = field_value.get("02_embedding_generation_provider")
796
+ try:
797
+ await self.create_collection_api(
798
+ new_collection_name=field_value["01_new_collection_name"],
799
+ token=self.token,
800
+ api_endpoint=build_config["api_endpoint"]["value"],
801
+ environment=self.environment,
802
+ keyspace=self.get_keyspace(),
803
+ dimension=field_value.get("04_dimension") if embedding_provider == "Bring your own" else None,
804
+ embedding_generation_provider=embedding_provider,
805
+ embedding_generation_model=field_value.get("03_embedding_generation_model"),
806
+ )
807
+ except Exception as e:
808
+ msg = f"Error creating collection: {e}"
809
+ raise ValueError(msg) from e
810
+
811
+ provider = embedding_provider.lower() if embedding_provider and embedding_provider != "Bring your own" else None
812
+ build_config["collection_name"].update(
813
+ {
814
+ "value": field_value["01_new_collection_name"],
815
+ "options": build_config["collection_name"]["options"] + [field_value["01_new_collection_name"]],
816
+ }
817
+ )
818
+
819
+ # Update collection metadata
820
+ build_config["collection_name"]["options_metadata"].append(
821
+ {
822
+ "records": 0,
823
+ "provider": provider,
824
+ "icon": self.get_provider_icon(provider_name=provider),
825
+ "model": field_value.get("03_embedding_generation_model"),
826
+ }
827
+ )
828
+
829
+ def _handle_database_selection(self, build_config: dict, field_value: str) -> dict:
830
+ """Handle database selection and update related configurations."""
831
+ build_config = self.reset_database_list(build_config)
832
+
833
+ # Reset collection list if database selection changes
834
+ if field_value not in build_config["database_name"]["options"]:
835
+ build_config["database_name"]["value"] = ""
836
+ return build_config
837
+
838
+ # Get the api endpoint for the selected database
839
+ index = build_config["database_name"]["options"].index(field_value)
840
+ build_config["api_endpoint"]["options"] = build_config["database_name"]["options_metadata"][index][
841
+ "api_endpoints"
842
+ ]
843
+ build_config["api_endpoint"]["value"] = build_config["database_name"]["options_metadata"][index][
844
+ "api_endpoints"
845
+ ][0]
846
+
847
+ # Get the org_id for the selected database
848
+ org_id = build_config["database_name"]["options_metadata"][index]["org_id"]
849
+ if not org_id:
850
+ return build_config
851
+
852
+ # Update the list of keyspaces based on the db info
853
+ build_config["keyspace"]["options"] = build_config["database_name"]["options_metadata"][index]["keyspaces"]
854
+ build_config["keyspace"]["value"] = (
855
+ build_config["keyspace"]["options"] and build_config["keyspace"]["options"][0]
856
+ if build_config["keyspace"]["value"] not in build_config["keyspace"]["options"]
857
+ else build_config["keyspace"]["value"]
858
+ )
859
+
860
+ # Get the database id for the selected database
861
+ db_id = self.get_database_id_static(api_endpoint=build_config["api_endpoint"]["value"])
862
+ keyspace = self.get_keyspace()
863
+
864
+ # Update the helper text for the embedding provider field
865
+ template = build_config["collection_name"]["dialog_inputs"]["fields"]["data"]["node"]["template"]
866
+ template["02_embedding_generation_provider"]["helper_text"] = (
867
+ "To create collections with more embedding provider options, go to "
868
+ f'<a class="underline" target="_blank" rel="noopener noreferrer" '
869
+ f'href="https://astra.datastax.com/org/{org_id}/database/{db_id}/data-explorer?createCollection=1&namespace={keyspace}">'
870
+ "your database in Astra DB</a>."
871
+ )
872
+
873
+ # Reset provider options
874
+ build_config = self.reset_provider_options(build_config)
875
+
876
+ return self.reset_collection_list(build_config)
877
+
878
+ def _handle_collection_selection(self, build_config: dict, field_value: str) -> dict:
879
+ """Handle collection selection and update embedding options."""
880
+ build_config["autodetect_collection"]["value"] = True
881
+ build_config = self.reset_collection_list(build_config)
882
+
883
+ # Reset embedding model if collection selection changes
884
+ if field_value and field_value not in build_config["collection_name"]["options"]:
885
+ build_config["collection_name"]["options"].append(field_value)
886
+ build_config["collection_name"]["options_metadata"].append(
887
+ {
888
+ "records": 0,
889
+ "provider": None,
890
+ "icon": "vectorstores",
891
+ "model": None,
892
+ }
893
+ )
894
+ build_config["autodetect_collection"]["value"] = False
895
+
896
+ return build_config