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/chat.py
CHANGED
|
@@ -6,23 +6,10 @@ import traceback
|
|
|
6
6
|
import uuid
|
|
7
7
|
from typing import TYPE_CHECKING, Annotated
|
|
8
8
|
|
|
9
|
-
from fastapi import
|
|
10
|
-
APIRouter,
|
|
11
|
-
BackgroundTasks,
|
|
12
|
-
Body,
|
|
13
|
-
Depends,
|
|
14
|
-
HTTPException,
|
|
15
|
-
Request,
|
|
16
|
-
status,
|
|
17
|
-
)
|
|
9
|
+
from fastapi import APIRouter, BackgroundTasks, Body, Depends, HTTPException, Request, status
|
|
18
10
|
from fastapi.responses import StreamingResponse
|
|
19
|
-
from loguru import logger
|
|
20
11
|
|
|
21
|
-
from langflow.api.build import
|
|
22
|
-
cancel_flow_build,
|
|
23
|
-
get_flow_events_response,
|
|
24
|
-
start_flow_build,
|
|
25
|
-
)
|
|
12
|
+
from langflow.api.build import cancel_flow_build, get_flow_events_response, start_flow_build
|
|
26
13
|
from langflow.api.limited_background_tasks import LimitVertexBuildBackgroundTasks
|
|
27
14
|
from langflow.api.utils import (
|
|
28
15
|
CurrentActiveUser,
|
|
@@ -48,6 +35,7 @@ from langflow.api.v1.schemas import (
|
|
|
48
35
|
from langflow.exceptions.component import ComponentBuildError
|
|
49
36
|
from langflow.graph.graph.base import Graph
|
|
50
37
|
from langflow.graph.utils import log_vertex_build
|
|
38
|
+
from langflow.logging.logger import logger
|
|
51
39
|
from langflow.schema.schema import OutputValue
|
|
52
40
|
from langflow.services.cache.utils import CacheMiss
|
|
53
41
|
from langflow.services.chat.service import ChatService
|
|
@@ -135,7 +123,7 @@ async def retrieve_vertices_order(
|
|
|
135
123
|
)
|
|
136
124
|
if "stream or streaming set to True" in str(exc):
|
|
137
125
|
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
|
138
|
-
logger.
|
|
126
|
+
await logger.aexception("Error checking build status")
|
|
139
127
|
raise HTTPException(status_code=500, detail=str(exc)) from exc
|
|
140
128
|
|
|
141
129
|
|
|
@@ -239,17 +227,17 @@ async def cancel_build(
|
|
|
239
227
|
return CancelFlowResponse(success=False, message="Failed to cancel flow build")
|
|
240
228
|
except asyncio.CancelledError:
|
|
241
229
|
# If CancelledError reaches here, it means the task was not successfully cancelled
|
|
242
|
-
logger.
|
|
230
|
+
await logger.aerror(f"Failed to cancel flow build for job_id {job_id} (CancelledError caught)")
|
|
243
231
|
return CancelFlowResponse(success=False, message="Failed to cancel flow build")
|
|
244
232
|
except ValueError as exc:
|
|
245
233
|
# Job not found
|
|
246
234
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(exc)) from exc
|
|
247
235
|
except JobQueueNotFoundError as exc:
|
|
248
|
-
logger.
|
|
236
|
+
await logger.aerror(f"Job not found: {job_id}. Error: {exc!s}")
|
|
249
237
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Job not found: {exc!s}") from exc
|
|
250
238
|
except Exception as exc:
|
|
251
239
|
# Any other unexpected error
|
|
252
|
-
logger.
|
|
240
|
+
await logger.aexception(f"Error cancelling flow build for job_id {job_id}: {exc}")
|
|
253
241
|
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(exc)) from exc
|
|
254
242
|
|
|
255
243
|
|
|
@@ -297,7 +285,7 @@ async def build_vertex(
|
|
|
297
285
|
cache = await chat_service.get_cache(flow_id_str)
|
|
298
286
|
if isinstance(cache, CacheMiss):
|
|
299
287
|
# If there's no cache
|
|
300
|
-
logger.
|
|
288
|
+
await logger.awarning(f"No cache found for {flow_id_str}. Building graph starting at {vertex_id}")
|
|
301
289
|
graph = await build_graph_from_db(
|
|
302
290
|
flow_id=flow_id,
|
|
303
291
|
session=await anext(get_session()),
|
|
@@ -331,7 +319,7 @@ async def build_vertex(
|
|
|
331
319
|
tb = exc.formatted_traceback
|
|
332
320
|
else:
|
|
333
321
|
tb = traceback.format_exc()
|
|
334
|
-
logger.
|
|
322
|
+
await logger.aexception("Error building Component")
|
|
335
323
|
params = format_exception_message(exc)
|
|
336
324
|
message = {"errorMessage": params, "stackTrace": tb}
|
|
337
325
|
valid = False
|
|
@@ -408,7 +396,7 @@ async def build_vertex(
|
|
|
408
396
|
component_error_message=str(exc),
|
|
409
397
|
),
|
|
410
398
|
)
|
|
411
|
-
logger.
|
|
399
|
+
await logger.aexception("Error building Component")
|
|
412
400
|
message = parse_exception(exc)
|
|
413
401
|
raise HTTPException(status_code=500, detail=message) from exc
|
|
414
402
|
|
|
@@ -421,14 +409,14 @@ async def _stream_vertex(flow_id: str, vertex_id: str, chat_service: ChatService
|
|
|
421
409
|
try:
|
|
422
410
|
cache = await chat_service.get_cache(flow_id)
|
|
423
411
|
except Exception as exc: # noqa: BLE001
|
|
424
|
-
logger.
|
|
412
|
+
await logger.aexception("Error building Component")
|
|
425
413
|
yield str(StreamData(event="error", data={"error": str(exc)}))
|
|
426
414
|
return
|
|
427
415
|
|
|
428
416
|
if isinstance(cache, CacheMiss):
|
|
429
417
|
# If there's no cache
|
|
430
418
|
msg = f"No cache found for {flow_id}."
|
|
431
|
-
logger.
|
|
419
|
+
await logger.aerror(msg)
|
|
432
420
|
yield str(StreamData(event="error", data={"error": msg}))
|
|
433
421
|
return
|
|
434
422
|
else:
|
|
@@ -437,13 +425,13 @@ async def _stream_vertex(flow_id: str, vertex_id: str, chat_service: ChatService
|
|
|
437
425
|
try:
|
|
438
426
|
vertex: InterfaceVertex = graph.get_vertex(vertex_id)
|
|
439
427
|
except Exception as exc: # noqa: BLE001
|
|
440
|
-
logger.
|
|
428
|
+
await logger.aexception("Error building Component")
|
|
441
429
|
yield str(StreamData(event="error", data={"error": str(exc)}))
|
|
442
430
|
return
|
|
443
431
|
|
|
444
432
|
if not hasattr(vertex, "stream"):
|
|
445
433
|
msg = f"Vertex {vertex_id} does not support streaming"
|
|
446
|
-
logger.
|
|
434
|
+
await logger.aerror(msg)
|
|
447
435
|
yield str(StreamData(event="error", data={"error": msg}))
|
|
448
436
|
return
|
|
449
437
|
|
|
@@ -460,7 +448,7 @@ async def _stream_vertex(flow_id: str, vertex_id: str, chat_service: ChatService
|
|
|
460
448
|
yield str(stream_data)
|
|
461
449
|
|
|
462
450
|
elif not vertex.frozen or not vertex.built:
|
|
463
|
-
logger.
|
|
451
|
+
await logger.adebug(f"Streaming vertex {vertex_id}")
|
|
464
452
|
stream_data = StreamData(
|
|
465
453
|
event="message",
|
|
466
454
|
data={"message": f"Streaming vertex {vertex_id}"},
|
|
@@ -474,7 +462,7 @@ async def _stream_vertex(flow_id: str, vertex_id: str, chat_service: ChatService
|
|
|
474
462
|
)
|
|
475
463
|
yield str(stream_data)
|
|
476
464
|
except Exception as exc: # noqa: BLE001
|
|
477
|
-
logger.
|
|
465
|
+
await logger.aexception("Error building Component")
|
|
478
466
|
exc_message = parse_exception(exc)
|
|
479
467
|
if exc_message == "The message must be an iterator or an async iterator.":
|
|
480
468
|
exc_message = "This stream has already been closed."
|
|
@@ -487,11 +475,11 @@ async def _stream_vertex(flow_id: str, vertex_id: str, chat_service: ChatService
|
|
|
487
475
|
yield str(stream_data)
|
|
488
476
|
else:
|
|
489
477
|
msg = f"No result found for vertex {vertex_id}"
|
|
490
|
-
logger.
|
|
478
|
+
await logger.aerror(msg)
|
|
491
479
|
yield str(StreamData(event="error", data={"error": msg}))
|
|
492
480
|
return
|
|
493
481
|
finally:
|
|
494
|
-
logger.
|
|
482
|
+
await logger.adebug("Closing stream")
|
|
495
483
|
if graph:
|
|
496
484
|
await chat_service.set_cache(flow_id, graph)
|
|
497
485
|
yield str(StreamData(event="close", data={"message": "Stream closed"}))
|
|
@@ -625,7 +613,7 @@ async def build_public_tmp(
|
|
|
625
613
|
flow_name=flow_name or f"{client_id}_{flow_id}",
|
|
626
614
|
)
|
|
627
615
|
except Exception as exc:
|
|
628
|
-
logger.
|
|
616
|
+
await logger.aexception("Error building public flow")
|
|
629
617
|
if isinstance(exc, HTTPException):
|
|
630
618
|
raise
|
|
631
619
|
raise HTTPException(status_code=500, detail=str(exc)) from exc
|
langflow/api/v1/endpoints.py
CHANGED
|
@@ -11,7 +11,6 @@ import sqlalchemy as sa
|
|
|
11
11
|
from fastapi import APIRouter, BackgroundTasks, Body, Depends, HTTPException, Request, UploadFile, status
|
|
12
12
|
from fastapi.encoders import jsonable_encoder
|
|
13
13
|
from fastapi.responses import StreamingResponse
|
|
14
|
-
from loguru import logger
|
|
15
14
|
from sqlmodel import select
|
|
16
15
|
|
|
17
16
|
from langflow.api.utils import CurrentActiveUser, DbSession, parse_value
|
|
@@ -41,6 +40,7 @@ from langflow.graph.schema import RunOutputs
|
|
|
41
40
|
from langflow.helpers.flow import get_flow_by_id_or_endpoint_name
|
|
42
41
|
from langflow.helpers.user import get_user_by_flow_id_or_endpoint_name
|
|
43
42
|
from langflow.interface.initialize.loading import update_params_with_load_from_db_fields
|
|
43
|
+
from langflow.logging.logger import logger
|
|
44
44
|
from langflow.processing.process import process_tweaks, run_graph_internal
|
|
45
45
|
from langflow.schema.graph import Tweaks
|
|
46
46
|
from langflow.services.auth.utils import api_key_security, get_current_active_user
|
|
@@ -184,7 +184,7 @@ async def simple_run_flow_task(
|
|
|
184
184
|
)
|
|
185
185
|
|
|
186
186
|
except Exception: # noqa: BLE001
|
|
187
|
-
logger.
|
|
187
|
+
await logger.aexception(f"Error running flow {flow.id} task")
|
|
188
188
|
|
|
189
189
|
|
|
190
190
|
async def consume_and_yield(queue: asyncio.Queue, client_consumed_queue: asyncio.Queue) -> AsyncGenerator:
|
|
@@ -215,7 +215,7 @@ async def consume_and_yield(queue: asyncio.Queue, client_consumed_queue: asyncio
|
|
|
215
215
|
yield value
|
|
216
216
|
get_time_yield = time.time()
|
|
217
217
|
client_consumed_queue.put_nowait(event_id)
|
|
218
|
-
logger.
|
|
218
|
+
await logger.adebug(
|
|
219
219
|
f"consumed event {event_id} "
|
|
220
220
|
f"(time in queue, {get_time - put_time:.4f}, "
|
|
221
221
|
f"client {get_time_yield - get_time:.4f})"
|
|
@@ -264,7 +264,7 @@ async def run_flow_generator(
|
|
|
264
264
|
event_manager.on_end(data={"result": result.model_dump()})
|
|
265
265
|
await client_consumed_queue.get()
|
|
266
266
|
except (ValueError, InvalidChatInputError, SerializationError) as e:
|
|
267
|
-
logger.
|
|
267
|
+
await logger.aerror(f"Error running flow: {e}")
|
|
268
268
|
event_manager.on_error(data={"error": str(e)})
|
|
269
269
|
finally:
|
|
270
270
|
await event_manager.queue.put((None, None, time.time))
|
|
@@ -331,7 +331,7 @@ async def simplified_run_flow(
|
|
|
331
331
|
)
|
|
332
332
|
|
|
333
333
|
async def on_disconnect() -> None:
|
|
334
|
-
logger.
|
|
334
|
+
await logger.adebug("Client disconnected, closing tasks")
|
|
335
335
|
main_task.cancel()
|
|
336
336
|
|
|
337
337
|
return StreamingResponse(
|
|
@@ -414,7 +414,7 @@ async def webhook_run_flow(
|
|
|
414
414
|
"""
|
|
415
415
|
telemetry_service = get_telemetry_service()
|
|
416
416
|
start_time = time.perf_counter()
|
|
417
|
-
logger.
|
|
417
|
+
await logger.adebug("Received webhook request")
|
|
418
418
|
error_msg = ""
|
|
419
419
|
try:
|
|
420
420
|
try:
|
|
@@ -442,7 +442,7 @@ async def webhook_run_flow(
|
|
|
442
442
|
session_id=None,
|
|
443
443
|
)
|
|
444
444
|
|
|
445
|
-
logger.
|
|
445
|
+
await logger.adebug("Starting background task")
|
|
446
446
|
background_tasks.add_task(
|
|
447
447
|
simple_run_flow_task,
|
|
448
448
|
flow=flow,
|
|
@@ -553,7 +553,7 @@ async def experimental_run_flow(
|
|
|
553
553
|
except sa.exc.StatementError as exc:
|
|
554
554
|
# StatementError('(builtins.ValueError) badly formed hexadecimal UUID string')
|
|
555
555
|
if "badly formed hexadecimal UUID string" in str(exc):
|
|
556
|
-
logger.
|
|
556
|
+
await logger.aerror(f"Flow ID {flow_id_str} is not a valid UUID")
|
|
557
557
|
# This means the Flow ID is not a valid UUID which means it can't find the flow
|
|
558
558
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(exc)) from exc
|
|
559
559
|
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(exc)) from exc
|
|
@@ -600,7 +600,7 @@ async def experimental_run_flow(
|
|
|
600
600
|
async def process(_flow_id) -> None:
|
|
601
601
|
"""Endpoint to process an input with a given flow_id."""
|
|
602
602
|
# Raise a depreciation warning
|
|
603
|
-
logger.
|
|
603
|
+
await logger.awarning(
|
|
604
604
|
"The /process endpoint is deprecated and will be removed in a future version. Please use /run instead."
|
|
605
605
|
)
|
|
606
606
|
raise HTTPException(
|
|
@@ -643,7 +643,7 @@ async def create_upload_file(
|
|
|
643
643
|
file_path=file_path,
|
|
644
644
|
)
|
|
645
645
|
except Exception as exc:
|
|
646
|
-
logger.
|
|
646
|
+
await logger.aexception("Error saving file")
|
|
647
647
|
raise HTTPException(status_code=500, detail=str(exc)) from exc
|
|
648
648
|
|
|
649
649
|
|
langflow/api/v1/flows.py
CHANGED
|
@@ -55,7 +55,7 @@ async def _save_flow_to_fs(flow: Flow) -> None:
|
|
|
55
55
|
try:
|
|
56
56
|
await f.write(flow.model_dump_json())
|
|
57
57
|
except OSError:
|
|
58
|
-
logger.
|
|
58
|
+
await logger.aexception("Failed to write flow %s to path %s", flow.name, flow.fs_path)
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
async def _new_flow(
|
|
@@ -6,10 +6,10 @@ from pathlib import Path
|
|
|
6
6
|
import pandas as pd
|
|
7
7
|
from fastapi import APIRouter, HTTPException
|
|
8
8
|
from langchain_chroma import Chroma
|
|
9
|
-
from loguru import logger
|
|
10
9
|
from pydantic import BaseModel
|
|
11
10
|
|
|
12
11
|
from langflow.api.utils import CurrentActiveUser
|
|
12
|
+
from langflow.logging import logger
|
|
13
13
|
from langflow.services.deps import get_settings_service
|
|
14
14
|
|
|
15
15
|
router = APIRouter(tags=["Knowledge Bases"], prefix="/knowledge_bases")
|
|
@@ -330,7 +330,7 @@ async def list_knowledge_bases(current_user: CurrentActiveUser) -> list[Knowledg
|
|
|
330
330
|
|
|
331
331
|
except OSError as _:
|
|
332
332
|
# Log the exception and skip directories that can't be read
|
|
333
|
-
logger.
|
|
333
|
+
await logger.aexception("Error reading knowledge base directory '%s'", kb_dir)
|
|
334
334
|
continue
|
|
335
335
|
|
|
336
336
|
# Sort by name alphabetically
|
|
@@ -422,7 +422,7 @@ async def delete_knowledge_bases_bulk(request: BulkDeleteRequest, current_user:
|
|
|
422
422
|
shutil.rmtree(kb_path)
|
|
423
423
|
deleted_count += 1
|
|
424
424
|
except (OSError, PermissionError) as e:
|
|
425
|
-
logger.
|
|
425
|
+
await logger.aexception("Error deleting knowledge base '%s': %s", kb_name, e)
|
|
426
426
|
# Continue with other deletions even if one fails
|
|
427
427
|
|
|
428
428
|
if not_found_kbs and deleted_count == 0:
|
langflow/api/v1/mcp.py
CHANGED
|
@@ -4,7 +4,6 @@ import pydantic
|
|
|
4
4
|
from anyio import BrokenResourceError
|
|
5
5
|
from fastapi import APIRouter, HTTPException, Request, Response
|
|
6
6
|
from fastapi.responses import HTMLResponse, StreamingResponse
|
|
7
|
-
from loguru import logger
|
|
8
7
|
from mcp import types
|
|
9
8
|
from mcp.server import NotificationOptions, Server
|
|
10
9
|
from mcp.server.sse import SseServerTransport
|
|
@@ -18,6 +17,7 @@ from langflow.api.v1.mcp_utils import (
|
|
|
18
17
|
handle_mcp_errors,
|
|
19
18
|
handle_read_resource,
|
|
20
19
|
)
|
|
20
|
+
from langflow.logging.logger import logger
|
|
21
21
|
from langflow.services.deps import get_settings_service
|
|
22
22
|
|
|
23
23
|
router = APIRouter(prefix="/mcp", tags=["mcp"])
|
|
@@ -83,22 +83,22 @@ async def im_alive():
|
|
|
83
83
|
@router.get("/sse", response_class=StreamingResponse)
|
|
84
84
|
async def handle_sse(request: Request, current_user: CurrentActiveMCPUser):
|
|
85
85
|
msg = f"Starting SSE connection, server name: {server.name}"
|
|
86
|
-
logger.
|
|
86
|
+
await logger.ainfo(msg)
|
|
87
87
|
token = current_user_ctx.set(current_user)
|
|
88
88
|
try:
|
|
89
89
|
async with sse.connect_sse(request.scope, request.receive, request._send) as streams:
|
|
90
90
|
try:
|
|
91
91
|
msg = "Starting SSE connection"
|
|
92
|
-
logger.
|
|
92
|
+
await logger.adebug(msg)
|
|
93
93
|
msg = f"Stream types: read={type(streams[0])}, write={type(streams[1])}"
|
|
94
|
-
logger.
|
|
94
|
+
await logger.adebug(msg)
|
|
95
95
|
|
|
96
96
|
notification_options = NotificationOptions(
|
|
97
97
|
prompts_changed=True, resources_changed=True, tools_changed=True
|
|
98
98
|
)
|
|
99
99
|
init_options = server.create_initialization_options(notification_options)
|
|
100
100
|
msg = f"Initialization options: {init_options}"
|
|
101
|
-
logger.
|
|
101
|
+
await logger.adebug(msg)
|
|
102
102
|
|
|
103
103
|
try:
|
|
104
104
|
await server.run(streams[0], streams[1], init_options)
|
|
@@ -106,20 +106,20 @@ async def handle_sse(request: Request, current_user: CurrentActiveMCPUser):
|
|
|
106
106
|
validation_error = find_validation_error(exc)
|
|
107
107
|
if validation_error:
|
|
108
108
|
msg = "Validation error in MCP:" + str(validation_error)
|
|
109
|
-
logger.
|
|
109
|
+
await logger.adebug(msg)
|
|
110
110
|
else:
|
|
111
111
|
msg = f"Error in MCP: {exc!s}"
|
|
112
|
-
logger.
|
|
112
|
+
await logger.adebug(msg)
|
|
113
113
|
return
|
|
114
114
|
except BrokenResourceError:
|
|
115
115
|
# Handle gracefully when client disconnects
|
|
116
|
-
logger.
|
|
116
|
+
await logger.ainfo("Client disconnected from SSE connection")
|
|
117
117
|
except asyncio.CancelledError:
|
|
118
|
-
logger.
|
|
118
|
+
await logger.ainfo("SSE connection was cancelled")
|
|
119
119
|
raise
|
|
120
120
|
except Exception as e:
|
|
121
121
|
msg = f"Error in MCP: {e!s}"
|
|
122
|
-
logger.
|
|
122
|
+
await logger.aexception(msg)
|
|
123
123
|
raise
|
|
124
124
|
finally:
|
|
125
125
|
current_user_ctx.reset(token)
|
|
@@ -130,8 +130,8 @@ async def handle_messages(request: Request):
|
|
|
130
130
|
try:
|
|
131
131
|
await sse.handle_post_message(request.scope, request.receive, request._send)
|
|
132
132
|
except (BrokenResourceError, BrokenPipeError) as e:
|
|
133
|
-
logger.
|
|
133
|
+
await logger.ainfo("MCP Server disconnected")
|
|
134
134
|
raise HTTPException(status_code=404, detail=f"MCP Server disconnected, error: {e}") from e
|
|
135
135
|
except Exception as e:
|
|
136
|
-
logger.
|
|
136
|
+
await logger.aerror(f"Internal server error: {e}")
|
|
137
137
|
raise HTTPException(status_code=500, detail=f"Internal server error: {e}") from e
|