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
langflow/main.py CHANGED
@@ -17,7 +17,6 @@ from fastapi.middleware.cors import CORSMiddleware
17
17
  from fastapi.responses import FileResponse, JSONResponse
18
18
  from fastapi.staticfiles import StaticFiles
19
19
  from fastapi_pagination import add_pagination
20
- from loguru import logger
21
20
  from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
22
21
  from pydantic import PydanticDeprecatedSince20
23
22
  from pydantic_core import PydanticSerializationError
@@ -34,13 +33,9 @@ from langflow.initial_setup.setup import (
34
33
  )
35
34
  from langflow.interface.components import get_and_cache_all_types_dict
36
35
  from langflow.interface.utils import setup_llm_caching
37
- from langflow.logging.logger import configure
36
+ from langflow.logging.logger import configure, logger
38
37
  from langflow.middleware import ContentSizeLimitMiddleware
39
- from langflow.services.deps import (
40
- get_queue_service,
41
- get_settings_service,
42
- get_telemetry_service,
43
- )
38
+ from langflow.services.deps import get_queue_service, get_settings_service, get_telemetry_service
44
39
  from langflow.services.utils import initialize_services, teardown_services
45
40
 
46
41
  if TYPE_CHECKING:
@@ -60,7 +55,7 @@ async def log_exception_to_telemetry(exc: Exception, context: str) -> None:
60
55
  telemetry_service = get_telemetry_service()
61
56
  await telemetry_service.log_exception(exc, context)
62
57
  except (httpx.HTTPError, asyncio.QueueFull):
63
- logger.warning(f"Failed to log {context} exception to telemetry")
58
+ await logger.awarning(f"Failed to log {context} exception to telemetry")
64
59
 
65
60
 
66
61
  class RequestCancelledMiddleware(BaseHTTPMiddleware):
@@ -115,7 +110,7 @@ async def load_bundles_with_error_handling():
115
110
  try:
116
111
  return await load_bundles_from_urls()
117
112
  except (httpx.TimeoutException, httpx.HTTPError, httpx.RequestError) as exc:
118
- logger.error(f"Error loading bundles from URLs: {exc}")
113
+ await logger.aerror(f"Error loading bundles from URLs: {exc}")
119
114
  return [], []
120
115
 
121
116
 
@@ -123,13 +118,13 @@ def get_lifespan(*, fix_migration=False, version=None):
123
118
  @asynccontextmanager
124
119
  async def lifespan(_app: FastAPI):
125
120
  telemetry_service = get_telemetry_service()
126
- configure(async_file=True)
121
+ configure()
127
122
 
128
123
  # Startup message
129
124
  if version:
130
- logger.debug(f"Starting Langflow v{version}...")
125
+ await logger.adebug(f"Starting Langflow v{version}...")
131
126
  else:
132
- logger.debug("Starting Langflow...")
127
+ await logger.adebug("Starting Langflow...")
133
128
 
134
129
  temp_dirs: list[TemporaryDirectory] = []
135
130
  sync_flows_from_fs_task = None
@@ -137,37 +132,37 @@ def get_lifespan(*, fix_migration=False, version=None):
137
132
  try:
138
133
  start_time = asyncio.get_event_loop().time()
139
134
 
140
- logger.debug("Initializing services")
135
+ await logger.adebug("Initializing services")
141
136
  await initialize_services(fix_migration=fix_migration)
142
- logger.debug(f"Services initialized in {asyncio.get_event_loop().time() - start_time:.2f}s")
137
+ await logger.adebug(f"Services initialized in {asyncio.get_event_loop().time() - start_time:.2f}s")
143
138
 
144
139
  current_time = asyncio.get_event_loop().time()
145
- logger.debug("Setting up LLM caching")
140
+ await logger.adebug("Setting up LLM caching")
146
141
  setup_llm_caching()
147
- logger.debug(f"LLM caching setup in {asyncio.get_event_loop().time() - current_time:.2f}s")
142
+ await logger.adebug(f"LLM caching setup in {asyncio.get_event_loop().time() - current_time:.2f}s")
148
143
 
