langflow-base-nightly 0.5.0.dev36__py3-none-any.whl → 0.5.0.dev37__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 (155) hide show
  1. langflow/api/v1/knowledge_bases.py +16 -9
  2. langflow/api/v2/files.py +3 -1
  3. langflow/base/data/kb_utils.py +33 -0
  4. langflow/base/models/model.py +3 -3
  5. langflow/components/agents/mcp_component.py +40 -55
  6. langflow/components/data/kb_ingest.py +116 -43
  7. langflow/components/data/kb_retrieval.py +24 -26
  8. langflow/components/processing/save_file.py +6 -32
  9. langflow/components/vectorstores/astradb.py +30 -19
  10. langflow/frontend/assets/{SlackIcon-B260Qg_R.js → SlackIcon-CnvyOamQ.js} +1 -1
  11. langflow/frontend/assets/{Wikipedia-BB2mbgyd.js → Wikipedia-nyTEXdr2.js} +1 -1
  12. langflow/frontend/assets/{Wolfram-DytXC9hF.js → Wolfram-BYMQkNSq.js} +1 -1
  13. langflow/frontend/assets/{index-BdIWbCEL.js → index-8WdfSTTz.js} +1 -1
  14. langflow/frontend/assets/{index-D87Zw62M.js → index-8yMsjVV2.js} +1 -1
  15. langflow/frontend/assets/{index-DyJDHm2D.js → index-B1YN7oMV.js} +1 -1
  16. langflow/frontend/assets/{index-BEDxAk3N.js → index-B3Sur4Z3.js} +1 -1
  17. langflow/frontend/assets/{index-DhzEUXfr.js → index-B748uLP1.js} +1 -1
  18. langflow/frontend/assets/{index-4eRtaV45.js → index-BB15_iOb.js} +1 -1
  19. langflow/frontend/assets/{index-C_1RBTul.js → index-BBxAPk1y.js} +1 -1
  20. langflow/frontend/assets/{index-DHlEwAxb.js → index-BCCGvqay.js} +1 -1
  21. langflow/frontend/assets/{index-ci4XHjbJ.js → index-BChjg6Az.js} +3 -3
  22. langflow/frontend/assets/{index-B9Mo3ndZ.js → index-BEMw2Np8.js} +1 -1
  23. langflow/frontend/assets/{index-BKvKC-12.js → index-BFp_O-c9.js} +1 -1
  24. langflow/frontend/assets/{index-Ym6gz0T6.js → index-BIQQCMvz.js} +1 -1
  25. langflow/frontend/assets/{index-CwIxqYlT.js → index-BIXaW2aY.js} +1 -1
  26. langflow/frontend/assets/{index-BxkZkBgQ.js → index-BIzTEqFh.js} +1 -1
  27. langflow/frontend/assets/{index-C76aBV_h.js → index-BLGYN-9b.js} +1 -1
  28. langflow/frontend/assets/{index-B-c82Fnu.js → index-BOB_zsjl.js} +1 -1
  29. langflow/frontend/assets/{index-BbsND1Qg.js → index-BOeo01QB.js} +1 -1
  30. langflow/frontend/assets/{index-DztLFiip.js → index-BQ6NUdMY.js} +1 -1
  31. langflow/frontend/assets/{index-G_U_kPAd.js → index-BR0bkVqX.js} +1 -1
  32. langflow/frontend/assets/{index-R7q8cAek.js → index-BRYjyhAd.js} +1 -1
  33. langflow/frontend/assets/{index-Ccb5B8zG.js → index-BRxvproo.js} +1 -1
  34. langflow/frontend/assets/{index-B8y58M9b.js → index-BTEW9e8P.js} +1 -1
  35. langflow/frontend/assets/{index-DdzVmJHE.js → index-BTrsh9LS.js} +1 -1
  36. langflow/frontend/assets/{index-CkSzjCqM.js → index-BVEZDXxS.js} +1 -1
  37. langflow/frontend/assets/{index-BLROcaSz.js → index-BWmPX4iQ.js} +1 -1
  38. langflow/frontend/assets/{index-Ct9_T9ox.js → index-BX5D-USa.js} +1 -1
  39. langflow/frontend/assets/{index-DtJyCbzF.js → index-BZgXW854.js} +1 -1
  40. langflow/frontend/assets/{index-CkQ-bJ4G.js → index-BbJjt5m4.js} +1 -1
  41. langflow/frontend/assets/{index-D5PeCofu.js → index-BbRm7beF.js} +1 -1
  42. langflow/frontend/assets/{index-Uq2ij_SS.js → index-Bd6WtbKA.js} +1 -1
  43. langflow/frontend/assets/{index-sS6XLk3j.js → index-BhIOhlCH.js} +1 -1
  44. langflow/frontend/assets/{index-dkS0ek2S.js → index-BkPYpfgw.js} +1 -1
  45. langflow/frontend/assets/{index-BOYTBrh9.js → index-BmX5CoED.js} +1 -1
  46. langflow/frontend/assets/{index-CMGZGIx_.js → index-Bnqod3vk.js} +1 -1
  47. langflow/frontend/assets/{index-Bisa4IQF.js → index-Boso-xEw.js} +1 -1
  48. langflow/frontend/assets/{index-DqSH4x-R.js → index-BqPpO6KG.js} +1 -1
  49. langflow/frontend/assets/{index-B5ed-sAv.js → index-Bsa0xZyL.js} +1 -1
  50. langflow/frontend/assets/{index-CoUlHbtg.js → index-Bv8h2Z-q.js} +1 -1
  51. langflow/frontend/assets/{index-tOy_uloT.js → index-BvT7L317.js} +1 -1
  52. langflow/frontend/assets/{index-D-zkHcob.js → index-BvwZfF2i.js} +1 -1
  53. langflow/frontend/assets/{index-DxIs8VSp.js → index-Bvxg4_ux.js} +1 -1
  54. langflow/frontend/assets/{index-CqDUqHfd.js → index-BxEuHa76.js} +1 -1
  55. langflow/frontend/assets/{index-DX7XsAcx.js → index-BzEUlaw_.js} +1 -1
  56. langflow/frontend/assets/{index-BCK-ZyIh.js → index-BzL_EoKd.js} +1 -1
  57. langflow/frontend/assets/{index-BNbWMmAV.js → index-C-2hghRJ.js} +1 -1
  58. langflow/frontend/assets/{index-CWWo2zOA.js → index-C26RqKWL.js} +1 -1
  59. langflow/frontend/assets/{index-BcgB3rXH.js → index-C6jri9Wm.js} +1 -1
  60. langflow/frontend/assets/{index-mBjJYD9q.js → index-C7QWbnLK.js} +1 -1
  61. langflow/frontend/assets/{index-D0HmkH0H.js → index-C82JjCPD.js} +1 -1
  62. langflow/frontend/assets/{index-Cpgkb0Q3.js → index-CCePCqkT.js} +1 -1
  63. langflow/frontend/assets/{index-IFGgPiye.js → index-CCxGSSTT.js} +1 -1
  64. langflow/frontend/assets/{index-BOEf7-ty.js → index-CFDvOtKC.js} +1 -1
  65. langflow/frontend/assets/{index-Ba3RTMXI.js → index-CJo_cyWW.js} +1 -1
  66. langflow/frontend/assets/{index-Cx__T92e.js → index-CLPdN-q6.js} +1 -1
  67. langflow/frontend/assets/{index-CF4dtI6S.js → index-CQMoqLAu.js} +1 -1
  68. langflow/frontend/assets/{index-3qMh9x6K.js → index-CTrt1Q_j.js} +1 -1
  69. langflow/frontend/assets/{index-rcdQpNcU.js → index-CVQmT7ZL.js} +1 -1
  70. langflow/frontend/assets/{index-Dpz3oBf5.js → index-CWdkbVsd.js} +1 -1
  71. langflow/frontend/assets/{index-D0s9f6Re.js → index-CYDAYm-i.js} +1 -1
  72. langflow/frontend/assets/{index-BjENqyKe.js → index-CYe8Ipef.js} +1 -1
  73. langflow/frontend/assets/{index-ByFXr9Iq.js → index-CZQ9rXNa.js} +1 -1
  74. langflow/frontend/assets/{index-VcXZzovW.js → index-C_TdzfAn.js} +1 -1
  75. langflow/frontend/assets/{index-LrMzDsq9.js → index-C_veJlEb.js} +1 -1
  76. langflow/frontend/assets/{index-BdYgKk1d.js → index-CaQ_H9ww.js} +1 -1
  77. langflow/frontend/assets/{index-CHFO5O4g.js → index-Car-zdor.js} +1 -1
  78. langflow/frontend/assets/{index-DZzbmg3J.js → index-ChXJpBz4.js} +1 -1
  79. langflow/frontend/assets/{index-C7x9R_Yo.js → index-CmplyEaa.js} +1 -1
  80. langflow/frontend/assets/{index-Cd5zuUUK.js → index-CpcbQZIF.js} +1 -1
  81. langflow/frontend/assets/{index-D9eflZfP.js → index-CpvYQ0ug.js} +1 -1
  82. langflow/frontend/assets/{index-DS1EgA10.js → index-CvcEzq4x.js} +1 -1
  83. langflow/frontend/assets/{index-hOkEW3JP.js → index-CxvP91st.js} +1 -1
  84. langflow/frontend/assets/{index-DasrI03Y.js → index-CyPvTB63.js} +1 -1
  85. langflow/frontend/assets/{index-BJrY2Fiu.js → index-D-9TI74R.js} +1 -1
  86. langflow/frontend/assets/{index-BlBl2tvQ.js → index-D3DDfngy.js} +1 -1
  87. langflow/frontend/assets/{index-DzeIsaBm.js → index-D5_DsUJc.js} +1 -1
  88. langflow/frontend/assets/{index-AY5Dm2mG.js → index-D6PSjHxP.js} +1 -1
  89. langflow/frontend/assets/{index-C9N80hP8.js → index-D8GJngXa.js} +1 -1
  90. langflow/frontend/assets/{index-BxWXWRmZ.js → index-D8lOi1GI.js} +1 -1
  91. langflow/frontend/assets/{index-DWkMJnbd.js → index-DCRk27Tp.js} +1 -1
  92. langflow/frontend/assets/{index-BnLT29qW.js → index-DF5VwgU6.js} +1 -1
  93. langflow/frontend/assets/{index-7xXgqu09.js → index-DGRMNe9n.js} +1 -1
  94. langflow/frontend/assets/{index-3TJWUdmx.js → index-DHq8TQPB.js} +1 -1
  95. langflow/frontend/assets/{index-BVtf6m9S.js → index-DIDDfmlJ.js} +1 -1
  96. langflow/frontend/assets/{index-B2ggrBuR.js → index-DIkNW9Cd.js} +1 -1
  97. langflow/frontend/assets/{index-r1LZg-PY.js → index-DJB12jIC.js} +1 -1
  98. langflow/frontend/assets/{index-DS9I4y48.js → index-DK1Ptcc4.js} +1 -1
  99. langflow/frontend/assets/{index-CG7cp0nD.js → index-DKHNourL.js} +1 -1
  100. langflow/frontend/assets/{index-BeNby7qF.js → index-DPCzHdsC.js} +1 -1
  101. langflow/frontend/assets/{index-COL0eiWI.js → index-DVlceYFD.js} +1 -1
  102. langflow/frontend/assets/{index-DK8vNpXK.js → index-DZTC5pdT.js} +1 -1
  103. langflow/frontend/assets/{index-Baka5dKE.js → index-Db71w3lq.js} +1 -1
  104. langflow/frontend/assets/{index-Du9aJK7m.js → index-DbMFlnHE.js} +1 -1
  105. langflow/frontend/assets/{index-CvQ0w8Pj.js → index-DfngcQxO.js} +1 -1
  106. langflow/frontend/assets/{index-DIqSyDVO.js → index-DfxYyS3M.js} +1 -1
  107. langflow/frontend/assets/{index-3uOAA_XX.js → index-Dg-63Si_.js} +1 -1
  108. langflow/frontend/assets/{index-BsBWP-Dh.js → index-DjQETUy8.js} +1 -1
  109. langflow/frontend/assets/{index-CDFLVFB4.js → index-DkXy1WFo.js} +1 -1
  110. langflow/frontend/assets/{index-B8TlNgn-.js → index-DkelbYy7.js} +1 -1
  111. langflow/frontend/assets/{index-GODbXlHC.js → index-DmMDPoi0.js} +1 -1
  112. langflow/frontend/assets/{index-DpQKtcXu.js → index-DnEGCgih.js} +1 -1
  113. langflow/frontend/assets/{index-VHmUHUUU.js → index-DpClkXIV.js} +1 -1
  114. langflow/frontend/assets/{index-BRWNIt9F.js → index-Dq5ilsem.js} +1 -1
  115. langflow/frontend/assets/{index-DDNNv4C0.js → index-Dqd4RjYA.js} +1 -1
  116. langflow/frontend/assets/{index-C2Xd7UkR.js → index-Dsps-jKu.js} +1 -1
  117. langflow/frontend/assets/{index-BVHvIhT5.js → index-Du_18NCU.js} +1 -1
  118. langflow/frontend/assets/{index-C7V5U9yH.js → index-DysKpOuj.js} +1 -1
  119. langflow/frontend/assets/{index-Bxml6wXu.js → index-DytJENYD.js} +1 -1
  120. langflow/frontend/assets/{index-BWq9GTzt.js → index-DzW2mfkK.js} +1 -1
  121. langflow/frontend/assets/{index-js8ceOaP.js → index-FUxmznS-.js} +1 -1
  122. langflow/frontend/assets/{index-DuAeoC-H.js → index-Gkrq-vzm.js} +1 -1
  123. langflow/frontend/assets/{index-DPX6X_bw.js → index-HK3bVMYA.js} +1 -1
  124. langflow/frontend/assets/{index-BEKoRwsX.js → index-LbYjHKkn.js} +1 -1
  125. langflow/frontend/assets/{index-C8KD3LPb.js → index-OazXJdEl.js} +1 -1
  126. langflow/frontend/assets/{index-DpJiH-Rk.js → index-Q9vDw0Xl.js} +1 -1
  127. langflow/frontend/assets/{index-DWr_zPkx.js → index-Ui4xUImO.js} +1 -1
  128. langflow/frontend/assets/{index-BejHxU5W.js → index-WPFivmdQ.js} +1 -1
  129. langflow/frontend/assets/{index-lKEJpUsF.js → index-_UcqeEjm.js} +1 -1
  130. langflow/frontend/assets/{index-VZnN0P6C.js → index-ajRge-Mg.js} +1 -1
  131. langflow/frontend/assets/{index-BQB-iDYl.js → index-cvZdgWHQ.js} +1 -1
  132. langflow/frontend/assets/{index-AlJ7td-D.js → index-dcnYpT9N.js} +1 -1
  133. langflow/frontend/assets/{index-DKEXZFUO.js → index-l7bzB8Ex.js} +1 -1
  134. langflow/frontend/assets/index-nVwHLjuV.js +1 -0
  135. langflow/frontend/assets/{index-BtJ2o21k.js → index-pCQ_yw8m.js} +1 -1
  136. langflow/frontend/assets/{index-B536IPXH.js → index-rXV1G1aB.js} +1 -1
  137. langflow/frontend/assets/{index-BIkqesA-.js → index-tVYiABdp.js} +1 -1
  138. langflow/frontend/assets/{index-CJwYfDBz.js → index-xuIrH2Dq.js} +1 -1
  139. langflow/frontend/assets/{index-BXMhmvTj.js → index-yCHsaqs8.js} +1 -1
  140. langflow/frontend/assets/{index-BqUeOc7Y.js → index-ya2uXE8v.js} +1 -1
  141. langflow/frontend/assets/lazyIconImports-t6wEndt1.js +2 -0
  142. langflow/frontend/assets/{use-post-add-user-HN0rRnhv.js → use-post-add-user-BrBYH9eR.js} +1 -1
  143. langflow/frontend/index.html +1 -1
  144. langflow/initial_setup/starter_projects/Hybrid Search RAG.json +2 -2
  145. langflow/initial_setup/starter_projects/Knowledge Ingestion.json +2 -2
  146. langflow/initial_setup/starter_projects/Knowledge Retrieval.json +2 -2
  147. langflow/initial_setup/starter_projects/News Aggregator.json +2 -19
  148. langflow/initial_setup/starter_projects/Nvidia Remix.json +2 -19
  149. langflow/initial_setup/starter_projects/Vector Store RAG.json +4 -4
  150. langflow/processing/process.py +1 -1
  151. {langflow_base_nightly-0.5.0.dev36.dist-info → langflow_base_nightly-0.5.0.dev37.dist-info}/METADATA +1 -1
  152. {langflow_base_nightly-0.5.0.dev36.dist-info → langflow_base_nightly-0.5.0.dev37.dist-info}/RECORD +154 -153
  153. langflow/frontend/assets/lazyIconImports-Bh1TFfvH.js +0 -2
  154. {langflow_base_nightly-0.5.0.dev36.dist-info → langflow_base_nightly-0.5.0.dev37.dist-info}/WHEEL +0 -0
  155. {langflow_base_nightly-0.5.0.dev36.dist-info → langflow_base_nightly-0.5.0.dev37.dist-info}/entry_points.txt +0 -0
