langflow-base-nightly 0.5.0.dev37__py3-none-any.whl → 0.5.0.dev38__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/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 +45 -81
- langflow/api/v1/mcp_utils.py +8 -8
- langflow/api/v1/schemas.py +1 -5
- 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/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 +3 -3
- 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/data/file.py +575 -55
- langflow/components/data/url.py +1 -1
- 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/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/nvidia/nvidia.py +3 -3
- langflow/components/olivya/olivya.py +7 -7
- langflow/components/ollama/ollama.py +8 -6
- 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/serpapi/serp.py +1 -1
- 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/vectorstores/local_db.py +1 -1
- 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/directory_reader/directory_reader.py +7 -7
- langflow/custom/directory_reader/utils.py +1 -2
- langflow/custom/utils.py +30 -30
- langflow/events/event_manager.py +1 -1
- langflow/frontend/assets/{SlackIcon-CnvyOamQ.js → SlackIcon-BhW6H3JR.js} +1 -1
- langflow/frontend/assets/{Wikipedia-nyTEXdr2.js → Wikipedia-Dx5jbiy3.js} +1 -1
- langflow/frontend/assets/{Wolfram-BYMQkNSq.js → Wolfram-CIyonzwo.js} +1 -1
- langflow/frontend/assets/{index-HK3bVMYA.js → index-0XQqYgdG.js} +1 -1
- langflow/frontend/assets/{index-BZgXW854.js → index-1Q3VBqKn.js} +1 -1
- langflow/frontend/assets/{index-BQ6NUdMY.js → index-35sspuLu.js} +1 -1
- langflow/frontend/assets/{index-DPCzHdsC.js → index-7hzXChQz.js} +1 -1
- langflow/frontend/assets/{index-CFDvOtKC.js → index-8cuhogZP.js} +1 -1
- langflow/frontend/assets/{index-CYDAYm-i.js → index-B0m53xKd.js} +1 -1
- langflow/frontend/assets/{index-Q9vDw0Xl.js → index-B1XqWJhG.js} +1 -1
- langflow/frontend/assets/{index-Gkrq-vzm.js → index-B3KCdQ91.js} +1 -1
- langflow/frontend/assets/{index-DytJENYD.js → index-B7uEuOPK.js} +1 -1
- langflow/frontend/assets/{index-DkXy1WFo.js → index-B8UR8v-Q.js} +1 -1
- langflow/frontend/assets/{index-BChjg6Az.js → index-BD7Io1hL.js} +6 -6
- langflow/frontend/assets/{index-CyPvTB63.js → index-BDQrd7Tj.js} +1 -1
- langflow/frontend/assets/{index-BbJjt5m4.js → index-BDuk0d7P.js} +1 -1
- langflow/frontend/assets/{index-BBxAPk1y.js → index-BFQ8KFK0.js} +1 -1
- langflow/frontend/assets/{index-BqPpO6KG.js → index-BFf0HTFI.js} +1 -1
- langflow/frontend/assets/{index-yCHsaqs8.js → index-BHhnpSkW.js} +1 -1
- langflow/frontend/assets/{index-Bd6WtbKA.js → index-BKKrUElc.js} +1 -1
- langflow/frontend/assets/{index-DHq8TQPB.js → index-BKeZt2hQ.js} +1 -1
- langflow/frontend/assets/{index-BCCGvqay.js → index-BKlQbl-6.js} +1 -1
- langflow/frontend/assets/{index-Boso-xEw.js → index-BLYw9MK2.js} +1 -1
- langflow/frontend/assets/{index-DmMDPoi0.js → index-BLsVo9iW.js} +1 -1
- langflow/frontend/assets/{index-Car-zdor.js → index-BNQIbda3.js} +1 -1
- langflow/frontend/assets/{index-Dg-63Si_.js → index-BPR2mEFC.js} +1 -1
- langflow/frontend/assets/{index-CTrt1Q_j.js → index-BPfdqCc_.js} +1 -1
- langflow/frontend/assets/{index-CVQmT7ZL.js → index-BQrVDjR1.js} +1 -1
- langflow/frontend/assets/{index-BB15_iOb.js → index-BRmSeoWR.js} +1 -1
- langflow/frontend/assets/{index-BX5D-USa.js → index-BUse-kxM.js} +1 -1
- langflow/frontend/assets/{index-CaQ_H9ww.js → index-BVFaF7HW.js} +1 -1
- langflow/frontend/assets/{index-C26RqKWL.js → index-BWgIWfv2.js} +1 -1
- langflow/frontend/assets/{index-DbMFlnHE.js → index-BWt5xGeA.js} +1 -1
- langflow/frontend/assets/{index-Db71w3lq.js → index-BYhcGLTV.js} +1 -1
- langflow/frontend/assets/{index-DzW2mfkK.js → index-BYjw7Gk3.js} +1 -1
- langflow/frontend/assets/{index-DJB12jIC.js → index-BZFljdMa.js} +1 -1
- langflow/frontend/assets/{index-nVwHLjuV.js → index-BcAgItH4.js} +1 -1
- langflow/frontend/assets/{index-DkelbYy7.js → index-Bct1s6__.js} +1 -1
- langflow/frontend/assets/{index-ChXJpBz4.js → index-Bhv79Zso.js} +1 -1
- langflow/frontend/assets/{index-BxEuHa76.js → index-Bj3lSwvZ.js} +1 -1
- langflow/frontend/assets/{index-BkPYpfgw.js → index-Bk4mTwnI.js} +1 -1
- langflow/frontend/assets/{index-BvT7L317.js → index-BmIx1cws.js} +1 -1
- langflow/frontend/assets/{index-DIDDfmlJ.js → index-BmYJJ5YS.js} +1 -1
- langflow/frontend/assets/{index-C7QWbnLK.js → index-BnAFhkSN.js} +1 -1
- langflow/frontend/assets/{index-CJo_cyWW.js → index-Bo-ww0Bb.js} +1 -1
- langflow/frontend/assets/{index-DjQETUy8.js → index-BpmqDOeZ.js} +1 -1
- langflow/frontend/assets/{index-ya2uXE8v.js → index-BrVhdPZb.js} +1 -1
- langflow/frontend/assets/{index-DCRk27Tp.js → index-BvGQfVBD.js} +1 -1
- langflow/frontend/assets/{index-BTrsh9LS.js → index-Bwi4flFg.js} +1 -1
- langflow/frontend/assets/{index-BRxvproo.js → index-BzoRPtTY.js} +1 -1
- langflow/frontend/assets/{index-BIQQCMvz.js → index-C--IDAyc.js} +1 -1
- langflow/frontend/assets/{index-DfngcQxO.js → index-C0E3_MIK.js} +1 -1
- langflow/frontend/assets/{index-Bvxg4_ux.js → index-C27Jj_26.js} +1 -1
- langflow/frontend/assets/{index-D8lOi1GI.js → index-C2eQmQsn.js} +1 -1
- langflow/frontend/assets/{index-rXV1G1aB.js → index-C8K0r39B.js} +1 -1
- langflow/frontend/assets/{index-B3Sur4Z3.js → index-CEJNWPhA.js} +1 -1
- langflow/frontend/assets/{index-BR0bkVqX.js → index-CFNTYfFK.js} +1 -1
- langflow/frontend/assets/{index-Bnqod3vk.js → index-CMHpjHZl.js} +1 -1
- langflow/frontend/assets/{index-BLGYN-9b.js → index-CSu8KHOi.js} +1 -1
- langflow/frontend/assets/{index-BOB_zsjl.js → index-CUKmGsI6.js} +1 -1
- langflow/frontend/assets/{index-BzEUlaw_.js → index-CWYiSeWV.js} +1 -1
- langflow/frontend/assets/{index-DVlceYFD.js → index-CY7_TBTC.js} +1 -1
- langflow/frontend/assets/{index-D3DDfngy.js → index-CbnWRlYY.js} +1 -1
- langflow/frontend/assets/{index-cvZdgWHQ.js → index-CfPBgkqg.js} +1 -1
- langflow/frontend/assets/{index-Ui4xUImO.js → index-Cg53lrYh.js} +1 -1
- langflow/frontend/assets/{index-C6jri9Wm.js → index-CgU7KF4I.js} +1 -1
- langflow/frontend/assets/{index-BVEZDXxS.js → index-CgwykVGh.js} +1 -1
- langflow/frontend/assets/{index-BOeo01QB.js → index-Ch5r0oW6.js} +1 -1
- langflow/frontend/assets/{index-D6PSjHxP.js → index-CjsommIr.js} +1 -1
- langflow/frontend/assets/{index-pCQ_yw8m.js → index-CkK25zZO.js} +1 -1
- langflow/frontend/assets/{index-BFp_O-c9.js → index-CkjwSTSM.js} +1 -1
- langflow/frontend/assets/{index-Du_18NCU.js → index-CmSFKgiD.js} +1 -1
- langflow/frontend/assets/{index-BvwZfF2i.js → index-Cr5v2ave.js} +1 -1
- langflow/frontend/assets/{index-FUxmznS-.js → index-CrAF-31Y.js} +1 -1
- langflow/frontend/assets/{index-C-2hghRJ.js → index-CsLQiWNf.js} +1 -1
- langflow/frontend/assets/{index-C_TdzfAn.js → index-CuCM7Wu7.js} +1 -1
- langflow/frontend/assets/{index-D5_DsUJc.js → index-Cxy9sEpy.js} +1 -1
- langflow/frontend/assets/{index-C_veJlEb.js → index-CyP3py8K.js} +1 -1
- langflow/frontend/assets/{index-OazXJdEl.js → index-CzHzeZuA.js} +1 -1
- langflow/frontend/assets/{index-CvcEzq4x.js → index-D1oynC8a.js} +1 -1
- langflow/frontend/assets/{index-CZQ9rXNa.js → index-D4tjMhfY.js} +1 -1
- langflow/frontend/assets/{index-B1YN7oMV.js → index-D6CSIrp1.js} +1 -1
- langflow/frontend/assets/{index-DfxYyS3M.js → index-D9kwEzPB.js} +1 -1
- langflow/frontend/assets/{index-BbRm7beF.js → index-DDXsm8tz.js} +1 -1
- langflow/frontend/assets/{index-xuIrH2Dq.js → index-DDhJVVel.js} +1 -1
- langflow/frontend/assets/{index-CmplyEaa.js → index-DH6o91_s.js} +1 -1
- langflow/frontend/assets/{index-DnEGCgih.js → index-DHngW1k8.js} +1 -1
- langflow/frontend/assets/{index-ajRge-Mg.js → index-DIKUsGLF.js} +1 -1
- langflow/frontend/assets/{index-DpClkXIV.js → index-DJESSNJi.js} +1 -1
- langflow/frontend/assets/{index-8WdfSTTz.js → index-DMCWDJOl.js} +1 -1
- langflow/frontend/assets/{index-DZTC5pdT.js → index-DOEvKC2X.js} +1 -1
- langflow/frontend/assets/{index-DysKpOuj.js → index-DOQDkSoK.js} +1 -1
- langflow/frontend/assets/{index-C82JjCPD.js → index-DXAfIEvs.js} +1 -1
- langflow/frontend/assets/{index-D8GJngXa.js → index-DZP_SaHb.js} +1 -1
- langflow/frontend/assets/{index-DIkNW9Cd.js → index-DZxUIhWh.js} +1 -1
- langflow/frontend/assets/{index-DK1Ptcc4.js → index-Dda2u_yz.js} +1 -1
- langflow/frontend/assets/{index-BWmPX4iQ.js → index-Dg8N3NSO.js} +1 -1
- langflow/frontend/assets/{index-CWdkbVsd.js → index-DkGhPNeA.js} +1 -1
- langflow/frontend/assets/{index-DF5VwgU6.js → index-Dka_Rk4-.js} +1 -1
- langflow/frontend/assets/{index-Bsa0xZyL.js → index-DljpLeCW.js} +1 -1
- langflow/frontend/assets/{index-CLPdN-q6.js → index-DnVYJtVO.js} +1 -1
- langflow/frontend/assets/{index-CxvP91st.js → index-DqbzUcI5.js} +1 -1
- langflow/frontend/assets/{index-BIzTEqFh.js → index-Dr6pVDPI.js} +1 -1
- langflow/frontend/assets/{index-tVYiABdp.js → index-DsoX2o1S.js} +1 -1
- langflow/frontend/assets/{index-CCePCqkT.js → index-DwfHWnX7.js} +1 -1
- langflow/frontend/assets/{index-BEMw2Np8.js → index-Dx-Z87KT.js} +1 -1
- langflow/frontend/assets/{index-BRYjyhAd.js → index-DyqITq51.js} +1 -1
- langflow/frontend/assets/{index-l7bzB8Ex.js → index-DzIv3RyR.js} +1 -1
- langflow/frontend/assets/{index-D-9TI74R.js → index-G4ro0MjT.js} +1 -1
- langflow/frontend/assets/{index-CCxGSSTT.js → index-H7J7w7fa.js} +1 -1
- langflow/frontend/assets/{index-_UcqeEjm.js → index-KWY77KfV.js} +1 -1
- langflow/frontend/assets/{index-Dqd4RjYA.js → index-U9GWm1eH.js} +1 -1
- langflow/frontend/assets/{index-Dq5ilsem.js → index-Un9pWxnP.js} +1 -1
- langflow/frontend/assets/{index-BzL_EoKd.js → index-Xi4TplbI.js} +1 -1
- langflow/frontend/assets/{index-LbYjHKkn.js → index-_cbGmjF4.js} +1 -1
- langflow/frontend/assets/{index-DGRMNe9n.js → index-cEXY6V06.js} +1 -1
- langflow/frontend/assets/{index-8yMsjVV2.js → index-dyXKnkMi.js} +1 -1
- langflow/frontend/assets/{index-DKHNourL.js → index-eUkS6iJM.js} +1 -1
- langflow/frontend/assets/{index-Bv8h2Z-q.js → index-ekfMOqrF.js} +1 -1
- langflow/frontend/assets/{index-B748uLP1.js → index-gdb7XMS8.js} +1 -1
- langflow/frontend/assets/{index-CpvYQ0ug.js → index-hZUcL0MZ.js} +1 -1
- langflow/frontend/assets/{index-BIXaW2aY.js → index-kkA-qHB_.js} +1 -1
- langflow/frontend/assets/{index-BhIOhlCH.js → index-mzl9ULw5.js} +1 -1
- langflow/frontend/assets/{index-CYe8Ipef.js → index-oxHBZk2v.js} +1 -1
- langflow/frontend/assets/{index-WPFivmdQ.js → index-p2kStSPe.js} +1 -1
- langflow/frontend/assets/{index-BmX5CoED.js → index-paQEWYGT.js} +1 -1
- langflow/frontend/assets/{index-CpcbQZIF.js → index-r_8gs4nL.js} +1 -1
- langflow/frontend/assets/{index-dcnYpT9N.js → index-uiKla4UR.js} +1 -1
- langflow/frontend/assets/{index-BTEW9e8P.js → index-vJOO5U8M.js} +1 -1
- langflow/frontend/assets/{index-CQMoqLAu.js → index-w72fDjpG.js} +1 -1
- langflow/frontend/assets/{index-Dsps-jKu.js → index-zV82kQ6k.js} +1 -1
- langflow/frontend/assets/lazyIconImports-DTNgvPE-.js +2 -0
- langflow/frontend/assets/{use-post-add-user-BrBYH9eR.js → use-post-add-user-CvtuazTg.js} +1 -1
- langflow/frontend/index.html +1 -1
- langflow/graph/edge/base.py +2 -3
- langflow/graph/graph/base.py +14 -12
- 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/Blog Writer.json +2 -2
- langflow/initial_setup/starter_projects/Custom Component Generator.json +2 -2
- langflow/initial_setup/starter_projects/Document Q&A.json +1 -1
- langflow/initial_setup/starter_projects/Instagram Copywriter.json +3 -3
- langflow/initial_setup/starter_projects/Invoice Summarizer.json +1 -1
- langflow/initial_setup/starter_projects/Knowledge Ingestion.json +2 -2
- langflow/initial_setup/starter_projects/Market Research.json +3 -3
- langflow/initial_setup/starter_projects/Meeting Summary.json +6 -6
- langflow/initial_setup/starter_projects/Memory Chatbot.json +2 -2
- langflow/initial_setup/starter_projects/News Aggregator.json +3 -3
- langflow/initial_setup/starter_projects/Nvidia Remix.json +3 -3
- langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +1 -1
- langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json +1 -1
- langflow/initial_setup/starter_projects/Price Deal Finder.json +5 -5
- langflow/initial_setup/starter_projects/Research Agent.json +3 -3
- langflow/initial_setup/starter_projects/SaaS Pricing.json +1 -1
- langflow/initial_setup/starter_projects/Search agent.json +1 -1
- langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +7 -7
- langflow/initial_setup/starter_projects/Simple Agent.json +3 -3
- langflow/initial_setup/starter_projects/Social Media Agent.json +1 -1
- langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +1 -1
- langflow/initial_setup/starter_projects/Travel Planning Agents.json +3 -3
- langflow/initial_setup/starter_projects/Vector Store RAG.json +1 -1
- langflow/initial_setup/starter_projects/Youtube Analysis.json +3 -3
- 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 +3 -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/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/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.dev38.dist-info}/METADATA +2 -1
- {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev38.dist-info}/RECORD +334 -333
- langflow/frontend/assets/lazyIconImports-t6wEndt1.js +0 -2
- {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev38.dist-info}/WHEEL +0 -0
- {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev38.dist-info}/entry_points.txt +0 -0
langflow/api/v1/mcp_projects.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import json
|
|
3
|
-
import logging
|
|
4
3
|
import os
|
|
5
4
|
import platform
|
|
6
5
|
from asyncio.subprocess import create_subprocess_exec
|
|
@@ -29,19 +28,12 @@ from langflow.api.v1.mcp_utils import (
|
|
|
29
28
|
handle_mcp_errors,
|
|
30
29
|
handle_read_resource,
|
|
31
30
|
)
|
|
32
|
-
from langflow.api.v1.schemas import
|
|
33
|
-
MCPInstallRequest,
|
|
34
|
-
MCPProjectResponse,
|
|
35
|
-
MCPProjectUpdateRequest,
|
|
36
|
-
MCPSettings,
|
|
37
|
-
)
|
|
31
|
+
from langflow.api.v1.schemas import MCPInstallRequest, MCPProjectResponse, MCPProjectUpdateRequest, MCPSettings
|
|
38
32
|
from langflow.base.mcp.constants import MAX_MCP_SERVER_NAME_LENGTH
|
|
39
33
|
from langflow.base.mcp.util import sanitize_mcp_name
|
|
34
|
+
from langflow.logging import logger
|
|
40
35
|
from langflow.services.database.models import Flow, Folder
|
|
41
36
|
from langflow.services.deps import get_settings_service, session_scope
|
|
42
|
-
from langflow.services.settings.feature_flags import FEATURE_FLAGS
|
|
43
|
-
|
|
44
|
-
logger = logging.getLogger(__name__)
|
|
45
37
|
|
|
46
38
|
router = APIRouter(prefix="/mcp/project", tags=["mcp_projects"])
|
|
47
39
|
|
|
@@ -117,7 +109,7 @@ async def list_project_tools(
|
|
|
117
109
|
tools.append(tool)
|
|
118
110
|
except Exception as e: # noqa: BLE001
|
|
119
111
|
msg = f"Error in listing project tools: {e!s} from flow: {name}"
|
|
120
|
-
logger.
|
|
112
|
+
await logger.awarning(msg)
|
|
121
113
|
continue
|
|
122
114
|
|
|
123
115
|
# Get project-level auth settings
|
|
@@ -129,14 +121,14 @@ async def list_project_tools(
|
|
|
129
121
|
|
|
130
122
|
except Exception as e:
|
|
131
123
|
msg = f"Error listing project tools: {e!s}"
|
|
132
|
-
logger.
|
|
124
|
+
await logger.aexception(msg)
|
|
133
125
|
raise HTTPException(status_code=500, detail=str(e)) from e
|
|
134
126
|
|
|
135
127
|
return MCPProjectResponse(tools=tools, auth_settings=auth_settings)
|
|
136
128
|
|
|
137
129
|
|
|
138
130
|
@router.head("/{project_id}/sse", response_class=HTMLResponse, include_in_schema=False)
|
|
139
|
-
async def im_alive():
|
|
131
|
+
async def im_alive(project_id: str): # noqa: ARG001
|
|
140
132
|
return Response()
|
|
141
133
|
|
|
142
134
|
|
|
@@ -159,7 +151,7 @@ async def handle_project_sse(
|
|
|
159
151
|
# Get project-specific SSE transport and MCP server
|
|
160
152
|
sse = get_project_sse(project_id)
|
|
161
153
|
project_server = get_project_mcp_server(project_id)
|
|
162
|
-
logger.
|
|
154
|
+
await logger.adebug("Project MCP server name: %s", project_server.server.name)
|
|
163
155
|
|
|
164
156
|
# Set context variables
|
|
165
157
|
user_token = current_user_ctx.set(current_user)
|
|
@@ -168,7 +160,7 @@ async def handle_project_sse(
|
|
|
168
160
|
try:
|
|
169
161
|
async with sse.connect_sse(request.scope, request.receive, request._send) as streams:
|
|
170
162
|
try:
|
|
171
|
-
logger.
|
|
163
|
+
await logger.adebug("Starting SSE connection for project %s", project_id)
|
|
172
164
|
|
|
173
165
|
notification_options = NotificationOptions(
|
|
174
166
|
prompts_changed=True, resources_changed=True, tools_changed=True
|
|
@@ -177,15 +169,15 @@ async def handle_project_sse(
|
|
|
177
169
|
|
|
178
170
|
try:
|
|
179
171
|
await project_server.server.run(streams[0], streams[1], init_options)
|
|
180
|
-
except Exception:
|
|
181
|
-
logger.
|
|
172
|
+
except Exception: # noqa: BLE001
|
|
173
|
+
await logger.aexception("Error in project MCP")
|
|
182
174
|
except BrokenResourceError:
|
|
183
|
-
logger.
|
|
175
|
+
await logger.ainfo("Client disconnected from project SSE connection")
|
|
184
176
|
except asyncio.CancelledError:
|
|
185
|
-
logger.
|
|
177
|
+
await logger.ainfo("Project SSE connection was cancelled")
|
|
186
178
|
raise
|
|
187
179
|
except Exception:
|
|
188
|
-
logger.
|
|
180
|
+
await logger.aexception("Error in project MCP")
|
|
189
181
|
raise
|
|
190
182
|
finally:
|
|
191
183
|
current_user_ctx.reset(user_token)
|
|
@@ -214,7 +206,7 @@ async def handle_project_messages(project_id: UUID, request: Request, current_us
|
|
|
214
206
|
sse = get_project_sse(project_id)
|
|
215
207
|
await sse.handle_post_message(request.scope, request.receive, request._send)
|
|
216
208
|
except BrokenResourceError as e:
|
|
217
|
-
logger.
|
|
209
|
+
await logger.ainfo("Project MCP Server disconnected for project %s", project_id)
|
|
218
210
|
raise HTTPException(status_code=404, detail=f"Project MCP Server disconnected, error: {e}") from e
|
|
219
211
|
finally:
|
|
220
212
|
current_user_ctx.reset(user_token)
|
|
@@ -280,7 +272,7 @@ async def update_project_mcp_settings(
|
|
|
280
272
|
|
|
281
273
|
except Exception as e:
|
|
282
274
|
msg = f"Error updating project MCP settings: {e!s}"
|
|
283
|
-
logger.
|
|
275
|
+
await logger.aexception(msg)
|
|
284
276
|
raise HTTPException(status_code=500, detail=str(e)) from e
|
|
285
277
|
|
|
286
278
|
|
|
@@ -368,13 +360,12 @@ async def install_mcp_config(
|
|
|
368
360
|
# Determine command and args based on operating system
|
|
369
361
|
os_type = platform.system()
|
|
370
362
|
command = "uvx"
|
|
371
|
-
mcp_tool = "mcp-composer" if FEATURE_FLAGS.mcp_composer else "mcp-proxy"
|
|
372
363
|
|
|
373
364
|
# Check if running on WSL (will appear as Linux but with Microsoft in release info)
|
|
374
365
|
is_wsl = os_type == "Linux" and "microsoft" in platform.uname().release.lower()
|
|
375
366
|
|
|
376
367
|
if is_wsl:
|
|
377
|
-
logger.
|
|
368
|
+
await logger.adebug("WSL detected, using Windows-specific configuration")
|
|
378
369
|
|
|
379
370
|
# If we're in WSL and the host is localhost, we might need to adjust the URL
|
|
380
371
|
# so Windows applications can reach the WSL service
|
|
@@ -393,43 +384,18 @@ async def install_mcp_config(
|
|
|
393
384
|
|
|
394
385
|
if proc.returncode == 0 and stdout.strip():
|
|
395
386
|
wsl_ip = stdout.decode().strip().split()[0] # Get first IP address
|
|
396
|
-
logger.
|
|
387
|
+
await logger.adebug("Using WSL IP for external access: %s", wsl_ip)
|
|
397
388
|
# Replace the localhost with the WSL IP in the URL
|
|
398
389
|
sse_url = sse_url.replace(f"http://{host}:{port}", f"http://{wsl_ip}:{port}")
|
|
399
390
|
except OSError as e:
|
|
400
|
-
logger.
|
|
401
|
-
|
|
402
|
-
# Configure args based on the MCP tool
|
|
403
|
-
oauth_env = None
|
|
404
|
-
if FEATURE_FLAGS.mcp_composer:
|
|
405
|
-
args = [mcp_tool, "--sse-url", sse_url]
|
|
406
|
-
|
|
407
|
-
# Check for auth settings and add auth parameters
|
|
408
|
-
if project.auth_settings:
|
|
409
|
-
from langflow.api.v1.schemas import AuthSettings
|
|
410
|
-
|
|
411
|
-
auth_settings = AuthSettings(**project.auth_settings)
|
|
412
|
-
args.extend(["--auth_type", auth_settings.auth_type])
|
|
413
|
-
|
|
414
|
-
oauth_env = {
|
|
415
|
-
"OAUTH_HOST": auth_settings.oauth_host,
|
|
416
|
-
"OAUTH_PORT": auth_settings.oauth_port,
|
|
417
|
-
"OAUTH_SERVER_URL": auth_settings.oauth_server_url,
|
|
418
|
-
"OAUTH_CALLBACK_PATH": auth_settings.oauth_callback_path,
|
|
419
|
-
"OAUTH_CLIENT_ID": auth_settings.oauth_client_id,
|
|
420
|
-
"OAUTH_CLIENT_SECRET": auth_settings.oauth_client_secret,
|
|
421
|
-
"OAUTH_AUTH_URL": auth_settings.oauth_auth_url,
|
|
422
|
-
"OAUTH_TOKEN_URL": auth_settings.oauth_token_url,
|
|
423
|
-
"OAUTH_MCP_SCOPE": auth_settings.oauth_mcp_scope,
|
|
424
|
-
"OAUTH_PROVIDER_SCOPE": auth_settings.oauth_provider_scope,
|
|
425
|
-
}
|
|
391
|
+
await logger.awarning("Failed to get WSL IP address: %s. Using default URL.", str(e))
|
|
426
392
|
else:
|
|
427
|
-
args = [
|
|
393
|
+
args = ["mcp-proxy", sse_url]
|
|
428
394
|
|
|
429
395
|
if os_type == "Windows":
|
|
430
396
|
command = "cmd"
|
|
431
397
|
args = ["/c", "uvx", *args]
|
|
432
|
-
logger.
|
|
398
|
+
await logger.adebug("Windows detected, using cmd command")
|
|
433
399
|
|
|
434
400
|
name = project.name
|
|
435
401
|
|
|
@@ -439,16 +405,12 @@ async def install_mcp_config(
|
|
|
439
405
|
"args": args,
|
|
440
406
|
}
|
|
441
407
|
|
|
442
|
-
# Add environment variables if mcp-composer feature flag is enabled and auth settings exist
|
|
443
|
-
if FEATURE_FLAGS.mcp_composer and oauth_env is not None:
|
|
444
|
-
server_config["env"] = oauth_env # type: ignore[assignment]
|
|
445
|
-
|
|
446
408
|
mcp_config = {
|
|
447
409
|
"mcpServers": {f"lf-{sanitize_mcp_name(name)[: (MAX_MCP_SERVER_NAME_LENGTH - 4)]}": server_config}
|
|
448
410
|
}
|
|
449
411
|
|
|
450
412
|
server_name = f"lf-{sanitize_mcp_name(name)[: (MAX_MCP_SERVER_NAME_LENGTH - 4)]}"
|
|
451
|
-
logger.
|
|
413
|
+
await logger.adebug("Installing MCP config for project: %s (server name: %s)", project.name, server_name)
|
|
452
414
|
|
|
453
415
|
# Determine the config file path based on the client and OS
|
|
454
416
|
if body.client.lower() == "cursor":
|
|
@@ -500,7 +462,7 @@ async def install_mcp_config(
|
|
|
500
462
|
status_code=400, detail="Windows C: drive not mounted at /mnt/c in WSL"
|
|
501
463
|
)
|
|
502
464
|
except (OSError, CalledProcessError) as e:
|
|
503
|
-
logger.
|
|
465
|
+
await logger.awarning("Failed to determine Windows user path in WSL: %s", str(e))
|
|
504
466
|
raise HTTPException(
|
|
505
467
|
status_code=400, detail=f"Could not determine Windows Claude config path in WSL: {e!s}"
|
|
506
468
|
) from e
|
|
@@ -536,11 +498,11 @@ async def install_mcp_config(
|
|
|
536
498
|
|
|
537
499
|
except Exception as e:
|
|
538
500
|
msg = f"Error installing MCP configuration: {e!s}"
|
|
539
|
-
logger.
|
|
501
|
+
await logger.aexception(msg)
|
|
540
502
|
raise HTTPException(status_code=500, detail=str(e)) from e
|
|
541
503
|
else:
|
|
542
504
|
message = f"Successfully installed MCP configuration for {body.client}"
|
|
543
|
-
logger.
|
|
505
|
+
await logger.ainfo(message)
|
|
544
506
|
return {"message": message}
|
|
545
507
|
|
|
546
508
|
|
|
@@ -564,7 +526,7 @@ async def check_installed_mcp_servers(
|
|
|
564
526
|
name = project.name
|
|
565
527
|
project_server_name = f"lf-{sanitize_mcp_name(name)[: (MAX_MCP_SERVER_NAME_LENGTH - 4)]}"
|
|
566
528
|
|
|
567
|
-
logger.
|
|
529
|
+
await logger.adebug(
|
|
568
530
|
"Checking for installed MCP servers for project: %s (server name: %s)", project.name, project_server_name
|
|
569
531
|
)
|
|
570
532
|
|
|
@@ -573,26 +535,28 @@ async def check_installed_mcp_servers(
|
|
|
573
535
|
|
|
574
536
|
# Check Cursor configuration
|
|
575
537
|
cursor_config_path = Path.home() / ".cursor" / "mcp.json"
|
|
576
|
-
logger.
|
|
538
|
+
await logger.adebug(
|
|
539
|
+
"Checking Cursor config at: %s (exists: %s)", cursor_config_path, cursor_config_path.exists()
|
|
540
|
+
)
|
|
577
541
|
if cursor_config_path.exists():
|
|
578
542
|
try:
|
|
579
543
|
with cursor_config_path.open("r") as f:
|
|
580
544
|
cursor_config = json.load(f)
|
|
581
545
|
if "mcpServers" in cursor_config and project_server_name in cursor_config["mcpServers"]:
|
|
582
|
-
logger.
|
|
546
|
+
await logger.adebug("Found Cursor config for project server: %s", project_server_name)
|
|
583
547
|
results.append("cursor")
|
|
584
548
|
else:
|
|
585
|
-
logger.
|
|
549
|
+
await logger.adebug(
|
|
586
550
|
"Cursor config exists but no entry for server: %s (available servers: %s)",
|
|
587
551
|
project_server_name,
|
|
588
552
|
list(cursor_config.get("mcpServers", {}).keys()),
|
|
589
553
|
)
|
|
590
554
|
except json.JSONDecodeError:
|
|
591
|
-
logger.
|
|
555
|
+
await logger.awarning("Failed to parse Cursor config JSON at: %s", cursor_config_path)
|
|
592
556
|
|
|
593
557
|
# Check Windsurf configuration
|
|
594
558
|
windsurf_config_path = Path.home() / ".codeium" / "windsurf" / "mcp_config.json"
|
|
595
|
-
logger.
|
|
559
|
+
await logger.adebug(
|
|
596
560
|
"Checking Windsurf config at: %s (exists: %s)", windsurf_config_path, windsurf_config_path.exists()
|
|
597
561
|
)
|
|
598
562
|
if windsurf_config_path.exists():
|
|
@@ -600,16 +564,16 @@ async def check_installed_mcp_servers(
|
|
|
600
564
|
with windsurf_config_path.open("r") as f:
|
|
601
565
|
windsurf_config = json.load(f)
|
|
602
566
|
if "mcpServers" in windsurf_config and project_server_name in windsurf_config["mcpServers"]:
|
|
603
|
-
logger.
|
|
567
|
+
await logger.adebug("Found Windsurf config for project server: %s", project_server_name)
|
|
604
568
|
results.append("windsurf")
|
|
605
569
|
else:
|
|
606
|
-
logger.
|
|
570
|
+
await logger.adebug(
|
|
607
571
|
"Windsurf config exists but no entry for server: %s (available servers: %s)",
|
|
608
572
|
project_server_name,
|
|
609
573
|
list(windsurf_config.get("mcpServers", {}).keys()),
|
|
610
574
|
)
|
|
611
575
|
except json.JSONDecodeError:
|
|
612
|
-
logger.
|
|
576
|
+
await logger.awarning("Failed to parse Windsurf config JSON at: %s", windsurf_config_path)
|
|
613
577
|
|
|
614
578
|
# Check Claude configuration
|
|
615
579
|
claude_config_path = None
|
|
@@ -654,7 +618,7 @@ async def check_installed_mcp_servers(
|
|
|
654
618
|
user_dirs[0] / "AppData" / "Roaming" / "Claude" / "claude_desktop_config.json"
|
|
655
619
|
)
|
|
656
620
|
except (OSError, CalledProcessError) as e:
|
|
657
|
-
logger.
|
|
621
|
+
await logger.awarning(
|
|
658
622
|
"Failed to determine Windows user path in WSL for checking Claude config: %s", str(e)
|
|
659
623
|
)
|
|
660
624
|
# Don't set claude_config_path, so it will be skipped
|
|
@@ -663,27 +627,27 @@ async def check_installed_mcp_servers(
|
|
|
663
627
|
claude_config_path = Path(os.environ["APPDATA"]) / "Claude" / "claude_desktop_config.json"
|
|
664
628
|
|
|
665
629
|
if claude_config_path and claude_config_path.exists():
|
|
666
|
-
logger.
|
|
630
|
+
await logger.adebug("Checking Claude config at: %s", claude_config_path)
|
|
667
631
|
try:
|
|
668
632
|
with claude_config_path.open("r") as f:
|
|
669
633
|
claude_config = json.load(f)
|
|
670
634
|
if "mcpServers" in claude_config and project_server_name in claude_config["mcpServers"]:
|
|
671
|
-
logger.
|
|
635
|
+
await logger.adebug("Found Claude config for project server: %s", project_server_name)
|
|
672
636
|
results.append("claude")
|
|
673
637
|
else:
|
|
674
|
-
logger.
|
|
638
|
+
await logger.adebug(
|
|
675
639
|
"Claude config exists but no entry for server: %s (available servers: %s)",
|
|
676
640
|
project_server_name,
|
|
677
641
|
list(claude_config.get("mcpServers", {}).keys()),
|
|
678
642
|
)
|
|
679
643
|
except json.JSONDecodeError:
|
|
680
|
-
logger.
|
|
644
|
+
await logger.awarning("Failed to parse Claude config JSON at: %s", claude_config_path)
|
|
681
645
|
else:
|
|
682
|
-
logger.
|
|
646
|
+
await logger.adebug("Claude config path not found or doesn't exist: %s", claude_config_path)
|
|
683
647
|
|
|
684
648
|
except Exception as e:
|
|
685
649
|
msg = f"Error checking MCP configuration: {e!s}"
|
|
686
|
-
logger.
|
|
650
|
+
await logger.aexception(msg)
|
|
687
651
|
raise HTTPException(status_code=500, detail=str(e)) from e
|
|
688
652
|
return results
|
|
689
653
|
|
|
@@ -750,11 +714,11 @@ async def init_mcp_servers():
|
|
|
750
714
|
try:
|
|
751
715
|
get_project_sse(project.id)
|
|
752
716
|
get_project_mcp_server(project.id)
|
|
753
|
-
except Exception as e:
|
|
717
|
+
except Exception as e: # noqa: BLE001
|
|
754
718
|
msg = f"Failed to initialize MCP server for project {project.id}: {e}"
|
|
755
|
-
logger.
|
|
719
|
+
await logger.aexception(msg)
|
|
756
720
|
# Continue to next project even if this one fails
|
|
757
721
|
|
|
758
|
-
except Exception as e:
|
|
722
|
+
except Exception as e: # noqa: BLE001
|
|
759
723
|
msg = f"Failed to initialize MCP servers: {e}"
|
|
760
|
-
logger.
|
|
724
|
+
await logger.aexception(msg)
|
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,12 +444,8 @@ class CancelFlowResponse(BaseModel):
|
|
|
444
444
|
class AuthSettings(BaseModel):
|
|
445
445
|
"""Model representing authentication settings for MCP."""
|
|
446
446
|
|
|
447
|
-
auth_type: Literal["none", "apikey", "
|
|
447
|
+
auth_type: Literal["none", "apikey", "oauth"] = "none"
|
|
448
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
|
|
453
449
|
oauth_host: str | None = None
|
|
454
450
|
oauth_port: str | None = None
|
|
455
451
|
oauth_server_url: 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
|
|