langflow-base-nightly 0.5.1.dev1__py3-none-any.whl → 0.5.1.dev3__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/endpoints.py +10 -7
- langflow/api/v1/schemas.py +5 -2
- langflow/base/knowledge_bases/__init__.py +0 -0
- langflow/components/agents/agent.py +1 -0
- langflow/components/data/__init__.py +0 -4
- langflow/components/datastax/__init__.py +2 -2
- langflow/components/knowledge_bases/__init__.py +34 -0
- langflow/components/{data/kb_ingest.py → knowledge_bases/ingestion.py} +23 -15
- langflow/components/{data/kb_retrieval.py → knowledge_bases/retrieval.py} +26 -22
- langflow/components/processing/dataframe_operations.py +12 -1
- langflow/frontend/assets/{SlackIcon-Cr3Q15Px.js → SlackIcon-Cc7Qnzki.js} +1 -1
- langflow/frontend/assets/{Wikipedia-GxM5sPdM.js → Wikipedia-7ulMZY46.js} +1 -1
- langflow/frontend/assets/{Wolfram-BN3-VOCA.js → Wolfram-By9PGsHS.js} +1 -1
- langflow/frontend/assets/{index-Kwdl-e29.js → index--e0oQqZh.js} +1 -1
- langflow/frontend/assets/{index-CD-PqGCY.js → index-3jlSQi5Y.js} +1 -1
- langflow/frontend/assets/{index-DQ7VYqQc.js → index-4JIEdyIM.js} +1 -1
- langflow/frontend/assets/{index-C9Cxnkl8.js → index-5-CSw2-z.js} +1 -1
- langflow/frontend/assets/{index-DUpri6zF.js → index-7yAHPRxv.js} +1 -1
- langflow/frontend/assets/{index-Dl5amdBz.js → index-9FL5xjkL.js} +1 -1
- langflow/frontend/assets/{index-X0guhYF8.js → index-AALDfCyt.js} +1 -1
- langflow/frontend/assets/{index-BLTxEeTi.js → index-AKVkmT4S.js} +1 -1
- langflow/frontend/assets/{index-CRcMqCIj.js → index-B3GvPjhD.js} +1 -1
- langflow/frontend/assets/{index-D14EWPyZ.js → index-B5LHnuQR.js} +1 -1
- langflow/frontend/assets/{index-C3yvArUT.js → index-BAn-AzCS.js} +1 -1
- langflow/frontend/assets/{index-CRPKJZw9.js → index-BCXhKCOK.js} +1 -1
- langflow/frontend/assets/{index-CuFXdTx4.js → index-BGt6jQ4x.js} +1 -1
- langflow/frontend/assets/{index-AWCSdofD.js → index-BH7AyHxp.js} +1 -1
- langflow/frontend/assets/{index-CBc8fEAE.js → index-BISPW-f6.js} +1 -1
- langflow/frontend/assets/{index-Bf0IYKLd.js → index-BIqEYjNT.js} +1 -1
- langflow/frontend/assets/{index-DiGWASY5.js → index-BLEWsL1U.js} +1 -1
- langflow/frontend/assets/{index-D-KY3kkq.js → index-BLXN681C.js} +1 -1
- langflow/frontend/assets/{index-C-Xfg4cD.js → index-BMpKFGhI.js} +1 -1
- langflow/frontend/assets/{index-BVwJDmw-.js → index-BMvp94tO.js} +1 -1
- langflow/frontend/assets/{index-3wW7BClE.js → index-BSwBVwyF.js} +1 -1
- langflow/frontend/assets/{index-Cewy7JZE.js → index-BWFIrwW1.js} +1 -1
- langflow/frontend/assets/{index-CiixOzDG.js → index-BWnKMRFJ.js} +1 -1
- langflow/frontend/assets/{index-BZcw4827.js → index-BX_asvRB.js} +1 -1
- langflow/frontend/assets/{index-CiR1dxI4.js → index-BZ-A4K98.js} +1 -1
- langflow/frontend/assets/{index-CpzXS6md.js → index-BZSa2qz7.js} +1 -1
- langflow/frontend/assets/{index-CdIf07Rw.js → index-B_kBTgxV.js} +1 -1
- langflow/frontend/assets/{index-ClsuDmR6.js → index-BdjfHsrf.js} +1 -1
- langflow/frontend/assets/{index-hbndqB9B.js → index-Bhcv5M0n.js} +1 -1
- langflow/frontend/assets/{index-dJWNxIRH.js → index-BhqVw9WQ.js} +1 -1
- langflow/frontend/assets/{index-Tw3Os-DN.js → index-Bl7RpmrB.js} +1 -1
- langflow/frontend/assets/{index-C-EdnFdA.js → index-BlDsBQ_1.js} +1 -1
- langflow/frontend/assets/{index-z3SRY-mX.js → index-Bm9i8F4W.js} +1 -1
- langflow/frontend/assets/{index-CMZ79X-Y.js → index-BnCnYnao.js} +1 -1
- langflow/frontend/assets/{index-DXRfN4HV.js → index-BrDz-PxE.js} +1 -1
- langflow/frontend/assets/{index-CVWQfRYZ.js → index-BsdLyYMY.js} +1 -1
- langflow/frontend/assets/{index-BTKOU4xC.js → index-BusCv3bR.js} +1 -1
- langflow/frontend/assets/{index-D2N3l-cw.js → index-BvRIG6P5.js} +1 -1
- langflow/frontend/assets/{index-DpVWih90.js → index-Bw-TIIC6.js} +1 -1
- langflow/frontend/assets/{index-D-1tA8Dt.js → index-ByxGmq5p.js} +1 -1
- langflow/frontend/assets/{index-BWYuQ2Sj.js → index-C-2MRYoJ.js} +1 -1
- langflow/frontend/assets/{index-CZqRL9DE.js → index-C-bjC2sz.js} +1 -1
- langflow/frontend/assets/{index-o0D2S7xW.js → index-C-wnbBBY.js} +1 -1
- langflow/frontend/assets/{index-D-_B1a8v.js → index-C51yNvIL.js} +1 -1
- langflow/frontend/assets/{index-DJP-ss47.js → index-C676MS3I.js} +1 -1
- langflow/frontend/assets/{index-lZX9AvZW.js → index-C6nzdeYx.js} +1 -1
- langflow/frontend/assets/{index-6pyH3ZJB.js → index-C8pI0lzi.js} +1 -1
- langflow/frontend/assets/{index-ovFJ_0J6.js → index-CDphUsa3.js} +1 -1
- langflow/frontend/assets/{index-J38wh62w.js → index-CF4_Og1m.js} +1 -1
- langflow/frontend/assets/{index-C1f2wMat.js → index-CJ5A6STv.js} +1 -1
- langflow/frontend/assets/{index-C3KequvP.js → index-CKPZpkQk.js} +1 -1
- langflow/frontend/assets/{index-BiKKN6FR.js → index-CLcaktde.js} +1 -1
- langflow/frontend/assets/{index-28oOcafk.js → index-CNh0rwur.js} +1 -1
- langflow/frontend/assets/{index-CGO1CiUr.js → index-COoTCxvs.js} +1 -1
- langflow/frontend/assets/{index-BC65VuWx.js → index-CPiM2oyj.js} +1 -1
- langflow/frontend/assets/{index-BWdLILDG.js → index-CQQ-4XMS.js} +1 -1
- langflow/frontend/assets/{index-pYJJOcma.js → index-CU16NJD7.js} +1 -1
- langflow/frontend/assets/{index-h_aSZHf3.js → index-CUzlcce2.js} +1 -1
- langflow/frontend/assets/{index-BrJV8psX.js → index-CVkIdc6y.js} +1 -1
- langflow/frontend/assets/{index-lTpteg8t.js → index-C_157Mb-.js} +1 -1
- langflow/frontend/assets/{index-Cyd2HtHK.js → index-C_MhBX6R.js} +1 -1
- langflow/frontend/assets/{index-DrDrcajG.js → index-C_NwzK6j.js} +1 -1
- langflow/frontend/assets/{index-DlD4dXlZ.js → index-Ca1b7Iag.js} +1 -1
- langflow/frontend/assets/{index-BS8Vo8nc.js → index-Cb5G9Ifd.js} +1 -1
- langflow/frontend/assets/{index-CH5UVA9b.js → index-CeswGUz3.js} +1 -1
- langflow/frontend/assets/{index-BCDSei1q.js → index-ChsGhZn3.js} +1 -1
- langflow/frontend/assets/{index-DiB3CTo8.js → index-CiklyQU3.js} +1 -1
- langflow/frontend/assets/{index-dcJ8-agu.js → index-Co__gFM1.js} +1 -1
- langflow/frontend/assets/{index-eo2mAtL-.js → index-Coi86oqP.js} +1 -1
- langflow/frontend/assets/{index-CBvrGgID.js → index-Cu2Xr6_j.js} +1 -1
- langflow/frontend/assets/{index-2wSXqBtB.js → index-Cu7vC48Y.js} +1 -1
- langflow/frontend/assets/{index-Bbi87Ve4.js → index-CvSoff-8.js} +1 -1
- langflow/frontend/assets/{index-DA6-bvgN.js → index-Cw0UComa.js} +1 -1
- langflow/frontend/assets/{index-CWPzZtSx.js → index-D-SnFlhU.js} +1 -1
- langflow/frontend/assets/{index-DHgomBdh.js → index-D-WStJI6.js} +1 -1
- langflow/frontend/assets/{index-BpxbUiZD.js → index-D234yKNJ.js} +186 -186
- langflow/frontend/assets/{index-BkXec1Yf.js → index-D5c2nNvp.js} +1 -1
- langflow/frontend/assets/{index-DwQEZe3C.js → index-DFY8YFbC.js} +1 -1
- langflow/frontend/assets/{index-Bief6eyJ.js → index-DJ6HD14g.js} +1 -1
- langflow/frontend/assets/{index-Bx7dBY26.js → index-DMCerPJM.js} +1 -1
- langflow/frontend/assets/{index-DDWBeudF.js → index-DOj_QWqG.js} +1 -1
- langflow/frontend/assets/{index-CmEYYRN1.js → index-DP1oE6QB.js} +1 -1
- langflow/frontend/assets/{index-C3ZjKdCD.js → index-DTCrijba.js} +1 -1
- langflow/frontend/assets/{index-CtVIONP2.js → index-DVLIDc2_.js} +1 -1
- langflow/frontend/assets/{index-DyJFTK24.js → index-DX7JcSMz.js} +1 -1
- langflow/frontend/assets/{index-DmeiHnfl.js → index-DZVgPCio.js} +1 -1
- langflow/frontend/assets/{index-BwLWcUXL.js → index-DbfS_UH-.js} +1 -1
- langflow/frontend/assets/{index-DV3utZDZ.js → index-DcApTyZ7.js} +1 -1
- langflow/frontend/assets/{index-DDcMAaG4.js → index-Deu8rlaZ.js} +1 -1
- langflow/frontend/assets/{index-iJngutFo.js → index-Df6psZEj.js} +1 -1
- langflow/frontend/assets/{index-CRPyCfYy.js → index-DiblXWmk.js} +1 -1
- langflow/frontend/assets/{index-CMzfJKiW.js → index-DjQElpEg.js} +1 -1
- langflow/frontend/assets/{index-Dmu-X5-4.js → index-DmVt5Jlx.js} +1 -1
- langflow/frontend/assets/{index-CPHEscq9.js → index-DmYLDQag.js} +1 -1
- langflow/frontend/assets/{index-BKseQQ2I.js → index-DnlVWWU8.js} +1 -1
- langflow/frontend/assets/{index-D5ETnvJa.js → index-Dp7ZQyL3.js} +1 -1
- langflow/frontend/assets/{index-Co20d-eQ.js → index-DpWrk8mA.js} +1 -1
- langflow/frontend/assets/{index-CVl6MbaM.js → index-DrXXKzpD.js} +1 -1
- langflow/frontend/assets/{index-OwPvCmpW.js → index-Drg8me2a.js} +1 -1
- langflow/frontend/assets/{index-CVwWoX99.js → index-DsEZjOcp.js} +1 -1
- langflow/frontend/assets/{index-DwPkMTaY.js → index-DznH7Jbq.js} +1 -1
- langflow/frontend/assets/{index-CNw1H-Wc.js → index-GzOGB_fo.js} +1 -1
- langflow/frontend/assets/{index-C3l0zYn0.js → index-MVW4HTEk.js} +1 -1
- langflow/frontend/assets/{index-DhtZ5hx8.js → index-OsUvqIUr.js} +1 -1
- langflow/frontend/assets/{index-B2ptVQGM.js → index-RH_I78z_.js} +1 -1
- langflow/frontend/assets/{index-DdtMEn6I.js → index-RjeC0kaX.js} +1 -1
- langflow/frontend/assets/{index-hG24k5xJ.js → index-S-sc0Cm9.js} +1 -1
- langflow/frontend/assets/{index-Bg5nrMRh.js → index-S8uJXTOq.js} +1 -1
- langflow/frontend/assets/{index-m8QA6VNM.js → index-SB4rw8D5.js} +1 -1
- langflow/frontend/assets/{index-Du-pc0KE.js → index-YJsAl7vm.js} +1 -1
- langflow/frontend/assets/{index-DfDhMHgQ.js → index-ZjeocHyu.js} +1 -1
- langflow/frontend/assets/{index-Bnl6QHtP.js → index-_szO7sta.js} +1 -1
- langflow/frontend/assets/{index-xvFOmxx4.js → index-aAgSKWb3.js} +1 -1
- langflow/frontend/assets/{index-Db9dYSzy.js → index-aWnZIwHd.js} +1 -1
- langflow/frontend/assets/{index-BJy50PvP.js → index-bMhyLtgS.js} +1 -1
- langflow/frontend/assets/{index-Cqpzl1J4.js → index-cYFKmtmg.js} +1 -1
- langflow/frontend/assets/{index-CLJeJYjH.js → index-hg2y9OAt.js} +1 -1
- langflow/frontend/assets/{index-D7kquVv2.js → index-jwzN3Jd_.js} +1 -1
- langflow/frontend/assets/{index-BiC280Nx.js → index-k9jP5chN.js} +1 -1
- langflow/frontend/assets/{index-B3TANVes.js → index-lnF9Eqr2.js} +1 -1
- langflow/frontend/assets/{index-B4yCvZKV.js → index-mjwtJmkP.js} +1 -1
- langflow/frontend/assets/{index-CfwLpbMM.js → index-nw3WF9lY.js} +1 -1
- langflow/frontend/assets/{index-CUVDws8F.js → index-qiVTWUuf.js} +1 -1
- langflow/frontend/assets/{index-DTqbvGC0.js → index-uybez8MR.js} +1 -1
- langflow/frontend/assets/{index-Dfe7qfvf.js → index-v8eXbWlM.js} +1 -1
- langflow/frontend/assets/{index-B2Zgv_xv.js → index-xN8ogFdo.js} +1 -1
- langflow/frontend/assets/{index-BRg1f4Mu.js → index-xV6ystWy.js} +1 -1
- langflow/frontend/assets/{index-sI75DsdM.js → index-yyAaYjLR.js} +1 -1
- langflow/frontend/assets/lazyIconImports-Ci-S9xBA.js +2 -0
- langflow/frontend/assets/{use-post-add-user-C0MdTpQ5.js → use-post-add-user-JUeLDErC.js} +1 -1
- langflow/frontend/index.html +1 -1
- langflow/initial_setup/starter_projects/Hybrid Search RAG.json +1280 -1276
- langflow/initial_setup/starter_projects/Instagram Copywriter.json +1 -1
- langflow/initial_setup/starter_projects/Invoice Summarizer.json +1 -1
- langflow/initial_setup/starter_projects/Knowledge Ingestion.json +46 -47
- langflow/initial_setup/starter_projects/Knowledge Retrieval.json +73 -56
- langflow/initial_setup/starter_projects/Market Research.json +1 -1
- langflow/initial_setup/starter_projects/News Aggregator.json +1 -1
- langflow/initial_setup/starter_projects/Nvidia Remix.json +1 -1
- langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +1 -1
- langflow/initial_setup/starter_projects/Price Deal Finder.json +1 -1
- langflow/initial_setup/starter_projects/Research Agent.json +1 -1
- langflow/initial_setup/starter_projects/SaaS Pricing.json +1 -1
- langflow/initial_setup/starter_projects/Search agent.json +1 -1
- langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +3 -3
- langflow/initial_setup/starter_projects/Simple Agent.json +1 -1
- langflow/initial_setup/starter_projects/Social Media Agent.json +1 -1
- langflow/initial_setup/starter_projects/Travel Planning Agents.json +3 -3
- langflow/initial_setup/starter_projects/Vector Store RAG.json +1093 -1108
- langflow/initial_setup/starter_projects/Youtube Analysis.json +1 -1
- langflow/services/auth/utils.py +78 -1
- langflow/services/settings/auth.py +4 -0
- {langflow_base_nightly-0.5.1.dev1.dist-info → langflow_base_nightly-0.5.1.dev3.dist-info}/METADATA +1 -1
- {langflow_base_nightly-0.5.1.dev1.dist-info → langflow_base_nightly-0.5.1.dev3.dist-info}/RECORD +171 -169
- langflow/frontend/assets/lazyIconImports-D97HEZkE.js +0 -2
- /langflow/base/{data/kb_utils.py → knowledge_bases/knowledge_base_utils.py} +0 -0
- /langflow/components/datastax/{astradb.py → astradb_vectorstore.py} +0 -0
- {langflow_base_nightly-0.5.1.dev1.dist-info → langflow_base_nightly-0.5.1.dev3.dist-info}/WHEEL +0 -0
- {langflow_base_nightly-0.5.1.dev1.dist-info → langflow_base_nightly-0.5.1.dev3.dist-info}/entry_points.txt +0 -0
langflow/api/v1/endpoints.py
CHANGED
|
@@ -38,12 +38,11 @@ from langflow.exceptions.serialization import SerializationError
|
|
|
38
38
|
from langflow.graph.graph.base import Graph
|
|
39
39
|
from langflow.graph.schema import RunOutputs
|
|
40
40
|
from langflow.helpers.flow import get_flow_by_id_or_endpoint_name
|
|
41
|
-
from langflow.helpers.user import get_user_by_flow_id_or_endpoint_name
|
|
42
41
|
from langflow.interface.initialize.loading import update_params_with_load_from_db_fields
|
|
43
42
|
from langflow.logging.logger import logger
|
|
44
43
|
from langflow.processing.process import process_tweaks, run_graph_internal
|
|
45
44
|
from langflow.schema.graph import Tweaks
|
|
46
|
-
from langflow.services.auth.utils import api_key_security, get_current_active_user
|
|
45
|
+
from langflow.services.auth.utils import api_key_security, get_current_active_user, get_webhook_user
|
|
47
46
|
from langflow.services.cache.utils import save_uploaded_file
|
|
48
47
|
from langflow.services.database.models.flow.model import Flow, FlowRead
|
|
49
48
|
from langflow.services.database.models.flow.utils import get_all_webhook_components_in_flow
|
|
@@ -399,16 +398,16 @@ async def simplified_run_flow(
|
|
|
399
398
|
|
|
400
399
|
@router.post("/webhook/{flow_id_or_name}", response_model=dict, status_code=HTTPStatus.ACCEPTED) # noqa: RUF100, FAST003
|
|
401
400
|
async def webhook_run_flow(
|
|
401
|
+
flow_id_or_name: str,
|
|
402
402
|
flow: Annotated[Flow, Depends(get_flow_by_id_or_endpoint_name)],
|
|
403
|
-
user: Annotated[User, Depends(get_user_by_flow_id_or_endpoint_name)],
|
|
404
403
|
request: Request,
|
|
405
404
|
background_tasks: BackgroundTasks,
|
|
406
405
|
):
|
|
407
406
|
"""Run a flow using a webhook request.
|
|
408
407
|
|
|
409
408
|
Args:
|
|
410
|
-
|
|
411
|
-
|
|
409
|
+
flow_id_or_name (str): The flow ID or endpoint name.
|
|
410
|
+
flow (Flow): The flow to be executed.
|
|
412
411
|
request (Request): The incoming HTTP request.
|
|
413
412
|
background_tasks (BackgroundTasks): The background tasks manager.
|
|
414
413
|
|
|
@@ -422,6 +421,10 @@ async def webhook_run_flow(
|
|
|
422
421
|
start_time = time.perf_counter()
|
|
423
422
|
await logger.adebug("Received webhook request")
|
|
424
423
|
error_msg = ""
|
|
424
|
+
|
|
425
|
+
# Get the appropriate user for webhook execution based on auth settings
|
|
426
|
+
webhook_user = await get_webhook_user(flow_id_or_name, request)
|
|
427
|
+
|
|
425
428
|
try:
|
|
426
429
|
try:
|
|
427
430
|
data = await request.body()
|
|
@@ -453,7 +456,7 @@ async def webhook_run_flow(
|
|
|
453
456
|
simple_run_flow_task,
|
|
454
457
|
flow=flow,
|
|
455
458
|
input_request=input_request,
|
|
456
|
-
api_key_user=
|
|
459
|
+
api_key_user=webhook_user,
|
|
457
460
|
)
|
|
458
461
|
except Exception as exc:
|
|
459
462
|
error_msg = str(exc)
|
|
@@ -762,7 +765,7 @@ async def get_config() -> ConfigResponse:
|
|
|
762
765
|
"""
|
|
763
766
|
try:
|
|
764
767
|
settings_service: SettingsService = get_settings_service()
|
|
765
|
-
return ConfigResponse.from_settings(settings_service.settings)
|
|
768
|
+
return ConfigResponse.from_settings(settings_service.settings, settings_service.auth_settings)
|
|
766
769
|
|
|
767
770
|
except Exception as exc:
|
|
768
771
|
raise HTTPException(status_code=500, detail=str(exc)) from exc
|
langflow/api/v1/schemas.py
CHANGED
|
@@ -407,13 +407,15 @@ class ConfigResponse(BaseModel):
|
|
|
407
407
|
public_flow_cleanup_interval: int
|
|
408
408
|
public_flow_expiration: int
|
|
409
409
|
event_delivery: Literal["polling", "streaming", "direct"]
|
|
410
|
+
webhook_auth_enable: bool
|
|
410
411
|
|
|
411
412
|
@classmethod
|
|
412
|
-
def from_settings(cls, settings: Settings) -> "ConfigResponse":
|
|
413
|
-
"""Create a ConfigResponse instance using values from a Settings object and
|
|
413
|
+
def from_settings(cls, settings: Settings, auth_settings) -> "ConfigResponse":
|
|
414
|
+
"""Create a ConfigResponse instance using values from a Settings object and AuthSettings.
|
|
414
415
|
|
|
415
416
|
Parameters:
|
|
416
417
|
settings (Settings): The Settings object containing configuration values.
|
|
418
|
+
auth_settings: The AuthSettings object containing authentication configuration values.
|
|
417
419
|
|
|
418
420
|
Returns:
|
|
419
421
|
ConfigResponse: An instance populated with configuration and feature flag values.
|
|
@@ -431,6 +433,7 @@ class ConfigResponse(BaseModel):
|
|
|
431
433
|
public_flow_cleanup_interval=settings.public_flow_cleanup_interval,
|
|
432
434
|
public_flow_expiration=settings.public_flow_expiration,
|
|
433
435
|
event_delivery=settings.event_delivery,
|
|
436
|
+
webhook_auth_enable=auth_settings.WEBHOOK_AUTH_ENABLE,
|
|
434
437
|
)
|
|
435
438
|
|
|
436
439
|
|
|
File without changes
|
|
@@ -483,6 +483,7 @@ class AgentComponent(ToolCallingAgentComponent):
|
|
|
483
483
|
build_config.update(fields_to_add)
|
|
484
484
|
# Reset input types for agent_llm
|
|
485
485
|
build_config["agent_llm"]["input_types"] = []
|
|
486
|
+
build_config["agent_llm"]["display_name"] = "Model Provider"
|
|
486
487
|
elif field_value == "Custom":
|
|
487
488
|
# Delete all provider fields
|
|
488
489
|
self.delete_fields(build_config, ALL_PROVIDER_FIELDS)
|
|
@@ -3,8 +3,6 @@ from .csv_to_data import CSVToDataComponent
|
|
|
3
3
|
from .directory import DirectoryComponent
|
|
4
4
|
from .file import FileComponent
|
|
5
5
|
from .json_to_data import JSONToDataComponent
|
|
6
|
-
from .kb_ingest import KBIngestionComponent
|
|
7
|
-
from .kb_retrieval import KBRetrievalComponent
|
|
8
6
|
from .news_search import NewsSearchComponent
|
|
9
7
|
from .rss import RSSReaderComponent
|
|
10
8
|
from .sql_executor import SQLComponent
|
|
@@ -18,8 +16,6 @@ __all__ = [
|
|
|
18
16
|
"DirectoryComponent",
|
|
19
17
|
"FileComponent",
|
|
20
18
|
"JSONToDataComponent",
|
|
21
|
-
"KBIngestionComponent",
|
|
22
|
-
"KBRetrievalComponent",
|
|
23
19
|
"NewsSearchComponent",
|
|
24
20
|
"RSSReaderComponent",
|
|
25
21
|
"SQLComponent",
|
|
@@ -8,9 +8,9 @@ if TYPE_CHECKING:
|
|
|
8
8
|
from .astra_assistant_manager import AstraAssistantManager
|
|
9
9
|
from .astra_db import AstraDBChatMemory
|
|
10
10
|
from .astra_vectorize import AstraVectorizeComponent
|
|
11
|
-
from .astradb import AstraDBVectorStoreComponent
|
|
12
11
|
from .astradb_cql import AstraDBCQLToolComponent
|
|
13
12
|
from .astradb_tool import AstraDBToolComponent
|
|
13
|
+
from .astradb_vectorstore import AstraDBVectorStoreComponent
|
|
14
14
|
from .create_assistant import AssistantsCreateAssistant
|
|
15
15
|
from .create_thread import AssistantsCreateThread
|
|
16
16
|
from .dotenv import Dotenv
|
|
@@ -29,7 +29,7 @@ _dynamic_imports = {
|
|
|
29
29
|
"AstraDBCQLToolComponent": "astradb_cql",
|
|
30
30
|
"AstraDBChatMemory": "astra_db",
|
|
31
31
|
"AstraDBToolComponent": "astradb_tool",
|
|
32
|
-
"AstraDBVectorStoreComponent": "
|
|
32
|
+
"AstraDBVectorStoreComponent": "astradb_vectorstore",
|
|
33
33
|
"AstraVectorizeComponent": "astra_vectorize",
|
|
34
34
|
"Dotenv": "dotenv",
|
|
35
35
|
"GetEnvVar": "getenvvar",
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from langflow.components._importing import import_mod
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from langflow.components.knowledge_bases.ingestion import KnowledgeIngestionComponent
|
|
9
|
+
from langflow.components.knowledge_bases.retrieval import KnowledgeRetrievalComponent
|
|
10
|
+
|
|
11
|
+
_dynamic_imports = {
|
|
12
|
+
"KnowledgeIngestionComponent": "ingestion",
|
|
13
|
+
"KnowledgeRetrievalComponent": "retrieval",
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
__all__ = ["KnowledgeIngestionComponent", "KnowledgeRetrievalComponent"]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import input/output components on attribute access."""
|
|
21
|
+
if attr_name not in _dynamic_imports:
|
|
22
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
23
|
+
raise AttributeError(msg)
|
|
24
|
+
try:
|
|
25
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
26
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
27
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
28
|
+
raise AttributeError(msg) from e
|
|
29
|
+
globals()[attr_name] = result
|
|
30
|
+
return result
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def __dir__() -> list[str]:
|
|
34
|
+
return list(__all__)
|
|
@@ -9,17 +9,18 @@ import uuid
|
|
|
9
9
|
from dataclasses import asdict, dataclass, field
|
|
10
10
|
from datetime import datetime, timezone
|
|
11
11
|
from pathlib import Path
|
|
12
|
-
from typing import Any
|
|
12
|
+
from typing import TYPE_CHECKING, Any
|
|
13
13
|
|
|
14
14
|
import pandas as pd
|
|
15
15
|
from cryptography.fernet import InvalidToken
|
|
16
16
|
from langchain_chroma import Chroma
|
|
17
17
|
from loguru import logger
|
|
18
18
|
|
|
19
|
-
from langflow.base.
|
|
19
|
+
from langflow.base.knowledge_bases.knowledge_base_utils import get_knowledge_bases
|
|
20
20
|
from langflow.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES
|
|
21
|
+
from langflow.components.processing.converter import convert_to_dataframe
|
|
21
22
|
from langflow.custom import Component
|
|
22
|
-
from langflow.io import BoolInput,
|
|
23
|
+
from langflow.io import BoolInput, DropdownInput, HandleInput, IntInput, Output, SecretStrInput, StrInput, TableInput
|
|
23
24
|
from langflow.schema.data import Data
|
|
24
25
|
from langflow.schema.dotdict import dotdict # noqa: TC001
|
|
25
26
|
from langflow.schema.table import EditMode
|
|
@@ -27,6 +28,9 @@ from langflow.services.auth.utils import decrypt_api_key, encrypt_api_key
|
|
|
27
28
|
from langflow.services.database.models.user.crud import get_user_by_id
|
|
28
29
|
from langflow.services.deps import get_settings_service, get_variable_service, session_scope
|
|
29
30
|
|
|
31
|
+
if TYPE_CHECKING:
|
|
32
|
+
from langflow.schema.dataframe import DataFrame
|
|
33
|
+
|
|
30
34
|
HUGGINGFACE_MODEL_NAMES = ["sentence-transformers/all-MiniLM-L6-v2", "sentence-transformers/all-mpnet-base-v2"]
|
|
31
35
|
COHERE_MODEL_NAMES = ["embed-english-v3.0", "embed-multilingual-v3.0"]
|
|
32
36
|
|
|
@@ -38,14 +42,14 @@ if not knowledge_directory:
|
|
|
38
42
|
KNOWLEDGE_BASES_ROOT_PATH = Path(knowledge_directory).expanduser()
|
|
39
43
|
|
|
40
44
|
|
|
41
|
-
class
|
|
45
|
+
class KnowledgeIngestionComponent(Component):
|
|
42
46
|
"""Create or append to Langflow Knowledge from a DataFrame."""
|
|
43
47
|
|
|
44
48
|
# ------ UI metadata ---------------------------------------------------
|
|
45
49
|
display_name = "Knowledge Ingestion"
|
|
46
50
|
description = "Create or update knowledge in Langflow."
|
|
47
|
-
icon = "
|
|
48
|
-
name = "
|
|
51
|
+
icon = "upload"
|
|
52
|
+
name = "KnowledgeIngestion"
|
|
49
53
|
|
|
50
54
|
def __init__(self, *args, **kwargs) -> None:
|
|
51
55
|
super().__init__(*args, **kwargs)
|
|
@@ -101,12 +105,17 @@ class KBIngestionComponent(Component):
|
|
|
101
105
|
required=True,
|
|
102
106
|
options=[],
|
|
103
107
|
refresh_button=True,
|
|
108
|
+
real_time_refresh=True,
|
|
104
109
|
dialog_inputs=asdict(NewKnowledgeBaseInput()),
|
|
105
110
|
),
|
|
106
|
-
|
|
111
|
+
HandleInput(
|
|
107
112
|
name="input_df",
|
|
108
|
-
display_name="
|
|
109
|
-
info=
|
|
113
|
+
display_name="Input",
|
|
114
|
+
info=(
|
|
115
|
+
"Table with all original columns (already chunked / processed). "
|
|
116
|
+
"Accepts Data or DataFrame. If Data is provided, it is converted to a DataFrame automatically."
|
|
117
|
+
),
|
|
118
|
+
input_types=["Data", "DataFrame"],
|
|
110
119
|
required=True,
|
|
111
120
|
),
|
|
112
121
|
TableInput(
|
|
@@ -171,7 +180,7 @@ class KBIngestionComponent(Component):
|
|
|
171
180
|
]
|
|
172
181
|
|
|
173
182
|
# ------ Outputs -------------------------------------------------------
|
|
174
|
-
outputs = [Output(display_name="
|
|
183
|
+
outputs = [Output(display_name="Results", name="dataframe_output", method="build_kb_info")]
|
|
175
184
|
|
|
176
185
|
# ------ Internal helpers ---------------------------------------------
|
|
177
186
|
def _get_kb_root(self) -> Path:
|
|
@@ -503,8 +512,8 @@ class KBIngestionComponent(Component):
|
|
|
503
512
|
async def build_kb_info(self) -> Data:
|
|
504
513
|
"""Main ingestion routine → returns a dict with KB metadata."""
|
|
505
514
|
try:
|
|
506
|
-
|
|
507
|
-
df_source:
|
|
515
|
+
input_value = self.input_df[0] if isinstance(self.input_df, list) else self.input_df
|
|
516
|
+
df_source: DataFrame = convert_to_dataframe(input_value)
|
|
508
517
|
|
|
509
518
|
# Validate column configuration (using Structured Output patterns)
|
|
510
519
|
config_list = self._validate_column_config(df_source)
|
|
@@ -559,9 +568,8 @@ class KBIngestionComponent(Component):
|
|
|
559
568
|
return Data(data=meta)
|
|
560
569
|
|
|
561
570
|
except (OSError, ValueError, RuntimeError, KeyError) as e:
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
return Data(data={"error": str(e), "kb_name": self.knowledge_base})
|
|
571
|
+
msg = f"Error during KB ingestion: {e}"
|
|
572
|
+
raise RuntimeError(msg) from e
|
|
565
573
|
|
|
566
574
|
async def _get_api_key_variable(self, field_value: dict[str, Any]):
|
|
567
575
|
async with session_scope() as db:
|
|
@@ -7,7 +7,7 @@ from langchain_chroma import Chroma
|
|
|
7
7
|
from loguru import logger
|
|
8
8
|
from pydantic import SecretStr
|
|
9
9
|
|
|
10
|
-
from langflow.base.
|
|
10
|
+
from langflow.base.knowledge_bases.knowledge_base_utils import get_knowledge_bases
|
|
11
11
|
from langflow.custom import Component
|
|
12
12
|
from langflow.io import BoolInput, DropdownInput, IntInput, MessageTextInput, Output, SecretStrInput
|
|
13
13
|
from langflow.schema.data import Data
|
|
@@ -24,11 +24,11 @@ if not knowledge_directory:
|
|
|
24
24
|
KNOWLEDGE_BASES_ROOT_PATH = Path(knowledge_directory).expanduser()
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
class
|
|
27
|
+
class KnowledgeRetrievalComponent(Component):
|
|
28
28
|
display_name = "Knowledge Retrieval"
|
|
29
29
|
description = "Search and retrieve data from knowledge."
|
|
30
|
-
icon = "
|
|
31
|
-
name = "
|
|
30
|
+
icon = "download"
|
|
31
|
+
name = "KnowledgeRetrieval"
|
|
32
32
|
|
|
33
33
|
inputs = [
|
|
34
34
|
DropdownInput(
|
|
@@ -51,6 +51,7 @@ class KBRetrievalComponent(Component):
|
|
|
51
51
|
name="search_query",
|
|
52
52
|
display_name="Search Query",
|
|
53
53
|
info="Optional search query to filter knowledge base data.",
|
|
54
|
+
tool_mode=True,
|
|
54
55
|
),
|
|
55
56
|
IntInput(
|
|
56
57
|
name="top_k",
|
|
@@ -63,17 +64,24 @@ class KBRetrievalComponent(Component):
|
|
|
63
64
|
BoolInput(
|
|
64
65
|
name="include_metadata",
|
|
65
66
|
display_name="Include Metadata",
|
|
66
|
-
info="Whether to include all metadata
|
|
67
|
+
info="Whether to include all metadata in the output. If false, only content is returned.",
|
|
67
68
|
value=True,
|
|
68
69
|
advanced=False,
|
|
69
70
|
),
|
|
71
|
+
BoolInput(
|
|
72
|
+
name="include_embeddings",
|
|
73
|
+
display_name="Include Embeddings",
|
|
74
|
+
info="Whether to include embeddings in the output. Only applicable if 'Include Metadata' is enabled.",
|
|
75
|
+
value=False,
|
|
76
|
+
advanced=True,
|
|
77
|
+
),
|
|
70
78
|
]
|
|
71
79
|
|
|
72
80
|
outputs = [
|
|
73
81
|
Output(
|
|
74
|
-
name="
|
|
82
|
+
name="retrieve_data",
|
|
75
83
|
display_name="Results",
|
|
76
|
-
method="
|
|
84
|
+
method="retrieve_data",
|
|
77
85
|
info="Returns the data from the selected knowledge base.",
|
|
78
86
|
),
|
|
79
87
|
]
|
|
@@ -162,7 +170,7 @@ class KBRetrievalComponent(Component):
|
|
|
162
170
|
msg = f"Embedding provider '{provider}' is not supported for retrieval."
|
|
163
171
|
raise NotImplementedError(msg)
|
|
164
172
|
|
|
165
|
-
async def
|
|
173
|
+
async def retrieve_data(self) -> DataFrame:
|
|
166
174
|
"""Retrieve data from the selected knowledge base by reading the Chroma collection.
|
|
167
175
|
|
|
168
176
|
Returns:
|
|
@@ -212,16 +220,16 @@ class KBRetrievalComponent(Component):
|
|
|
212
220
|
# For each result, make it a tuple to match the expected output format
|
|
213
221
|
results = [(doc, 0) for doc in results] # Assign a dummy score of 0
|
|
214
222
|
|
|
215
|
-
# If
|
|
223
|
+
# If include_embeddings is enabled, get embeddings for the results
|
|
216
224
|
id_to_embedding = {}
|
|
217
|
-
if self.
|
|
225
|
+
if self.include_embeddings and results:
|
|
218
226
|
doc_ids = [doc[0].metadata.get("_id") for doc in results if doc[0].metadata.get("_id")]
|
|
219
227
|
|
|
220
228
|
# Only proceed if we have valid document IDs
|
|
221
229
|
if doc_ids:
|
|
222
230
|
# Access underlying client to get embeddings
|
|
223
231
|
collection = chroma._client.get_collection(name=self.knowledge_base)
|
|
224
|
-
embeddings_result = collection.get(where={"_id": {"$in": doc_ids}}, include=["
|
|
232
|
+
embeddings_result = collection.get(where={"_id": {"$in": doc_ids}}, include=["metadatas", "embeddings"])
|
|
225
233
|
|
|
226
234
|
# Create a mapping from document ID to embedding
|
|
227
235
|
for i, metadata in enumerate(embeddings_result.get("metadatas", [])):
|
|
@@ -231,20 +239,16 @@ class KBRetrievalComponent(Component):
|
|
|
231
239
|
# Build output data based on include_metadata setting
|
|
232
240
|
data_list = []
|
|
233
241
|
for doc in results:
|
|
242
|
+
kwargs = {
|
|
243
|
+
"content": doc[0].page_content,
|
|
244
|
+
}
|
|
245
|
+
if self.search_query:
|
|
246
|
+
kwargs["_score"] = -1 * doc[1]
|
|
234
247
|
if self.include_metadata:
|
|
235
248
|
# Include all metadata, embeddings, and content
|
|
236
|
-
kwargs
|
|
237
|
-
|
|
238
|
-
**doc[0].metadata,
|
|
239
|
-
}
|
|
240
|
-
if self.search_query:
|
|
241
|
-
kwargs["_score"] = -1 * doc[1]
|
|
249
|
+
kwargs.update(doc[0].metadata)
|
|
250
|
+
if self.include_embeddings:
|
|
242
251
|
kwargs["_embeddings"] = id_to_embedding.get(doc[0].metadata.get("_id"))
|
|
243
|
-
else:
|
|
244
|
-
# Only include content
|
|
245
|
-
kwargs = {
|
|
246
|
-
"content": doc[0].page_content,
|
|
247
|
-
}
|
|
248
252
|
|
|
249
253
|
data_list.append(Data(**kwargs))
|
|
250
254
|
|
|
@@ -79,7 +79,16 @@ class DataFrameOperationsComponent(Component):
|
|
|
79
79
|
DropdownInput(
|
|
80
80
|
name="filter_operator",
|
|
81
81
|
display_name="Filter Operator",
|
|
82
|
-
options=[
|
|
82
|
+
options=[
|
|
83
|
+
"equals",
|
|
84
|
+
"not equals",
|
|
85
|
+
"contains",
|
|
86
|
+
"not contains",
|
|
87
|
+
"starts with",
|
|
88
|
+
"ends with",
|
|
89
|
+
"greater than",
|
|
90
|
+
"less than",
|
|
91
|
+
],
|
|
83
92
|
value="equals",
|
|
84
93
|
info="The operator to apply for filtering rows.",
|
|
85
94
|
advanced=False,
|
|
@@ -254,6 +263,8 @@ class DataFrameOperationsComponent(Component):
|
|
|
254
263
|
mask = column != filter_value
|
|
255
264
|
elif operator == "contains":
|
|
256
265
|
mask = column.astype(str).str.contains(str(filter_value), na=False)
|
|
266
|
+
elif operator == "not contains":
|
|
267
|
+
mask = ~column.astype(str).str.contains(str(filter_value), na=False)
|
|
257
268
|
elif operator == "starts with":
|
|
258
269
|
mask = column.astype(str).str.startswith(str(filter_value), na=False)
|
|
259
270
|
elif operator == "ends with":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as a}from"./index-
|
|
1
|
+
import{j as a}from"./index-D234yKNJ.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};
|