@@ -5,13 +5,16 @@ from typing import Any
5
5
  from cryptography.fernet import InvalidToken
6
6
  from langchain_chroma import Chroma
7
7
  from loguru import logger
8
+ from pydantic import SecretStr
8
9
 
10
+ from langflow.base.data.kb_utils import get_knowledge_bases
9
11
  from langflow.custom import Component
10
12
  from langflow.io import BoolInput, DropdownInput, IntInput, MessageTextInput, Output, SecretStrInput
11
13
  from langflow.schema.data import Data
12
14
  from langflow.schema.dataframe import DataFrame
13
15
  from langflow.services.auth.utils import decrypt_api_key
14
- from langflow.services.deps import get_settings_service
16
+ from langflow.services.database.models.user.crud import get_user_by_id
17
+ from langflow.services.deps import get_settings_service, session_scope
15
18
 
16
19
  settings = get_settings_service().settings
17
20
  knowledge_directory = settings.knowledge_bases_dir
@@ -33,11 +36,7 @@ class KBRetrievalComponent(Component):
33
36
  display_name="Knowledge",
34
37
  info="Select the knowledge to load data from.",
35
38
  required=True,
36
- options=[
37
- str(d.name) for d in KNOWLEDGE_BASES_ROOT_PATH.iterdir() if not d.name.startswith(".") and d.is_dir()
38
- ]
39
- if KNOWLEDGE_BASES_ROOT_PATH.exists()
40
- else [],
39
+ options=[],
41
40
  refresh_button=True,
