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.
- langflow/api/v1/knowledge_bases.py +16 -9
- langflow/api/v2/files.py +3 -1
- langflow/base/data/kb_utils.py +33 -0
- langflow/base/models/model.py +3 -3
- langflow/components/agents/mcp_component.py +40 -55
- langflow/components/data/kb_ingest.py +116 -43
- langflow/components/data/kb_retrieval.py +24 -26
- langflow/components/processing/save_file.py +6 -32
- langflow/components/vectorstores/astradb.py +30 -19
- langflow/frontend/assets/{SlackIcon-B260Qg_R.js → SlackIcon-CnvyOamQ.js} +1 -1
- langflow/frontend/assets/{Wikipedia-BB2mbgyd.js → Wikipedia-nyTEXdr2.js} +1 -1
- langflow/frontend/assets/{Wolfram-DytXC9hF.js → Wolfram-BYMQkNSq.js} +1 -1
- langflow/frontend/assets/{index-BdIWbCEL.js → index-8WdfSTTz.js} +1 -1
- langflow/frontend/assets/{index-D87Zw62M.js → index-8yMsjVV2.js} +1 -1
- langflow/frontend/assets/{index-DyJDHm2D.js → index-B1YN7oMV.js} +1 -1
- langflow/frontend/assets/{index-BEDxAk3N.js → index-B3Sur4Z3.js} +1 -1
- langflow/frontend/assets/{index-DhzEUXfr.js → index-B748uLP1.js} +1 -1
- langflow/frontend/assets/{index-4eRtaV45.js → index-BB15_iOb.js} +1 -1
- langflow/frontend/assets/{index-C_1RBTul.js → index-BBxAPk1y.js} +1 -1
- langflow/frontend/assets/{index-DHlEwAxb.js → index-BCCGvqay.js} +1 -1
- langflow/frontend/assets/{index-ci4XHjbJ.js → index-BChjg6Az.js} +3 -3
- langflow/frontend/assets/{index-B9Mo3ndZ.js → index-BEMw2Np8.js} +1 -1
- langflow/frontend/assets/{index-BKvKC-12.js → index-BFp_O-c9.js} +1 -1
- langflow/frontend/assets/{index-Ym6gz0T6.js → index-BIQQCMvz.js} +1 -1
- langflow/frontend/assets/{index-CwIxqYlT.js → index-BIXaW2aY.js} +1 -1
- langflow/frontend/assets/{index-BxkZkBgQ.js → index-BIzTEqFh.js} +1 -1
- langflow/frontend/assets/{index-C76aBV_h.js → index-BLGYN-9b.js} +1 -1
- langflow/frontend/assets/{index-B-c82Fnu.js → index-BOB_zsjl.js} +1 -1
- langflow/frontend/assets/{index-BbsND1Qg.js → index-BOeo01QB.js} +1 -1
- langflow/frontend/assets/{index-DztLFiip.js → index-BQ6NUdMY.js} +1 -1
- langflow/frontend/assets/{index-G_U_kPAd.js → index-BR0bkVqX.js} +1 -1
- langflow/frontend/assets/{index-R7q8cAek.js → index-BRYjyhAd.js} +1 -1
- langflow/frontend/assets/{index-Ccb5B8zG.js → index-BRxvproo.js} +1 -1
- langflow/frontend/assets/{index-B8y58M9b.js → index-BTEW9e8P.js} +1 -1
- langflow/frontend/assets/{index-DdzVmJHE.js → index-BTrsh9LS.js} +1 -1
- langflow/frontend/assets/{index-CkSzjCqM.js → index-BVEZDXxS.js} +1 -1
- langflow/frontend/assets/{index-BLROcaSz.js → index-BWmPX4iQ.js} +1 -1
- langflow/frontend/assets/{index-Ct9_T9ox.js → index-BX5D-USa.js} +1 -1
- langflow/frontend/assets/{index-DtJyCbzF.js → index-BZgXW854.js} +1 -1
- langflow/frontend/assets/{index-CkQ-bJ4G.js → index-BbJjt5m4.js} +1 -1
- langflow/frontend/assets/{index-D5PeCofu.js → index-BbRm7beF.js} +1 -1
- langflow/frontend/assets/{index-Uq2ij_SS.js → index-Bd6WtbKA.js} +1 -1
- langflow/frontend/assets/{index-sS6XLk3j.js → index-BhIOhlCH.js} +1 -1
- langflow/frontend/assets/{index-dkS0ek2S.js → index-BkPYpfgw.js} +1 -1
- langflow/frontend/assets/{index-BOYTBrh9.js → index-BmX5CoED.js} +1 -1
- langflow/frontend/assets/{index-CMGZGIx_.js → index-Bnqod3vk.js} +1 -1
- langflow/frontend/assets/{index-Bisa4IQF.js → index-Boso-xEw.js} +1 -1
- langflow/frontend/assets/{index-DqSH4x-R.js → index-BqPpO6KG.js} +1 -1
- langflow/frontend/assets/{index-B5ed-sAv.js → index-Bsa0xZyL.js} +1 -1
- langflow/frontend/assets/{index-CoUlHbtg.js → index-Bv8h2Z-q.js} +1 -1
- langflow/frontend/assets/{index-tOy_uloT.js → index-BvT7L317.js} +1 -1
- langflow/frontend/assets/{index-D-zkHcob.js → index-BvwZfF2i.js} +1 -1
- langflow/frontend/assets/{index-DxIs8VSp.js → index-Bvxg4_ux.js} +1 -1
- langflow/frontend/assets/{index-CqDUqHfd.js → index-BxEuHa76.js} +1 -1
- langflow/frontend/assets/{index-DX7XsAcx.js → index-BzEUlaw_.js} +1 -1
- langflow/frontend/assets/{index-BCK-ZyIh.js → index-BzL_EoKd.js} +1 -1
- langflow/frontend/assets/{index-BNbWMmAV.js → index-C-2hghRJ.js} +1 -1
- langflow/frontend/assets/{index-CWWo2zOA.js → index-C26RqKWL.js} +1 -1
- langflow/frontend/assets/{index-BcgB3rXH.js → index-C6jri9Wm.js} +1 -1
- langflow/frontend/assets/{index-mBjJYD9q.js → index-C7QWbnLK.js} +1 -1
- langflow/frontend/assets/{index-D0HmkH0H.js → index-C82JjCPD.js} +1 -1
- langflow/frontend/assets/{index-Cpgkb0Q3.js → index-CCePCqkT.js} +1 -1
- langflow/frontend/assets/{index-IFGgPiye.js → index-CCxGSSTT.js} +1 -1
- langflow/frontend/assets/{index-BOEf7-ty.js → index-CFDvOtKC.js} +1 -1
- langflow/frontend/assets/{index-Ba3RTMXI.js → index-CJo_cyWW.js} +1 -1
- langflow/frontend/assets/{index-Cx__T92e.js → index-CLPdN-q6.js} +1 -1
- langflow/frontend/assets/{index-CF4dtI6S.js → index-CQMoqLAu.js} +1 -1
- langflow/frontend/assets/{index-3qMh9x6K.js → index-CTrt1Q_j.js} +1 -1
- langflow/frontend/assets/{index-rcdQpNcU.js → index-CVQmT7ZL.js} +1 -1
- langflow/frontend/assets/{index-Dpz3oBf5.js → index-CWdkbVsd.js} +1 -1
- langflow/frontend/assets/{index-D0s9f6Re.js → index-CYDAYm-i.js} +1 -1
- langflow/frontend/assets/{index-BjENqyKe.js → index-CYe8Ipef.js} +1 -1
- langflow/frontend/assets/{index-ByFXr9Iq.js → index-CZQ9rXNa.js} +1 -1
- langflow/frontend/assets/{index-VcXZzovW.js → index-C_TdzfAn.js} +1 -1
- langflow/frontend/assets/{index-LrMzDsq9.js → index-C_veJlEb.js} +1 -1
- langflow/frontend/assets/{index-BdYgKk1d.js → index-CaQ_H9ww.js} +1 -1
- langflow/frontend/assets/{index-CHFO5O4g.js → index-Car-zdor.js} +1 -1
- langflow/frontend/assets/{index-DZzbmg3J.js → index-ChXJpBz4.js} +1 -1
- langflow/frontend/assets/{index-C7x9R_Yo.js → index-CmplyEaa.js} +1 -1
- langflow/frontend/assets/{index-Cd5zuUUK.js → index-CpcbQZIF.js} +1 -1
- langflow/frontend/assets/{index-D9eflZfP.js → index-CpvYQ0ug.js} +1 -1
- langflow/frontend/assets/{index-DS1EgA10.js → index-CvcEzq4x.js} +1 -1
- langflow/frontend/assets/{index-hOkEW3JP.js → index-CxvP91st.js} +1 -1
- langflow/frontend/assets/{index-DasrI03Y.js → index-CyPvTB63.js} +1 -1
- langflow/frontend/assets/{index-BJrY2Fiu.js → index-D-9TI74R.js} +1 -1
- langflow/frontend/assets/{index-BlBl2tvQ.js → index-D3DDfngy.js} +1 -1
- langflow/frontend/assets/{index-DzeIsaBm.js → index-D5_DsUJc.js} +1 -1
- langflow/frontend/assets/{index-AY5Dm2mG.js → index-D6PSjHxP.js} +1 -1
- langflow/frontend/assets/{index-C9N80hP8.js → index-D8GJngXa.js} +1 -1
- langflow/frontend/assets/{index-BxWXWRmZ.js → index-D8lOi1GI.js} +1 -1
- langflow/frontend/assets/{index-DWkMJnbd.js → index-DCRk27Tp.js} +1 -1
- langflow/frontend/assets/{index-BnLT29qW.js → index-DF5VwgU6.js} +1 -1
- langflow/frontend/assets/{index-7xXgqu09.js → index-DGRMNe9n.js} +1 -1
- langflow/frontend/assets/{index-3TJWUdmx.js → index-DHq8TQPB.js} +1 -1
- langflow/frontend/assets/{index-BVtf6m9S.js → index-DIDDfmlJ.js} +1 -1
- langflow/frontend/assets/{index-B2ggrBuR.js → index-DIkNW9Cd.js} +1 -1
- langflow/frontend/assets/{index-r1LZg-PY.js → index-DJB12jIC.js} +1 -1
- langflow/frontend/assets/{index-DS9I4y48.js → index-DK1Ptcc4.js} +1 -1
- langflow/frontend/assets/{index-CG7cp0nD.js → index-DKHNourL.js} +1 -1
- langflow/frontend/assets/{index-BeNby7qF.js → index-DPCzHdsC.js} +1 -1
- langflow/frontend/assets/{index-COL0eiWI.js → index-DVlceYFD.js} +1 -1
- langflow/frontend/assets/{index-DK8vNpXK.js → index-DZTC5pdT.js} +1 -1
- langflow/frontend/assets/{index-Baka5dKE.js → index-Db71w3lq.js} +1 -1
- langflow/frontend/assets/{index-Du9aJK7m.js → index-DbMFlnHE.js} +1 -1
- langflow/frontend/assets/{index-CvQ0w8Pj.js → index-DfngcQxO.js} +1 -1
- langflow/frontend/assets/{index-DIqSyDVO.js → index-DfxYyS3M.js} +1 -1
- langflow/frontend/assets/{index-3uOAA_XX.js → index-Dg-63Si_.js} +1 -1
- langflow/frontend/assets/{index-BsBWP-Dh.js → index-DjQETUy8.js} +1 -1
- langflow/frontend/assets/{index-CDFLVFB4.js → index-DkXy1WFo.js} +1 -1
- langflow/frontend/assets/{index-B8TlNgn-.js → index-DkelbYy7.js} +1 -1
- langflow/frontend/assets/{index-GODbXlHC.js → index-DmMDPoi0.js} +1 -1
- langflow/frontend/assets/{index-DpQKtcXu.js → index-DnEGCgih.js} +1 -1
- langflow/frontend/assets/{index-VHmUHUUU.js → index-DpClkXIV.js} +1 -1
- langflow/frontend/assets/{index-BRWNIt9F.js → index-Dq5ilsem.js} +1 -1
- langflow/frontend/assets/{index-DDNNv4C0.js → index-Dqd4RjYA.js} +1 -1
- langflow/frontend/assets/{index-C2Xd7UkR.js → index-Dsps-jKu.js} +1 -1
- langflow/frontend/assets/{index-BVHvIhT5.js → index-Du_18NCU.js} +1 -1
- langflow/frontend/assets/{index-C7V5U9yH.js → index-DysKpOuj.js} +1 -1
- langflow/frontend/assets/{index-Bxml6wXu.js → index-DytJENYD.js} +1 -1
- langflow/frontend/assets/{index-BWq9GTzt.js → index-DzW2mfkK.js} +1 -1
- langflow/frontend/assets/{index-js8ceOaP.js → index-FUxmznS-.js} +1 -1
- langflow/frontend/assets/{index-DuAeoC-H.js → index-Gkrq-vzm.js} +1 -1
- langflow/frontend/assets/{index-DPX6X_bw.js → index-HK3bVMYA.js} +1 -1
- langflow/frontend/assets/{index-BEKoRwsX.js → index-LbYjHKkn.js} +1 -1
- langflow/frontend/assets/{index-C8KD3LPb.js → index-OazXJdEl.js} +1 -1
- langflow/frontend/assets/{index-DpJiH-Rk.js → index-Q9vDw0Xl.js} +1 -1
- langflow/frontend/assets/{index-DWr_zPkx.js → index-Ui4xUImO.js} +1 -1
- langflow/frontend/assets/{index-BejHxU5W.js → index-WPFivmdQ.js} +1 -1
- langflow/frontend/assets/{index-lKEJpUsF.js → index-_UcqeEjm.js} +1 -1
- langflow/frontend/assets/{index-VZnN0P6C.js → index-ajRge-Mg.js} +1 -1
- langflow/frontend/assets/{index-BQB-iDYl.js → index-cvZdgWHQ.js} +1 -1
- langflow/frontend/assets/{index-AlJ7td-D.js → index-dcnYpT9N.js} +1 -1
- langflow/frontend/assets/{index-DKEXZFUO.js → index-l7bzB8Ex.js} +1 -1
- langflow/frontend/assets/index-nVwHLjuV.js +1 -0
- langflow/frontend/assets/{index-BtJ2o21k.js → index-pCQ_yw8m.js} +1 -1
- langflow/frontend/assets/{index-B536IPXH.js → index-rXV1G1aB.js} +1 -1
- langflow/frontend/assets/{index-BIkqesA-.js → index-tVYiABdp.js} +1 -1
- langflow/frontend/assets/{index-CJwYfDBz.js → index-xuIrH2Dq.js} +1 -1
- langflow/frontend/assets/{index-BXMhmvTj.js → index-yCHsaqs8.js} +1 -1
- langflow/frontend/assets/{index-BqUeOc7Y.js → index-ya2uXE8v.js} +1 -1
- langflow/frontend/assets/lazyIconImports-t6wEndt1.js +2 -0
- langflow/frontend/assets/{use-post-add-user-HN0rRnhv.js → use-post-add-user-BrBYH9eR.js} +1 -1
- langflow/frontend/index.html +1 -1
- langflow/initial_setup/starter_projects/Hybrid Search RAG.json +2 -2
- langflow/initial_setup/starter_projects/Knowledge Ingestion.json +2 -2
- langflow/initial_setup/starter_projects/Knowledge Retrieval.json +2 -2
- langflow/initial_setup/starter_projects/News Aggregator.json +2 -19
- langflow/initial_setup/starter_projects/Nvidia Remix.json +2 -19
- langflow/initial_setup/starter_projects/Vector Store RAG.json +4 -4
- langflow/processing/process.py +1 -1
- {langflow_base_nightly-0.5.0.dev36.dist-info → langflow_base_nightly-0.5.0.dev37.dist-info}/METADATA +1 -1
- {langflow_base_nightly-0.5.0.dev36.dist-info → langflow_base_nightly-0.5.0.dev37.dist-info}/RECORD +154 -153
- langflow/frontend/assets/lazyIconImports-Bh1TFfvH.js +0 -2
- {langflow_base_nightly-0.5.0.dev36.dist-info → langflow_base_nightly-0.5.0.dev37.dist-info}/WHEEL +0 -0
- {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.
|
|
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
|
|
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"] =
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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"]["
|
|
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
|
-
#
|
|
1081
|
-
|
|
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-
|
|
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};
|