149
144
  current_time = asyncio.get_event_loop().time()
150
- logger.debug("Initializing super user")
145
+ await logger.adebug("Initializing super user")
151
146
  await initialize_super_user_if_needed()
152
- logger.debug(f"Super user initialized in {asyncio.get_event_loop().time() - current_time:.2f}s")
147
+ await logger.adebug(f"Super user initialized in {asyncio.get_event_loop().time() - current_time:.2f}s")
153
148
 
154
149
  current_time = asyncio.get_event_loop().time()
155
- logger.debug("Loading bundles")
150
+ await logger.adebug("Loading bundles")
156
151
  temp_dirs, bundles_components_paths = await load_bundles_with_error_handling()
157
152
  get_settings_service().settings.components_path.extend(bundles_components_paths)
158
- logger.debug(f"Bundles loaded in {asyncio.get_event_loop().time() - current_time:.2f}s")
153
+ await logger.adebug(f"Bundles loaded in {asyncio.get_event_loop().time() - current_time:.2f}s")
159
154
 
160
155
  current_time = asyncio.get_event_loop().time()
161
- logger.debug("Caching types")
156
+ await logger.adebug("Caching types")
162
157
  all_types_dict = await get_and_cache_all_types_dict(get_settings_service())
163
- logger.debug(f"Types cached in {asyncio.get_event_loop().time() - current_time:.2f}s")
158
+ await logger.adebug(f"Types cached in {asyncio.get_event_loop().time() - current_time:.2f}s")
164
159
 
165
160
  # Use file-based lock to prevent multiple workers from creating duplicate starter projects concurrently.
166
161
  # Note that it's still possible that one worker may complete this task, release the lock,
167
162
  # then another worker pick it up, but the operation is idempotent so worst case it duplicates
168
163
  # the initialization work.
169
164
  current_time = asyncio.get_event_loop().time()
170
- logger.debug("Creating/updating starter projects")
165
+ await logger.adebug("Creating/updating starter projects")
171
166
  import tempfile
172
167
 
173
168
  from filelock import FileLock
@@ -177,42 +172,42 @@ def get_lifespan(*, fix_migration=False, version=None):
177
172
  try:
178
173
  with lock:
179
174
  await create_or_update_starter_projects(all_types_dict)
