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
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""Encrypt existing MCP auth_settings credentials
|
|
2
|
+
|
|
3
|
+
Revision ID: 0882f9657f22
|
|
4
|
+
Revises: 1cb603706752
|
|
5
|
+
Create Date: 2025-08-21 20:11:26.504681
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
import json
|
|
9
|
+
from typing import Sequence, Union
|
|
10
|
+
|
|
11
|
+
from alembic import op
|
|
12
|
+
import sqlalchemy as sa
|
|
13
|
+
import sqlmodel
|
|
14
|
+
from sqlalchemy.engine.reflection import Inspector
|
|
15
|
+
from langflow.utils import migration
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# revision identifiers, used by Alembic.
|
|
19
|
+
revision: str = '0882f9657f22'
|
|
20
|
+
down_revision: Union[str, None] = '1cb603706752'
|
|
21
|
+
branch_labels: Union[str, Sequence[str], None] = None
|
|
22
|
+
depends_on: Union[str, Sequence[str], None] = None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def upgrade() -> None:
|
|
26
|
+
"""Encrypt sensitive fields in existing auth_settings data."""
|
|
27
|
+
conn = op.get_bind()
|
|
28
|
+
|
|
29
|
+
# Import encryption utilities
|
|
30
|
+
try:
|
|
31
|
+
from langflow.services.auth.mcp_encryption import encrypt_auth_settings
|
|
32
|
+
from langflow.services.deps import get_settings_service
|
|
33
|
+
|
|
34
|
+
# Check if the folder table exists
|
|
35
|
+
inspector = sa.inspect(conn)
|
|
36
|
+
if 'folder' not in inspector.get_table_names():
|
|
37
|
+
return
|
|
38
|
+
|
|
39
|
+
# Query all folders with auth_settings
|
|
40
|
+
result = conn.execute(
|
|
41
|
+
sa.text("SELECT id, auth_settings FROM folder WHERE auth_settings IS NOT NULL")
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Encrypt auth_settings for each folder
|
|
45
|
+
for row in result:
|
|
46
|
+
folder_id = row.id
|
|
47
|
+
auth_settings = row.auth_settings
|
|
48
|
+
|
|
49
|
+
if auth_settings:
|
|
50
|
+
try:
|
|
51
|
+
# Parse JSON if it's a string
|
|
52
|
+
if isinstance(auth_settings, str):
|
|
53
|
+
auth_settings_dict = json.loads(auth_settings)
|
|
54
|
+
else:
|
|
55
|
+
auth_settings_dict = auth_settings
|
|
56
|
+
|
|
57
|
+
# Encrypt sensitive fields
|
|
58
|
+
encrypted_settings = encrypt_auth_settings(auth_settings_dict)
|
|
59
|
+
|
|
60
|
+
# Update the record with encrypted data
|
|
61
|
+
if encrypted_settings:
|
|
62
|
+
conn.execute(
|
|
63
|
+
sa.text("UPDATE folder SET auth_settings = :auth_settings WHERE id = :id"),
|
|
64
|
+
{"auth_settings": json.dumps(encrypted_settings), "id": folder_id}
|
|
65
|
+
)
|
|
66
|
+
except Exception as e:
|
|
67
|
+
# Log the error but continue with other records
|
|
68
|
+
print(f"Warning: Failed to encrypt auth_settings for folder {folder_id}: {e}")
|
|
69
|
+
|
|
70
|
+
except ImportError as e:
|
|
71
|
+
# If encryption utilities are not available, skip the migration
|
|
72
|
+
print(f"Warning: Encryption utilities not available, skipping encryption migration: {e}")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def downgrade() -> None:
|
|
76
|
+
"""Decrypt sensitive fields in auth_settings data (for rollback)."""
|
|
77
|
+
conn = op.get_bind()
|
|
78
|
+
|
|
79
|
+
# Import decryption utilities
|
|
80
|
+
try:
|
|
81
|
+
from langflow.services.auth.mcp_encryption import decrypt_auth_settings
|
|
82
|
+
from langflow.services.deps import get_settings_service
|
|
83
|
+
|
|
84
|
+
# Check if the folder table exists
|
|
85
|
+
inspector = sa.inspect(conn)
|
|
86
|
+
if 'folder' not in inspector.get_table_names():
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
# Query all folders with auth_settings
|
|
90
|
+
result = conn.execute(
|
|
91
|
+
sa.text("SELECT id, auth_settings FROM folder WHERE auth_settings IS NOT NULL")
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# Decrypt auth_settings for each folder
|
|
95
|
+
for row in result:
|
|
96
|
+
folder_id = row.id
|
|
97
|
+
auth_settings = row.auth_settings
|
|
98
|
+
|
|
99
|
+
if auth_settings:
|
|
100
|
+
try:
|
|
101
|
+
# Parse JSON if it's a string
|
|
102
|
+
if isinstance(auth_settings, str):
|
|
103
|
+
auth_settings_dict = json.loads(auth_settings)
|
|
104
|
+
else:
|
|
105
|
+
auth_settings_dict = auth_settings
|
|
106
|
+
|
|
107
|
+
# Decrypt sensitive fields
|
|
108
|
+
decrypted_settings = decrypt_auth_settings(auth_settings_dict)
|
|
109
|
+
|
|
110
|
+
# Update the record with decrypted data
|
|
111
|
+
if decrypted_settings:
|
|
112
|
+
conn.execute(
|
|
113
|
+
sa.text("UPDATE folder SET auth_settings = :auth_settings WHERE id = :id"),
|
|
114
|
+
{"auth_settings": json.dumps(decrypted_settings), "id": folder_id}
|
|
115
|
+
)
|
|
116
|
+
except Exception as e:
|
|
117
|
+
# Log the error but continue with other records
|
|
118
|
+
print(f"Warning: Failed to decrypt auth_settings for folder {folder_id}: {e}")
|
|
119
|
+
|
|
120
|
+
except ImportError as e:
|
|
121
|
+
# If decryption utilities are not available, skip the migration
|
|
122
|
+
print(f"Warning: Decryption utilities not available, skipping decryption migration: {e}")
|
langflow/api/router.py
CHANGED
|
@@ -13,6 +13,7 @@ from langflow.api.v1 import (
|
|
|
13
13
|
mcp_projects_router,
|
|
14
14
|
mcp_router,
|
|
15
15
|
monitor_router,
|
|
16
|
+
openai_responses_router,
|
|
16
17
|
projects_router,
|
|
17
18
|
starter_projects_router,
|
|
18
19
|
store_router,
|
|
@@ -50,6 +51,7 @@ router_v1.include_router(knowledge_bases_router)
|
|
|
50
51
|
router_v1.include_router(mcp_router)
|
|
51
52
|
router_v1.include_router(voice_mode_router)
|
|
52
53
|
router_v1.include_router(mcp_projects_router)
|
|
54
|
+
router_v1.include_router(openai_responses_router)
|
|
53
55
|
|
|
54
56
|
router_v2.include_router(files_router_v2)
|
|
55
57
|
router_v2.include_router(mcp_router_v2)
|
langflow/api/v1/__init__.py
CHANGED
|
@@ -9,6 +9,7 @@ from langflow.api.v1.login import router as login_router
|
|
|
9
9
|
from langflow.api.v1.mcp import router as mcp_router
|
|
10
10
|
from langflow.api.v1.mcp_projects import router as mcp_projects_router
|
|
11
11
|
from langflow.api.v1.monitor import router as monitor_router
|
|
12
|
+
from langflow.api.v1.openai_responses import router as openai_responses_router
|
|
12
13
|
from langflow.api.v1.projects import router as projects_router
|
|
13
14
|
from langflow.api.v1.starter_projects import router as starter_projects_router
|
|
14
15
|
from langflow.api.v1.store import router as store_router
|
|
@@ -29,6 +30,7 @@ __all__ = [
|
|
|
29
30
|
"mcp_projects_router",
|
|
30
31
|
"mcp_router",
|
|
31
32
|
"monitor_router",
|
|
33
|
+
"openai_responses_router",
|
|
32
34
|
"projects_router",
|
|
33
35
|
"starter_projects_router",
|
|
34
36
|
"store_router",
|
langflow/api/v1/endpoints.py
CHANGED
|
@@ -116,6 +116,7 @@ async def simple_run_flow(
|
|
|
116
116
|
stream: bool = False,
|
|
117
117
|
api_key_user: User | None = None,
|
|
118
118
|
event_manager: EventManager | None = None,
|
|
119
|
+
context: dict | None = None,
|
|
119
120
|
):
|
|
120
121
|
validate_input_and_tweaks(input_request)
|
|
121
122
|
try:
|
|
@@ -127,7 +128,9 @@ async def simple_run_flow(
|
|
|
127
128
|
raise ValueError(msg)
|
|
128
129
|
graph_data = flow.data.copy()
|
|
129
130
|
graph_data = process_tweaks(graph_data, input_request.tweaks or {}, stream=stream)
|
|
130
|
-
graph = Graph.from_payload(
|
|
131
|
+
graph = Graph.from_payload(
|
|
132
|
+
graph_data, flow_id=flow_id_str, user_id=str(user_id), flow_name=flow.name, context=context
|
|
133
|
+
)
|
|
131
134
|
inputs = None
|
|
132
135
|
if input_request.input_value is not None:
|
|
133
136
|
inputs = [
|
|
@@ -228,6 +231,7 @@ async def run_flow_generator(
|
|
|
228
231
|
api_key_user: User | None,
|
|
229
232
|
event_manager: EventManager,
|
|
230
233
|
client_consumed_queue: asyncio.Queue,
|
|
234
|
+
context: dict | None = None,
|
|
231
235
|
) -> None:
|
|
232
236
|
"""Executes a flow asynchronously and manages event streaming to the client.
|
|
233
237
|
|
|
@@ -240,6 +244,7 @@ async def run_flow_generator(
|
|
|
240
244
|
api_key_user (User | None): Optional authenticated user running the flow
|
|
241
245
|
event_manager (EventManager): Manages the streaming of events to the client
|
|
242
246
|
client_consumed_queue (asyncio.Queue): Tracks client consumption of events
|
|
247
|
+
context (dict | None): Optional context to pass to the flow
|
|
243
248
|
|
|
244
249
|
Events Generated:
|
|
245
250
|
- "add_message": Sent when new messages are added during flow execution
|
|
@@ -260,6 +265,7 @@ async def run_flow_generator(
|
|
|
260
265
|
stream=True,
|
|
261
266
|
api_key_user=api_key_user,
|
|
262
267
|
event_manager=event_manager,
|
|
268
|
+
context=context,
|
|
263
269
|
)
|
|
264
270
|
event_manager.on_end(data={"result": result.model_dump()})
|
|
265
271
|
await client_consumed_queue.get()
|