langflow-base-nightly 0.5.0.dev38__py3-none-any.whl → 0.5.1.dev0__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/alembic/versions/0882f9657f22_encrypt_existing_mcp_auth_settings_.py +122 -0
- langflow/api/router.py +2 -0
- langflow/api/v1/__init__.py +2 -0
- langflow/api/v1/endpoints.py +7 -1
- langflow/api/v1/mcp_projects.py +373 -52
- langflow/api/v1/openai_responses.py +545 -0
- langflow/api/v1/schemas.py +1 -2
- langflow/components/FAISS/__init__.py +34 -0
- langflow/components/agents/agent.py +246 -52
- langflow/components/cassandra/__init__.py +40 -0
- langflow/components/chroma/__init__.py +34 -0
- langflow/components/clickhouse/__init__.py +34 -0
- langflow/components/couchbase/__init__.py +34 -0
- langflow/components/data/file.py +302 -376
- langflow/components/datastax/__init__.py +3 -3
- langflow/components/docling/docling_inline.py +56 -4
- langflow/components/elastic/__init__.py +37 -0
- langflow/components/milvus/__init__.py +34 -0
- langflow/components/mongodb/__init__.py +34 -0
- langflow/components/nvidia/nvidia_ingest.py +3 -2
- langflow/components/ollama/ollama.py +1 -0
- langflow/components/perplexity/perplexity.py +3 -13
- langflow/components/pgvector/__init__.py +34 -0
- langflow/components/pinecone/__init__.py +34 -0
- langflow/components/qdrant/__init__.py +34 -0
- langflow/components/redis/__init__.py +36 -2
- langflow/components/redis/redis.py +75 -29
- langflow/components/redis/redis_chat.py +43 -0
- langflow/components/supabase/__init__.py +37 -0
- langflow/components/upstash/__init__.py +34 -0
- langflow/components/vectara/__init__.py +37 -0
- langflow/components/vectorstores/__init__.py +0 -69
- langflow/components/vectorstores/local_db.py +1 -0
- langflow/components/weaviate/__init__.py +34 -0
- langflow/components/youtube/channel.py +1 -1
- langflow/custom/custom_component/custom_component.py +11 -0
- langflow/custom/dependency_analyzer.py +165 -0
- langflow/custom/utils.py +34 -16
- langflow/frontend/assets/{SlackIcon-BhW6H3JR.js → SlackIcon-Cr3Q15Px.js} +1 -1
- langflow/frontend/assets/{Wikipedia-Dx5jbiy3.js → Wikipedia-GxM5sPdM.js} +1 -1
- langflow/frontend/assets/{Wolfram-CIyonzwo.js → Wolfram-BN3-VOCA.js} +1 -1
- langflow/frontend/assets/{index-DOEvKC2X.js → index-28oOcafk.js} +1 -1
- langflow/frontend/assets/{index-Bhv79Zso.js → index-2wSXqBtB.js} +1 -1
- langflow/frontend/assets/{index-BRmSeoWR.js → index-3wW7BClE.js} +1 -1
- langflow/frontend/assets/{index-eUkS6iJM.js → index-6pyH3ZJB.js} +1 -1
- langflow/frontend/assets/{index-Cr5v2ave.js → index-AWCSdofD.js} +1 -1
- langflow/frontend/assets/{index-C27Jj_26.js → index-B2Zgv_xv.js} +1 -1
- langflow/frontend/assets/{index-BKKrUElc.js → index-B2ptVQGM.js} +1 -1
- langflow/frontend/assets/{index-BnAFhkSN.js → index-B3TANVes.js} +1 -1
- langflow/frontend/assets/{index-hZUcL0MZ.js → index-B4yCvZKV.js} +1 -1
- langflow/frontend/assets/{index-BPR2mEFC.js → index-BC65VuWx.js} +1 -1
- langflow/frontend/assets/{index-CgU7KF4I.js → index-BCDSei1q.js} +1 -1
- langflow/frontend/assets/{index-CzHzeZuA.js → index-BJy50PvP.js} +1 -1
- langflow/frontend/assets/{index-DkGhPNeA.js → index-BKseQQ2I.js} +1 -1
- langflow/frontend/assets/{index-BVFaF7HW.js → index-BLTxEeTi.js} +1 -1
- langflow/frontend/assets/{index-cEXY6V06.js → index-BRg1f4Mu.js} +1 -1
- langflow/frontend/assets/{index-C2eQmQsn.js → index-BS8Vo8nc.js} +1 -1
- langflow/frontend/assets/{index-gdb7XMS8.js → index-BTKOU4xC.js} +1 -1
- langflow/frontend/assets/{index-U9GWm1eH.js → index-BVwJDmw-.js} +1 -1
- langflow/frontend/assets/{index-BWt5xGeA.js → index-BWYuQ2Sj.js} +1 -1
- langflow/frontend/assets/{index-Dx-Z87KT.js → index-BWdLILDG.js} +1 -1
- langflow/frontend/assets/{index-paQEWYGT.js → index-BZcw4827.js} +1 -1
- langflow/frontend/assets/{index-BDQrd7Tj.js → index-Bbi87Ve4.js} +1 -1
- langflow/frontend/assets/{index-vJOO5U8M.js → index-Bf0IYKLd.js} +1 -1
- langflow/frontend/assets/{index-1Q3VBqKn.js → index-Bg5nrMRh.js} +1 -1
- langflow/frontend/assets/{index-BFQ8KFK0.js → index-BiC280Nx.js} +1 -1
- langflow/frontend/assets/{index-CFNTYfFK.js → index-BiKKN6FR.js} +1 -1
- langflow/frontend/assets/{index-BPfdqCc_.js → index-Bief6eyJ.js} +1 -1
- langflow/frontend/assets/{index-Cxy9sEpy.js → index-BkXec1Yf.js} +1 -1
- langflow/frontend/assets/{index-D4tjMhfY.js → index-Bnl6QHtP.js} +1 -1
- langflow/frontend/assets/{index-BD7Io1hL.js → index-BpxbUiZD.js} +1978 -1978
- langflow/frontend/assets/{index-Ch5r0oW6.js → index-BrJV8psX.js} +1 -1
- langflow/frontend/assets/{index-DOQDkSoK.js → index-BwLWcUXL.js} +1 -1
- langflow/frontend/assets/{index-CMHpjHZl.js → index-Bx7dBY26.js} +1 -1
- langflow/frontend/assets/{index-CbnWRlYY.js → index-C-EdnFdA.js} +1 -1
- langflow/frontend/assets/{index-DljpLeCW.js → index-C-Xfg4cD.js} +1 -1
- langflow/frontend/assets/{index-Bwi4flFg.js → index-C1f2wMat.js} +1 -1
- langflow/frontend/assets/index-C1xroOlH.css +1 -0
- langflow/frontend/assets/{index-D6CSIrp1.js → index-C3KequvP.js} +1 -1
- langflow/frontend/assets/{index-BYjw7Gk3.js → index-C3ZjKdCD.js} +1 -1
- langflow/frontend/assets/{index-DIKUsGLF.js → index-C3l0zYn0.js} +1 -1
- langflow/frontend/assets/{index-CfPBgkqg.js → index-C3yvArUT.js} +1 -1
- langflow/frontend/assets/{index-CsLQiWNf.js → index-C9Cxnkl8.js} +1 -1
- langflow/frontend/assets/{index-mzl9ULw5.js → index-CBc8fEAE.js} +1 -1
- langflow/frontend/assets/{index-CEJNWPhA.js → index-CBvrGgID.js} +1 -1
- langflow/frontend/assets/{index-DwfHWnX7.js → index-CD-PqGCY.js} +1 -1
- langflow/frontend/assets/{index-dyXKnkMi.js → index-CGO1CiUr.js} +1 -1
- langflow/frontend/assets/{index-Dka_Rk4-.js → index-CH5UVA9b.js} +1 -1
- langflow/frontend/assets/{index-uiKla4UR.js → index-CLJeJYjH.js} +1 -1
- langflow/frontend/assets/{index-D9kwEzPB.js → index-CMZ79X-Y.js} +1 -1
- langflow/frontend/assets/{index-BrVhdPZb.js → index-CMzfJKiW.js} +1 -1
- langflow/frontend/assets/{index-Bct1s6__.js → index-CNw1H-Wc.js} +1 -1
- langflow/frontend/assets/{index-B7uEuOPK.js → index-CPHEscq9.js} +1 -1
- langflow/frontend/assets/{index-ekfMOqrF.js → index-CRPKJZw9.js} +1 -1
- langflow/frontend/assets/{index-G4ro0MjT.js → index-CRPyCfYy.js} +1 -1
- langflow/frontend/assets/{index-CSu8KHOi.js → index-CRcMqCIj.js} +1 -1
- langflow/frontend/assets/{index-DsoX2o1S.js → index-CUVDws8F.js} +1 -1
- langflow/frontend/assets/{index-r_8gs4nL.js → index-CVWQfRYZ.js} +1 -1
- langflow/frontend/assets/{index-7hzXChQz.js → index-CVl6MbaM.js} +1 -1
- langflow/frontend/assets/{index-B8UR8v-Q.js → index-CVwWoX99.js} +1 -1
- langflow/frontend/assets/{index-Dda2u_yz.js → index-CWPzZtSx.js} +1 -1
- langflow/frontend/assets/{index-BKeZt2hQ.js → index-CZqRL9DE.js} +1 -1
- langflow/frontend/assets/{index-DHngW1k8.js → index-CdIf07Rw.js} +1 -1
- langflow/frontend/assets/{index-C--IDAyc.js → index-Cewy7JZE.js} +1 -1
- langflow/frontend/assets/{index-DZP_SaHb.js → index-CfwLpbMM.js} +1 -1
- langflow/frontend/assets/{index-CuCM7Wu7.js → index-CiR1dxI4.js} +1 -1
- langflow/frontend/assets/{index-Xi4TplbI.js → index-CiixOzDG.js} +1 -1
- langflow/frontend/assets/{index-BLYw9MK2.js → index-ClsuDmR6.js} +1 -1
- langflow/frontend/assets/{index-DMCWDJOl.js → index-CmEYYRN1.js} +1 -1
- langflow/frontend/assets/{index-CrAF-31Y.js → index-Co20d-eQ.js} +1 -1
- langflow/frontend/assets/{index-DXAfIEvs.js → index-CpzXS6md.js} +1 -1
- langflow/frontend/assets/{index-BmYJJ5YS.js → index-Cqpzl1J4.js} +1 -1
- langflow/frontend/assets/{index-KWY77KfV.js → index-CtVIONP2.js} +1 -1
- langflow/frontend/assets/{index-B3KCdQ91.js → index-CuFXdTx4.js} +1 -1
- langflow/frontend/assets/{index-p2kStSPe.js → index-Cyd2HtHK.js} +1 -1
- langflow/frontend/assets/{index-CkjwSTSM.js → index-D-1tA8Dt.js} +1 -1
- langflow/frontend/assets/{index-BFf0HTFI.js → index-D-KY3kkq.js} +1 -1
- langflow/frontend/assets/{index-BYhcGLTV.js → index-D-_B1a8v.js} +1 -1
- langflow/frontend/assets/{index-Dr6pVDPI.js → index-D14EWPyZ.js} +1 -1
- langflow/frontend/assets/{index-BDuk0d7P.js → index-D2N3l-cw.js} +1 -1
- langflow/frontend/assets/{index-BvGQfVBD.js → index-D5ETnvJa.js} +1 -1
- langflow/frontend/assets/{index-D1oynC8a.js → index-D7kquVv2.js} +1 -1
- langflow/frontend/assets/{index-B1XqWJhG.js → index-DA6-bvgN.js} +1 -1
- langflow/frontend/assets/{index-DzIv3RyR.js → index-DDWBeudF.js} +1 -1
- langflow/frontend/assets/{index-BKlQbl-6.js → index-DDcMAaG4.js} +1 -1
- langflow/frontend/assets/{index-CkK25zZO.js → index-DHgomBdh.js} +1 -1
- langflow/frontend/assets/{index-Bj3lSwvZ.js → index-DJP-ss47.js} +1 -1
- langflow/frontend/assets/{index-DDXsm8tz.js → index-DQ7VYqQc.js} +1 -1
- langflow/frontend/assets/{index-BNQIbda3.js → index-DTqbvGC0.js} +1 -1
- langflow/frontend/assets/{index-BzoRPtTY.js → index-DUpri6zF.js} +1 -1
- langflow/frontend/assets/{index-35sspuLu.js → index-DV3utZDZ.js} +1 -1
- langflow/frontend/assets/{index-BpmqDOeZ.js → index-DXRfN4HV.js} +1 -1
- langflow/frontend/assets/{index-C0E3_MIK.js → index-Db9dYSzy.js} +1 -1
- langflow/frontend/assets/{index-C8K0r39B.js → index-DdtMEn6I.js} +1 -1
- langflow/frontend/assets/{index-BLsVo9iW.js → index-DfDhMHgQ.js} +1 -1
- langflow/frontend/assets/{index-BZFljdMa.js → index-Dfe7qfvf.js} +1 -1
- langflow/frontend/assets/{index-CyP3py8K.js → index-DhtZ5hx8.js} +1 -1
- langflow/frontend/assets/{index-w72fDjpG.js → index-DiB3CTo8.js} +1 -1
- langflow/frontend/assets/{index-CY7_TBTC.js → index-DiGWASY5.js} +1 -1
- langflow/frontend/assets/{index-CmSFKgiD.js → index-Dl5amdBz.js} +1 -1
- langflow/frontend/assets/{index-B0m53xKd.js → index-DlD4dXlZ.js} +1 -1
- langflow/frontend/assets/{index-DnVYJtVO.js → index-DmeiHnfl.js} +1 -1
- langflow/frontend/assets/index-Dmu-X5-4.js +1 -0
- langflow/frontend/assets/{index-CWYiSeWV.js → index-DpVWih90.js} +1 -1
- langflow/frontend/assets/{index-CjsommIr.js → index-DrDrcajG.js} +1 -1
- langflow/frontend/assets/{index-Un9pWxnP.js → index-Du-pc0KE.js} +1 -1
- langflow/frontend/assets/{index-oxHBZk2v.js → index-DwPkMTaY.js} +1 -1
- langflow/frontend/assets/{index-CgwykVGh.js → index-DwQEZe3C.js} +1 -1
- langflow/frontend/assets/{index-BmIx1cws.js → index-DyJFTK24.js} +1 -1
- langflow/frontend/assets/{index-0XQqYgdG.js → index-J38wh62w.js} +1 -1
- langflow/frontend/assets/{index-H7J7w7fa.js → index-Kwdl-e29.js} +1 -1
- langflow/frontend/assets/{index-CUKmGsI6.js → index-OwPvCmpW.js} +1 -1
- langflow/frontend/assets/{index-zV82kQ6k.js → index-Tw3Os-DN.js} +1 -1
- langflow/frontend/assets/{index-8cuhogZP.js → index-X0guhYF8.js} +1 -1
- langflow/frontend/assets/{index-BUse-kxM.js → index-dJWNxIRH.js} +1 -1
- langflow/frontend/assets/{index-DyqITq51.js → index-dcJ8-agu.js} +1 -1
- langflow/frontend/assets/{index-Cg53lrYh.js → index-eo2mAtL-.js} +1 -1
- langflow/frontend/assets/{index-DqbzUcI5.js → index-hG24k5xJ.js} +1 -1
- langflow/frontend/assets/{index-BQrVDjR1.js → index-h_aSZHf3.js} +1 -1
- langflow/frontend/assets/{index-kkA-qHB_.js → index-hbndqB9B.js} +1 -1
- langflow/frontend/assets/{index-DZxUIhWh.js → index-iJngutFo.js} +1 -1
- langflow/frontend/assets/{index-Dg8N3NSO.js → index-lTpteg8t.js} +1 -1
- langflow/frontend/assets/{index-DDhJVVel.js → index-lZX9AvZW.js} +1 -1
- langflow/frontend/assets/{index-BHhnpSkW.js → index-m8QA6VNM.js} +1 -1
- langflow/frontend/assets/{index-Bk4mTwnI.js → index-o0D2S7xW.js} +1 -1
- langflow/frontend/assets/{index-DJESSNJi.js → index-ovFJ_0J6.js} +1 -1
- langflow/frontend/assets/{index-DH6o91_s.js → index-pYJJOcma.js} +1 -1
- langflow/frontend/assets/{index-Bo-ww0Bb.js → index-sI75DsdM.js} +1 -1
- langflow/frontend/assets/{index-BcAgItH4.js → index-xvFOmxx4.js} +1 -1
- langflow/frontend/assets/{index-_cbGmjF4.js → index-z3SRY-mX.js} +1 -1
- langflow/frontend/assets/lazyIconImports-D97HEZkE.js +2 -0
- langflow/frontend/assets/{use-post-add-user-CvtuazTg.js → use-post-add-user-C0MdTpQ5.js} +1 -1
- langflow/frontend/index.html +2 -2
- langflow/graph/graph/base.py +4 -2
- langflow/initial_setup/starter_projects/Basic Prompt Chaining.json +26 -0
- langflow/initial_setup/starter_projects/Basic Prompting.json +26 -0
- langflow/initial_setup/starter_projects/Blog Writer.json +56 -0
- langflow/initial_setup/starter_projects/Custom Component Generator.json +35 -0
- langflow/initial_setup/starter_projects/Document Q&A.json +27 -1
- langflow/initial_setup/starter_projects/Financial Report Parser.json +43 -0
- langflow/initial_setup/starter_projects/Hybrid Search RAG.json +83 -1
- langflow/initial_setup/starter_projects/Image Sentiment Analysis.json +43 -0
- langflow/initial_setup/starter_projects/Instagram Copywriter.json +49 -1
- langflow/initial_setup/starter_projects/Invoice Summarizer.json +40 -1
- langflow/initial_setup/starter_projects/Knowledge Ingestion.json +71 -0
- langflow/initial_setup/starter_projects/Knowledge Retrieval.json +63 -0
- langflow/initial_setup/starter_projects/Market Research.json +57 -1
- langflow/initial_setup/starter_projects/Meeting Summary.json +95 -0
- langflow/initial_setup/starter_projects/Memory Chatbot.json +35 -0
- langflow/initial_setup/starter_projects/News Aggregator.json +61 -1
- langflow/initial_setup/starter_projects/Nvidia Remix.json +67 -2
- langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +48 -1
- langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json +44 -1
- langflow/initial_setup/starter_projects/Price Deal Finder.json +53 -1
- langflow/initial_setup/starter_projects/Research Agent.json +40 -1
- langflow/initial_setup/starter_projects/Research Translation Loop.json +66 -0
- langflow/initial_setup/starter_projects/SEO Keyword Generator.json +17 -0
- langflow/initial_setup/starter_projects/SaaS Pricing.json +27 -1
- langflow/initial_setup/starter_projects/Search agent.json +40 -1
- langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +72 -3
- langflow/initial_setup/starter_projects/Simple Agent.json +57 -1
- langflow/initial_setup/starter_projects/Social Media Agent.json +77 -1
- langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +35 -1
- langflow/initial_setup/starter_projects/Travel Planning Agents.json +51 -3
- langflow/initial_setup/starter_projects/Twitter Thread Generator.json +80 -0
- langflow/initial_setup/starter_projects/Vector Store RAG.json +110 -3
- langflow/initial_setup/starter_projects/Youtube Analysis.json +82 -1
- langflow/initial_setup/starter_projects/vector_store_rag.py +1 -1
- langflow/processing/process.py +3 -0
- langflow/schema/openai_responses_schemas.py +74 -0
- langflow/services/auth/mcp_encryption.py +104 -0
- langflow/services/settings/feature_flags.py +1 -1
- {langflow_base_nightly-0.5.0.dev38.dist-info → langflow_base_nightly-0.5.1.dev0.dist-info}/METADATA +1 -1
- {langflow_base_nightly-0.5.0.dev38.dist-info → langflow_base_nightly-0.5.1.dev0.dist-info}/RECORD +239 -219
- langflow/components/vectorstores/redis.py +0 -89
- langflow/frontend/assets/index-BWgIWfv2.js +0 -1
- langflow/frontend/assets/index-CqS7zir1.css +0 -1
- langflow/frontend/assets/lazyIconImports-DTNgvPE-.js +0 -2
- /langflow/components/{vectorstores → FAISS}/faiss.py +0 -0
- /langflow/components/{vectorstores → cassandra}/cassandra.py +0 -0
- /langflow/components/{datastax/cassandra.py → cassandra/cassandra_chat.py} +0 -0
- /langflow/components/{vectorstores → cassandra}/cassandra_graph.py +0 -0
- /langflow/components/{vectorstores → chroma}/chroma.py +0 -0
- /langflow/components/{vectorstores → clickhouse}/clickhouse.py +0 -0
- /langflow/components/{vectorstores → couchbase}/couchbase.py +0 -0
- /langflow/components/{vectorstores → datastax}/astradb.py +0 -0
- /langflow/components/{vectorstores → datastax}/astradb_graph.py +0 -0
- /langflow/components/{vectorstores → datastax}/graph_rag.py +0 -0
- /langflow/components/{vectorstores → datastax}/hcd.py +0 -0
- /langflow/components/{vectorstores → elastic}/elasticsearch.py +0 -0
- /langflow/components/{vectorstores → elastic}/opensearch.py +0 -0
- /langflow/components/{vectorstores → milvus}/milvus.py +0 -0
- /langflow/components/{vectorstores → mongodb}/mongodb_atlas.py +0 -0
- /langflow/components/{vectorstores → pgvector}/pgvector.py +0 -0
- /langflow/components/{vectorstores → pinecone}/pinecone.py +0 -0
- /langflow/components/{vectorstores → qdrant}/qdrant.py +0 -0
- /langflow/components/{vectorstores → supabase}/supabase.py +0 -0
- /langflow/components/{vectorstores → upstash}/upstash.py +0 -0
- /langflow/components/{vectorstores → vectara}/vectara.py +0 -0
- /langflow/components/{vectorstores → vectara}/vectara_rag.py +0 -0
- /langflow/components/{vectorstores → weaviate}/weaviate.py +0 -0
- {langflow_base_nightly-0.5.0.dev38.dist-info → langflow_base_nightly-0.5.1.dev0.dist-info}/WHEEL +0 -0
- {langflow_base_nightly-0.5.0.dev38.dist-info → langflow_base_nightly-0.5.1.dev0.dist-info}/entry_points.txt +0 -0
|
@@ -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
|
|
11
12
|
from .astradb_cql import AstraDBCQLToolComponent
|
|
12
13
|
from .astradb_tool import AstraDBToolComponent
|
|
13
|
-
from .cassandra import CassandraChatMemory
|
|
14
14
|
from .create_assistant import AssistantsCreateAssistant
|
|
15
15
|
from .create_thread import AssistantsCreateThread
|
|
16
16
|
from .dotenv import Dotenv
|
|
@@ -29,8 +29,8 @@ _dynamic_imports = {
|
|
|
29
29
|
"AstraDBCQLToolComponent": "astradb_cql",
|
|
30
30
|
"AstraDBChatMemory": "astra_db",
|
|
31
31
|
"AstraDBToolComponent": "astradb_tool",
|
|
32
|
+
"AstraDBVectorStoreComponent": "astradb",
|
|
32
33
|
"AstraVectorizeComponent": "astra_vectorize",
|
|
33
|
-
"CassandraChatMemory": "cassandra",
|
|
34
34
|
"Dotenv": "dotenv",
|
|
35
35
|
"GetEnvVar": "getenvvar",
|
|
36
36
|
}
|
|
@@ -45,8 +45,8 @@ __all__ = [
|
|
|
45
45
|
"AstraDBCQLToolComponent",
|
|
46
46
|
"AstraDBChatMemory",
|
|
47
47
|
"AstraDBToolComponent",
|
|
48
|
+
"AstraDBVectorStoreComponent",
|
|
48
49
|
"AstraVectorizeComponent",
|
|
49
|
-
"CassandraChatMemory",
|
|
50
50
|
"Dotenv",
|
|
51
51
|
"GetEnvVar",
|
|
52
52
|
]
|
|
@@ -61,11 +61,11 @@ class DoclingInlineComponent(BaseFileComponent):
|
|
|
61
61
|
),
|
|
62
62
|
DropdownInput(
|
|
63
63
|
name="ocr_engine",
|
|
64
|
-
display_name="
|
|
65
|
-
info="OCR engine to use",
|
|
66
|
-
options=["", "easyocr", "tesserocr", "rapidocr", "ocrmac"],
|
|
64
|
+
display_name="OCR Engine",
|
|
65
|
+
info="OCR engine to use. None will disable OCR.",
|
|
66
|
+
options=["None", "easyocr", "tesserocr", "rapidocr", "ocrmac"],
|
|
67
67
|
real_time_refresh=False,
|
|
68
|
-
value="",
|
|
68
|
+
value="None",
|
|
69
69
|
),
|
|
70
70
|
# TODO: expose more Docling options
|
|
71
71
|
]
|
|
@@ -130,6 +130,58 @@ class DoclingInlineComponent(BaseFileComponent):
|
|
|
130
130
|
self.log("Warning: Process still alive after SIGKILL")
|
|
131
131
|
|
|
132
132
|
def process_files(self, file_list: list[BaseFileComponent.BaseFile]) -> list[BaseFileComponent.BaseFile]:
|
|
133
|
+
try:
|
|
134
|
+
from docling.datamodel.base_models import InputFormat
|
|
135
|
+
from docling.datamodel.pipeline_options import (
|
|
136
|
+
OcrOptions,
|
|
137
|
+
PdfPipelineOptions,
|
|
138
|
+
VlmPipelineOptions,
|
|
139
|
+
)
|
|
140
|
+
from docling.document_converter import DocumentConverter, FormatOption, PdfFormatOption
|
|
141
|
+
from docling.models.factories import get_ocr_factory
|
|
142
|
+
from docling.pipeline.vlm_pipeline import VlmPipeline
|
|
143
|
+
except ImportError as e:
|
|
144
|
+
msg = (
|
|
145
|
+
"Docling is an optional dependency. Install with `uv pip install 'langflow[docling]'` or refer to the "
|
|
146
|
+
"documentation on how to install optional dependencies."
|
|
147
|
+
)
|
|
148
|
+
raise ImportError(msg) from e
|
|
149
|
+
|
|
150
|
+
# Configure the standard PDF pipeline
|
|
151
|
+
def _get_standard_opts() -> PdfPipelineOptions:
|
|
152
|
+
pipeline_options = PdfPipelineOptions()
|
|
153
|
+
pipeline_options.do_ocr = self.ocr_engine != "None"
|
|
154
|
+
if pipeline_options.do_ocr:
|
|
155
|
+
ocr_factory = get_ocr_factory(
|
|
156
|
+
allow_external_plugins=False,
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
ocr_options: OcrOptions = ocr_factory.create_options(
|
|
160
|
+
kind=self.ocr_engine,
|
|
161
|
+
)
|
|
162
|
+
pipeline_options.ocr_options = ocr_options
|
|
163
|
+
return pipeline_options
|
|
164
|
+
|
|
165
|
+
# Configure the VLM pipeline
|
|
166
|
+
def _get_vlm_opts() -> VlmPipelineOptions:
|
|
167
|
+
return VlmPipelineOptions()
|
|
168
|
+
|
|
169
|
+
# Configure the main format options and create the DocumentConverter()
|
|
170
|
+
def _get_converter() -> DocumentConverter:
|
|
171
|
+
if self.pipeline == "standard":
|
|
172
|
+
pdf_format_option = PdfFormatOption(
|
|
173
|
+
pipeline_options=_get_standard_opts(),
|
|
174
|
+
)
|
|
175
|
+
elif self.pipeline == "vlm":
|
|
176
|
+
pdf_format_option = PdfFormatOption(pipeline_cls=VlmPipeline, pipeline_options=_get_vlm_opts())
|
|
177
|
+
|
|
178
|
+
format_options: dict[InputFormat, FormatOption] = {
|
|
179
|
+
InputFormat.PDF: pdf_format_option,
|
|
180
|
+
InputFormat.IMAGE: pdf_format_option,
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return DocumentConverter(format_options=format_options)
|
|
184
|
+
|
|
133
185
|
file_paths = [file.path for file in file_list if file.path]
|
|
134
186
|
|
|
135
187
|
if not file_paths:
|
|
@@ -0,0 +1,37 @@
|
|
|
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 .elasticsearch import ElasticsearchVectorStoreComponent
|
|
9
|
+
from .opensearch import OpenSearchVectorStoreComponent
|
|
10
|
+
|
|
11
|
+
_dynamic_imports = {
|
|
12
|
+
"ElasticsearchVectorStoreComponent": "elasticsearch",
|
|
13
|
+
"OpenSearchVectorStoreComponent": "opensearch",
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"ElasticsearchVectorStoreComponent",
|
|
18
|
+
"OpenSearchVectorStoreComponent",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def __getattr__(attr_name: str) -> Any:
|
|
23
|
+
"""Lazily import Elastic components on attribute access."""
|
|
24
|
+
if attr_name not in _dynamic_imports:
|
|
25
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
26
|
+
raise AttributeError(msg)
|
|
27
|
+
try:
|
|
28
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
29
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
30
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
31
|
+
raise AttributeError(msg) from e
|
|
32
|
+
globals()[attr_name] = result
|
|
33
|
+
return result
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def __dir__() -> list[str]:
|
|
37
|
+
return list(__all__)
|
|
@@ -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 .milvus import MilvusVectorStoreComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"MilvusVectorStoreComponent": "milvus",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"MilvusVectorStoreComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import Milvus 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__)
|
|
@@ -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 .mongodb_atlas import MongoVectorStoreComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"MongoVectorStoreComponent": "mongodb_atlas",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"MongoVectorStoreComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import MongoDB 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__)
|
|
@@ -21,8 +21,9 @@ class NvidiaIngestComponent(BaseFileComponent):
|
|
|
21
21
|
VALID_EXTENSIONS = ["pdf", "docx", "pptx", "jpeg", "png", "svg", "tiff", "txt"]
|
|
22
22
|
except ImportError:
|
|
23
23
|
msg = (
|
|
24
|
-
"NVIDIA Retriever Extraction (nv-ingest)
|
|
25
|
-
"
|
|
24
|
+
"NVIDIA Retriever Extraction (nv-ingest) is an optional dependency. "
|
|
25
|
+
"Install with `uv pip install 'langflow[nv-ingest]'` "
|
|
26
|
+
"(requires Python 3.12>=)"
|
|
26
27
|
)
|
|
27
28
|
VALID_EXTENSIONS = [msg]
|
|
28
29
|
|
|
@@ -31,9 +31,7 @@ class PerplexityComponent(LCModelComponent):
|
|
|
31
31
|
],
|
|
32
32
|
value="llama-3.1-sonar-small-128k-online",
|
|
33
33
|
),
|
|
34
|
-
IntInput(
|
|
35
|
-
name="max_output_tokens", display_name="Max Output Tokens", info="The maximum number of tokens to generate."
|
|
36
|
-
),
|
|
34
|
+
IntInput(name="max_tokens", display_name="Max Output Tokens", info="The maximum number of tokens to generate."),
|
|
37
35
|
SecretStrInput(
|
|
38
36
|
name="api_key",
|
|
39
37
|
display_name="Perplexity API Key",
|
|
@@ -57,20 +55,13 @@ class PerplexityComponent(LCModelComponent):
|
|
|
57
55
|
"Note that the API may not return the full n completions if duplicates are generated.",
|
|
58
56
|
advanced=True,
|
|
59
57
|
),
|
|
60
|
-
IntInput(
|
|
61
|
-
name="top_k",
|
|
62
|
-
display_name="Top K",
|
|
63
|
-
info="Decode using top-k sampling: consider the set of top_k most probable tokens. Must be positive.",
|
|
64
|
-
advanced=True,
|
|
65
|
-
),
|
|
66
58
|
]
|
|
67
59
|
|
|
68
60
|
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
|
69
61
|
api_key = SecretStr(self.api_key).get_secret_value()
|
|
70
62
|
temperature = self.temperature
|
|
71
63
|
model = self.model_name
|
|
72
|
-
|
|
73
|
-
top_k = self.top_k
|
|
64
|
+
max_tokens = self.max_tokens
|
|
74
65
|
top_p = self.top_p
|
|
75
66
|
n = self.n
|
|
76
67
|
|
|
@@ -78,8 +69,7 @@ class PerplexityComponent(LCModelComponent):
|
|
|
78
69
|
model=model,
|
|
79
70
|
temperature=temperature or 0.75,
|
|
80
71
|
pplx_api_key=api_key,
|
|
81
|
-
top_k=top_k or None,
|
|
82
72
|
top_p=top_p or None,
|
|
83
73
|
n=n or 1,
|
|
84
|
-
|
|
74
|
+
max_tokens=max_tokens,
|
|
85
75
|
)
|
|
@@ -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 .pgvector import PGVectorStoreComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"PGVectorStoreComponent": "pgvector",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"PGVectorStoreComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import pgvector 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__)
|
|
@@ -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 .pinecone import PineconeVectorStoreComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"PineconeVectorStoreComponent": "pinecone",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"PineconeVectorStoreComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import Pinecone 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__)
|
|
@@ -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 .qdrant import QdrantVectorStoreComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"QdrantVectorStoreComponent": "qdrant",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"QdrantVectorStoreComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import Qdrant 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__)
|
|
@@ -1,3 +1,37 @@
|
|
|
1
|
-
from
|
|
1
|
+
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from langflow.components._importing import import_mod
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from .redis import RedisVectorStoreComponent
|
|
9
|
+
from .redis_chat import RedisIndexChatMemory
|
|
10
|
+
|
|
11
|
+
_dynamic_imports = {
|
|
12
|
+
"RedisVectorStoreComponent": "redis",
|
|
13
|
+
"RedisIndexChatMemory": "redis_chat",
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"RedisIndexChatMemory",
|
|
18
|
+
"RedisVectorStoreComponent",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def __getattr__(attr_name: str) -> Any:
|
|
23
|
+
"""Lazily import Redis components on attribute access."""
|
|
24
|
+
if attr_name not in _dynamic_imports:
|
|
25
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
26
|
+
raise AttributeError(msg)
|
|
27
|
+
try:
|
|
28
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
29
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
30
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
31
|
+
raise AttributeError(msg) from e
|
|
32
|
+
globals()[attr_name] = result
|
|
33
|
+
return result
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def __dir__() -> list[str]:
|
|
37
|
+
return list(__all__)
|
|
@@ -1,43 +1,89 @@
|
|
|
1
|
-
from
|
|
1
|
+
from pathlib import Path
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from langchain.text_splitter import CharacterTextSplitter
|
|
4
|
+
from langchain_community.vectorstores.redis import Redis
|
|
4
5
|
|
|
5
|
-
from langflow.base.
|
|
6
|
-
from langflow.
|
|
7
|
-
from langflow.
|
|
6
|
+
from langflow.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
|
7
|
+
from langflow.helpers.data import docs_to_data
|
|
8
|
+
from langflow.io import HandleInput, IntInput, SecretStrInput, StrInput
|
|
9
|
+
from langflow.schema.data import Data
|
|
8
10
|
|
|
9
11
|
|
|
10
|
-
class
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
class RedisVectorStoreComponent(LCVectorStoreComponent):
|
|
13
|
+
"""A custom component for implementing a Vector Store using Redis."""
|
|
14
|
+
|
|
15
|
+
display_name: str = "Redis"
|
|
16
|
+
description: str = "Implementation of Vector Store using Redis"
|
|
17
|
+
name = "Redis"
|
|
14
18
|
icon = "Redis"
|
|
15
19
|
|
|
16
20
|
inputs = [
|
|
21
|
+
SecretStrInput(name="redis_server_url", display_name="Redis Server Connection String", required=True),
|
|
17
22
|
StrInput(
|
|
18
|
-
name="
|
|
19
|
-
|
|
20
|
-
IntInput(name="port", display_name="port", required=True, value=6379, info="Redis Port Number."),
|
|
21
|
-
StrInput(name="database", display_name="database", required=True, value="0", info="Redis database."),
|
|
22
|
-
MessageTextInput(
|
|
23
|
-
name="username", display_name="Username", value="", info="The Redis user name.", advanced=True
|
|
23
|
+
name="redis_index_name",
|
|
24
|
+
display_name="Redis Index",
|
|
24
25
|
),
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
StrInput(name="code", display_name="Code", advanced=True),
|
|
27
|
+
StrInput(
|
|
28
|
+
name="schema",
|
|
29
|
+
display_name="Schema",
|
|
27
30
|
),
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
name="
|
|
31
|
+
*LCVectorStoreComponent.inputs,
|
|
32
|
+
IntInput(
|
|
33
|
+
name="number_of_results",
|
|
34
|
+
display_name="Number of Results",
|
|
35
|
+
info="Number of results to return.",
|
|
36
|
+
value=4,
|
|
37
|
+
advanced=True,
|
|
31
38
|
),
|
|
39
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
|
32
40
|
]
|
|
33
41
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
42
|
+
@check_cached_vector_store
|
|
43
|
+
def build_vector_store(self) -> Redis:
|
|
44
|
+
# Convert DataFrame to Data if needed using parent's method
|
|
45
|
+
self.ingest_data = self._prepare_ingest_data()
|
|
46
|
+
|
|
47
|
+
documents = []
|
|
48
|
+
for _input in self.ingest_data or []:
|
|
49
|
+
if isinstance(_input, Data):
|
|
50
|
+
documents.append(_input.to_lc_document())
|
|
51
|
+
else:
|
|
52
|
+
documents.append(_input)
|
|
53
|
+
Path("docuemnts.txt").write_text(str(documents), encoding="utf-8")
|
|
54
|
+
|
|
55
|
+
if not documents:
|
|
56
|
+
if self.schema is None:
|
|
57
|
+
msg = "If no documents are provided, a schema must be provided."
|
|
58
|
+
raise ValueError(msg)
|
|
59
|
+
redis_vs = Redis.from_existing_index(
|
|
60
|
+
embedding=self.embedding,
|
|
61
|
+
index_name=self.redis_index_name,
|
|
62
|
+
schema=self.schema,
|
|
63
|
+
key_prefix=None,
|
|
64
|
+
redis_url=self.redis_server_url,
|
|
65
|
+
)
|
|
66
|
+
else:
|
|
67
|
+
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
|
|
68
|
+
docs = text_splitter.split_documents(documents)
|
|
69
|
+
redis_vs = Redis.from_documents(
|
|
70
|
+
documents=docs,
|
|
71
|
+
embedding=self.embedding,
|
|
72
|
+
redis_url=self.redis_server_url,
|
|
73
|
+
index_name=self.redis_index_name,
|
|
74
|
+
)
|
|
75
|
+
return redis_vs
|
|
76
|
+
|
|
77
|
+
def search_documents(self) -> list[Data]:
|
|
78
|
+
vector_store = self.build_vector_store()
|
|
79
|
+
|
|
80
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
|
81
|
+
docs = vector_store.similarity_search(
|
|
82
|
+
query=self.search_query,
|
|
83
|
+
k=self.number_of_results,
|
|
84
|
+
)
|
|
41
85
|
|
|
42
|
-
|
|
43
|
-
|
|
86
|
+
data = docs_to_data(docs)
|
|
87
|
+
self.status = data
|
|
88
|
+
return data
|
|
89
|
+
return []
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from urllib import parse
|
|
2
|
+
|
|
3
|
+
from langchain_community.chat_message_histories.redis import RedisChatMessageHistory
|
|
4
|
+
|
|
5
|
+
from langflow.base.memory.model import LCChatMemoryComponent
|
|
6
|
+
from langflow.field_typing.constants import Memory
|
|
7
|
+
from langflow.inputs.inputs import IntInput, MessageTextInput, SecretStrInput, StrInput
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RedisIndexChatMemory(LCChatMemoryComponent):
|
|
11
|
+
display_name = "Redis Chat Memory"
|
|
12
|
+
description = "Retrieves and store chat messages from Redis."
|
|
13
|
+
name = "RedisChatMemory"
|
|
14
|
+
icon = "Redis"
|
|
15
|
+
|
|
16
|
+
inputs = [
|
|
17
|
+
StrInput(
|
|
18
|
+
name="host", display_name="hostname", required=True, value="localhost", info="IP address or hostname."
|
|
19
|
+
),
|
|
20
|
+
IntInput(name="port", display_name="port", required=True, value=6379, info="Redis Port Number."),
|
|
21
|
+
StrInput(name="database", display_name="database", required=True, value="0", info="Redis database."),
|
|
22
|
+
MessageTextInput(
|
|
23
|
+
name="username", display_name="Username", value="", info="The Redis user name.", advanced=True
|
|
24
|
+
),
|
|
25
|
+
SecretStrInput(
|
|
26
|
+
name="password", display_name="Password", value="", info="The password for username.", advanced=True
|
|
27
|
+
),
|
|
28
|
+
StrInput(name="key_prefix", display_name="Key prefix", info="Key prefix.", advanced=True),
|
|
29
|
+
MessageTextInput(
|
|
30
|
+
name="session_id", display_name="Session ID", info="Session ID for the message.", advanced=True
|
|
31
|
+
),
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
def build_message_history(self) -> Memory:
|
|
35
|
+
kwargs = {}
|
|
36
|
+
password: str | None = self.password
|
|
37
|
+
if self.key_prefix:
|
|
38
|
+
kwargs["key_prefix"] = self.key_prefix
|
|
39
|
+
if password:
|
|
40
|
+
password = parse.quote_plus(password)
|
|
41
|
+
|
|
42
|
+
url = f"redis://{self.username}:{self.password}@{self.host}:{self.port}/{self.database}"
|
|
43
|
+
return RedisChatMessageHistory(session_id=self.session_id, url=url, **kwargs)
|
|
@@ -0,0 +1,37 @@
|
|
|
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 .supabase import SupabaseVectorStoreComponent
|
|
9
|
+
from .supabase_composio import SupabaseComposioComponent
|
|
10
|
+
|
|
11
|
+
_dynamic_imports = {
|
|
12
|
+
"SupabaseVectorStoreComponent": "supabase",
|
|
13
|
+
"SupabaseComposioComponent": "supabase_composio",
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"SupabaseComposioComponent",
|
|
18
|
+
"SupabaseVectorStoreComponent",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def __getattr__(attr_name: str) -> Any:
|
|
23
|
+
"""Lazily import Supabase components on attribute access."""
|
|
24
|
+
if attr_name not in _dynamic_imports:
|
|
25
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
26
|
+
raise AttributeError(msg)
|
|
27
|
+
try:
|
|
28
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
29
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
30
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
31
|
+
raise AttributeError(msg) from e
|
|
32
|
+
globals()[attr_name] = result
|
|
33
|
+
return result
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def __dir__() -> list[str]:
|
|
37
|
+
return list(__all__)
|
|
@@ -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 .upstash import UpstashVectorStoreComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"UpstashVectorStoreComponent": "upstash",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"UpstashVectorStoreComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import Upstash 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__)
|