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.
Files changed (335) hide show
  1. langflow/__main__.py +1 -1
  2. langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py +24 -30
  3. langflow/alembic/versions/58b28437a398_modify_nullable.py +6 -6
  4. langflow/alembic/versions/79e675cb6752_change_datetime_type.py +24 -30
  5. langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py +12 -13
  6. langflow/api/build.py +21 -26
  7. langflow/api/health_check_router.py +3 -3
  8. langflow/api/utils.py +3 -3
  9. langflow/api/v1/callback.py +2 -2
  10. langflow/api/v1/chat.py +19 -31
  11. langflow/api/v1/endpoints.py +10 -10
  12. langflow/api/v1/flows.py +1 -1
  13. langflow/api/v1/knowledge_bases.py +3 -3
  14. langflow/api/v1/mcp.py +12 -12
  15. langflow/api/v1/mcp_projects.py +45 -81
  16. langflow/api/v1/mcp_utils.py +8 -8
  17. langflow/api/v1/schemas.py +1 -5
  18. langflow/api/v1/store.py +1 -1
  19. langflow/api/v1/validate.py +2 -2
  20. langflow/api/v1/voice_mode.py +58 -62
  21. langflow/api/v2/files.py +2 -2
  22. langflow/api/v2/mcp.py +10 -9
  23. langflow/base/composio/composio_base.py +21 -2
  24. langflow/base/data/docling_utils.py +194 -0
  25. langflow/base/embeddings/aiml_embeddings.py +1 -1
  26. langflow/base/flow_processing/utils.py +1 -2
  27. langflow/base/io/__init__.py +0 -1
  28. langflow/base/langwatch/utils.py +2 -1
  29. langflow/base/mcp/util.py +49 -47
  30. langflow/base/prompts/api_utils.py +1 -1
  31. langflow/base/tools/flow_tool.py +2 -2
  32. langflow/base/tools/run_flow.py +2 -6
  33. langflow/components/Notion/add_content_to_page.py +2 -2
  34. langflow/components/Notion/list_database_properties.py +2 -2
  35. langflow/components/Notion/list_pages.py +2 -2
  36. langflow/components/Notion/page_content_viewer.py +2 -2
  37. langflow/components/Notion/update_page_property.py +1 -1
  38. langflow/components/agentql/agentql_api.py +2 -10
  39. langflow/components/agents/agent.py +3 -3
  40. langflow/components/agents/mcp_component.py +14 -14
  41. langflow/components/anthropic/anthropic.py +5 -4
  42. langflow/components/assemblyai/assemblyai_get_subtitles.py +2 -2
  43. langflow/components/assemblyai/assemblyai_lemur.py +2 -2
  44. langflow/components/assemblyai/assemblyai_list_transcripts.py +2 -2
  45. langflow/components/assemblyai/assemblyai_poll_transcript.py +2 -2
  46. langflow/components/assemblyai/assemblyai_start_transcript.py +2 -2
  47. langflow/components/data/file.py +575 -55
  48. langflow/components/data/url.py +1 -1
  49. langflow/components/datastax/astra_assistant_manager.py +3 -3
  50. langflow/components/datastax/create_assistant.py +1 -2
  51. langflow/components/deactivated/merge_data.py +1 -2
  52. langflow/components/deactivated/sub_flow.py +6 -7
  53. langflow/components/deactivated/vectara_self_query.py +3 -3
  54. langflow/components/docling/__init__.py +0 -198
  55. langflow/components/docling/docling_inline.py +1 -1
  56. langflow/components/embeddings/text_embedder.py +3 -3
  57. langflow/components/firecrawl/firecrawl_extract_api.py +2 -9
  58. langflow/components/google/gmail.py +1 -1
  59. langflow/components/google/google_generative_ai.py +5 -11
  60. langflow/components/groq/groq.py +4 -3
  61. langflow/components/helpers/current_date.py +2 -3
  62. langflow/components/helpers/memory.py +1 -1
  63. langflow/components/ibm/watsonx.py +1 -1
  64. langflow/components/ibm/watsonx_embeddings.py +1 -1
  65. langflow/components/langwatch/langwatch.py +3 -3
  66. langflow/components/logic/flow_tool.py +2 -2
  67. langflow/components/logic/notify.py +1 -1
  68. langflow/components/logic/run_flow.py +2 -3
  69. langflow/components/logic/sub_flow.py +4 -5
  70. langflow/components/mem0/mem0_chat_memory.py +2 -8
  71. langflow/components/nvidia/nvidia.py +3 -3
  72. langflow/components/olivya/olivya.py +7 -7
  73. langflow/components/ollama/ollama.py +8 -6
  74. langflow/components/processing/batch_run.py +8 -8
  75. langflow/components/processing/data_operations.py +2 -2
  76. langflow/components/processing/merge_data.py +1 -2
  77. langflow/components/processing/message_to_data.py +2 -3
  78. langflow/components/processing/parse_json_data.py +1 -1
  79. langflow/components/prototypes/python_function.py +2 -3
  80. langflow/components/serpapi/serp.py +1 -1
  81. langflow/components/tavily/tavily_extract.py +1 -1
  82. langflow/components/tavily/tavily_search.py +1 -1
  83. langflow/components/tools/calculator.py +2 -2
  84. langflow/components/tools/python_code_structured_tool.py +3 -10
  85. langflow/components/tools/python_repl.py +2 -2
  86. langflow/components/tools/searxng.py +3 -3
  87. langflow/components/tools/serp_api.py +2 -2
  88. langflow/components/tools/tavily_search_tool.py +2 -2
  89. langflow/components/tools/yahoo_finance.py +1 -1
  90. langflow/components/twelvelabs/video_embeddings.py +4 -4
  91. langflow/components/vectorstores/local_db.py +1 -1
  92. langflow/components/yahoosearch/yahoo.py +1 -1
  93. langflow/components/youtube/trending.py +3 -4
  94. langflow/custom/attributes.py +2 -1
  95. langflow/custom/code_parser/code_parser.py +1 -1
  96. langflow/custom/custom_component/base_component.py +1 -1
  97. langflow/custom/custom_component/component.py +16 -2
  98. langflow/custom/directory_reader/directory_reader.py +7 -7
  99. langflow/custom/directory_reader/utils.py +1 -2
  100. langflow/custom/utils.py +30 -30
  101. langflow/events/event_manager.py +1 -1
  102. langflow/frontend/assets/{SlackIcon-CnvyOamQ.js → SlackIcon-BhW6H3JR.js} +1 -1
  103. langflow/frontend/assets/{Wikipedia-nyTEXdr2.js → Wikipedia-Dx5jbiy3.js} +1 -1
  104. langflow/frontend/assets/{Wolfram-BYMQkNSq.js → Wolfram-CIyonzwo.js} +1 -1
  105. langflow/frontend/assets/{index-HK3bVMYA.js → index-0XQqYgdG.js} +1 -1
  106. langflow/frontend/assets/{index-BZgXW854.js → index-1Q3VBqKn.js} +1 -1
  107. langflow/frontend/assets/{index-BQ6NUdMY.js → index-35sspuLu.js} +1 -1
  108. langflow/frontend/assets/{index-DPCzHdsC.js → index-7hzXChQz.js} +1 -1
  109. langflow/frontend/assets/{index-CFDvOtKC.js → index-8cuhogZP.js} +1 -1
  110. langflow/frontend/assets/{index-CYDAYm-i.js → index-B0m53xKd.js} +1 -1
  111. langflow/frontend/assets/{index-Q9vDw0Xl.js → index-B1XqWJhG.js} +1 -1
  112. langflow/frontend/assets/{index-Gkrq-vzm.js → index-B3KCdQ91.js} +1 -1
  113. langflow/frontend/assets/{index-DytJENYD.js → index-B7uEuOPK.js} +1 -1
  114. langflow/frontend/assets/{index-DkXy1WFo.js → index-B8UR8v-Q.js} +1 -1
  115. langflow/frontend/assets/{index-BChjg6Az.js → index-BD7Io1hL.js} +6 -6
  116. langflow/frontend/assets/{index-CyPvTB63.js → index-BDQrd7Tj.js} +1 -1
  117. langflow/frontend/assets/{index-BbJjt5m4.js → index-BDuk0d7P.js} +1 -1
  118. langflow/frontend/assets/{index-BBxAPk1y.js → index-BFQ8KFK0.js} +1 -1
  119. langflow/frontend/assets/{index-BqPpO6KG.js → index-BFf0HTFI.js} +1 -1
  120. langflow/frontend/assets/{index-yCHsaqs8.js → index-BHhnpSkW.js} +1 -1
  121. langflow/frontend/assets/{index-Bd6WtbKA.js → index-BKKrUElc.js} +1 -1
  122. langflow/frontend/assets/{index-DHq8TQPB.js → index-BKeZt2hQ.js} +1 -1
  123. langflow/frontend/assets/{index-BCCGvqay.js → index-BKlQbl-6.js} +1 -1
  124. langflow/frontend/assets/{index-Boso-xEw.js → index-BLYw9MK2.js} +1 -1
  125. langflow/frontend/assets/{index-DmMDPoi0.js → index-BLsVo9iW.js} +1 -1
  126. langflow/frontend/assets/{index-Car-zdor.js → index-BNQIbda3.js} +1 -1
  127. langflow/frontend/assets/{index-Dg-63Si_.js → index-BPR2mEFC.js} +1 -1
  128. langflow/frontend/assets/{index-CTrt1Q_j.js → index-BPfdqCc_.js} +1 -1
  129. langflow/frontend/assets/{index-CVQmT7ZL.js → index-BQrVDjR1.js} +1 -1
  130. langflow/frontend/assets/{index-BB15_iOb.js → index-BRmSeoWR.js} +1 -1
  131. langflow/frontend/assets/{index-BX5D-USa.js → index-BUse-kxM.js} +1 -1
  132. langflow/frontend/assets/{index-CaQ_H9ww.js → index-BVFaF7HW.js} +1 -1
  133. langflow/frontend/assets/{index-C26RqKWL.js → index-BWgIWfv2.js} +1 -1
  134. langflow/frontend/assets/{index-DbMFlnHE.js → index-BWt5xGeA.js} +1 -1
  135. langflow/frontend/assets/{index-Db71w3lq.js → index-BYhcGLTV.js} +1 -1
  136. langflow/frontend/assets/{index-DzW2mfkK.js → index-BYjw7Gk3.js} +1 -1
  137. langflow/frontend/assets/{index-DJB12jIC.js → index-BZFljdMa.js} +1 -1
  138. langflow/frontend/assets/{index-nVwHLjuV.js → index-BcAgItH4.js} +1 -1
  139. langflow/frontend/assets/{index-DkelbYy7.js → index-Bct1s6__.js} +1 -1
  140. langflow/frontend/assets/{index-ChXJpBz4.js → index-Bhv79Zso.js} +1 -1
  141. langflow/frontend/assets/{index-BxEuHa76.js → index-Bj3lSwvZ.js} +1 -1
  142. langflow/frontend/assets/{index-BkPYpfgw.js → index-Bk4mTwnI.js} +1 -1
  143. langflow/frontend/assets/{index-BvT7L317.js → index-BmIx1cws.js} +1 -1
  144. langflow/frontend/assets/{index-DIDDfmlJ.js → index-BmYJJ5YS.js} +1 -1
  145. langflow/frontend/assets/{index-C7QWbnLK.js → index-BnAFhkSN.js} +1 -1
  146. langflow/frontend/assets/{index-CJo_cyWW.js → index-Bo-ww0Bb.js} +1 -1
  147. langflow/frontend/assets/{index-DjQETUy8.js → index-BpmqDOeZ.js} +1 -1
  148. langflow/frontend/assets/{index-ya2uXE8v.js → index-BrVhdPZb.js} +1 -1
  149. langflow/frontend/assets/{index-DCRk27Tp.js → index-BvGQfVBD.js} +1 -1
  150. langflow/frontend/assets/{index-BTrsh9LS.js → index-Bwi4flFg.js} +1 -1
  151. langflow/frontend/assets/{index-BRxvproo.js → index-BzoRPtTY.js} +1 -1
  152. langflow/frontend/assets/{index-BIQQCMvz.js → index-C--IDAyc.js} +1 -1
  153. langflow/frontend/assets/{index-DfngcQxO.js → index-C0E3_MIK.js} +1 -1
  154. langflow/frontend/assets/{index-Bvxg4_ux.js → index-C27Jj_26.js} +1 -1
  155. langflow/frontend/assets/{index-D8lOi1GI.js → index-C2eQmQsn.js} +1 -1
  156. langflow/frontend/assets/{index-rXV1G1aB.js → index-C8K0r39B.js} +1 -1
  157. langflow/frontend/assets/{index-B3Sur4Z3.js → index-CEJNWPhA.js} +1 -1
  158. langflow/frontend/assets/{index-BR0bkVqX.js → index-CFNTYfFK.js} +1 -1
  159. langflow/frontend/assets/{index-Bnqod3vk.js → index-CMHpjHZl.js} +1 -1
  160. langflow/frontend/assets/{index-BLGYN-9b.js → index-CSu8KHOi.js} +1 -1
  161. langflow/frontend/assets/{index-BOB_zsjl.js → index-CUKmGsI6.js} +1 -1
  162. langflow/frontend/assets/{index-BzEUlaw_.js → index-CWYiSeWV.js} +1 -1
  163. langflow/frontend/assets/{index-DVlceYFD.js → index-CY7_TBTC.js} +1 -1
  164. langflow/frontend/assets/{index-D3DDfngy.js → index-CbnWRlYY.js} +1 -1
  165. langflow/frontend/assets/{index-cvZdgWHQ.js → index-CfPBgkqg.js} +1 -1
  166. langflow/frontend/assets/{index-Ui4xUImO.js → index-Cg53lrYh.js} +1 -1
  167. langflow/frontend/assets/{index-C6jri9Wm.js → index-CgU7KF4I.js} +1 -1
  168. langflow/frontend/assets/{index-BVEZDXxS.js → index-CgwykVGh.js} +1 -1
  169. langflow/frontend/assets/{index-BOeo01QB.js → index-Ch5r0oW6.js} +1 -1
  170. langflow/frontend/assets/{index-D6PSjHxP.js → index-CjsommIr.js} +1 -1
  171. langflow/frontend/assets/{index-pCQ_yw8m.js → index-CkK25zZO.js} +1 -1
  172. langflow/frontend/assets/{index-BFp_O-c9.js → index-CkjwSTSM.js} +1 -1
  173. langflow/frontend/assets/{index-Du_18NCU.js → index-CmSFKgiD.js} +1 -1
  174. langflow/frontend/assets/{index-BvwZfF2i.js → index-Cr5v2ave.js} +1 -1
  175. langflow/frontend/assets/{index-FUxmznS-.js → index-CrAF-31Y.js} +1 -1
  176. langflow/frontend/assets/{index-C-2hghRJ.js → index-CsLQiWNf.js} +1 -1
  177. langflow/frontend/assets/{index-C_TdzfAn.js → index-CuCM7Wu7.js} +1 -1
  178. langflow/frontend/assets/{index-D5_DsUJc.js → index-Cxy9sEpy.js} +1 -1
  179. langflow/frontend/assets/{index-C_veJlEb.js → index-CyP3py8K.js} +1 -1
  180. langflow/frontend/assets/{index-OazXJdEl.js → index-CzHzeZuA.js} +1 -1
  181. langflow/frontend/assets/{index-CvcEzq4x.js → index-D1oynC8a.js} +1 -1
  182. langflow/frontend/assets/{index-CZQ9rXNa.js → index-D4tjMhfY.js} +1 -1
  183. langflow/frontend/assets/{index-B1YN7oMV.js → index-D6CSIrp1.js} +1 -1
  184. langflow/frontend/assets/{index-DfxYyS3M.js → index-D9kwEzPB.js} +1 -1
  185. langflow/frontend/assets/{index-BbRm7beF.js → index-DDXsm8tz.js} +1 -1
  186. langflow/frontend/assets/{index-xuIrH2Dq.js → index-DDhJVVel.js} +1 -1
  187. langflow/frontend/assets/{index-CmplyEaa.js → index-DH6o91_s.js} +1 -1
  188. langflow/frontend/assets/{index-DnEGCgih.js → index-DHngW1k8.js} +1 -1
  189. langflow/frontend/assets/{index-ajRge-Mg.js → index-DIKUsGLF.js} +1 -1
  190. langflow/frontend/assets/{index-DpClkXIV.js → index-DJESSNJi.js} +1 -1
  191. langflow/frontend/assets/{index-8WdfSTTz.js → index-DMCWDJOl.js} +1 -1
  192. langflow/frontend/assets/{index-DZTC5pdT.js → index-DOEvKC2X.js} +1 -1
  193. langflow/frontend/assets/{index-DysKpOuj.js → index-DOQDkSoK.js} +1 -1
  194. langflow/frontend/assets/{index-C82JjCPD.js → index-DXAfIEvs.js} +1 -1
  195. langflow/frontend/assets/{index-D8GJngXa.js → index-DZP_SaHb.js} +1 -1
  196. langflow/frontend/assets/{index-DIkNW9Cd.js → index-DZxUIhWh.js} +1 -1
  197. langflow/frontend/assets/{index-DK1Ptcc4.js → index-Dda2u_yz.js} +1 -1
  198. langflow/frontend/assets/{index-BWmPX4iQ.js → index-Dg8N3NSO.js} +1 -1
  199. langflow/frontend/assets/{index-CWdkbVsd.js → index-DkGhPNeA.js} +1 -1
  200. langflow/frontend/assets/{index-DF5VwgU6.js → index-Dka_Rk4-.js} +1 -1
  201. langflow/frontend/assets/{index-Bsa0xZyL.js → index-DljpLeCW.js} +1 -1
  202. langflow/frontend/assets/{index-CLPdN-q6.js → index-DnVYJtVO.js} +1 -1
  203. langflow/frontend/assets/{index-CxvP91st.js → index-DqbzUcI5.js} +1 -1
  204. langflow/frontend/assets/{index-BIzTEqFh.js → index-Dr6pVDPI.js} +1 -1
  205. langflow/frontend/assets/{index-tVYiABdp.js → index-DsoX2o1S.js} +1 -1
  206. langflow/frontend/assets/{index-CCePCqkT.js → index-DwfHWnX7.js} +1 -1
  207. langflow/frontend/assets/{index-BEMw2Np8.js → index-Dx-Z87KT.js} +1 -1
  208. langflow/frontend/assets/{index-BRYjyhAd.js → index-DyqITq51.js} +1 -1
  209. langflow/frontend/assets/{index-l7bzB8Ex.js → index-DzIv3RyR.js} +1 -1
  210. langflow/frontend/assets/{index-D-9TI74R.js → index-G4ro0MjT.js} +1 -1
  211. langflow/frontend/assets/{index-CCxGSSTT.js → index-H7J7w7fa.js} +1 -1
  212. langflow/frontend/assets/{index-_UcqeEjm.js → index-KWY77KfV.js} +1 -1
  213. langflow/frontend/assets/{index-Dqd4RjYA.js → index-U9GWm1eH.js} +1 -1
  214. langflow/frontend/assets/{index-Dq5ilsem.js → index-Un9pWxnP.js} +1 -1
  215. langflow/frontend/assets/{index-BzL_EoKd.js → index-Xi4TplbI.js} +1 -1
  216. langflow/frontend/assets/{index-LbYjHKkn.js → index-_cbGmjF4.js} +1 -1
  217. langflow/frontend/assets/{index-DGRMNe9n.js → index-cEXY6V06.js} +1 -1
  218. langflow/frontend/assets/{index-8yMsjVV2.js → index-dyXKnkMi.js} +1 -1
  219. langflow/frontend/assets/{index-DKHNourL.js → index-eUkS6iJM.js} +1 -1
  220. langflow/frontend/assets/{index-Bv8h2Z-q.js → index-ekfMOqrF.js} +1 -1
  221. langflow/frontend/assets/{index-B748uLP1.js → index-gdb7XMS8.js} +1 -1
  222. langflow/frontend/assets/{index-CpvYQ0ug.js → index-hZUcL0MZ.js} +1 -1
  223. langflow/frontend/assets/{index-BIXaW2aY.js → index-kkA-qHB_.js} +1 -1
  224. langflow/frontend/assets/{index-BhIOhlCH.js → index-mzl9ULw5.js} +1 -1
  225. langflow/frontend/assets/{index-CYe8Ipef.js → index-oxHBZk2v.js} +1 -1
  226. langflow/frontend/assets/{index-WPFivmdQ.js → index-p2kStSPe.js} +1 -1
  227. langflow/frontend/assets/{index-BmX5CoED.js → index-paQEWYGT.js} +1 -1
  228. langflow/frontend/assets/{index-CpcbQZIF.js → index-r_8gs4nL.js} +1 -1
  229. langflow/frontend/assets/{index-dcnYpT9N.js → index-uiKla4UR.js} +1 -1
  230. langflow/frontend/assets/{index-BTEW9e8P.js → index-vJOO5U8M.js} +1 -1
  231. langflow/frontend/assets/{index-CQMoqLAu.js → index-w72fDjpG.js} +1 -1
  232. langflow/frontend/assets/{index-Dsps-jKu.js → index-zV82kQ6k.js} +1 -1
  233. langflow/frontend/assets/lazyIconImports-DTNgvPE-.js +2 -0
  234. langflow/frontend/assets/{use-post-add-user-BrBYH9eR.js → use-post-add-user-CvtuazTg.js} +1 -1
  235. langflow/frontend/index.html +1 -1
  236. langflow/graph/edge/base.py +2 -3
  237. langflow/graph/graph/base.py +14 -12
  238. langflow/graph/graph/constants.py +3 -0
  239. langflow/graph/utils.py +6 -6
  240. langflow/graph/vertex/base.py +4 -5
  241. langflow/graph/vertex/param_handler.py +1 -1
  242. langflow/graph/vertex/vertex_types.py +2 -2
  243. langflow/helpers/flow.py +1 -1
  244. langflow/initial_setup/setup.py +32 -30
  245. langflow/initial_setup/starter_projects/Blog Writer.json +2 -2
  246. langflow/initial_setup/starter_projects/Custom Component Generator.json +2 -2
  247. langflow/initial_setup/starter_projects/Document Q&A.json +1 -1
  248. langflow/initial_setup/starter_projects/Instagram Copywriter.json +3 -3
  249. langflow/initial_setup/starter_projects/Invoice Summarizer.json +1 -1
  250. langflow/initial_setup/starter_projects/Knowledge Ingestion.json +2 -2
  251. langflow/initial_setup/starter_projects/Market Research.json +3 -3
  252. langflow/initial_setup/starter_projects/Meeting Summary.json +6 -6
  253. langflow/initial_setup/starter_projects/Memory Chatbot.json +2 -2
  254. langflow/initial_setup/starter_projects/News Aggregator.json +3 -3
  255. langflow/initial_setup/starter_projects/Nvidia Remix.json +3 -3
  256. langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +1 -1
  257. langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json +1 -1
  258. langflow/initial_setup/starter_projects/Price Deal Finder.json +5 -5
  259. langflow/initial_setup/starter_projects/Research Agent.json +3 -3
  260. langflow/initial_setup/starter_projects/SaaS Pricing.json +1 -1
  261. langflow/initial_setup/starter_projects/Search agent.json +1 -1
  262. langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +7 -7
  263. langflow/initial_setup/starter_projects/Simple Agent.json +3 -3
  264. langflow/initial_setup/starter_projects/Social Media Agent.json +1 -1
  265. langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +1 -1
  266. langflow/initial_setup/starter_projects/Travel Planning Agents.json +3 -3
  267. langflow/initial_setup/starter_projects/Vector Store RAG.json +1 -1
  268. langflow/initial_setup/starter_projects/Youtube Analysis.json +3 -3
  269. langflow/interface/components.py +23 -22
  270. langflow/interface/initialize/loading.py +5 -5
  271. langflow/interface/run.py +1 -1
  272. langflow/interface/utils.py +1 -1
  273. langflow/io/__init__.py +0 -1
  274. langflow/langflow_launcher.py +1 -1
  275. langflow/load/load.py +2 -7
  276. langflow/logging/__init__.py +0 -1
  277. langflow/logging/logger.py +191 -115
  278. langflow/logging/setup.py +1 -1
  279. langflow/main.py +37 -52
  280. langflow/memory.py +7 -7
  281. langflow/middleware.py +1 -1
  282. langflow/processing/process.py +3 -3
  283. langflow/schema/artifact.py +2 -2
  284. langflow/schema/data.py +10 -2
  285. langflow/schema/dataframe.py +1 -1
  286. langflow/schema/message.py +1 -1
  287. langflow/serialization/serialization.py +1 -1
  288. langflow/services/auth/utils.py +2 -2
  289. langflow/services/cache/disk.py +1 -1
  290. langflow/services/cache/service.py +3 -3
  291. langflow/services/database/models/flow/model.py +2 -7
  292. langflow/services/database/models/transactions/crud.py +2 -2
  293. langflow/services/database/models/user/crud.py +2 -2
  294. langflow/services/database/service.py +8 -8
  295. langflow/services/database/utils.py +6 -5
  296. langflow/services/deps.py +2 -3
  297. langflow/services/factory.py +1 -1
  298. langflow/services/flow/flow_runner.py +7 -12
  299. langflow/services/job_queue/service.py +16 -15
  300. langflow/services/manager.py +3 -4
  301. langflow/services/settings/auth.py +1 -1
  302. langflow/services/settings/base.py +3 -8
  303. langflow/services/settings/manager.py +1 -1
  304. langflow/services/settings/utils.py +1 -1
  305. langflow/services/socket/__init__.py +0 -1
  306. langflow/services/socket/service.py +3 -3
  307. langflow/services/socket/utils.py +4 -4
  308. langflow/services/state/service.py +1 -2
  309. langflow/services/storage/factory.py +1 -1
  310. langflow/services/storage/local.py +9 -8
  311. langflow/services/storage/s3.py +11 -10
  312. langflow/services/store/service.py +3 -3
  313. langflow/services/store/utils.py +3 -2
  314. langflow/services/task/temp_flow_cleanup.py +7 -7
  315. langflow/services/telemetry/service.py +10 -10
  316. langflow/services/tracing/arize_phoenix.py +2 -2
  317. langflow/services/tracing/langfuse.py +1 -1
  318. langflow/services/tracing/langsmith.py +1 -1
  319. langflow/services/tracing/langwatch.py +1 -1
  320. langflow/services/tracing/opik.py +1 -1
  321. langflow/services/tracing/service.py +25 -6
  322. langflow/services/tracing/traceloop.py +245 -0
  323. langflow/services/utils.py +7 -7
  324. langflow/services/variable/kubernetes.py +3 -3
  325. langflow/services/variable/kubernetes_secrets.py +2 -1
  326. langflow/services/variable/service.py +5 -5
  327. langflow/utils/component_utils.py +9 -6
  328. langflow/utils/util.py +5 -5
  329. langflow/utils/validate.py +3 -3
  330. langflow/utils/voice_utils.py +2 -2
  331. {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev38.dist-info}/METADATA +2 -1
  332. {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev38.dist-info}/RECORD +334 -333
  333. langflow/frontend/assets/lazyIconImports-t6wEndt1.js +0 -2
  334. {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev38.dist-info}/WHEEL +0 -0
  335. {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev38.dist-info}/entry_points.txt +0 -0
