langflow-base-nightly 0.5.0.dev37__py3-none-any.whl → 0.5.0.dev39__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/__main__.py +1 -1
- langflow/alembic/versions/0882f9657f22_encrypt_existing_mcp_auth_settings_.py +122 -0
- langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py +24 -30
- langflow/alembic/versions/58b28437a398_modify_nullable.py +6 -6
- langflow/alembic/versions/79e675cb6752_change_datetime_type.py +24 -30
- langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py +12 -13
- langflow/api/build.py +21 -26
- langflow/api/health_check_router.py +3 -3
- langflow/api/utils.py +3 -3
- langflow/api/v1/callback.py +2 -2
- langflow/api/v1/chat.py +19 -31
- langflow/api/v1/endpoints.py +10 -10
- langflow/api/v1/flows.py +1 -1
- langflow/api/v1/knowledge_bases.py +3 -3
- langflow/api/v1/mcp.py +12 -12
- langflow/api/v1/mcp_projects.py +405 -120
- langflow/api/v1/mcp_utils.py +8 -8
- langflow/api/v1/schemas.py +2 -7
- langflow/api/v1/store.py +1 -1
- langflow/api/v1/validate.py +2 -2
- langflow/api/v1/voice_mode.py +58 -62
- langflow/api/v2/files.py +2 -2
- langflow/api/v2/mcp.py +10 -9
- langflow/base/composio/composio_base.py +21 -2
- langflow/base/data/docling_utils.py +194 -0
- langflow/base/embeddings/aiml_embeddings.py +1 -1
- langflow/base/flow_processing/utils.py +1 -2
- langflow/base/io/__init__.py +0 -1
- langflow/base/langwatch/utils.py +2 -1
- langflow/base/mcp/util.py +49 -47
- langflow/base/prompts/api_utils.py +1 -1
- langflow/base/tools/flow_tool.py +2 -2
- langflow/base/tools/run_flow.py +2 -6
- langflow/components/FAISS/__init__.py +34 -0
- langflow/components/Notion/add_content_to_page.py +2 -2
- langflow/components/Notion/list_database_properties.py +2 -2
- langflow/components/Notion/list_pages.py +2 -2
- langflow/components/Notion/page_content_viewer.py +2 -2
- langflow/components/Notion/update_page_property.py +1 -1
- langflow/components/agentql/agentql_api.py +2 -10
- langflow/components/agents/agent.py +249 -55
- langflow/components/agents/mcp_component.py +14 -14
- langflow/components/anthropic/anthropic.py +5 -4
- langflow/components/assemblyai/assemblyai_get_subtitles.py +2 -2
- langflow/components/assemblyai/assemblyai_lemur.py +2 -2
- langflow/components/assemblyai/assemblyai_list_transcripts.py +2 -2
- langflow/components/assemblyai/assemblyai_poll_transcript.py +2 -2
- langflow/components/assemblyai/assemblyai_start_transcript.py +2 -2
- 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 +575 -55
- langflow/components/data/url.py +1 -1
- langflow/components/datastax/__init__.py +3 -3
- langflow/components/datastax/astra_assistant_manager.py +3 -3
- langflow/components/datastax/create_assistant.py +1 -2
- langflow/components/deactivated/merge_data.py +1 -2
- langflow/components/deactivated/sub_flow.py +6 -7
- langflow/components/deactivated/vectara_self_query.py +3 -3
- langflow/components/docling/__init__.py +0 -198
- langflow/components/docling/docling_inline.py +1 -1
- langflow/components/elastic/__init__.py +37 -0
- langflow/components/embeddings/text_embedder.py +3 -3
- langflow/components/firecrawl/firecrawl_extract_api.py +2 -9
- langflow/components/google/gmail.py +1 -1
- langflow/components/google/google_generative_ai.py +5 -11
- langflow/components/groq/groq.py +4 -3
- langflow/components/helpers/current_date.py +2 -3
- langflow/components/helpers/memory.py +1 -1
- langflow/components/ibm/watsonx.py +1 -1
- langflow/components/ibm/watsonx_embeddings.py +1 -1
- langflow/components/langwatch/langwatch.py +3 -3
- langflow/components/logic/flow_tool.py +2 -2
- langflow/components/logic/notify.py +1 -1
- langflow/components/logic/run_flow.py +2 -3
- langflow/components/logic/sub_flow.py +4 -5
- langflow/components/mem0/mem0_chat_memory.py +2 -8
- langflow/components/milvus/__init__.py +34 -0
- langflow/components/mongodb/__init__.py +34 -0
- langflow/components/nvidia/nvidia.py +3 -3
- langflow/components/olivya/olivya.py +7 -7
- langflow/components/ollama/ollama.py +9 -6
- langflow/components/perplexity/perplexity.py +3 -13
- langflow/components/pgvector/__init__.py +34 -0
- langflow/components/pinecone/__init__.py +34 -0
- langflow/components/processing/batch_run.py +8 -8
- langflow/components/processing/data_operations.py +2 -2
- langflow/components/processing/merge_data.py +1 -2
- langflow/components/processing/message_to_data.py +2 -3
- langflow/components/processing/parse_json_data.py +1 -1
- langflow/components/prototypes/python_function.py +2 -3
- 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/serpapi/serp.py +1 -1
- langflow/components/supabase/__init__.py +37 -0
- langflow/components/tavily/tavily_extract.py +1 -1
- langflow/components/tavily/tavily_search.py +1 -1
- langflow/components/tools/calculator.py +2 -2
- langflow/components/tools/python_code_structured_tool.py +3 -10
- langflow/components/tools/python_repl.py +2 -2
- langflow/components/tools/searxng.py +3 -3
- langflow/components/tools/serp_api.py +2 -2
- langflow/components/tools/tavily_search_tool.py +2 -2
- langflow/components/tools/yahoo_finance.py +1 -1
- langflow/components/twelvelabs/video_embeddings.py +4 -4
- 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 +2 -1
- langflow/components/weaviate/__init__.py +34 -0
- langflow/components/yahoosearch/yahoo.py +1 -1
- langflow/components/youtube/trending.py +3 -4
- langflow/custom/attributes.py +2 -1
- langflow/custom/code_parser/code_parser.py +1 -1
- langflow/custom/custom_component/base_component.py +1 -1
- langflow/custom/custom_component/component.py +16 -2
- langflow/custom/dependency_analyzer.py +165 -0
- langflow/custom/directory_reader/directory_reader.py +7 -7
- langflow/custom/directory_reader/utils.py +1 -2
- langflow/custom/utils.py +63 -45
- langflow/events/event_manager.py +1 -1
- langflow/frontend/assets/{SlackIcon-CnvyOamQ.js → SlackIcon-Cr3Q15Px.js} +1 -1
- langflow/frontend/assets/{Wikipedia-nyTEXdr2.js → Wikipedia-GxM5sPdM.js} +1 -1
- langflow/frontend/assets/{Wolfram-BYMQkNSq.js → Wolfram-BN3-VOCA.js} +1 -1
- langflow/frontend/assets/{index-DZTC5pdT.js → index-28oOcafk.js} +1 -1
- langflow/frontend/assets/{index-ChXJpBz4.js → index-2wSXqBtB.js} +1 -1
- langflow/frontend/assets/{index-BB15_iOb.js → index-3wW7BClE.js} +1 -1
- langflow/frontend/assets/{index-DKHNourL.js → index-6pyH3ZJB.js} +1 -1
- langflow/frontend/assets/{index-BvwZfF2i.js → index-AWCSdofD.js} +1 -1
- langflow/frontend/assets/{index-Bvxg4_ux.js → index-B2Zgv_xv.js} +1 -1
- langflow/frontend/assets/{index-Bd6WtbKA.js → index-B2ptVQGM.js} +1 -1
- langflow/frontend/assets/{index-C7QWbnLK.js → index-B3TANVes.js} +1 -1
- langflow/frontend/assets/{index-CpvYQ0ug.js → index-B4yCvZKV.js} +1 -1
- langflow/frontend/assets/{index-Dg-63Si_.js → index-BC65VuWx.js} +1 -1
- langflow/frontend/assets/{index-C6jri9Wm.js → index-BCDSei1q.js} +1 -1
- langflow/frontend/assets/{index-OazXJdEl.js → index-BJy50PvP.js} +1 -1
- langflow/frontend/assets/{index-CWdkbVsd.js → index-BKseQQ2I.js} +1 -1
- langflow/frontend/assets/{index-CaQ_H9ww.js → index-BLTxEeTi.js} +1 -1
- langflow/frontend/assets/{index-DGRMNe9n.js → index-BRg1f4Mu.js} +1 -1
- langflow/frontend/assets/{index-D8lOi1GI.js → index-BS8Vo8nc.js} +1 -1
- langflow/frontend/assets/{index-B748uLP1.js → index-BTKOU4xC.js} +1 -1
- langflow/frontend/assets/{index-Dqd4RjYA.js → index-BVwJDmw-.js} +1 -1
- langflow/frontend/assets/{index-DbMFlnHE.js → index-BWYuQ2Sj.js} +1 -1
- langflow/frontend/assets/{index-BEMw2Np8.js → index-BWdLILDG.js} +1 -1
- langflow/frontend/assets/{index-BmX5CoED.js → index-BZcw4827.js} +1 -1
- langflow/frontend/assets/{index-CyPvTB63.js → index-Bbi87Ve4.js} +1 -1
- langflow/frontend/assets/{index-BTEW9e8P.js → index-Bf0IYKLd.js} +1 -1
- langflow/frontend/assets/{index-BZgXW854.js → index-Bg5nrMRh.js} +1 -1
- langflow/frontend/assets/{index-BBxAPk1y.js → index-BiC280Nx.js} +1 -1
- langflow/frontend/assets/{index-BR0bkVqX.js → index-BiKKN6FR.js} +1 -1
- langflow/frontend/assets/{index-CTrt1Q_j.js → index-Bief6eyJ.js} +1 -1
- langflow/frontend/assets/{index-D5_DsUJc.js → index-BkXec1Yf.js} +1 -1
- langflow/frontend/assets/{index-CZQ9rXNa.js → index-Bnl6QHtP.js} +1 -1
- langflow/frontend/assets/{index-BChjg6Az.js → index-BpxbUiZD.js} +1979 -1979
- langflow/frontend/assets/{index-BOeo01QB.js → index-BrJV8psX.js} +1 -1
- langflow/frontend/assets/{index-DysKpOuj.js → index-BwLWcUXL.js} +1 -1
- langflow/frontend/assets/{index-Bnqod3vk.js → index-Bx7dBY26.js} +1 -1
- langflow/frontend/assets/{index-D3DDfngy.js → index-C-EdnFdA.js} +1 -1
- langflow/frontend/assets/{index-Bsa0xZyL.js → index-C-Xfg4cD.js} +1 -1
- langflow/frontend/assets/{index-BTrsh9LS.js → index-C1f2wMat.js} +1 -1
- langflow/frontend/assets/index-C1xroOlH.css +1 -0
- langflow/frontend/assets/{index-B1YN7oMV.js → index-C3KequvP.js} +1 -1
- langflow/frontend/assets/{index-DzW2mfkK.js → index-C3ZjKdCD.js} +1 -1
- langflow/frontend/assets/{index-ajRge-Mg.js → index-C3l0zYn0.js} +1 -1
- langflow/frontend/assets/{index-cvZdgWHQ.js → index-C3yvArUT.js} +1 -1
- langflow/frontend/assets/{index-C-2hghRJ.js → index-C9Cxnkl8.js} +1 -1
- langflow/frontend/assets/{index-BhIOhlCH.js → index-CBc8fEAE.js} +1 -1
- langflow/frontend/assets/{index-B3Sur4Z3.js → index-CBvrGgID.js} +1 -1
- langflow/frontend/assets/{index-CCePCqkT.js → index-CD-PqGCY.js} +1 -1
- langflow/frontend/assets/{index-8yMsjVV2.js → index-CGO1CiUr.js} +1 -1
- langflow/frontend/assets/{index-DF5VwgU6.js → index-CH5UVA9b.js} +1 -1
- langflow/frontend/assets/{index-dcnYpT9N.js → index-CLJeJYjH.js} +1 -1
- langflow/frontend/assets/{index-DfxYyS3M.js → index-CMZ79X-Y.js} +1 -1
- langflow/frontend/assets/{index-ya2uXE8v.js → index-CMzfJKiW.js} +1 -1
- langflow/frontend/assets/{index-DkelbYy7.js → index-CNw1H-Wc.js} +1 -1
- langflow/frontend/assets/{index-DytJENYD.js → index-CPHEscq9.js} +1 -1
- langflow/frontend/assets/{index-Bv8h2Z-q.js → index-CRPKJZw9.js} +1 -1
- langflow/frontend/assets/{index-D-9TI74R.js → index-CRPyCfYy.js} +1 -1
- langflow/frontend/assets/{index-BLGYN-9b.js → index-CRcMqCIj.js} +1 -1
- langflow/frontend/assets/{index-tVYiABdp.js → index-CUVDws8F.js} +1 -1
- langflow/frontend/assets/{index-CpcbQZIF.js → index-CVWQfRYZ.js} +1 -1
- langflow/frontend/assets/{index-DPCzHdsC.js → index-CVl6MbaM.js} +1 -1
- langflow/frontend/assets/{index-DkXy1WFo.js → index-CVwWoX99.js} +1 -1
- langflow/frontend/assets/{index-DK1Ptcc4.js → index-CWPzZtSx.js} +1 -1
- langflow/frontend/assets/{index-DHq8TQPB.js → index-CZqRL9DE.js} +1 -1
- langflow/frontend/assets/{index-DnEGCgih.js → index-CdIf07Rw.js} +1 -1
- langflow/frontend/assets/{index-BIQQCMvz.js → index-Cewy7JZE.js} +1 -1
- langflow/frontend/assets/{index-D8GJngXa.js → index-CfwLpbMM.js} +1 -1
- langflow/frontend/assets/{index-C_TdzfAn.js → index-CiR1dxI4.js} +1 -1
- langflow/frontend/assets/{index-BzL_EoKd.js → index-CiixOzDG.js} +1 -1
- langflow/frontend/assets/{index-Boso-xEw.js → index-ClsuDmR6.js} +1 -1
- langflow/frontend/assets/{index-8WdfSTTz.js → index-CmEYYRN1.js} +1 -1
- langflow/frontend/assets/{index-FUxmznS-.js → index-Co20d-eQ.js} +1 -1
- langflow/frontend/assets/{index-C82JjCPD.js → index-CpzXS6md.js} +1 -1
- langflow/frontend/assets/{index-DIDDfmlJ.js → index-Cqpzl1J4.js} +1 -1
- langflow/frontend/assets/{index-_UcqeEjm.js → index-CtVIONP2.js} +1 -1
- langflow/frontend/assets/{index-Gkrq-vzm.js → index-CuFXdTx4.js} +1 -1
- langflow/frontend/assets/{index-WPFivmdQ.js → index-Cyd2HtHK.js} +1 -1
- langflow/frontend/assets/{index-BFp_O-c9.js → index-D-1tA8Dt.js} +1 -1
- langflow/frontend/assets/{index-BqPpO6KG.js → index-D-KY3kkq.js} +1 -1
- langflow/frontend/assets/{index-Db71w3lq.js → index-D-_B1a8v.js} +1 -1
- langflow/frontend/assets/{index-BIzTEqFh.js → index-D14EWPyZ.js} +1 -1
- langflow/frontend/assets/{index-BbJjt5m4.js → index-D2N3l-cw.js} +1 -1
- langflow/frontend/assets/{index-DCRk27Tp.js → index-D5ETnvJa.js} +1 -1
- langflow/frontend/assets/{index-CvcEzq4x.js → index-D7kquVv2.js} +1 -1
- langflow/frontend/assets/{index-Q9vDw0Xl.js → index-DA6-bvgN.js} +1 -1
- langflow/frontend/assets/{index-l7bzB8Ex.js → index-DDWBeudF.js} +1 -1
- langflow/frontend/assets/{index-BCCGvqay.js → index-DDcMAaG4.js} +1 -1
- langflow/frontend/assets/{index-pCQ_yw8m.js → index-DHgomBdh.js} +1 -1
- langflow/frontend/assets/{index-BxEuHa76.js → index-DJP-ss47.js} +1 -1
- langflow/frontend/assets/{index-BbRm7beF.js → index-DQ7VYqQc.js} +1 -1
- langflow/frontend/assets/{index-Car-zdor.js → index-DTqbvGC0.js} +1 -1
- langflow/frontend/assets/{index-BRxvproo.js → index-DUpri6zF.js} +1 -1
- langflow/frontend/assets/{index-BQ6NUdMY.js → index-DV3utZDZ.js} +1 -1
- langflow/frontend/assets/{index-DjQETUy8.js → index-DXRfN4HV.js} +1 -1
- langflow/frontend/assets/{index-DfngcQxO.js → index-Db9dYSzy.js} +1 -1
- langflow/frontend/assets/{index-rXV1G1aB.js → index-DdtMEn6I.js} +1 -1
- langflow/frontend/assets/{index-DmMDPoi0.js → index-DfDhMHgQ.js} +1 -1
- langflow/frontend/assets/{index-DJB12jIC.js → index-Dfe7qfvf.js} +1 -1
- langflow/frontend/assets/{index-C_veJlEb.js → index-DhtZ5hx8.js} +1 -1
- langflow/frontend/assets/{index-CQMoqLAu.js → index-DiB3CTo8.js} +1 -1
- langflow/frontend/assets/{index-DVlceYFD.js → index-DiGWASY5.js} +1 -1
- langflow/frontend/assets/{index-Du_18NCU.js → index-Dl5amdBz.js} +1 -1
- langflow/frontend/assets/{index-CYDAYm-i.js → index-DlD4dXlZ.js} +1 -1
- langflow/frontend/assets/{index-CLPdN-q6.js → index-DmeiHnfl.js} +1 -1
- langflow/frontend/assets/index-Dmu-X5-4.js +1 -0
- langflow/frontend/assets/{index-BzEUlaw_.js → index-DpVWih90.js} +1 -1
- langflow/frontend/assets/{index-D6PSjHxP.js → index-DrDrcajG.js} +1 -1
- langflow/frontend/assets/{index-Dq5ilsem.js → index-Du-pc0KE.js} +1 -1
- langflow/frontend/assets/{index-CYe8Ipef.js → index-DwPkMTaY.js} +1 -1
- langflow/frontend/assets/{index-BVEZDXxS.js → index-DwQEZe3C.js} +1 -1
- langflow/frontend/assets/{index-BvT7L317.js → index-DyJFTK24.js} +1 -1
- langflow/frontend/assets/{index-HK3bVMYA.js → index-J38wh62w.js} +1 -1
- langflow/frontend/assets/{index-CCxGSSTT.js → index-Kwdl-e29.js} +1 -1
- langflow/frontend/assets/{index-BOB_zsjl.js → index-OwPvCmpW.js} +1 -1
- langflow/frontend/assets/{index-Dsps-jKu.js → index-Tw3Os-DN.js} +1 -1
- langflow/frontend/assets/{index-CFDvOtKC.js → index-X0guhYF8.js} +1 -1
- langflow/frontend/assets/{index-BX5D-USa.js → index-dJWNxIRH.js} +1 -1
- langflow/frontend/assets/{index-BRYjyhAd.js → index-dcJ8-agu.js} +1 -1
- langflow/frontend/assets/{index-Ui4xUImO.js → index-eo2mAtL-.js} +1 -1
- langflow/frontend/assets/{index-CxvP91st.js → index-hG24k5xJ.js} +1 -1
- langflow/frontend/assets/{index-CVQmT7ZL.js → index-h_aSZHf3.js} +1 -1
- langflow/frontend/assets/{index-BIXaW2aY.js → index-hbndqB9B.js} +1 -1
- langflow/frontend/assets/{index-DIkNW9Cd.js → index-iJngutFo.js} +1 -1
- langflow/frontend/assets/{index-BWmPX4iQ.js → index-lTpteg8t.js} +1 -1
- langflow/frontend/assets/{index-xuIrH2Dq.js → index-lZX9AvZW.js} +1 -1
- langflow/frontend/assets/{index-yCHsaqs8.js → index-m8QA6VNM.js} +1 -1
- langflow/frontend/assets/{index-BkPYpfgw.js → index-o0D2S7xW.js} +1 -1
- langflow/frontend/assets/{index-DpClkXIV.js → index-ovFJ_0J6.js} +1 -1
- langflow/frontend/assets/{index-CmplyEaa.js → index-pYJJOcma.js} +1 -1
- langflow/frontend/assets/{index-CJo_cyWW.js → index-sI75DsdM.js} +1 -1
- langflow/frontend/assets/{index-nVwHLjuV.js → index-xvFOmxx4.js} +1 -1
- langflow/frontend/assets/{index-LbYjHKkn.js → index-z3SRY-mX.js} +1 -1
- langflow/frontend/assets/lazyIconImports-D97HEZkE.js +2 -0
- langflow/frontend/assets/{use-post-add-user-BrBYH9eR.js → use-post-add-user-C0MdTpQ5.js} +1 -1
- langflow/frontend/index.html +2 -2
- langflow/graph/edge/base.py +2 -3
- langflow/graph/graph/base.py +15 -13
- langflow/graph/graph/constants.py +3 -0
- langflow/graph/utils.py +6 -6
- langflow/graph/vertex/base.py +4 -5
- langflow/graph/vertex/param_handler.py +1 -1
- langflow/graph/vertex/vertex_types.py +2 -2
- langflow/helpers/flow.py +1 -1
- langflow/initial_setup/setup.py +32 -30
- 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 +58 -2
- langflow/initial_setup/starter_projects/Custom Component Generator.json +37 -2
- 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 +51 -3
- langflow/initial_setup/starter_projects/Invoice Summarizer.json +40 -1
- langflow/initial_setup/starter_projects/Knowledge Ingestion.json +73 -2
- langflow/initial_setup/starter_projects/Knowledge Retrieval.json +63 -0
- langflow/initial_setup/starter_projects/Market Research.json +59 -3
- langflow/initial_setup/starter_projects/Meeting Summary.json +101 -6
- langflow/initial_setup/starter_projects/Memory Chatbot.json +37 -2
- langflow/initial_setup/starter_projects/News Aggregator.json +63 -3
- langflow/initial_setup/starter_projects/Nvidia Remix.json +69 -4
- 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 +57 -5
- langflow/initial_setup/starter_projects/Research Agent.json +42 -3
- 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 +76 -7
- langflow/initial_setup/starter_projects/Simple Agent.json +59 -3
- 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 +84 -3
- langflow/initial_setup/starter_projects/vector_store_rag.py +1 -1
- langflow/interface/components.py +23 -22
- langflow/interface/initialize/loading.py +5 -5
- langflow/interface/run.py +1 -1
- langflow/interface/utils.py +1 -1
- langflow/io/__init__.py +0 -1
- langflow/langflow_launcher.py +1 -1
- langflow/load/load.py +2 -7
- langflow/logging/__init__.py +0 -1
- langflow/logging/logger.py +191 -115
- langflow/logging/setup.py +1 -1
- langflow/main.py +37 -52
- langflow/memory.py +7 -7
- langflow/middleware.py +1 -1
- langflow/processing/process.py +6 -3
- langflow/schema/artifact.py +2 -2
- langflow/schema/data.py +10 -2
- langflow/schema/dataframe.py +1 -1
- langflow/schema/message.py +1 -1
- langflow/serialization/serialization.py +1 -1
- langflow/services/auth/mcp_encryption.py +104 -0
- langflow/services/auth/utils.py +2 -2
- langflow/services/cache/disk.py +1 -1
- langflow/services/cache/service.py +3 -3
- langflow/services/database/models/flow/model.py +2 -7
- langflow/services/database/models/transactions/crud.py +2 -2
- langflow/services/database/models/user/crud.py +2 -2
- langflow/services/database/service.py +8 -8
- langflow/services/database/utils.py +6 -5
- langflow/services/deps.py +2 -3
- langflow/services/factory.py +1 -1
- langflow/services/flow/flow_runner.py +7 -12
- langflow/services/job_queue/service.py +16 -15
- langflow/services/manager.py +3 -4
- langflow/services/settings/auth.py +1 -1
- langflow/services/settings/base.py +3 -8
- langflow/services/settings/feature_flags.py +1 -1
- langflow/services/settings/manager.py +1 -1
- langflow/services/settings/utils.py +1 -1
- langflow/services/socket/__init__.py +0 -1
- langflow/services/socket/service.py +3 -3
- langflow/services/socket/utils.py +4 -4
- langflow/services/state/service.py +1 -2
- langflow/services/storage/factory.py +1 -1
- langflow/services/storage/local.py +9 -8
- langflow/services/storage/s3.py +11 -10
- langflow/services/store/service.py +3 -3
- langflow/services/store/utils.py +3 -2
- langflow/services/task/temp_flow_cleanup.py +7 -7
- langflow/services/telemetry/service.py +10 -10
- langflow/services/tracing/arize_phoenix.py +2 -2
- langflow/services/tracing/langfuse.py +1 -1
- langflow/services/tracing/langsmith.py +1 -1
- langflow/services/tracing/langwatch.py +1 -1
- langflow/services/tracing/opik.py +1 -1
- langflow/services/tracing/service.py +25 -6
- langflow/services/tracing/traceloop.py +245 -0
- langflow/services/utils.py +7 -7
- langflow/services/variable/kubernetes.py +3 -3
- langflow/services/variable/kubernetes_secrets.py +2 -1
- langflow/services/variable/service.py +5 -5
- langflow/utils/component_utils.py +9 -6
- langflow/utils/util.py +5 -5
- langflow/utils/validate.py +3 -3
- langflow/utils/voice_utils.py +2 -2
- {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev39.dist-info}/METADATA +2 -1
- {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev39.dist-info}/RECORD +393 -374
- langflow/components/vectorstores/redis.py +0 -89
- langflow/frontend/assets/index-C26RqKWL.js +0 -1
- langflow/frontend/assets/index-CqS7zir1.css +0 -1
- langflow/frontend/assets/lazyIconImports-t6wEndt1.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.dev37.dist-info → langflow_base_nightly-0.5.0.dev39.dist-info}/WHEEL +0 -0
- {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev39.dist-info}/entry_points.txt +0 -0
langflow/api/v1/mcp_utils.py
CHANGED
|
@@ -12,7 +12,6 @@ from typing import Any, ParamSpec, TypeVar
|
|
|
12
12
|
from urllib.parse import quote, unquote, urlparse
|
|
13
13
|
from uuid import uuid4
|
|
14
14
|
|
|
15
|
-
from loguru import logger
|
|
16
15
|
from mcp import types
|
|
17
16
|
from sqlmodel import select
|
|
18
17
|
|
|
@@ -21,6 +20,7 @@ from langflow.api.v1.schemas import SimplifiedAPIRequest
|
|
|
21
20
|
from langflow.base.mcp.constants import MAX_MCP_TOOL_NAME_LENGTH
|
|
22
21
|
from langflow.base.mcp.util import get_flow_snake_case, get_unique_name, sanitize_mcp_name
|
|
23
22
|
from langflow.helpers.flow import json_schema_from_flow
|
|
23
|
+
from langflow.logging.logger import logger
|
|
24
24
|
from langflow.schema.message import Message
|
|
25
25
|
from langflow.services.database.models import Flow
|
|
26
26
|
from langflow.services.database.models.user.model import User
|
|
@@ -43,7 +43,7 @@ def handle_mcp_errors(func: Callable[P, Awaitable[T]]) -> Callable[P, Awaitable[
|
|
|
43
43
|
return await func(*args, **kwargs)
|
|
44
44
|
except Exception as e:
|
|
45
45
|
msg = f"Error in {func.__name__}: {e!s}"
|
|
46
|
-
logger.
|
|
46
|
+
await logger.aexception(msg)
|
|
47
47
|
raise
|
|
48
48
|
|
|
49
49
|
return wrapper
|
|
@@ -108,11 +108,11 @@ async def handle_list_resources(project_id=None):
|
|
|
108
108
|
resources.append(resource)
|
|
109
109
|
except FileNotFoundError as e:
|
|
110
110
|
msg = f"Error listing files for flow {flow.id}: {e}"
|
|
111
|
-
logger.
|
|
111
|
+
await logger.adebug(msg)
|
|
112
112
|
continue
|
|
113
113
|
except Exception as e:
|
|
114
114
|
msg = f"Error in listing resources: {e!s}"
|
|
115
|
-
logger.
|
|
115
|
+
await logger.aexception(msg)
|
|
116
116
|
raise
|
|
117
117
|
return resources
|
|
118
118
|
|
|
@@ -150,7 +150,7 @@ async def handle_read_resource(uri: str) -> bytes:
|
|
|
150
150
|
return base64.b64encode(content)
|
|
151
151
|
except Exception as e:
|
|
152
152
|
msg = f"Error reading resource {uri}: {e!s}"
|
|
153
|
-
logger.
|
|
153
|
+
await logger.aexception(msg)
|
|
154
154
|
raise
|
|
155
155
|
|
|
156
156
|
|
|
@@ -271,7 +271,7 @@ async def handle_call_tool(
|
|
|
271
271
|
return await with_db_session(execute_tool)
|
|
272
272
|
except Exception as e:
|
|
273
273
|
msg = f"Error executing tool {name}: {e!s}"
|
|
274
|
-
logger.
|
|
274
|
+
await logger.aexception(msg)
|
|
275
275
|
raise
|
|
276
276
|
|
|
277
277
|
|
|
@@ -339,10 +339,10 @@ async def handle_list_tools(project_id=None, *, mcp_enabled_only=False):
|
|
|
339
339
|
existing_names.add(name)
|
|
340
340
|
except Exception as e: # noqa: BLE001
|
|
341
341
|
msg = f"Error in listing tools: {e!s} from flow: {base_name}"
|
|
342
|
-
logger.
|
|
342
|
+
await logger.awarning(msg)
|
|
343
343
|
continue
|
|
344
344
|
except Exception as e:
|
|
345
345
|
msg = f"Error in listing tools: {e!s}"
|
|
346
|
-
logger.
|
|
346
|
+
await logger.aexception(msg)
|
|
347
347
|
raise
|
|
348
348
|
return tools
|
langflow/api/v1/schemas.py
CHANGED
|
@@ -444,18 +444,13 @@ class CancelFlowResponse(BaseModel):
|
|
|
444
444
|
class AuthSettings(BaseModel):
|
|
445
445
|
"""Model representing authentication settings for MCP."""
|
|
446
446
|
|
|
447
|
-
auth_type: Literal["none", "apikey", "
|
|
448
|
-
api_key: SecretStr | None = None
|
|
449
|
-
username: str | None = None
|
|
450
|
-
password: SecretStr | None = None
|
|
451
|
-
bearer_token: SecretStr | None = None
|
|
452
|
-
iam_endpoint: str | None = None
|
|
447
|
+
auth_type: Literal["none", "apikey", "oauth"] = "none"
|
|
453
448
|
oauth_host: str | None = None
|
|
454
449
|
oauth_port: str | None = None
|
|
455
450
|
oauth_server_url: str | None = None
|
|
456
451
|
oauth_callback_path: str | None = None
|
|
457
452
|
oauth_client_id: str | None = None
|
|
458
|
-
oauth_client_secret:
|
|
453
|
+
oauth_client_secret: SecretStr | None = None
|
|
459
454
|
oauth_auth_url: str | None = None
|
|
460
455
|
oauth_token_url: str | None = None
|
|
461
456
|
oauth_mcp_scope: str | None = None
|
langflow/api/v1/store.py
CHANGED
|
@@ -2,9 +2,9 @@ from typing import Annotated
|
|
|
2
2
|
from uuid import UUID
|
|
3
3
|
|
|
4
4
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
5
|
-
from loguru import logger
|
|
6
5
|
|
|
7
6
|
from langflow.api.utils import CurrentActiveUser, check_langflow_version
|
|
7
|
+
from langflow.logging.logger import logger
|
|
8
8
|
from langflow.services.auth import utils as auth_utils
|
|
9
9
|
from langflow.services.deps import get_settings_service, get_store_service
|
|
10
10
|
from langflow.services.store.exceptions import CustomError
|
langflow/api/v1/validate.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from fastapi import APIRouter, HTTPException
|
|
2
|
-
from loguru import logger
|
|
3
2
|
|
|
4
3
|
from langflow.api.utils import CurrentActiveUser
|
|
5
4
|
from langflow.api.v1.base import Code, CodeValidationResponse, PromptValidationResponse, ValidatePromptRequest
|
|
6
5
|
from langflow.base.prompts.api_utils import process_prompt_template
|
|
6
|
+
from langflow.logging.logger import logger
|
|
7
7
|
from langflow.utils.validate import validate_code
|
|
8
8
|
|
|
9
9
|
# build router
|
|
@@ -19,7 +19,7 @@ async def post_validate_code(code: Code, _current_user: CurrentActiveUser) -> Co
|
|
|
19
19
|
function=errors.get("function", {}),
|
|
20
20
|
)
|
|
21
21
|
except Exception as e:
|
|
22
|
-
logger.
|
|
22
|
+
logger.debug("Error validating code", exc_info=True)
|
|
23
23
|
raise HTTPException(status_code=500, detail=str(e)) from e
|
|
24
24
|
|
|
25
25
|
|
langflow/api/v1/voice_mode.py
CHANGED
|
@@ -33,11 +33,7 @@ from langflow.services.database.models.flow.model import Flow
|
|
|
33
33
|
from langflow.services.database.models.message.model import MessageTable
|
|
34
34
|
from langflow.services.database.models.user.model import User
|
|
35
35
|
from langflow.services.deps import get_variable_service, session_scope
|
|
36
|
-
from langflow.utils.voice_utils import
|
|
37
|
-
BYTES_PER_24K_FRAME,
|
|
38
|
-
VAD_SAMPLE_RATE_16K,
|
|
39
|
-
resample_24k_to_16k,
|
|
40
|
-
)
|
|
36
|
+
from langflow.utils.voice_utils import BYTES_PER_24K_FRAME, VAD_SAMPLE_RATE_16K, resample_24k_to_16k
|
|
41
37
|
|
|
42
38
|
router = APIRouter(prefix="/voice", tags=["Voice"])
|
|
43
39
|
|
|
@@ -121,8 +117,8 @@ async def authenticate_and_get_openai_key(session: DbSession, user: User, websoc
|
|
|
121
117
|
)
|
|
122
118
|
return None, None
|
|
123
119
|
except Exception as e: # noqa: BLE001
|
|
124
|
-
logger.
|
|
125
|
-
logger.
|
|
120
|
+
await logger.aerror(f"Error with API key: {e}")
|
|
121
|
+
await logger.aerror(traceback.format_exc())
|
|
126
122
|
return None, None
|
|
127
123
|
return user, openai_key
|
|
128
124
|
|
|
@@ -185,13 +181,13 @@ class ElevenLabsClientManager:
|
|
|
185
181
|
session=session,
|
|
186
182
|
)
|
|
187
183
|
except (InvalidToken, ValueError) as e:
|
|
188
|
-
logger.
|
|
184
|
+
await logger.aerror(f"Error with ElevenLabs API key: {e}")
|
|
189
185
|
cls._api_key = os.getenv("ELEVENLABS_API_KEY", "")
|
|
190
186
|
if not cls._api_key:
|
|
191
|
-
logger.
|
|
187
|
+
await logger.aerror("ElevenLabs API key not found")
|
|
192
188
|
return None
|
|
193
189
|
except (KeyError, AttributeError, sqlalchemy.exc.SQLAlchemyError) as e:
|
|
194
|
-
logger.
|
|
190
|
+
await logger.aerror(f"Exception getting ElevenLabs API key: {e}")
|
|
195
191
|
return None
|
|
196
192
|
|
|
197
193
|
if cls._api_key:
|
|
@@ -310,25 +306,25 @@ async def process_message_queue(queue_key, session):
|
|
|
310
306
|
|
|
311
307
|
try:
|
|
312
308
|
await aadd_messagetables([message], session)
|
|
313
|
-
logger.
|
|
309
|
+
await logger.adebug(f"Added message to DB: {message.text[:30]}...")
|
|
314
310
|
except ValueError as e:
|
|
315
|
-
logger.
|
|
316
|
-
logger.
|
|
311
|
+
await logger.aerror(f"Error saving message to database (ValueError): {e}")
|
|
312
|
+
await logger.aerror(traceback.format_exc())
|
|
317
313
|
except sqlalchemy.exc.SQLAlchemyError as e:
|
|
318
|
-
logger.
|
|
319
|
-
logger.
|
|
314
|
+
await logger.aerror(f"Error saving message to database (SQLAlchemyError): {e}")
|
|
315
|
+
await logger.aerror(traceback.format_exc())
|
|
320
316
|
except (KeyError, AttributeError, TypeError) as e:
|
|
321
317
|
# More specific exceptions instead of blind Exception
|
|
322
|
-
logger.
|
|
323
|
-
logger.
|
|
318
|
+
await logger.aerror(f"Error saving message to database: {e}")
|
|
319
|
+
await logger.aerror(traceback.format_exc())
|
|
324
320
|
finally:
|
|
325
321
|
message_queues[queue_key].task_done()
|
|
326
322
|
|
|
327
323
|
if message_queues[queue_key].empty():
|
|
328
324
|
break
|
|
329
325
|
except Exception as e: # noqa: BLE001
|
|
330
|
-
logger.
|
|
331
|
-
logger.
|
|
326
|
+
await logger.adebug(f"Message queue processor for {queue_key} was cancelled: {e}")
|
|
327
|
+
await logger.aerror(traceback.format_exc())
|
|
332
328
|
|
|
333
329
|
|
|
334
330
|
class SendQueues:
|
|
@@ -369,7 +365,7 @@ class SendQueues:
|
|
|
369
365
|
logger.trace("OPENAI BLOCKING")
|
|
370
366
|
# log_event(msg, DIRECTION_TO_OPENAI)
|
|
371
367
|
except Exception: # noqa: BLE001
|
|
372
|
-
logger.
|
|
368
|
+
await logger.aerror(traceback.format_exc())
|
|
373
369
|
|
|
374
370
|
def client_send(self, payload):
|
|
375
371
|
try:
|
|
@@ -387,7 +383,7 @@ class SendQueues:
|
|
|
387
383
|
self.log_event(msg, LF_TO_CLIENT)
|
|
388
384
|
await self.client_ws.send_text(json.dumps(msg))
|
|
389
385
|
except Exception: # noqa: BLE001
|
|
390
|
-
logger.
|
|
386
|
+
await logger.aerror(traceback.format_exc())
|
|
391
387
|
|
|
392
388
|
async def close(self):
|
|
393
389
|
self.openai_send_q.put_nowait(None)
|
|
@@ -462,7 +458,7 @@ async def handle_function_call(
|
|
|
462
458
|
create_response()
|
|
463
459
|
except json.JSONDecodeError as e:
|
|
464
460
|
trace = traceback.format_exc()
|
|
465
|
-
logger.
|
|
461
|
+
await logger.aerror(f"JSON decode error: {e!s}\ntrace: {trace}")
|
|
466
462
|
function_output = {
|
|
467
463
|
"type": "conversation.item.create",
|
|
468
464
|
"item": {
|
|
@@ -474,7 +470,7 @@ async def handle_function_call(
|
|
|
474
470
|
msg_handler.openai_send(function_output)
|
|
475
471
|
except ValueError as e:
|
|
476
472
|
trace = traceback.format_exc()
|
|
477
|
-
logger.
|
|
473
|
+
await logger.aerror(f"Value error: {e!s}\ntrace: {trace}")
|
|
478
474
|
function_output = {
|
|
479
475
|
"type": "conversation.item.create",
|
|
480
476
|
"item": {
|
|
@@ -486,7 +482,7 @@ async def handle_function_call(
|
|
|
486
482
|
msg_handler.openai_send(function_output)
|
|
487
483
|
except (ConnectionError, websockets.exceptions.WebSocketException) as e:
|
|
488
484
|
trace = traceback.format_exc()
|
|
489
|
-
logger.
|
|
485
|
+
await logger.aerror(f"Connection error: {e!s}\ntrace: {trace}")
|
|
490
486
|
function_output = {
|
|
491
487
|
"type": "conversation.item.create",
|
|
492
488
|
"item": {
|
|
@@ -497,8 +493,8 @@ async def handle_function_call(
|
|
|
497
493
|
}
|
|
498
494
|
msg_handler.openai_send(function_output)
|
|
499
495
|
except (KeyError, AttributeError, TypeError) as e:
|
|
500
|
-
logger.
|
|
501
|
-
logger.
|
|
496
|
+
await logger.aerror(f"Error executing flow: {e}")
|
|
497
|
+
await logger.aerror(traceback.format_exc())
|
|
502
498
|
function_output = {
|
|
503
499
|
"type": "conversation.item.create",
|
|
504
500
|
"item": {
|
|
@@ -751,7 +747,7 @@ async def flow_as_tool_websocket(
|
|
|
751
747
|
except Exception as e: # noqa: BLE001
|
|
752
748
|
err_msg = {"error": f"Failed to load flow: {e!s}"}
|
|
753
749
|
await client_websocket.send_json(err_msg)
|
|
754
|
-
logger.
|
|
750
|
+
await logger.aerror(f"Failed to load flow: {e}")
|
|
755
751
|
return
|
|
756
752
|
|
|
757
753
|
url = "wss://api.openai.com/v1/realtime?model=gpt-4o-mini-realtime-preview"
|
|
@@ -800,7 +796,7 @@ async def flow_as_tool_websocket(
|
|
|
800
796
|
msg_handler.openai_send({"type": "response.cancel"})
|
|
801
797
|
bot_speaking_flag[0] = False
|
|
802
798
|
except Exception as e: # noqa: BLE001
|
|
803
|
-
logger.
|
|
799
|
+
await logger.aerror(f"[ERROR] VAD processing failed (ValueError): {e}")
|
|
804
800
|
continue
|
|
805
801
|
if has_speech:
|
|
806
802
|
last_speech_time = datetime.now(tz=timezone.utc)
|
|
@@ -856,7 +852,7 @@ async def flow_as_tool_websocket(
|
|
|
856
852
|
return new_session
|
|
857
853
|
|
|
858
854
|
class Response:
|
|
859
|
-
def __init__(self, response_id: str, use_elevenlabs: bool | None = None):
|
|
855
|
+
def __init__(self, response_id: str, *, use_elevenlabs: bool | None = None):
|
|
860
856
|
if use_elevenlabs is None:
|
|
861
857
|
use_elevenlabs = False
|
|
862
858
|
self.response_id = response_id
|
|
@@ -925,7 +921,7 @@ async def flow_as_tool_websocket(
|
|
|
925
921
|
# client_send_event_from_thread(event, main_loop)
|
|
926
922
|
msg_handler.client_send(event)
|
|
927
923
|
except Exception: # noqa: BLE001
|
|
928
|
-
logger.
|
|
924
|
+
await logger.aerror(traceback.format_exc())
|
|
929
925
|
|
|
930
926
|
async def forward_to_openai() -> None:
|
|
931
927
|
nonlocal openai_realtime_session
|
|
@@ -954,10 +950,10 @@ async def flow_as_tool_websocket(
|
|
|
954
950
|
msg_handler.openai_send(msg)
|
|
955
951
|
num_audio_samples = 0
|
|
956
952
|
elif msg.get("type") == "langflow.voice_mode.config":
|
|
957
|
-
logger.
|
|
953
|
+
await logger.ainfo(f"langflow.voice_mode.config {msg}")
|
|
958
954
|
voice_config.progress_enabled = msg.get("progress_enabled", True)
|
|
959
955
|
elif msg.get("type") == "langflow.elevenlabs.config":
|
|
960
|
-
logger.
|
|
956
|
+
await logger.ainfo(f"langflow.elevenlabs.config {msg}")
|
|
961
957
|
voice_config.use_elevenlabs = msg["enabled"]
|
|
962
958
|
voice_config.elevenlabs_voice = msg.get("voice_id", voice_config.elevenlabs_voice)
|
|
963
959
|
|
|
@@ -997,7 +993,7 @@ async def flow_as_tool_websocket(
|
|
|
997
993
|
if do_forward:
|
|
998
994
|
msg_handler.client_send(event)
|
|
999
995
|
if event_type == "response.created":
|
|
1000
|
-
responses[response_id] = Response(response_id, voice_config.use_elevenlabs)
|
|
996
|
+
responses[response_id] = Response(response_id, use_elevenlabs=voice_config.use_elevenlabs)
|
|
1001
997
|
if function_call:
|
|
1002
998
|
if function_call.is_prog_enabled and not function_call.prog_rsp_id:
|
|
1003
999
|
function_call.prog_rsp_id = response_id
|
|
@@ -1021,12 +1017,12 @@ async def flow_as_tool_websocket(
|
|
|
1021
1017
|
message_text = event.get("text", "")
|
|
1022
1018
|
await add_message_to_db(message_text, session, flow_id, session_id, "Machine", "AI")
|
|
1023
1019
|
except ValueError as err:
|
|
1024
|
-
logger.
|
|
1025
|
-
logger.
|
|
1020
|
+
await logger.aerror(f"Error saving message to database (ValueError): {err}")
|
|
1021
|
+
await logger.aerror(traceback.format_exc())
|
|
1026
1022
|
except (KeyError, AttributeError, TypeError) as err:
|
|
1027
1023
|
# Replace blind Exception with specific exceptions
|
|
1028
|
-
logger.
|
|
1029
|
-
logger.
|
|
1024
|
+
await logger.aerror(f"Error saving message to database: {err}")
|
|
1025
|
+
await logger.aerror(traceback.format_exc())
|
|
1030
1026
|
|
|
1031
1027
|
elif event_type == "response.output_item.added":
|
|
1032
1028
|
bot_speaking_flag[0] = True
|
|
@@ -1050,12 +1046,12 @@ async def flow_as_tool_websocket(
|
|
|
1050
1046
|
if transcript and transcript.strip():
|
|
1051
1047
|
await add_message_to_db(transcript, session, flow_id, session_id, "Machine", "AI")
|
|
1052
1048
|
except ValueError as err:
|
|
1053
|
-
logger.
|
|
1054
|
-
logger.
|
|
1049
|
+
await logger.aerror(f"Error saving message to database (ValueError): {err}")
|
|
1050
|
+
await logger.aerror(traceback.format_exc())
|
|
1055
1051
|
except (KeyError, AttributeError, TypeError) as err:
|
|
1056
1052
|
# Replace blind Exception with specific exceptions
|
|
1057
|
-
logger.
|
|
1058
|
-
logger.
|
|
1053
|
+
await logger.aerror(f"Error saving message to database: {err}")
|
|
1054
|
+
await logger.aerror(traceback.format_exc())
|
|
1059
1055
|
bot_speaking_flag[0] = False
|
|
1060
1056
|
elif event_type == "response.done":
|
|
1061
1057
|
msg_handler.openai_unblock()
|
|
@@ -1080,12 +1076,12 @@ async def flow_as_tool_websocket(
|
|
|
1080
1076
|
if message_text and message_text.strip():
|
|
1081
1077
|
await add_message_to_db(message_text, session, flow_id, session_id, "User", "User")
|
|
1082
1078
|
except ValueError as e:
|
|
1083
|
-
logger.
|
|
1084
|
-
logger.
|
|
1079
|
+
await logger.aerror(f"Error saving message to database (ValueError): {e}")
|
|
1080
|
+
await logger.aerror(traceback.format_exc())
|
|
1085
1081
|
except (KeyError, AttributeError, TypeError) as e:
|
|
1086
1082
|
# Replace blind Exception with specific exceptions
|
|
1087
|
-
logger.
|
|
1088
|
-
logger.
|
|
1083
|
+
await logger.aerror(f"Error saving message to database: {e}")
|
|
1084
|
+
await logger.aerror(traceback.format_exc())
|
|
1089
1085
|
elif event_type == "error":
|
|
1090
1086
|
pass
|
|
1091
1087
|
|
|
@@ -1104,12 +1100,12 @@ async def flow_as_tool_websocket(
|
|
|
1104
1100
|
# Check for exceptions in results
|
|
1105
1101
|
for result in results:
|
|
1106
1102
|
if isinstance(result, Exception):
|
|
1107
|
-
logger.
|
|
1108
|
-
logger.
|
|
1103
|
+
await logger.aerror("WS loop failed:", exc_info=result)
|
|
1104
|
+
await logger.aerror(traceback.format_exc())
|
|
1109
1105
|
except Exception as e: # noqa: BLE001
|
|
1110
1106
|
# Handle any other exceptions
|
|
1111
|
-
logger.
|
|
1112
|
-
logger.
|
|
1107
|
+
await logger.aerror(f"WS loop failed: {e}")
|
|
1108
|
+
await logger.aerror(traceback.format_exc())
|
|
1113
1109
|
finally:
|
|
1114
1110
|
# shared cleanup for writers & sockets
|
|
1115
1111
|
async def close():
|
|
@@ -1119,8 +1115,8 @@ async def flow_as_tool_websocket(
|
|
|
1119
1115
|
|
|
1120
1116
|
await close()
|
|
1121
1117
|
except Exception as e: # noqa: BLE001
|
|
1122
|
-
logger.
|
|
1123
|
-
logger.
|
|
1118
|
+
await logger.aerror(f"Unexpected error: {e}")
|
|
1119
|
+
await logger.aerror(traceback.format_exc())
|
|
1124
1120
|
finally:
|
|
1125
1121
|
# Make sure to clean up the task
|
|
1126
1122
|
if vad_task and not vad_task.done():
|
|
@@ -1232,16 +1228,16 @@ async def flow_tts_websocket(
|
|
|
1232
1228
|
elif event.get("type") == "input_audio_buffer.commit":
|
|
1233
1229
|
openai_send(event)
|
|
1234
1230
|
elif event.get("type") == "langflow.elevenlabs.config":
|
|
1235
|
-
logger.
|
|
1231
|
+
await logger.ainfo(f"langflow.elevenlabs.config {event}")
|
|
1236
1232
|
tts_config.use_elevenlabs = event["enabled"]
|
|
1237
1233
|
tts_config.elevenlabs_voice = event.get("voice_id", tts_config.elevenlabs_voice)
|
|
1238
1234
|
elif event.get("type") == "voice.settings":
|
|
1239
1235
|
# Store the voice setting
|
|
1240
1236
|
if event.get("voice"):
|
|
1241
1237
|
tts_config.openai_voice = event.get("voice")
|
|
1242
|
-
logger.
|
|
1238
|
+
await logger.ainfo(f"Updated OpenAI voice to: {tts_config.openai_voice}")
|
|
1243
1239
|
except Exception as e: # noqa: BLE001
|
|
1244
|
-
logger.
|
|
1240
|
+
await logger.aerror(f"Error in WebSocket communication: {e}")
|
|
1245
1241
|
|
|
1246
1242
|
async def forward_to_client() -> None:
|
|
1247
1243
|
try:
|
|
@@ -1312,7 +1308,7 @@ async def flow_tts_websocket(
|
|
|
1312
1308
|
audio_event = {"type": "response.audio.delta", "delta": base64_audio}
|
|
1313
1309
|
client_send(audio_event)
|
|
1314
1310
|
except Exception as e: # noqa: BLE001
|
|
1315
|
-
logger.
|
|
1311
|
+
await logger.aerror(f"Error in WebSocket communication: {e}")
|
|
1316
1312
|
|
|
1317
1313
|
try:
|
|
1318
1314
|
# Create tasks and gather them for concurrent execution
|
|
@@ -1321,13 +1317,13 @@ async def flow_tts_websocket(
|
|
|
1321
1317
|
await asyncio.gather(task1, task2)
|
|
1322
1318
|
except Exception as exc: # noqa: BLE001
|
|
1323
1319
|
# handle any exceptions from any task
|
|
1324
|
-
logger.
|
|
1320
|
+
await logger.aerror("WS loop failed:", exc_info=exc)
|
|
1325
1321
|
finally:
|
|
1326
1322
|
# shared cleanup for writers & sockets
|
|
1327
1323
|
await close()
|
|
1328
1324
|
except Exception as e: # noqa: BLE001
|
|
1329
|
-
logger.
|
|
1330
|
-
logger.
|
|
1325
|
+
await logger.aerror(f"Unexpected error: {e}")
|
|
1326
|
+
await logger.aerror(traceback.format_exc())
|
|
1331
1327
|
|
|
1332
1328
|
|
|
1333
1329
|
def extract_transcript(json_data):
|
|
@@ -1367,13 +1363,13 @@ async def get_elevenlabs_voice_ids(
|
|
|
1367
1363
|
for voice in voices
|
|
1368
1364
|
]
|
|
1369
1365
|
except ValueError as e:
|
|
1370
|
-
logger.
|
|
1366
|
+
await logger.aerror(f"Error fetching ElevenLabs voices (ValueError): {e}")
|
|
1371
1367
|
return {"error": str(e)}
|
|
1372
1368
|
except requests.RequestException as e:
|
|
1373
|
-
logger.
|
|
1369
|
+
await logger.aerror(f"Error fetching ElevenLabs voices (RequestException): {e}")
|
|
1374
1370
|
return {"error": str(e)}
|
|
1375
1371
|
except (KeyError, AttributeError, TypeError) as e:
|
|
1376
1372
|
# More specific exceptions instead of blind Exception
|
|
1377
|
-
logger.
|
|
1378
|
-
logger.
|
|
1373
|
+
await logger.aerror(f"Error fetching ElevenLabs voices: {e}")
|
|
1374
|
+
await logger.aerror(traceback.format_exc())
|
|
1379
1375
|
return {"error": str(e)}
|
langflow/api/v2/files.py
CHANGED
|
@@ -11,11 +11,11 @@ from zoneinfo import ZoneInfo
|
|
|
11
11
|
|
|
12
12
|
from fastapi import APIRouter, Depends, File, HTTPException, UploadFile
|
|
13
13
|
from fastapi.responses import StreamingResponse
|
|
14
|
-
from loguru import logger
|
|
15
14
|
from sqlmodel import col, select
|
|
16
15
|
|
|
17
16
|
from langflow.api.schemas import UploadFileResponse
|
|
18
17
|
from langflow.api.utils import CurrentActiveUser, DbSession
|
|
18
|
+
from langflow.logging.logger import logger
|
|
19
19
|
from langflow.services.database.models.file.model import File as UserFile
|
|
20
20
|
from langflow.services.deps import get_settings_service, get_storage_service
|
|
21
21
|
from langflow.services.storage.service import StorageService
|
|
@@ -488,7 +488,7 @@ async def delete_file(
|
|
|
488
488
|
raise
|
|
489
489
|
except Exception as e:
|
|
490
490
|
# Log and return a generic server error
|
|
491
|
-
logger.
|
|
491
|
+
await logger.aerror("Error deleting file %s: %s", file_id, e)
|
|
492
492
|
raise HTTPException(status_code=500, detail=f"Error deleting file: {e}") from e
|
|
493
493
|
return {"detail": f"File {file_to_delete.name} deleted successfully"}
|
|
494
494
|
|
langflow/api/v2/mcp.py
CHANGED
|
@@ -115,6 +115,7 @@ async def get_servers(
|
|
|
115
115
|
session: DbSession,
|
|
116
116
|
storage_service=Depends(get_storage_service),
|
|
117
117
|
settings_service=Depends(get_settings_service),
|
|
118
|
+
*,
|
|
118
119
|
action_count: bool | None = None,
|
|
119
120
|
):
|
|
120
121
|
"""Get the list of available servers."""
|
|
@@ -140,27 +141,27 @@ async def get_servers(
|
|
|
140
141
|
server_info["error"] = "No tools found"
|
|
141
142
|
except ValueError as e:
|
|
142
143
|
# Configuration validation errors, invalid URLs, etc.
|
|
143
|
-
logger.
|
|
144
|
+
await logger.aerror(f"Configuration error for server {server_name}: {e}")
|
|
144
145
|
server_info["error"] = f"Configuration error: {e}"
|
|
145
146
|
except ConnectionError as e:
|
|
146
147
|
# Network connection and timeout issues
|
|
147
|
-
logger.
|
|
148
|
+
await logger.aerror(f"Connection error for server {server_name}: {e}")
|
|
148
149
|
server_info["error"] = f"Connection failed: {e}"
|
|
149
150
|
except (TimeoutError, asyncio.TimeoutError) as e:
|
|
150
151
|
# Timeout errors
|
|
151
|
-
logger.
|
|
152
|
+
await logger.aerror(f"Timeout error for server {server_name}: {e}")
|
|
152
153
|
server_info["error"] = "Timeout when checking server tools"
|
|
153
154
|
except OSError as e:
|
|
154
155
|
# System-level errors (process execution, file access)
|
|
155
|
-
logger.
|
|
156
|
+
await logger.aerror(f"System error for server {server_name}: {e}")
|
|
156
157
|
server_info["error"] = f"System error: {e}"
|
|
157
158
|
except (KeyError, TypeError) as e:
|
|
158
159
|
# Data parsing and access errors
|
|
159
|
-
logger.
|
|
160
|
+
await logger.aerror(f"Data error for server {server_name}: {e}")
|
|
160
161
|
server_info["error"] = f"Configuration data error: {e}"
|
|
161
162
|
except (RuntimeError, ProcessLookupError, PermissionError) as e:
|
|
162
163
|
# Runtime and process-related errors
|
|
163
|
-
logger.
|
|
164
|
+
await logger.aerror(f"Runtime error for server {server_name}: {e}")
|
|
164
165
|
server_info["error"] = f"Runtime error: {e}"
|
|
165
166
|
except Exception as e: # noqa: BLE001
|
|
166
167
|
# Generic catch-all for other exceptions (including ExceptionGroup)
|
|
@@ -168,15 +169,15 @@ async def get_servers(
|
|
|
168
169
|
# Extract the first underlying exception for a more meaningful error message
|
|
169
170
|
underlying_error = e.exceptions[0]
|
|
170
171
|
if hasattr(underlying_error, "exceptions"):
|
|
171
|
-
logger.
|
|
172
|
+
await logger.aerror(
|
|
172
173
|
f"Error checking server {server_name}: {underlying_error}, {underlying_error.exceptions}"
|
|
173
174
|
)
|
|
174
175
|
underlying_error = underlying_error.exceptions[0]
|
|
175
176
|
else:
|
|
176
|
-
logger.
|
|
177
|
+
await logger.aexception(f"Error checking server {server_name}: {underlying_error}")
|
|
177
178
|
server_info["error"] = f"Error loading server: {underlying_error}"
|
|
178
179
|
else:
|
|
179
|
-
logger.
|
|
180
|
+
await logger.aexception(f"Error checking server {server_name}: {e}")
|
|
180
181
|
server_info["error"] = f"Error loading server: {e}"
|
|
181
182
|
return server_info
|
|
182
183
|
|
|
@@ -135,7 +135,15 @@ class ComposioBaseComponent(Component):
|
|
|
135
135
|
|
|
136
136
|
if isinstance(result, dict):
|
|
137
137
|
result = [result]
|
|
138
|
-
|
|
138
|
+
# Build DataFrame and avoid exposing a 'data' attribute via column access,
|
|
139
|
+
result_dataframe = DataFrame(result)
|
|
140
|
+
if hasattr(result_dataframe, "columns"):
|
|
141
|
+
try:
|
|
142
|
+
if "data" in result_dataframe.columns:
|
|
143
|
+
result_dataframe = result_dataframe.rename(columns={"data": "_data"})
|
|
144
|
+
except (AttributeError, TypeError, ValueError, KeyError) as e:
|
|
145
|
+
logger.debug(f"Failed to rename 'data' column: {e}")
|
|
146
|
+
return result_dataframe
|
|
139
147
|
|
|
140
148
|
def as_data(self) -> Data:
|
|
141
149
|
result = self.execute_action()
|
|
@@ -379,6 +387,8 @@ class ComposioBaseComponent(Component):
|
|
|
379
387
|
# Handle conflicting field names - rename user_id to avoid conflicts with entity_id
|
|
380
388
|
if clean_field == "user_id":
|
|
381
389
|
clean_field = f"{self.app_name}_user_id"
|
|
390
|
+
elif clean_field == "status":
|
|
391
|
+
clean_field = f"{self.app_name}_status"
|
|
382
392
|
|
|
383
393
|
action_fields.append(clean_field)
|
|
384
394
|
|
|
@@ -526,11 +536,18 @@ class ComposioBaseComponent(Component):
|
|
|
526
536
|
# Handle conflicting field names - rename user_id to avoid conflicts with entity_id
|
|
527
537
|
if clean_field_name == "user_id":
|
|
528
538
|
clean_field_name = f"{self.app_name}_user_id"
|
|
529
|
-
# Update
|
|
539
|
+
# Update
|
|
530
540
|
field_schema_copy = field_schema.copy()
|
|
531
541
|
field_schema_copy["description"] = (
|
|
532
542
|
f"User ID for {self.app_name.title()}: " + field_schema["description"]
|
|
533
543
|
)
|
|
544
|
+
elif clean_field_name == "status":
|
|
545
|
+
clean_field_name = f"{self.app_name}_status"
|
|
546
|
+
# Update
|
|
547
|
+
field_schema_copy = field_schema.copy()
|
|
548
|
+
field_schema_copy["description"] = (
|
|
549
|
+
f"Status for {self.app_name.title()}: " + field_schema["description"]
|
|
550
|
+
)
|
|
534
551
|
else:
|
|
535
552
|
# Use the original field schema for all other fields
|
|
536
553
|
field_schema_copy = field_schema
|
|
@@ -1240,6 +1257,8 @@ class ComposioBaseComponent(Component):
|
|
|
1240
1257
|
final_field_name = field
|
|
1241
1258
|
if field.endswith("_user_id") and field.startswith(self.app_name):
|
|
1242
1259
|
final_field_name = "user_id"
|
|
1260
|
+
elif field.endswith("_status") and field.startswith(self.app_name):
|
|
1261
|
+
final_field_name = "status"
|
|
1243
1262
|
|
|
1244
1263
|
arguments[final_field_name] = value
|
|
1245
1264
|
|