42
41
  real_time_refresh=True,
43
42
  ),
@@ -79,21 +78,13 @@ class KBRetrievalComponent(Component):
79
78
  ),
80
79
  ]
81
80
 
82
- def _get_knowledge_bases(self) -> list[str]:
83
- """Retrieve a list of available knowledge bases.
84
-
85
- Returns:
86
- A list of knowledge base names.
87
- """
88
- if not KNOWLEDGE_BASES_ROOT_PATH.exists():
89
- return []
90
-
91
- return [str(d.name) for d in KNOWLEDGE_BASES_ROOT_PATH.iterdir() if not d.name.startswith(".") and d.is_dir()]
92
-
93
- def update_build_config(self, build_config, field_value, field_name=None): # noqa: ARG002
81
+ async def update_build_config(self, build_config, field_value, field_name=None): # noqa: ARG002
94
82
  if field_name == "knowledge_base":
95
83
  # Update the knowledge base options dynamically
96
- build_config["knowledge_base"]["options"] = self._get_knowledge_bases()
84
+ build_config["knowledge_base"]["options"] = await get_knowledge_bases(
85
+ KNOWLEDGE_BASES_ROOT_PATH,
86
+ user_id=self.user_id, # Use the user_id from the component context
87
+ )
97
88
 
98
89
  # If the selected knowledge base is not available, reset it
