langflow-base-nightly 0.5.1.dev0__py3-none-any.whl → 0.5.1.dev2__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 (172) hide show
  1. langflow/api/v1/endpoints.py +10 -7
  2. langflow/api/v1/schemas.py +5 -2
  3. langflow/base/knowledge_bases/__init__.py +0 -0
  4. langflow/components/agents/agent.py +1 -0
  5. langflow/components/data/__init__.py +0 -4
  6. langflow/components/datastax/__init__.py +2 -2
  7. langflow/components/knowledge_bases/__init__.py +34 -0
  8. langflow/components/{data/kb_ingest.py → knowledge_bases/ingestion.py} +23 -15
  9. langflow/components/{data/kb_retrieval.py → knowledge_bases/retrieval.py} +26 -22
  10. langflow/components/processing/dataframe_operations.py +12 -1
  11. langflow/frontend/assets/{SlackIcon-Cr3Q15Px.js → SlackIcon-Cc7Qnzki.js} +1 -1
  12. langflow/frontend/assets/{Wikipedia-GxM5sPdM.js → Wikipedia-7ulMZY46.js} +1 -1
  13. langflow/frontend/assets/{Wolfram-BN3-VOCA.js → Wolfram-By9PGsHS.js} +1 -1
  14. langflow/frontend/assets/{index-Kwdl-e29.js → index--e0oQqZh.js} +1 -1
  15. langflow/frontend/assets/{index-CD-PqGCY.js → index-3jlSQi5Y.js} +1 -1
  16. langflow/frontend/assets/{index-DQ7VYqQc.js → index-4JIEdyIM.js} +1 -1
  17. langflow/frontend/assets/{index-C9Cxnkl8.js → index-5-CSw2-z.js} +1 -1
  18. langflow/frontend/assets/{index-DUpri6zF.js → index-7yAHPRxv.js} +1 -1
  19. langflow/frontend/assets/{index-Dl5amdBz.js → index-9FL5xjkL.js} +1 -1
  20. langflow/frontend/assets/{index-X0guhYF8.js → index-AALDfCyt.js} +1 -1
  21. langflow/frontend/assets/{index-BLTxEeTi.js → index-AKVkmT4S.js} +1 -1
  22. langflow/frontend/assets/{index-CRcMqCIj.js → index-B3GvPjhD.js} +1 -1
  23. langflow/frontend/assets/{index-D14EWPyZ.js → index-B5LHnuQR.js} +1 -1
  24. langflow/frontend/assets/{index-C3yvArUT.js → index-BAn-AzCS.js} +1 -1
  25. langflow/frontend/assets/{index-CRPKJZw9.js → index-BCXhKCOK.js} +1 -1
  26. langflow/frontend/assets/{index-CuFXdTx4.js → index-BGt6jQ4x.js} +1 -1
  27. langflow/frontend/assets/{index-AWCSdofD.js → index-BH7AyHxp.js} +1 -1
  28. langflow/frontend/assets/{index-CBc8fEAE.js → index-BISPW-f6.js} +1 -1
  29. langflow/frontend/assets/{index-Bf0IYKLd.js → index-BIqEYjNT.js} +1 -1
  30. langflow/frontend/assets/{index-DiGWASY5.js → index-BLEWsL1U.js} +1 -1
  31. langflow/frontend/assets/{index-D-KY3kkq.js → index-BLXN681C.js} +1 -1
  32. langflow/frontend/assets/{index-C-Xfg4cD.js → index-BMpKFGhI.js} +1 -1
  33. langflow/frontend/assets/{index-BVwJDmw-.js → index-BMvp94tO.js} +1 -1
  34. langflow/frontend/assets/{index-3wW7BClE.js → index-BSwBVwyF.js} +1 -1
  35. langflow/frontend/assets/{index-Cewy7JZE.js → index-BWFIrwW1.js} +1 -1
  36. langflow/frontend/assets/{index-CiixOzDG.js → index-BWnKMRFJ.js} +1 -1
  37. langflow/frontend/assets/{index-BZcw4827.js → index-BX_asvRB.js} +1 -1
  38. langflow/frontend/assets/{index-CiR1dxI4.js → index-BZ-A4K98.js} +1 -1
  39. langflow/frontend/assets/{index-CpzXS6md.js → index-BZSa2qz7.js} +1 -1
  40. langflow/frontend/assets/{index-CdIf07Rw.js → index-B_kBTgxV.js} +1 -1
  41. langflow/frontend/assets/{index-ClsuDmR6.js → index-BdjfHsrf.js} +1 -1
  42. langflow/frontend/assets/{index-hbndqB9B.js → index-Bhcv5M0n.js} +1 -1
  43. langflow/frontend/assets/{index-dJWNxIRH.js → index-BhqVw9WQ.js} +1 -1
  44. langflow/frontend/assets/{index-Tw3Os-DN.js → index-Bl7RpmrB.js} +1 -1
  45. langflow/frontend/assets/{index-C-EdnFdA.js → index-BlDsBQ_1.js} +1 -1
  46. langflow/frontend/assets/{index-z3SRY-mX.js → index-Bm9i8F4W.js} +1 -1
  47. langflow/frontend/assets/{index-CMZ79X-Y.js → index-BnCnYnao.js} +1 -1
  48. langflow/frontend/assets/{index-DXRfN4HV.js → index-BrDz-PxE.js} +1 -1
  49. langflow/frontend/assets/{index-CVWQfRYZ.js → index-BsdLyYMY.js} +1 -1
  50. langflow/frontend/assets/{index-BTKOU4xC.js → index-BusCv3bR.js} +1 -1
  51. langflow/frontend/assets/{index-D2N3l-cw.js → index-BvRIG6P5.js} +1 -1
  52. langflow/frontend/assets/{index-DpVWih90.js → index-Bw-TIIC6.js} +1 -1
  53. langflow/frontend/assets/{index-D-1tA8Dt.js → index-ByxGmq5p.js} +1 -1
  54. langflow/frontend/assets/{index-BWYuQ2Sj.js → index-C-2MRYoJ.js} +1 -1
  55. langflow/frontend/assets/{index-CZqRL9DE.js → index-C-bjC2sz.js} +1 -1
  56. langflow/frontend/assets/{index-o0D2S7xW.js → index-C-wnbBBY.js} +1 -1
  57. langflow/frontend/assets/{index-D-_B1a8v.js → index-C51yNvIL.js} +1 -1
  58. langflow/frontend/assets/{index-DJP-ss47.js → index-C676MS3I.js} +1 -1
  59. langflow/frontend/assets/{index-lZX9AvZW.js → index-C6nzdeYx.js} +1 -1
  60. langflow/frontend/assets/{index-6pyH3ZJB.js → index-C8pI0lzi.js} +1 -1
  61. langflow/frontend/assets/{index-ovFJ_0J6.js → index-CDphUsa3.js} +1 -1
  62. langflow/frontend/assets/{index-J38wh62w.js → index-CF4_Og1m.js} +1 -1
  63. langflow/frontend/assets/{index-C1f2wMat.js → index-CJ5A6STv.js} +1 -1
  64. langflow/frontend/assets/{index-C3KequvP.js → index-CKPZpkQk.js} +1 -1
  65. langflow/frontend/assets/{index-BiKKN6FR.js → index-CLcaktde.js} +1 -1
  66. langflow/frontend/assets/{index-28oOcafk.js → index-CNh0rwur.js} +1 -1
  67. langflow/frontend/assets/{index-CGO1CiUr.js → index-COoTCxvs.js} +1 -1
  68. langflow/frontend/assets/{index-BC65VuWx.js → index-CPiM2oyj.js} +1 -1
  69. langflow/frontend/assets/{index-BWdLILDG.js → index-CQQ-4XMS.js} +1 -1
  70. langflow/frontend/assets/{index-pYJJOcma.js → index-CU16NJD7.js} +1 -1
  71. langflow/frontend/assets/{index-h_aSZHf3.js → index-CUzlcce2.js} +1 -1
  72. langflow/frontend/assets/{index-BrJV8psX.js → index-CVkIdc6y.js} +1 -1
  73. langflow/frontend/assets/{index-lTpteg8t.js → index-C_157Mb-.js} +1 -1
  74. langflow/frontend/assets/{index-Cyd2HtHK.js → index-C_MhBX6R.js} +1 -1
  75. langflow/frontend/assets/{index-DrDrcajG.js → index-C_NwzK6j.js} +1 -1
  76. langflow/frontend/assets/{index-DlD4dXlZ.js → index-Ca1b7Iag.js} +1 -1
  77. langflow/frontend/assets/{index-BS8Vo8nc.js → index-Cb5G9Ifd.js} +1 -1
  78. langflow/frontend/assets/{index-CH5UVA9b.js → index-CeswGUz3.js} +1 -1
  79. langflow/frontend/assets/{index-BCDSei1q.js → index-ChsGhZn3.js} +1 -1
  80. langflow/frontend/assets/{index-DiB3CTo8.js → index-CiklyQU3.js} +1 -1
  81. langflow/frontend/assets/{index-dcJ8-agu.js → index-Co__gFM1.js} +1 -1
  82. langflow/frontend/assets/{index-eo2mAtL-.js → index-Coi86oqP.js} +1 -1
  83. langflow/frontend/assets/{index-CBvrGgID.js → index-Cu2Xr6_j.js} +1 -1
  84. langflow/frontend/assets/{index-2wSXqBtB.js → index-Cu7vC48Y.js} +1 -1
  85. langflow/frontend/assets/{index-Bbi87Ve4.js → index-CvSoff-8.js} +1 -1
  86. langflow/frontend/assets/{index-DA6-bvgN.js → index-Cw0UComa.js} +1 -1
  87. langflow/frontend/assets/{index-CWPzZtSx.js → index-D-SnFlhU.js} +1 -1
  88. langflow/frontend/assets/{index-DHgomBdh.js → index-D-WStJI6.js} +1 -1
  89. langflow/frontend/assets/{index-BpxbUiZD.js → index-D234yKNJ.js} +186 -186
  90. langflow/frontend/assets/{index-BkXec1Yf.js → index-D5c2nNvp.js} +1 -1
  91. langflow/frontend/assets/{index-DwQEZe3C.js → index-DFY8YFbC.js} +1 -1
  92. langflow/frontend/assets/{index-Bief6eyJ.js → index-DJ6HD14g.js} +1 -1
  93. langflow/frontend/assets/{index-Bx7dBY26.js → index-DMCerPJM.js} +1 -1
  94. langflow/frontend/assets/{index-DDWBeudF.js → index-DOj_QWqG.js} +1 -1
  95. langflow/frontend/assets/{index-CmEYYRN1.js → index-DP1oE6QB.js} +1 -1
  96. langflow/frontend/assets/{index-C3ZjKdCD.js → index-DTCrijba.js} +1 -1
  97. langflow/frontend/assets/{index-CtVIONP2.js → index-DVLIDc2_.js} +1 -1
  98. langflow/frontend/assets/{index-DyJFTK24.js → index-DX7JcSMz.js} +1 -1
  99. langflow/frontend/assets/{index-DmeiHnfl.js → index-DZVgPCio.js} +1 -1
  100. langflow/frontend/assets/{index-BwLWcUXL.js → index-DbfS_UH-.js} +1 -1
  101. langflow/frontend/assets/{index-DV3utZDZ.js → index-DcApTyZ7.js} +1 -1
  102. langflow/frontend/assets/{index-DDcMAaG4.js → index-Deu8rlaZ.js} +1 -1
  103. langflow/frontend/assets/{index-iJngutFo.js → index-Df6psZEj.js} +1 -1
  104. langflow/frontend/assets/{index-CRPyCfYy.js → index-DiblXWmk.js} +1 -1
  105. langflow/frontend/assets/{index-CMzfJKiW.js → index-DjQElpEg.js} +1 -1
  106. langflow/frontend/assets/{index-Dmu-X5-4.js → index-DmVt5Jlx.js} +1 -1
  107. langflow/frontend/assets/{index-CPHEscq9.js → index-DmYLDQag.js} +1 -1
  108. langflow/frontend/assets/{index-BKseQQ2I.js → index-DnlVWWU8.js} +1 -1
  109. langflow/frontend/assets/{index-D5ETnvJa.js → index-Dp7ZQyL3.js} +1 -1
  110. langflow/frontend/assets/{index-Co20d-eQ.js → index-DpWrk8mA.js} +1 -1
  111. langflow/frontend/assets/{index-CVl6MbaM.js → index-DrXXKzpD.js} +1 -1
  112. langflow/frontend/assets/{index-OwPvCmpW.js → index-Drg8me2a.js} +1 -1
  113. langflow/frontend/assets/{index-CVwWoX99.js → index-DsEZjOcp.js} +1 -1
  114. langflow/frontend/assets/{index-DwPkMTaY.js → index-DznH7Jbq.js} +1 -1
  115. langflow/frontend/assets/{index-CNw1H-Wc.js → index-GzOGB_fo.js} +1 -1
  116. langflow/frontend/assets/{index-C3l0zYn0.js → index-MVW4HTEk.js} +1 -1
  117. langflow/frontend/assets/{index-DhtZ5hx8.js → index-OsUvqIUr.js} +1 -1
  118. langflow/frontend/assets/{index-B2ptVQGM.js → index-RH_I78z_.js} +1 -1
  119. langflow/frontend/assets/{index-DdtMEn6I.js → index-RjeC0kaX.js} +1 -1
  120. langflow/frontend/assets/{index-hG24k5xJ.js → index-S-sc0Cm9.js} +1 -1
  121. langflow/frontend/assets/{index-Bg5nrMRh.js → index-S8uJXTOq.js} +1 -1
  122. langflow/frontend/assets/{index-m8QA6VNM.js → index-SB4rw8D5.js} +1 -1
  123. langflow/frontend/assets/{index-Du-pc0KE.js → index-YJsAl7vm.js} +1 -1
  124. langflow/frontend/assets/{index-DfDhMHgQ.js → index-ZjeocHyu.js} +1 -1
  125. langflow/frontend/assets/{index-Bnl6QHtP.js → index-_szO7sta.js} +1 -1
  126. langflow/frontend/assets/{index-xvFOmxx4.js → index-aAgSKWb3.js} +1 -1
  127. langflow/frontend/assets/{index-Db9dYSzy.js → index-aWnZIwHd.js} +1 -1
  128. langflow/frontend/assets/{index-BJy50PvP.js → index-bMhyLtgS.js} +1 -1
  129. langflow/frontend/assets/{index-Cqpzl1J4.js → index-cYFKmtmg.js} +1 -1
  130. langflow/frontend/assets/{index-CLJeJYjH.js → index-hg2y9OAt.js} +1 -1
  131. langflow/frontend/assets/{index-D7kquVv2.js → index-jwzN3Jd_.js} +1 -1
  132. langflow/frontend/assets/{index-BiC280Nx.js → index-k9jP5chN.js} +1 -1
  133. langflow/frontend/assets/{index-B3TANVes.js → index-lnF9Eqr2.js} +1 -1
  134. langflow/frontend/assets/{index-B4yCvZKV.js → index-mjwtJmkP.js} +1 -1
  135. langflow/frontend/assets/{index-CfwLpbMM.js → index-nw3WF9lY.js} +1 -1
  136. langflow/frontend/assets/{index-CUVDws8F.js → index-qiVTWUuf.js} +1 -1
  137. langflow/frontend/assets/{index-DTqbvGC0.js → index-uybez8MR.js} +1 -1
  138. langflow/frontend/assets/{index-Dfe7qfvf.js → index-v8eXbWlM.js} +1 -1
  139. langflow/frontend/assets/{index-B2Zgv_xv.js → index-xN8ogFdo.js} +1 -1
  140. langflow/frontend/assets/{index-BRg1f4Mu.js → index-xV6ystWy.js} +1 -1
  141. langflow/frontend/assets/{index-sI75DsdM.js → index-yyAaYjLR.js} +1 -1
  142. langflow/frontend/assets/lazyIconImports-Ci-S9xBA.js +2 -0
  143. langflow/frontend/assets/{use-post-add-user-C0MdTpQ5.js → use-post-add-user-JUeLDErC.js} +1 -1
  144. langflow/frontend/index.html +1 -1
  145. langflow/initial_setup/starter_projects/Hybrid Search RAG.json +1280 -1276
  146. langflow/initial_setup/starter_projects/Instagram Copywriter.json +1 -1
  147. langflow/initial_setup/starter_projects/Invoice Summarizer.json +1 -1
  148. langflow/initial_setup/starter_projects/Knowledge Ingestion.json +46 -47
  149. langflow/initial_setup/starter_projects/Knowledge Retrieval.json +73 -56
  150. langflow/initial_setup/starter_projects/Market Research.json +1 -1
  151. langflow/initial_setup/starter_projects/News Aggregator.json +1 -1
  152. langflow/initial_setup/starter_projects/Nvidia Remix.json +1 -1
  153. langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +1 -1
  154. langflow/initial_setup/starter_projects/Price Deal Finder.json +1 -1
  155. langflow/initial_setup/starter_projects/Research Agent.json +1 -1
  156. langflow/initial_setup/starter_projects/SaaS Pricing.json +1 -1
  157. langflow/initial_setup/starter_projects/Search agent.json +1 -1
  158. langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +3 -3
  159. langflow/initial_setup/starter_projects/Simple Agent.json +1 -1
  160. langflow/initial_setup/starter_projects/Social Media Agent.json +1 -1
  161. langflow/initial_setup/starter_projects/Travel Planning Agents.json +3 -3
  162. langflow/initial_setup/starter_projects/Vector Store RAG.json +1093 -1108
  163. langflow/initial_setup/starter_projects/Youtube Analysis.json +1 -1
  164. langflow/services/auth/utils.py +78 -1
  165. langflow/services/settings/auth.py +4 -0
  166. {langflow_base_nightly-0.5.1.dev0.dist-info → langflow_base_nightly-0.5.1.dev2.dist-info}/METADATA +1 -1
  167. {langflow_base_nightly-0.5.1.dev0.dist-info → langflow_base_nightly-0.5.1.dev2.dist-info}/RECORD +171 -169
  168. langflow/frontend/assets/lazyIconImports-D97HEZkE.js +0 -2
  169. /langflow/base/{data/kb_utils.py → knowledge_bases/knowledge_base_utils.py} +0 -0
  170. /langflow/components/datastax/{astradb.py → astradb_vectorstore.py} +0 -0
  171. {langflow_base_nightly-0.5.1.dev0.dist-info → langflow_base_nightly-0.5.1.dev2.dist-info}/WHEEL +0 -0
  172. {langflow_base_nightly-0.5.1.dev0.dist-info → langflow_base_nightly-0.5.1.dev2.dist-info}/entry_points.txt +0 -0