180
- logger.debug(
175
+ await logger.adebug(
181
176
  f"Starter projects created/updated in {asyncio.get_event_loop().time() - current_time:.2f}s"
182
177
  )
183
178
  except TimeoutError:
184
179
  # Another process has the lock
185
- logger.debug("Another worker is creating starter projects, skipping")
180
+ await logger.adebug("Another worker is creating starter projects, skipping")
186
181
  except Exception as e: # noqa: BLE001
187
- logger.warning(
182
+ await logger.awarning(
188
183
  f"Failed to acquire lock for starter projects: {e}. Starter projects may not be created or updated."
189
184
  )
190
185
 
191
186
  current_time = asyncio.get_event_loop().time()
192
- logger.debug("Starting telemetry service")
187
+ await logger.adebug("Starting telemetry service")
193
188
  telemetry_service.start()
194
- logger.debug(f"started telemetry service in {asyncio.get_event_loop().time() - current_time:.2f}s")
189
+ await logger.adebug(f"started telemetry service in {asyncio.get_event_loop().time() - current_time:.2f}s")
195
190
 
196
191
  current_time = asyncio.get_event_loop().time()
197
- logger.debug("Loading flows")
192
+ await logger.adebug("Loading flows")
198
193
  await load_flows_from_directory()
199
194
  sync_flows_from_fs_task = asyncio.create_task(sync_flows_from_fs())
200
195
  queue_service = get_queue_service()
201
196
  if not queue_service.is_started(): # Start if not already started
202
197
  queue_service.start()
203
- logger.debug(f"Flows loaded in {asyncio.get_event_loop().time() - current_time:.2f}s")
198
+ await logger.adebug(f"Flows loaded in {asyncio.get_event_loop().time() - current_time:.2f}s")
204
199
 
205
200
  current_time = asyncio.get_event_loop().time()
206
- logger.debug("Loading mcp servers for projects")
201
+ await logger.adebug("Loading mcp servers for projects")
207
202
  await init_mcp_servers()
208
- logger.debug(f"mcp servers loaded in {asyncio.get_event_loop().time() - current_time:.2f}s")
203
+ await logger.adebug(f"mcp servers loaded in {asyncio.get_event_loop().time() - current_time:.2f}s")
209
204
 
210
205
  total_time = asyncio.get_event_loop().time() - start_time
211
- logger.debug(f"Total initialization time: {total_time:.2f}s")
206
+ await logger.adebug(f"Total initialization time: {total_time:.2f}s")
212
207
  yield
213
208
 
214
209
  except asyncio.CancelledError:
215
- logger.debug("Lifespan received cancellation signal")
210
+ await logger.adebug("Lifespan received cancellation signal")
216
211
  except Exception as exc:
217
212
  if "langflow migration --fix" not in str(exc):
218
213
  logger.exception(exc)
@@ -234,7 +229,7 @@ def get_lifespan(*, fix_migration=False, version=None):
234
229
  try:
235
230
  # Step 0: Stopping Server
236
231
  with shutdown_progress.step(0):
237
- logger.debug("Stopping server gracefully...")
232
+ await logger.adebug("Stopping server gracefully...")
238
233
  # The actual server stopping is handled by the lifespan context
239
234
  await asyncio.sleep(0.1) # Brief pause for visual effect
240
235
 
@@ -249,7 +244,7 @@ def get_lifespan(*, fix_migration=False, version=None):
249
244
  try:
250
245
  await asyncio.wait_for(teardown_services(), timeout=10)
251
246
  except asyncio.TimeoutError:
252
- logger.warning("Teardown services timed out.")
247
+ await logger.awarning("Teardown services timed out.")
253
248
 
254
249
  # Step 3: Clearing Temporary Files
255
250
  with shutdown_progress.step(3):
@@ -258,31 +253,21 @@ def get_lifespan(*, fix_migration=False, version=None):
258
253
 
259
254
  # Step 4: Finalizing Shutdown
260
255
  with shutdown_progress.step(4):
261
- logger.debug("Langflow shutdown complete")
256
+ await logger.adebug("Langflow shutdown complete")
262
257
 
263
258
  # Show completion summary and farewell
264
259
  shutdown_progress.print_shutdown_summary()
265
260
 
266
261
  except (sqlalchemy.exc.OperationalError, sqlalchemy.exc.DBAPIError) as e:
267
262
  # Case where the database connection is closed during shutdown
268
- logger.warning(f"Database teardown failed due to closed connection: {e}")
269
- await log_exception_to_telemetry(e, "lifespan_database_teardown")
263
+ await logger.awarning(f"Database teardown failed due to closed connection: {e}")
270
264
  except asyncio.CancelledError:
271
265
  # Swallow this - it's normal during shutdown
272
- logger.debug("Teardown cancelled during shutdown.")
273
- raise
266
+ await logger.adebug("Teardown cancelled during shutdown.")
274
267
  except Exception as e: # noqa: BLE001
275
- logger.exception(f"Unhandled error during cleanup: {e}")
276
-
268
+ await logger.aexception(f"Unhandled error during cleanup: {e}")
277
269
  await log_exception_to_telemetry(e, "lifespan_cleanup")
278
270
 
279
- try:
280
- await asyncio.shield(asyncio.sleep(0.1)) # let logger flush async logs
281
- await asyncio.shield(logger.complete())
282
- except asyncio.CancelledError:
283
- # Cancellation during logger flush is possible during shutdown, so we swallow it
284
- pass
285
-
286
271
  return lifespan
287
272
 
288
273
 
@@ -388,12 +373,12 @@ def create_app():
388
373
  @app.exception_handler(Exception)
389
374
  async def exception_handler(_request: Request, exc: Exception):
390
375
  if isinstance(exc, HTTPException):
391
- logger.error(f"HTTPException: {exc}", exc_info=exc)
376
+ await logger.aerror(f"HTTPException: {exc}", exc_info=exc)
392
377
  return JSONResponse(
393
378
  status_code=exc.status_code,
394
379
  content={"message": str(exc.detail)},
395
380
  )
396
- logger.error(f"unhandled error: {exc}", exc_info=exc)
381
+ await logger.aerror(f"unhandled error: {exc}", exc_info=exc)
397
382
 
398
383
  await log_exception_to_telemetry(exc, "handler")
399
384
 
langflow/memory.py CHANGED
@@ -5,11 +5,11 @@ from uuid import UUID
5
5
 
6
6
  from langchain_core.chat_history import BaseChatMessageHistory
7
7
  from langchain_core.messages import BaseMessage
8
- from loguru import logger
9
8
  from sqlalchemy import delete
10
9
  from sqlmodel import col, select
11
10
  from sqlmodel.ext.asyncio.session import AsyncSession
12
11
 
12
+ from langflow.logging.logger import logger
13
13
  from langflow.schema.message import Message
14
14
  from langflow.services.database.models.message.model import MessageRead, MessageTable
15
15
  from langflow.services.deps import session_scope
@@ -123,7 +123,7 @@ async def aadd_messages(messages: Message | list[Message], flow_id: str | UUID |
123
123
  messages_models = await aadd_messagetables(messages_models, session)
124
124
  return [await Message.create(**message.model_dump()) for message in messages_models]
125
125
  except Exception as e:
126
- logger.exception(e)
126
+ await logger.aexception(e)
127
127
  raise
128
128
 
129
129
 
@@ -146,7 +146,7 @@ async def aupdate_messages(messages: Message | list[Message]) -> list[Message]:
146
146
  updated_messages.append(msg)
147
147
  else:
148
148
  error_message = f"Message with id {message.id} not found"
149
- logger.warning(error_message)
149
+ await logger.awarning(error_message)
150
150
  raise ValueError(error_message)
151
151
  return [MessageRead.model_validate(message, from_attributes=True) for message in updated_messages]
152
152
 
@@ -166,11 +166,11 @@ async def aadd_messagetables(messages: list[MessageTable], session: AsyncSession
166
166
  for message in messages:
167
167
  await session.refresh(message)
168
168
  except asyncio.CancelledError as e:
169
- logger.exception(e)
169
+ await logger.aexception(e)
170
170
  error_msg = "Operation cancelled"
171
171
  raise ValueError(error_msg) from e
172
172
  except Exception as e:
173
- logger.exception(e)
173
+ await logger.aexception(e)
174
174
  raise
175
175
 
176
176
  new_messages = []
@@ -262,7 +262,7 @@ async def astore_message(
262
262
  ValueError: If any of the required parameters (session_id, sender, sender_name) is not provided.
263
263
  """
264
264
  if not message:
265
- logger.warning("No message provided.")
265
+ await logger.awarning("No message provided.")
266
266
  return []
267
267
 
268
268
  if not message.session_id or not message.sender or not message.sender_name:
@@ -277,7 +277,7 @@ async def astore_message(
277
277
  try:
278
278
  return await aupdate_messages([message])
279
279
  except ValueError as e:
280
- logger.error(e)
280
+ await logger.aerror(e)
281
281
  if flow_id and not isinstance(flow_id, UUID):
282
282
  flow_id = UUID(flow_id)
283
283
  return await aadd_messages([message], flow_id=flow_id)
langflow/middleware.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from fastapi import HTTPException
2
- from loguru import logger
3
2
 
3
+ from langflow.logging.logger import logger
4
4
  from langflow.services.deps import get_settings_service
5
5
 
6
6
 
@@ -2,10 +2,10 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING, Any, cast
4
4
 
5
- from loguru import logger
6
5
  from pydantic import BaseModel
7
6
 
8
7
  from langflow.graph.vertex.base import Vertex
8
+ from langflow.logging.logger import logger
9
9
  from langflow.processing.utils import validate_and_repair_json
10
10
  from langflow.schema.graph import InputValue, Tweaks
11
11
  from langflow.schema.schema import INPUT_FIELD_NAME
@@ -41,7 +41,7 @@ async def run_graph_internal(
41
41
  types = []
42
42
  for input_value_request in inputs:
43
43
  if input_value_request.input_value is None:
44
- logger.warning("InputValueRequest input_value cannot be None, defaulting to an empty string.")
44
+ await logger.awarning("InputValueRequest input_value cannot be None, defaulting to an empty string.")
45
45
  input_value_request.input_value = ""
46
46
  components.append(input_value_request.components or [])
47
47
  inputs_list.append({INPUT_FIELD_NAME: input_value_request.input_value})
@@ -105,7 +105,7 @@ async def run_graph(
105
105
  types = []
106
106
  for input_value_request in inputs:
107
107
  if input_value_request.input_value is None:
108
- logger.warning("InputValueRequest input_value cannot be None, defaulting to an empty string.")
108
+ await logger.awarning("InputValueRequest input_value cannot be None, defaulting to an empty string.")
109
109
  input_value_request.input_value = ""
110
110
  components.append(input_value_request.components or [])
111
111
  inputs_list.append({INPUT_FIELD_NAME: input_value_request.input_value})
@@ -2,9 +2,9 @@ from collections.abc import Generator
2
2
  from enum import Enum
3
3
 
4
4
  from fastapi.encoders import jsonable_encoder
5
- from loguru import logger
6
5
  from pydantic import BaseModel
7
6
 
7
+ from langflow.logging.logger import logger
8
8
  from langflow.schema.data import Data
9
9
  from langflow.schema.dataframe import DataFrame
10
10
  from langflow.schema.encoders import CUSTOM_ENCODERS
@@ -75,7 +75,7 @@ def post_process_raw(raw, artifact_type: str):
75
75
  raw = jsonable_encoder(raw, custom_encoder=CUSTOM_ENCODERS)
76
76
  artifact_type = ArtifactType.OBJECT.value
77
77
  except Exception: # noqa: BLE001
78
- logger.opt(exception=True).debug(f"Error converting to json: {raw} ({type(raw)})")
78
+ logger.debug(f"Error converting to json: {raw} ({type(raw)})", exc_info=True)
79
79
  raw = default_message
80
80
  else:
81
81
  raw = default_message
langflow/schema/data.py CHANGED
@@ -9,9 +9,9 @@ from uuid import UUID
9
9
 
10
10
  from langchain_core.documents import Document
11
11
  from langchain_core.messages import AIMessage, BaseMessage, HumanMessage
12
- from loguru import logger
13
12
  from pydantic import BaseModel, ConfigDict, model_serializer, model_validator
14
13
 
14
+ from langflow.logging.logger import logger
15
15
  from langflow.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_USER
16
16
  from langflow.utils.image import create_image_content_dict
17
17
 
@@ -234,7 +234,7 @@ class Data(BaseModel):
234
234
  data = {k: v.to_json() if hasattr(v, "to_json") else v for k, v in self.data.items()}
235
235
  return serialize_data(data) # use the custom serializer
236
236
  except Exception: # noqa: BLE001
237
- logger.opt(exception=True).debug("Error converting Data to JSON")
237
+ logger.debug("Error converting Data to JSON", exc_info=True)
238
238
  return str(self.data)
239
239
 
240
240
  def __contains__(self, key) -> bool:
@@ -276,6 +276,14 @@ class Data(BaseModel):
276
276
  return DataFrame(data=next(iter(data_dict.values())))
277
277
  return DataFrame(data=[self])
278
278
 
279
+ def __repr__(self) -> str:
280
+ """Return string representation of the Data object."""
281
+ return f"Data(text_key={self.text_key!r}, data={self.data!r}, default_value={self.default_value!r})"
282
+
283
+ def __hash__(self) -> int:
284
+ """Return hash of the Data object based on its string representation."""
285
+ return hash(self.__repr__())
286
+
279
287
 
280
288
  def custom_serializer(obj):
281
289
  if isinstance(obj, datetime):
@@ -8,7 +8,7 @@ from langflow.schema.data import Data
8
8
  from langflow.schema.message import Message
9
9
 
10
10
 
11
- class DataFrame(pandas_DataFrame):
11
+ class DataFrame(pandas_DataFrame): # noqa: PLW1641
12
12
  """A pandas DataFrame subclass specialized for handling collections of Data objects.
13
13
 
14
14
  This class extends pandas.DataFrame to provide seamless integration between
@@ -14,10 +14,10 @@ from langchain_core.load import load
14
14
  from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, SystemMessage
15
15
  from langchain_core.prompts.chat import BaseChatPromptTemplate, ChatPromptTemplate
16
16
  from langchain_core.prompts.prompt import PromptTemplate
17
- from loguru import logger
18
17
  from pydantic import BaseModel, ConfigDict, Field, ValidationError, field_serializer, field_validator
19
18
 
20
19
  from langflow.base.prompts.utils import dict_values_to_string
20
+ from langflow.logging.logger import logger
21
21
  from langflow.schema.content_block import ContentBlock
22
22
  from langflow.schema.content_types import ErrorContent
23
23
  from langflow.schema.data import Data
@@ -8,10 +8,10 @@ from uuid import UUID
8
8
  import numpy as np
9
9
  import pandas as pd
10
10
  from langchain_core.documents import Document
11
- from loguru import logger
12
11
  from pydantic import BaseModel
13
12
  from pydantic.v1 import BaseModel as BaseModelV1
14
13
 
14
+ from langflow.logging.logger import logger
15
15
  from langflow.serialization.constants import MAX_ITEMS_LENGTH, MAX_TEXT_LENGTH
16
16
  from langflow.services.deps import get_settings_service
17
17
 
@@ -10,11 +10,11 @@ from cryptography.fernet import Fernet
10
10
  from fastapi import Depends, HTTPException, Security, WebSocketException, status
11
11
  from fastapi.security import APIKeyHeader, APIKeyQuery, OAuth2PasswordBearer
12
12
  from jose import JWTError, jwt
13
- from loguru import logger
14
13
  from sqlalchemy.exc import IntegrityError
15
14
  from sqlmodel.ext.asyncio.session import AsyncSession
16
15
  from starlette.websockets import WebSocket
17
16
 
17
+ from langflow.logging.logger import logger
18
18
  from langflow.services.database.models.api_key.crud import check_key
19
19
  from langflow.services.database.models.user.crud import get_user_by_id, get_user_by_username, update_user_last_login_at
20
20
  from langflow.services.database.models.user.model import User, UserRead
@@ -310,7 +310,7 @@ async def create_super_user(
310
310
  if not super_user:
311
311
  raise # Re-raise if it's not a race condition
312
312
  except Exception: # noqa: BLE001
313
- logger.opt(exception=True).debug("Error creating superuser.")
313
+ logger.debug("Error creating superuser.", exc_info=True)
314
314
 
315
315
  return super_user
316
316
 
@@ -4,8 +4,8 @@ import time
4
4
  from typing import Generic
5
5
 
6
6
  from diskcache import Cache
7
- from loguru import logger
8
7
 
8
+ from langflow.logging.logger import logger
9
9
  from langflow.services.cache.base import AsyncBaseCacheService, AsyncLockType
10
10
  from langflow.services.cache.utils import CACHE_MISS
11
11
 
@@ -6,9 +6,9 @@ from collections import OrderedDict
6
6
  from typing import Generic, Union
7
7
 
8
8
  import dill
9
- from loguru import logger
10
9
  from typing_extensions import override
11
10
 
11
+ from langflow.logging.logger import logger
12
12
  from langflow.services.cache.base import (
13
13
  AsyncBaseCacheService,
14
14
  AsyncLockType,
@@ -228,7 +228,7 @@ class RedisCache(ExternalAsyncBaseCacheService, Generic[LockType]):
228
228
  await self._client.ping()
229
229
  except redis.exceptions.ConnectionError:
230
230
  msg = "RedisCache could not connect to the Redis server"
231
- logger.exception(msg)
231
+ await logger.aexception(msg)
232
232
  return False
233
233
  return True
234
234
 
@@ -309,7 +309,7 @@ class AsyncInMemoryCache(AsyncBaseCacheService, Generic[AsyncLockType]):
309
309
  if time.time() - item["time"] < self.expiration_time:
310
310
  self.cache.move_to_end(key)
311
311
  return pickle.loads(item["value"]) if isinstance(item["value"], bytes) else item["value"]
312
- logger.info(f"Cache item for key '{key}' has expired and will be deleted.")
312
+ await logger.ainfo(f"Cache item for key '{key}' has expired and will be deleted.")
313
313
  await self._delete(key) # Log before deleting the expired item
314
314
  return CACHE_MISS
315
315
 
@@ -9,17 +9,12 @@ from uuid import UUID, uuid4
9
9
  import emoji
10
10
  from emoji import purely_emoji
11
11
  from fastapi import HTTPException, status
12
- from loguru import logger
13
- from pydantic import (
14
- BaseModel,
15
- ValidationInfo,
16
- field_serializer,
17
- field_validator,
18
- )
12
+ from pydantic import BaseModel, ValidationInfo, field_serializer, field_validator
19
13
  from sqlalchemy import Enum as SQLEnum
20
14
  from sqlalchemy import Text, UniqueConstraint, text
21
15
  from sqlmodel import JSON, Column, Field, Relationship, SQLModel
22
16
 
17
+ from langflow.logging.logger import logger
23
18
  from langflow.schema.data import Data
24
19
 
25
20
  if TYPE_CHECKING:
@@ -1,9 +1,9 @@
1
1
  from uuid import UUID
2
2
 
3
- from loguru import logger
4
3
  from sqlmodel import col, delete, select
5
4
  from sqlmodel.ext.asyncio.session import AsyncSession
6
5
 
6
+ from langflow.logging.logger import logger
7
7
  from langflow.services.database.models.transactions.model import (
8
8
  TransactionBase,
9
9
  TransactionReadResponse,
@@ -44,7 +44,7 @@ async def log_transaction(db: AsyncSession, transaction: TransactionBase) -> Tra
44
44
  IntegrityError: If there is a database integrity error
45
45
  """
46
46
  if not transaction.flow_id:
47
- logger.debug("Transaction flow_id is None")
47
+ await logger.adebug("Transaction flow_id is None")
48
48
  return None
49
49
  table = TransactionTable(**transaction.model_dump())
50
50
 
@@ -2,12 +2,12 @@ from datetime import datetime, timezone
2
2
  from uuid import UUID
3
3
 
4
4
  from fastapi import HTTPException, status
5
- from loguru import logger
6
5
  from sqlalchemy.exc import IntegrityError
7
6
  from sqlalchemy.orm.attributes import flag_modified
8
7
  from sqlmodel import select
9
8
  from sqlmodel.ext.asyncio.session import AsyncSession
10
9
 
10
+ from langflow.logging.logger import logger
11
11
  from langflow.services.database.models.user.model import User, UserUpdate
12
12
 
13
13
 
@@ -59,7 +59,7 @@ async def update_user_last_login_at(user_id: UUID, db: AsyncSession):
59
59
  user = await get_user_by_id(db, user_id)
60
60
  return await update_user(user, user_data, db)
61
61
  except Exception as e: # noqa: BLE001
62
- logger.error(f"Error updating user last login at: {e!s}")
62
+ await logger.aerror(f"Error updating user last login at: {e!s}")
63
63
 
64
64
 
65
65
  async def get_all_superusers(db: AsyncSession) -> list[User]:
@@ -13,7 +13,6 @@ import anyio
13
13
  import sqlalchemy as sa
14
14
  from alembic import command, util
15
15
  from alembic.config import Config
16
- from loguru import logger
17
16
  from sqlalchemy import event, exc, inspect
18
17
  from sqlalchemy.dialects import sqlite as dialect_sqlite
19
18
  from sqlalchemy.engine import Engine
@@ -24,6 +23,7 @@ from sqlmodel.ext.asyncio.session import AsyncSession
24
23
  from tenacity import retry, stop_after_attempt, wait_fixed
25
24
 
26
25
  from langflow.initial_setup.constants import STARTER_FOLDER_NAME
26
+ from langflow.logging.logger import logger
27
27
  from langflow.services.base import Service
28
28
  from langflow.services.database import models
29
29
  from langflow.services.database.models.user.crud import get_user_by_username
@@ -193,7 +193,7 @@ class DatabaseService(Service):
193
193
  try:
194
194
  yield session
195
195
  except exc.SQLAlchemyError as db_exc:
196
- logger.error(f"Database error during session scope: {db_exc}")
196
+ await logger.aerror(f"Database error during session scope: {db_exc}")
197
197
  await session.rollback()
198
198
  raise
199
199
 
@@ -219,7 +219,7 @@ class DatabaseService(Service):
219
219
  if not orphaned_flows:
220
220
  return
221
221
 
222
- logger.debug("Assigning orphaned flows to the default superuser")
222
+ await logger.adebug("Assigning orphaned flows to the default superuser")
223
223
 
224
224
  # Retrieve superuser
225
225
  superuser_username = settings_service.auth_settings.SUPERUSER
@@ -227,7 +227,7 @@ class DatabaseService(Service):
227
227
 
228
228
  if not superuser:
229
229
  error_message = "Default superuser not found"
230
- logger.error(error_message)
230
+ await logger.aerror(error_message)
231
231
  raise RuntimeError(error_message)
232
232
 
233
233
  # Get existing flow names for the superuser
@@ -244,7 +244,7 @@ class DatabaseService(Service):
244
244
 
245
245
  # Commit changes
246
246
  await session.commit()
247
- logger.debug("Successfully assigned orphaned flows to the default superuser")
247
+ await logger.adebug("Successfully assigned orphaned flows to the default superuser")
248
248
 
249
249
  @staticmethod
250
250
  def _generate_unique_flow_name(original_name: str, existing_names: set[str]) -> str:
@@ -372,7 +372,7 @@ class DatabaseService(Service):
372
372
  try:
373
373
  await session.exec(text("SELECT * FROM alembic_version"))
374
374
  except Exception: # noqa: BLE001
375
- logger.debug("Alembic not initialized")
375
+ await logger.adebug("Alembic not initialized")
376
376
  should_initialize_alembic = True
377
377
  await asyncio.to_thread(self._run_migrations, should_initialize_alembic, fix)
378
378
 
@@ -473,7 +473,7 @@ class DatabaseService(Service):
473
473
  await conn.run_sync(self._create_db_and_tables)
474
474
 
475
475
  async def teardown(self) -> None:
476
- logger.debug("Tearing down database")
476
+ await logger.adebug("Tearing down database")
477
477
  try:
478
478
  settings_service = get_settings_service()
479
479
  # remove the default superuser if auto_login is enabled
@@ -481,5 +481,5 @@ class DatabaseService(Service):
481
481
  async with self.with_session() as session:
482
482
  await teardown_superuser(settings_service, session)
483
483
  except Exception: # noqa: BLE001
484
- logger.exception("Error tearing down database")
484
+ await logger.aexception("Error tearing down database")
485
485
  await self.engine.dispose()