99
90
  if build_config["knowledge_base"]["value"] not in build_config["knowledge_base"]["options"]:
@@ -129,15 +120,12 @@ class KBRetrievalComponent(Component):
129
120
 
130
121
  def _build_embeddings(self, metadata: dict):
131
122
  """Build embedding model from metadata."""
123
+ runtime_api_key = self.api_key.get_secret_value() if isinstance(self.api_key, SecretStr) else self.api_key
132
124
  provider = metadata.get("embedding_provider")
133
125
  model = metadata.get("embedding_model")
134
- api_key = metadata.get("api_key")
126
+ api_key = runtime_api_key or metadata.get("api_key")
135
127
  chunk_size = metadata.get("chunk_size")
136
128
 
137
- # If user provided a key in the input, it overrides the stored one.
138
- if self.api_key and self.api_key.get_secret_value():
139
- api_key = self.api_key.get_secret_value()
140
-
141
129
  # Handle various providers
142
130
  if provider == "OpenAI":
143
131
  from langchain_openai import OpenAIEmbeddings
@@ -174,13 +162,23 @@ class KBRetrievalComponent(Component):
174
162
  msg = f"Embedding provider '{provider}' is not supported for retrieval."
175
163
  raise NotImplementedError(msg)
176
164
 
177
- def get_chroma_kb_data(self) -> DataFrame:
165
+ async def get_chroma_kb_data(self) -> DataFrame:
178
166
  """Retrieve data from the selected knowledge base by reading the Chroma collection.
179
167
 
180
168
  Returns:
181
169
  A DataFrame containing the data rows from the knowledge base.
182
170
  """