@@ -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.warning(msg)
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.exception(msg)
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.debug("Project MCP server name: %s", project_server.server.name)
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.debug("Starting SSE connection for project %s", project_id)
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.exception("Error in project MCP")
172
+ except Exception: # noqa: BLE001
173
+ await logger.aexception("Error in project MCP")
182
174
  except BrokenResourceError:
183
- logger.info("Client disconnected from project SSE connection")
175
+ await logger.ainfo("Client disconnected from project SSE connection")
184
176
  except asyncio.CancelledError:
185
- logger.info("Project SSE connection was cancelled")
177
+ await logger.ainfo("Project SSE connection was cancelled")
186
178
  raise
187
179
  except Exception:
188
- logger.exception("Error in project MCP")
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.info("Project MCP Server disconnected for project %s", project_id)
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.exception(msg)
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.debug("WSL detected, using Windows-specific configuration")
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.debug("Using WSL IP for external access: %s", wsl_ip)
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.warning("Failed to get WSL IP address: %s. Using default URL.", str(e))
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 = [mcp_tool, sse_url]
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.debug("Windows detected, using cmd command")
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.debug("Installing MCP config for project: %s (server name: %s)", project.name, server_name)
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.warning("Failed to determine Windows user path in WSL: %s", str(e))
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.exception(msg)
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.info(message)
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.debug(
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.debug("Checking Cursor config at: %s (exists: %s)", cursor_config_path, cursor_config_path.exists())
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.debug("Found Cursor config for project server: %s", project_server_name)
546
+ await logger.adebug("Found Cursor config for project server: %s", project_server_name)
583
547
  results.append("cursor")
584
548
  else:
585
- logger.debug(
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.warning("Failed to parse Cursor config JSON at: %s", cursor_config_path)
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.debug(
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.debug("Found Windsurf config for project server: %s", project_server_name)
567
+ await logger.adebug("Found Windsurf config for project server: %s", project_server_name)
604
568
  results.append("windsurf")
605
569
  else:
606
- logger.debug(
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.warning("Failed to parse Windsurf config JSON at: %s", windsurf_config_path)
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.warning(
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.debug("Checking Claude config at: %s", claude_config_path)
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.debug("Found Claude config for project server: %s", project_server_name)
635
+ await logger.adebug("Found Claude config for project server: %s", project_server_name)
672
636
  results.append("claude")
673
637
  else:
674
- logger.debug(
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.warning("Failed to parse Claude config JSON at: %s", claude_config_path)
644
+ await logger.awarning("Failed to parse Claude config JSON at: %s", claude_config_path)
681
645
  else:
682
- logger.debug("Claude config path not found or doesn't exist: %s", claude_config_path)
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.exception(msg)
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.exception(msg)
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.exception(msg)
724
+ await logger.aexception(msg)
@@ -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.exception(msg)
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.debug(msg)
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.exception(msg)
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.exception(msg)
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.exception(msg)
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.warning(msg)
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.exception(msg)
346
+ await logger.aexception(msg)
347
347
  raise
348
348
  return tools
@@ -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", "basic", "bearer", "iam", "oauth"] = "none"
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
@@ -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.opt(exception=True).debug("Error validating code")
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