@@ -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
- flow (Flow, optional): The flow to be executed. Defaults to Depends(get_flow_by_id).
411
- user (User): The flow user.
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=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
@@ -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 global feature flags.
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": "astradb",
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.data.kb_utils import get_knowledge_bases
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, DataFrameInput, DropdownInput, IntInput, Output, SecretStrInput, StrInput, TableInput
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 KBIngestionComponent(Component):
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 = "database"
48
- name = "KBIngestion"
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
- DataFrameInput(
111
+ HandleInput(
107
112
  name="input_df",
108
- display_name="Data",
109
- info="Table with all original columns (already chunked / processed).",
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="DataFrame", name="dataframe", method="build_kb_info")]
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
- # Get source DataFrame
507
- df_source: pd.DataFrame = self.input_df
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
- self.log(f"Error in KB ingestion: {e}")
563
- self.status = f"❌ KB ingestion failed: {e}"
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.data.kb_utils import get_knowledge_bases
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 KBRetrievalComponent(Component):
27
+ class KnowledgeRetrievalComponent(Component):
28
28
  display_name = "Knowledge Retrieval"
29
29
  description = "Search and retrieve data from knowledge."
30
- icon = "database"
31
- name = "KBRetrieval"
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 and embeddings in the output. If false, only content is returned.",
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="chroma_kb_data",
82
+ name="retrieve_data",
75
83
  display_name="Results",
76
- method="get_chroma_kb_data",
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 get_chroma_kb_data(self) -> DataFrame:
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 metadata is enabled, get embeddings for the results
223
+ # If include_embeddings is enabled, get embeddings for the results
216
224
  id_to_embedding = {}
217
- if self.include_metadata and results:
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=["embeddings", "metadatas"])
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
- "content": doc[0].page_content,
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=["equals", "not equals", "contains", "starts with", "ends with", "greater than", "less than"],
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-BpxbUiZD.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-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};