183
- kb_path = KNOWLEDGE_BASES_ROOT_PATH / self.knowledge_base
171
+ # Get the current user
172
+ async with session_scope() as db:
173
+ if not self.user_id:
174
+ msg = "User ID is required for fetching Knowledge Base data."
175
+ raise ValueError(msg)
176
+ current_user = await get_user_by_id(db, self.user_id)
177
+ if not current_user:
178
+ msg = f"User with ID {self.user_id} not found."
179
+ raise ValueError(msg)
180
+ kb_user = current_user.username
181
+ kb_path = KNOWLEDGE_BASES_ROOT_PATH / kb_user / self.knowledge_base
184
182
 
185
183
  metadata = self._get_kb_metadata(kb_path)
186
184
  if not metadata:
@@ -1,7 +1,6 @@
1
1
  import json
2
2
  from collections.abc import AsyncIterator, Iterator
3
3
  from pathlib import Path
4
- from typing import TYPE_CHECKING
5
4
 
6
5
  import orjson
7
6
  import pandas as pd
@@ -10,16 +9,12 @@ from fastapi.encoders import jsonable_encoder
10
9
 
11
10
  from langflow.api.v2.files import upload_user_file
12
11
  from langflow.custom import Component
13
- from langflow.io import DropdownInput, HandleInput, SecretStrInput, StrInput
12
+ from langflow.io import DropdownInput, HandleInput, StrInput
14
13
  from langflow.schema import Data, DataFrame, Message
15
- from langflow.services.auth.utils import create_user_longterm_token, get_current_user
16
14
  from langflow.services.database.models.user.crud import get_user_by_id
17
- from langflow.services.deps import get_session, get_settings_service, get_storage_service
15
+ from langflow.services.deps import get_settings_service, get_storage_service, session_scope
18
16
  from langflow.template.field.base import Output
19
17
 
20
- if TYPE_CHECKING:
21
- from langflow.services.database.models.user.model import User
22
-
23
18
 
24
19
  class SaveToFileComponent(Component):
25
20
  display_name = "Save File"
@@ -55,13 +50,6 @@ class SaveToFileComponent(Component):
55
50
  value="",
56
51
  advanced=True,
57
52
  ),
58
- SecretStrInput(
59
- name="api_key",
60
- display_name="Langflow API Key",
61
- info="Langflow API key for authentication when saving the file.",
62
- required=False,
63
- advanced=True,
64
- ),
65
53
  ]
66
54
 
67
55
  outputs = [Output(display_name="File Path", name="message", method="save_to_file")]
@@ -148,25 +136,11 @@ class SaveToFileComponent(Component):
148
136
  raise FileNotFoundError(msg)
149
137
 
150
138
  with file_path.open("rb") as f:
151
- async for db in get_session():
152
- # TODO: In 1.6, this may need to be removed or adjusted
153
- # Try to get the super user token, if possible
154
- current_user: User | None = None
155
- if self.api_key:
156
- current_user = await get_current_user(
157
- token="",
158
- query_param=self.api_key,
159
- header_param="",
160
- db=db,
161
- )
162
- else:
163
- user_id, _ = await create_user_longterm_token(db)
164
- current_user = await get_user_by_id(db, user_id)
165
-
166
- # Fail if the user is not found
167
- if not current_user:
168
- msg = "User not found. Please provide a valid API key or ensure the user exists."
139
+ async with session_scope() as db:
140
+ if not self.user_id:
141
+ msg = "User ID is required for file saving."
169
142
  raise ValueError(msg)
143
+ current_user = await get_user_by_id(db, self.user_id)
170
144
 
171
145
  await upload_user_file(
172
146
  file=UploadFile(filename=file_path.name, file=f, size=file_path.stat().st_size),
@@ -161,11 +161,11 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
161
161
  dialog_inputs=asdict(NewDatabaseInput()),
162
162
  combobox=True,
163
163
  ),
164
- StrInput(
164
+ DropdownInput(
165
165
  name="api_endpoint",
166
166
  display_name="Astra DB API Endpoint",
167
167
  info="The API Endpoint for the Astra DB instance. Supercedes database selection.",
168
- show=False,
168
+ advanced=True,
169
169
  ),
170
170
  DropdownInput(
171
171
  name="keyspace",
@@ -224,7 +224,6 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
224
224
  separator=" ",
225
225
  show=False,
226
226
  value="",
227
- advanced=True,
228
227
  ),
229
228
  IntInput(
230
229
  name="number_of_results",
@@ -448,14 +447,14 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
448
447
  for db in db_list:
449
448
  try:
450
449
  # Get the API endpoint for the database
451
- api_endpoint = db.regions[0].api_endpoint
450
+ api_endpoints = [db_reg.api_endpoint for db_reg in db.regions]
452
451
 
453
452
  # Get the number of collections
454
453
  try:
455
454
  # Get the number of collections in the database
456
455
  num_collections = len(
457
456
  client.get_database(
458
- api_endpoint,
457
+ api_endpoints[0],
459
458
  token=token,
460
459
  ).list_collection_names()
461
460
  )
@@ -466,7 +465,7 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
466
465
 
467
466
  # Add the database to the dictionary
468
467
  db_info_dict[db.name] = {
469
- "api_endpoint": api_endpoint,
468
+ "api_endpoints": api_endpoints,
470
469
  "keyspaces": db.keyspaces,
471
470
  "collections": num_collections,
472
471
  "status": db.status if db.status != "ACTIVE" else None,
@@ -509,7 +508,8 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
509
508
  return None
510
509
 
511
510
  # Otherwise, get the URL from the database list
512
- return db.get("api_endpoint")
511
+ endpoints = db.get("api_endpoints") or []
512
+ return endpoints[0] if endpoints else None
513
513
 
514
514
  def get_api_endpoint(self):
515
515
  return self.get_api_endpoint_static(
@@ -577,7 +577,7 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
577
577
  "name": name,
578
578
  "status": info["status"],
579
579
  "collections": info["collections"],
580
- "api_endpoint": info["api_endpoint"],
580
+ "api_endpoints": info["api_endpoints"],
581
581
  "keyspaces": info["keyspaces"],
582
582
  "org_id": info["org_id"],
583
583
  }
@@ -773,6 +773,7 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
773
773
  # Reset selections if value not in options
774
774
  if database_config["value"] not in database_config["options"]:
775
775
  database_config["value"] = ""
776
+ build_config["api_endpoint"]["options"] = []
776
777
  build_config["api_endpoint"]["value"] = ""
777
778
  build_config["collection_name"]["show"] = False
778
779
 
@@ -786,6 +787,7 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
786
787
  # Reset database configuration
787
788
  database_config = build_config["database_name"]
788
789
  database_config.update({"options": [], "options_metadata": [], "value": "", "show": False})
790
+ build_config["api_endpoint"]["options"] = []
789
791
  build_config["api_endpoint"]["value"] = ""
790
792
 
791
793
  # Reset collection configuration
@@ -828,13 +830,6 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
828
830
  build_config["search_method"]["options"] = ["Vector Search"]
829
831
  build_config["search_method"]["value"] = "Vector Search"
830
832
 
831
- # Set reranker and lexical terms options based on search method
832
- build_config["reranker"]["toggle_value"] = True
833
- build_config["reranker"]["show"] = build_config["search_method"]["value"] == "Hybrid Search"
834
- build_config["reranker"]["toggle_disable"] = build_config["search_method"]["value"] == "Hybrid Search"
835
- if build_config["reranker"]["show"]:
836
- build_config["search_type"]["value"] = "Similarity"
837
-
838
833
  return build_config
839
834
 
840
835
  async def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None) -> dict:
@@ -892,6 +887,7 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
892
887
  build_config["lexical_terms"]["value"] = "" if is_vector_search else build_config["lexical_terms"]["value"]
893
888
 
894
889
  # Disable reranker disabling if hybrid search is selected
890
+ build_config["reranker"]["show"] = not is_vector_search
895
891
  build_config["reranker"]["toggle_disable"] = not is_vector_search
896
892
  build_config["reranker"]["toggle_value"] = True
897
893
  build_config["reranker"]["value"] = build_config["reranker"]["options"][0]
@@ -926,7 +922,7 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
926
922
  {
927
923
  "status": "PENDING",
928
924
  "collections": 0,
929
- "api_endpoint": None,
925
+ "api_endpoints": [],
930
926
  "keyspaces": [self.get_keyspace()],
931
927
  "org_id": None,
932
928
  }
@@ -999,7 +995,12 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
999
995
 
1000
996
  # Get the api endpoint for the selected database
1001
997
  index = build_config["database_name"]["options"].index(field_value)
1002
- build_config["api_endpoint"]["value"] = build_config["database_name"]["options_metadata"][index]["api_endpoint"]
998
+ build_config["api_endpoint"]["options"] = build_config["database_name"]["options_metadata"][index][
999
+ "api_endpoints"
1000
+ ]
1001
+ build_config["api_endpoint"]["value"] = build_config["database_name"]["options_metadata"][index][
1002
+ "api_endpoints"
1003
+ ][0]
1003
1004
 
1004
1005
  # Get the org_id for the selected database
1005
1006
  org_id = build_config["database_name"]["options_metadata"][index]["org_id"]
@@ -1077,8 +1078,18 @@ class AstraDBVectorStoreComponent(LCVectorStoreComponent):
1077
1078
  lex_enabled = col_options.lexical and col_options.lexical.enabled
1078
1079
  user_hyb_enabled = build_config["search_method"]["value"] == "Hybrid Search"
1079
1080
 
1080
- # Show lexical terms if the collection is hybrid enabled
1081
- build_config["lexical_terms"]["show"] = hyb_enabled and lex_enabled and user_hyb_enabled
1081
+ # Reranker visible when both the collection supports it and the user selected Hybrid
1082
+ hybrid_active = bool(hyb_enabled and user_hyb_enabled)
1083
+ build_config["reranker"]["show"] = hybrid_active
1084
+ build_config["reranker"]["toggle_value"] = hybrid_active
1085
+ build_config["reranker"]["toggle_disable"] = False # allow user to toggle if visible
1086
+
1087
+ # If hybrid is active, lock search_type to "Similarity"
1088
+ if hybrid_active:
1089
+ build_config["search_type"]["value"] = "Similarity"
1090
+
1091
+ # Show the lexical terms option only if the collection enables lexical search
1092
+ build_config["lexical_terms"]["show"] = bool(lex_enabled)
1082
1093
 
1083
1094
  return build_config
1084
1095
 
@@ -1 +1 @@
1
- import{j as a}from"./index-ci4XHjbJ.js";const s=l=>a.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 54 54",width:"1em",height:"1em",...l,children:a.jsxs("g",{fill:"none",fillRule:"evenodd",children:[a.jsx("path",{fill:"#36C5F0",d:"M19.712.133a5.381 5.381 0 0 0-5.376 5.387 5.381 5.381 0 0 0 5.376 5.386h5.376V5.52A5.381 5.381 0 0 0 19.712.133m0 14.365H5.376A5.381 5.381 0 0 0 0 19.884a5.381 5.381 0 0 0 5.376 5.387h14.336a5.381 5.381 0 0 0 5.376-5.387 5.381 5.381 0 0 0-5.376-5.386"}),a.jsx("path",{fill:"#2EB67D",d:"M53.76 19.884a5.381 5.381 0 0 0-5.376-5.386 5.381 5.381 0 0 0-5.376 5.386v5.387h5.376a5.381 5.381 0 0 0 5.376-5.387m-14.336 0V5.52A5.381 5.381 0 0 0 34.048.133a5.381 5.381 0 0 0-5.376 5.387v14.364a5.381 5.381 0 0 0 5.376 5.387 5.381 5.381 0 0 0 5.376-5.387"}),a.jsx("path",{fill:"#ECB22E",d:"M34.048 54a5.381 5.381 0 0 0 5.376-5.387 5.381 5.381 0 0 0-5.376-5.386h-5.376v5.386A5.381 5.381 0 0 0 34.048 54m0-14.365h14.336a5.381 5.381 0 0 0 5.376-5.386 5.381 5.381 0 0 0-5.376-5.387H34.048a5.381 5.381 0 0 0-5.376 5.387 5.381 5.381 0 0 0 5.376 5.386"}),a.jsx("path",{fill:"#E01E5A",d:"M0 34.249a5.381 5.381 0 0 0 5.376 5.386 5.381 5.381 0 0 0 5.376-5.386v-5.387H5.376A5.381 5.381 0 0 0 0 34.25m14.336-.001v14.364A5.381 5.381 0 0 0 19.712 54a5.381 5.381 0 0 0 5.376-5.387V34.25a5.381 5.381 0 0 0-5.376-5.387 5.381 5.381 0 0 0-5.376 5.387"})]})});export{s as default};
1
+ import{j as a}from"./index-BChjg6Az.js";const s=l=>a.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 54 54",width:"1em",height:"1em",...l,children:a.jsxs("g",{fill:"none",fillRule:"evenodd",children:[a.jsx("path",{fill:"#36C5F0",d:"M19.712.133a5.381 5.381 0 0 0-5.376 5.387 5.381 5.381 0 0 0 5.376 5.386h5.376V5.52A5.381 5.381 0 0 0 19.712.133m0 14.365H5.376A5.381 5.381 0 0 0 0 19.884a5.381 5.381 0 0 0 5.376 5.387h14.336a5.381 5.381 0 0 0 5.376-5.387 5.381 5.381 0 0 0-5.376-5.386"}),a.jsx("path",{fill:"#2EB67D",d:"M53.76 19.884a5.381 5.381 0 0 0-5.376-5.386 5.381 5.381 0 0 0-5.376 5.386v5.387h5.376a5.381 5.381 0 0 0 5.376-5.387m-14.336 0V5.52A5.381 5.381 0 0 0 34.048.133a5.381 5.381 0 0 0-5.376 5.387v14.364a5.381 5.381 0 0 0 5.376 5.387 5.381 5.381 0 0 0 5.376-5.387"}),a.jsx("path",{fill:"#ECB22E",d:"M34.048 54a5.381 5.381 0 0 0 5.376-5.387 5.381 5.381 0 0 0-5.376-5.386h-5.376v5.386A5.381 5.381 0 0 0 34.048 54m0-14.365h14.336a5.381 5.381 0 0 0 5.376-5.386 5.381 5.381 0 0 0-5.376-5.387H34.048a5.381 5.381 0 0 0-5.376 5.387 5.381 5.381 0 0 0 5.376 5.386"}),a.jsx("path",{fill:"#E01E5A",d:"M0 34.249a5.381 5.381 0 0 0 5.376 5.386 5.381 5.381 0 0 0 5.376-5.386v-5.387H5.376A5.381 5.381 0 0 0 0 34.25m14.336-.001v14.364A5.381 5.381 0 0 0 19.712 54a5.381 5.381 0 0 0 5.376-5.387V34.25a5.381 5.381 0 0 0-5.376-5.387 5.381 5.381 0 0 0-5.376 5.387"})]})});export{s as default};