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
@@ -5,16 +5,17 @@ from dataclasses import dataclass
5
5
  from typing import TYPE_CHECKING
6
6
 
7
7
  from alembic.util.exc import CommandError
8
- from loguru import logger
9
8
  from sqlmodel import text
10
9
  from sqlmodel.ext.asyncio.session import AsyncSession
11
10
 
11
+ from langflow.logging.logger import logger
12
+
12
13
  if TYPE_CHECKING:
13
14
  from langflow.services.database.service import DatabaseService
14
15
 
15
16
 
16
17
  async def initialize_database(*, fix_migration: bool = False) -> None:
17
- logger.debug("Initializing database")
18
+ await logger.adebug("Initializing database")
18
19
  from langflow.services.deps import get_db_service
19
20
 
20
21
  database_service: DatabaseService = get_db_service()
@@ -28,7 +29,7 @@ async def initialize_database(*, fix_migration: bool = False) -> None:
28
29
  # we can ignore it
29
30
  if "already exists" not in str(exc):
30
31
  msg = "Error creating DB and tables"
31
- logger.exception(msg)
32
+ await logger.aexception(msg)
32
33
  raise RuntimeError(msg) from exc
33
34
  try:
34
35
  await database_service.check_schema_health()
@@ -58,7 +59,7 @@ async def initialize_database(*, fix_migration: bool = False) -> None:
58
59
  if "already exists" not in str(exc):
59
60
  logger.exception(exc)
60
61
  raise
61
- logger.debug("Database initialized")
62
+ await logger.adebug("Database initialized")
62
63
 
63
64
 
64
65
  @asynccontextmanager
@@ -67,7 +68,7 @@ async def session_getter(db_service: DatabaseService):
67
68
  session = AsyncSession(db_service.engine, expire_on_commit=False)
68
69
  yield session
69
70
  except Exception:
70
- logger.exception("Session rollback because of exception")
71
+ await logger.aexception("Session rollback because of exception")
71
72
  await session.rollback()
72
73
  raise
73
74
  finally:
langflow/services/deps.py CHANGED
@@ -3,8 +3,7 @@ from __future__ import annotations
3
3
  from contextlib import asynccontextmanager
4
4
  from typing import TYPE_CHECKING
5
5
 
6
- from loguru import logger
7
-
6
+ from langflow.logging.logger import logger
8
7
  from langflow.services.schema import ServiceType
9
8
 
10
9
  if TYPE_CHECKING:
@@ -174,7 +173,7 @@ async def session_scope() -> AsyncGenerator[AsyncSession, None]:
174
173
  yield session
175
174
  await session.commit()
176
175
  except Exception:
177
- logger.exception("An error occurred during the session scope.")
176
+ await logger.aexception("An error occurred during the session scope.")
178
177
  await session.rollback()
179
178
  raise
180
179
 
@@ -3,8 +3,8 @@ import inspect
3
3
  from typing import TYPE_CHECKING, get_type_hints
4
4
 
5
5
  from cachetools import LRUCache, cached
6
- from loguru import logger
7
6
 
7
+ from langflow.logging.logger import logger
8
8
  from langflow.services.schema import ServiceType
9
9
 
10
10
  if TYPE_CHECKING:
@@ -4,18 +4,15 @@ from pathlib import Path
4
4
  from uuid import UUID, uuid4
5
5
 
6
6
  from aiofile import async_open
7
- from loguru import logger
8
7
  from sqlmodel import delete, select, text
9
8
 
10
9
  from langflow.api.utils import cascade_delete_flow
11
10
  from langflow.graph import Graph
12
11
  from langflow.graph.vertex.param_handler import ParameterHandler
13
12
  from langflow.load.utils import replace_tweaks_with_env
14
- from langflow.logging.logger import configure
13
+ from langflow.logging.logger import configure, logger
15
14
  from langflow.processing.process import process_tweaks, run_graph
16
- from langflow.services.auth.utils import (
17
- get_password_hash,
18
- )
15
+ from langflow.services.auth.utils import get_password_hash
19
16
  from langflow.services.cache.service import AsyncBaseCacheService
20
17
  from langflow.services.database.models import Flow, User, Variable
21
18
  from langflow.services.database.utils import initialize_database
@@ -48,7 +45,6 @@ class LangflowRunnerExperimental:
48
45
  log_file: str | None = None,
49
46
  log_rotation: str | None = None,
50
47
  disable_logs: bool = False,
51
- async_log_file: bool = True,
52
48
  ):
53
49
  self.should_initialize_db = should_initialize_db
54
50
  log_file_path = Path(log_file) if log_file else None
@@ -57,7 +53,6 @@ class LangflowRunnerExperimental:
57
53
  log_file=log_file_path,
58
54
  log_rotation=log_rotation,
59
55
  disable=disable_logs,
60
- async_file=async_log_file,
61
56
  )
62
57
 
63
58
  async def run(
@@ -76,7 +71,7 @@ class LangflowRunnerExperimental:
76
71
  tweaks_values: dict | None = None,
77
72
  ):
78
73
  try:
79
- logger.info(f"Start Handling {session_id=}")
74
+ await logger.ainfo(f"Start Handling {session_id=}")
80
75
  await self.init_db_if_needed()
81
76
  # Update settings with cache and components path
82
77
  await update_settings(cache=cache)
@@ -118,7 +113,7 @@ class LangflowRunnerExperimental:
118
113
  result = await self.run_graph(input_value, input_type, output_type, session_id, graph, stream=stream)
119
114
  finally:
120
115
  await self.clear_flow_state(flow_dict)
121
- logger.info(f"Finish Handling {session_id=}")
116
+ await logger.ainfo(f"Finish Handling {session_id=}")
122
117
  return result
123
118
 
124
119
  async def prepare_flow_and_add_to_db(
@@ -242,10 +237,10 @@ class LangflowRunnerExperimental:
242
237
 
243
238
  async def init_db_if_needed(self):
244
239
  if not await self.database_exists_check() and self.should_initialize_db:
245
- logger.info("Initializing database...")
240
+ await logger.ainfo("Initializing database...")
246
241
  await initialize_database(fix_migration=True)
247
242
  self.should_initialize_db = False
248
- logger.info("Database initialized.")
243
+ await logger.ainfo("Database initialized.")
249
244
 
250
245
  @staticmethod
251
246
  async def database_exists_check():
@@ -254,7 +249,7 @@ class LangflowRunnerExperimental:
254
249
  result = await session.exec(text("SELECT version_num FROM public.alembic_version"))
255
250
  return result.first() is not None
256
251
  except Exception as e: # noqa: BLE001
257
- logger.debug(f"Database check failed: {e}")
252
+ await logger.adebug(f"Database check failed: {e}")
258
253
  return False
259
254
 
260
255
  @staticmethod
@@ -2,9 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
 
5
- from loguru import logger
6
-
7
5
  from langflow.events.event_manager import EventManager
6
+ from langflow.logging.logger import logger
8
7
  from langflow.services.base import Service
9
8
 
10
9
 
@@ -117,7 +116,7 @@ class JobQueueService(Service):
117
116
  # Clean up each registered job queue.
118
117
  for job_id in list(self._queues.keys()):
119
118
  await self.cleanup_job(job_id)
120
- logger.debug("JobQueueService stopped: all job queues have been cleaned up.")
119
+ await logger.adebug("JobQueueService stopped: all job queues have been cleaned up.")
121
120
 
122
121
  async def teardown(self) -> None:
123
122
  await self.stop()
@@ -221,21 +220,21 @@ class JobQueueService(Service):
221
220
  job_id (str): Unique identifier for the job to be cleaned up.
222
221
  """
223
222
  if job_id not in self._queues:
224
- logger.debug(f"No queue found for job_id {job_id} during cleanup.")
223
+ await logger.adebug(f"No queue found for job_id {job_id} during cleanup.")
225
224
  return
226
225
 
227
- logger.debug(f"Commencing cleanup for job_id {job_id}")
226
+ await logger.adebug(f"Commencing cleanup for job_id {job_id}")
228
227
  main_queue, _event_manager, task, _ = self._queues[job_id]
229
228
 
230
229
  # Cancel the associated task if it is still running.
231
230
  if task and not task.done():
232
- logger.debug(f"Cancelling active task for job_id {job_id}")
231
+ await logger.adebug(f"Cancelling active task for job_id {job_id}")
233
232
  task.cancel()
234
233
  await asyncio.wait([task])
235
234
  # Log any exceptions that occurred during the task's execution.
236
235
  if exc := task.exception():
237
- logger.error(f"Error in task for job_id {job_id}: {exc}")
238
- logger.debug(f"Task cancellation complete for job_id {job_id}")
236
+ await logger.aerror(f"Error in task for job_id {job_id}: {exc}")
237
+ await logger.adebug(f"Task cancellation complete for job_id {job_id}")
239
238
 
240
239
  # Clear the queue since we just cancelled the task or it has completed
241
240
  items_cleared = 0
@@ -246,10 +245,10 @@ class JobQueueService(Service):
246
245
  except asyncio.QueueEmpty:
247
246
  break
248
247
 
249
- logger.debug(f"Removed {items_cleared} items from queue for job_id {job_id}")
248
+ await logger.adebug(f"Removed {items_cleared} items from queue for job_id {job_id}")
250
249
  # Remove the job entry from the registry
251
250
  self._queues.pop(job_id, None)
252
- logger.debug(f"Cleanup successful for job_id {job_id}: resources have been released.")
251
+ await logger.adebug(f"Cleanup successful for job_id {job_id}: resources have been released.")
253
252
 
254
253
  async def _periodic_cleanup(self) -> None:
255
254
  """Execute a periodic task that cleans up completed or cancelled job queues.
@@ -266,10 +265,10 @@ class JobQueueService(Service):
266
265
  await asyncio.sleep(60) # Sleep for 60 seconds before next cleanup attempt.
267
266
  await self._cleanup_old_queues()
268
267
  except asyncio.CancelledError:
269
- logger.debug("Periodic cleanup task received cancellation signal.")
268
+ await logger.adebug("Periodic cleanup task received cancellation signal.")
270
269
  raise
271
270
  except Exception as exc: # noqa: BLE001
272
- logger.error(f"Exception encountered during periodic cleanup: {exc}")
271
+ await logger.aerror(f"Exception encountered during periodic cleanup: {exc}")
273
272
 
274
273
  async def _cleanup_old_queues(self) -> None:
275
274
  """Scan all registered job queues and clean up those with completed or failed tasks."""
@@ -278,7 +277,7 @@ class JobQueueService(Service):
278
277
  for job_id in list(self._queues.keys()):
279
278
  _, _, task, cleanup_time = self._queues[job_id]
280
279
  if task:
281
- logger.debug(
280
+ await logger.adebug(
282
281
  f"Queue {job_id} status - Done: {task.done()}, "
283
282
  f"Cancelled: {task.cancelled()}, "
284
283
  f"Has exception: {task.exception() is not None if task.done() else 'N/A'}"
@@ -294,10 +293,12 @@ class JobQueueService(Service):
294
293
  self._queues[job_id][2],
295
294
  current_time,
296
295
  )
297
- logger.debug(f"Job queue for job_id {job_id} marked for cleanup - Task cancelled or failed")
296
+ await logger.adebug(
297
+ f"Job queue for job_id {job_id} marked for cleanup - Task cancelled or failed"
298
+ )
298
299
  elif current_time - cleanup_time >= self.CLEANUP_GRACE_PERIOD:
299
300
  # Enough time has passed, perform the actual cleanup
300
- logger.debug(f"Cleaning up job_id {job_id} after grace period")
301
+ await logger.adebug(f"Cleaning up job_id {job_id} after grace period")
301
302
  await self.cleanup_job(job_id)
302
303
 
303
304
  def _create_default_event_manager(self, queue: asyncio.Queue) -> EventManager:
@@ -4,8 +4,7 @@ import importlib
4
4
  import inspect
5
5
  from typing import TYPE_CHECKING
6
6
 
7
- from loguru import logger
8
-
7
+ from langflow.logging.logger import logger
9
8
  from langflow.utils.concurrency import KeyedMemoryLockManager
10
9
 
11
10
  if TYPE_CHECKING:
@@ -92,11 +91,11 @@ class ServiceManager:
92
91
  for service in list(self.services.values()):
93
92
  if service is None:
94
93
  continue
95
- logger.debug(f"Teardown service {service.name}")
94
+ await logger.adebug(f"Teardown service {service.name}")
96
95
  try:
97
96
  await service.teardown()
98
97
  except Exception as exc: # noqa: BLE001
99
- logger.exception(exc)
98
+ await logger.aexception(exc)
100
99
  self.services = {}
101
100
  self.factories = {}
102
101
 
@@ -2,11 +2,11 @@ import secrets
2
2
  from pathlib import Path
3
3
  from typing import Literal
4
4
 
5
- from loguru import logger
6
5
  from passlib.context import CryptContext
7
6
  from pydantic import Field, SecretStr, field_validator
8
7
  from pydantic_settings import BaseSettings, SettingsConfigDict
9
8
 
9
+ from langflow.logging.logger import logger
10
10
  from langflow.services.settings.constants import DEFAULT_SUPERUSER, DEFAULT_SUPERUSER_PASSWORD
11
11
  from langflow.services.settings.utils import read_secret_from_file, write_secret_to_file
12
12
 
@@ -9,17 +9,12 @@ from typing import Any, Literal
9
9
  import orjson
10
10
  import yaml
11
11
  from aiofile import async_open
12
- from loguru import logger
13
12
  from pydantic import Field, field_validator
14
13
  from pydantic.fields import FieldInfo
15
- from pydantic_settings import (
16
- BaseSettings,
17
- EnvSettingsSource,
18
- PydanticBaseSettingsSource,
19
- SettingsConfigDict,
20
- )
14
+ from pydantic_settings import BaseSettings, EnvSettingsSource, PydanticBaseSettingsSource, SettingsConfigDict
21
15
  from typing_extensions import override
22
16
 
17
+ from langflow.logging.logger import logger
23
18
  from langflow.serialization.constants import MAX_ITEMS_LENGTH, MAX_TEXT_LENGTH
24
19
  from langflow.services.settings.constants import VARIABLES_TO_GET_FROM_ENVIRONMENT
25
20
  from langflow.utils.util_strings import is_valid_database_url
@@ -549,6 +544,6 @@ async def load_settings_from_yaml(file_path: str) -> Settings:
549
544
  if key not in Settings.model_fields:
550
545
  msg = f"Key {key} not found in settings"
551
546
  raise KeyError(msg)
552
- logger.debug(f"Loading {len(settings_dict[key])} {key} from {file_path}")
547
+ await logger.adebug(f"Loading {len(settings_dict[key])} {key} from {file_path}")
553
548
 
554
549
  return await asyncio.to_thread(Settings, **settings_dict)
@@ -3,8 +3,8 @@ from __future__ import annotations
3
3
  from pathlib import Path
4
4
 
5
5
  import yaml
6
- from loguru import logger
7
6
 
7
+ from langflow.logging.logger import logger
8
8
  from langflow.services.base import Service
9
9
  from langflow.services.settings.auth import AuthSettings
10
10
  from langflow.services.settings.base import Settings
@@ -1,7 +1,7 @@
1
1
  import platform
2
2
  from pathlib import Path
3
3
 
4
- from loguru import logger
4
+ from langflow.logging.logger import logger
5
5
 
6
6
 
7
7
  def set_secure_permissions(file_path: Path) -> None:
@@ -1 +0,0 @@
1
- # noqa: A005
@@ -1,8 +1,8 @@
1
1
  from typing import Any
2
2
 
3
3
  import socketio
4
- from loguru import logger
5
4
 
5
+ from langflow.logging.logger import logger
6
6
  from langflow.services.base import Service
7
7
  from langflow.services.cache.base import AsyncBaseCacheService, CacheService
8
8
  from langflow.services.deps import get_chat_service
@@ -30,11 +30,11 @@ class SocketIOService(Service):
30
30
  await self.sio.emit("error", to=sid, data=error)
31
31
 
32
32
  async def connect(self, sid, environ) -> None:
33
- logger.info(f"Socket connected: {sid}")
33
+ await logger.ainfo(f"Socket connected: {sid}")
34
34
  self.sessions[sid] = environ
35
35
 
36
36
  async def disconnect(self, sid) -> None:
37
- logger.info(f"Socket disconnected: {sid}")
37
+ await logger.ainfo(f"Socket disconnected: {sid}")
38
38
  self.sessions.pop(sid, None)
39
39
 
40
40
  async def message(self, sid, data=None) -> None:
@@ -2,7 +2,6 @@ import time
2
2
  from collections.abc import Callable
3
3
 
4
4
  import socketio
5
- from loguru import logger
6
5
  from sqlmodel import select
7
6
 
8
7
  from langflow.api.utils import format_elapsed_time
@@ -11,6 +10,7 @@ from langflow.graph.graph.base import Graph
11
10
  from langflow.graph.graph.utils import layered_topological_sort
12
11
  from langflow.graph.utils import log_vertex_build
13
12
  from langflow.graph.vertex.base import Vertex
13
+ from langflow.logging.logger import logger
14
14
  from langflow.services.database.models.flow.model import Flow
15
15
  from langflow.services.deps import get_session
16
16
 
@@ -44,7 +44,7 @@ async def get_vertices(sio, sid, flow_id, chat_service) -> None:
44
44
  await sio.emit("vertices_order", data=vertices, to=sid)
45
45
 
46
46
  except Exception as exc: # noqa: BLE001
47
- logger.opt(exception=True).debug("Error getting vertices")
47
+ logger.debug("Error getting vertices", exc_info=True)
48
48
  await sio.emit("error", data=str(exc), to=sid)
49
49
 
50
50
 
@@ -88,7 +88,7 @@ async def build_vertex(
88
88
  timedelta=timedelta,
89
89
  )
90
90
  except Exception as exc: # noqa: BLE001
91
- logger.opt(exception=True).debug("Error building vertex")
91
+ logger.debug("Error building vertex", exc_info=True)
92
92
  params = str(exc)
93
93
  valid = False
94
94
  result_dict = ResultDataResponse(results={})
@@ -108,5 +108,5 @@ async def build_vertex(
108
108
  await sio.emit("vertex_build", data=response.model_dump(), to=sid)
109
109
 
110
110
  except Exception as exc: # noqa: BLE001
111
- logger.opt(exception=True).debug("Error building vertex")
111
+ logger.debug("Error building vertex", exc_info=True)
112
112
  await sio.emit("error", data=str(exc), to=sid)
@@ -2,8 +2,7 @@ from collections import defaultdict
2
2
  from collections.abc import Callable
3
3
  from threading import Lock
4
4
 
5
- from loguru import logger
6
-
5
+ from langflow.logging.logger import logger
7
6
  from langflow.services.base import Service
8
7
  from langflow.services.settings.service import SettingsService
9
8
 
@@ -1,6 +1,6 @@
1
- from loguru import logger
2
1
  from typing_extensions import override
3
2
 
3
+ from langflow.logging.logger import logger
4
4
  from langflow.services.factory import ServiceFactory
5
5
  from langflow.services.session.service import SessionService
6
6
  from langflow.services.settings.service import SettingsService
@@ -1,6 +1,7 @@
1
1
  import anyio
2
2
  from aiofile import async_open
3
- from loguru import logger
3
+
4
+ from langflow.logging.logger import logger
4
5
 
5
6
  from .service import StorageService
6
7
 
@@ -37,7 +38,7 @@ class LocalStorageService(StorageService):
37
38
  try:
38
39
  async with async_open(str(file_path), "wb") as f:
39
40
  await f.write(data)
40
- logger.info(f"File {file_name} saved successfully in flow {flow_id}.")
41
+ await logger.ainfo(f"File {file_name} saved successfully in flow {flow_id}.")
41
42
  except Exception:
42
43
  logger.exception(f"Error saving file {file_name} in flow {flow_id}")
43
44
  raise
@@ -57,7 +58,7 @@ class LocalStorageService(StorageService):
57
58
  """
58
59
  file_path = self.data_dir / flow_id / file_name
59
60
  if not await file_path.exists():
60
- logger.warning(f"File {file_name} not found in flow {flow_id}.")
61
+ await logger.awarning(f"File {file_name} not found in flow {flow_id}.")
61
62
  msg = f"File {file_name} not found in flow {flow_id}"
62
63
  raise FileNotFoundError(msg)
63
64
 
@@ -83,7 +84,7 @@ class LocalStorageService(StorageService):
83
84
  flow_id = str(flow_id)
84
85
  folder_path = self.data_dir / flow_id
85
86
  if not await folder_path.exists() or not await folder_path.is_dir():
86
- logger.warning(f"Flow {flow_id} directory does not exist.")
87
+ await logger.awarning(f"Flow {flow_id} directory does not exist.")
87
88
  msg = f"Flow {flow_id} directory does not exist."
88
89
  raise FileNotFoundError(msg)
89
90
 
@@ -93,7 +94,7 @@ class LocalStorageService(StorageService):
93
94
  if await anyio.Path(file).is_file()
94
95
  ]
95
96
 
96
- logger.info(f"Listed {len(files)} files in flow {flow_id}.")
97
+ await logger.ainfo(f"Listed {len(files)} files in flow {flow_id}.")
97
98
  return files
98
99
 
99
100
  async def delete_file(self, flow_id: str, file_name: str) -> None:
@@ -105,9 +106,9 @@ class LocalStorageService(StorageService):
105
106
  file_path = self.data_dir / flow_id / file_name
106
107
  if await file_path.exists():
107
108
  await file_path.unlink()
108
- logger.info(f"File {file_name} deleted successfully from flow {flow_id}.")
109
+ await logger.ainfo(f"File {file_name} deleted successfully from flow {flow_id}.")
109
110
  else:
110
- logger.warning(f"Attempted to delete non-existent file {file_name} in flow {flow_id}.")
111
+ await logger.awarning(f"Attempted to delete non-existent file {file_name} in flow {flow_id}.")
111
112
 
112
113
  async def teardown(self) -> None:
113
114
  """Perform any cleanup operations when the service is being torn down."""
@@ -118,7 +119,7 @@ class LocalStorageService(StorageService):
118
119
  # Get the file size from the file path
119
120
  file_path = self.data_dir / flow_id / file_name
120
121
  if not await file_path.exists():
121
- logger.warning(f"File {file_name} not found in flow {flow_id}.")
122
+ await logger.awarning(f"File {file_name} not found in flow {flow_id}.")
122
123
  msg = f"File {file_name} not found in flow {flow_id}"
123
124
  raise FileNotFoundError(msg)
124
125
 
@@ -1,6 +1,7 @@
1
1
  import boto3
2
2
  from botocore.exceptions import ClientError, NoCredentialsError
3
- from loguru import logger
3
+
4
+ from langflow.logging.logger import logger
4
5
 
5
6
  from .service import StorageService
6
7
 
@@ -28,12 +29,12 @@ class S3StorageService(StorageService):
28
29
  """
29
30
  try:
30
31
  self.s3_client.put_object(Bucket=self.bucket, Key=f"{folder}/{file_name}", Body=data)
31
- logger.info(f"File {file_name} saved successfully in folder {folder}.")
32
+ await logger.ainfo(f"File {file_name} saved successfully in folder {folder}.")
32
33
  except NoCredentialsError:
33
- logger.exception("Credentials not available for AWS S3.")
34
+ await logger.aexception("Credentials not available for AWS S3.")
34
35
  raise
35
36
  except ClientError:
36
- logger.exception(f"Error saving file {file_name} in folder {folder}")
37
+ await logger.aexception(f"Error saving file {file_name} in folder {folder}")
37
38
  raise
38
39
 
39
40
  async def get_file(self, folder: str, file_name: str):
@@ -51,10 +52,10 @@ class S3StorageService(StorageService):
51
52
  """
52
53
  try:
53
54
  response = self.s3_client.get_object(Bucket=self.bucket, Key=f"{folder}/{file_name}")
54
- logger.info(f"File {file_name} retrieved successfully from folder {folder}.")
55
+ await logger.ainfo(f"File {file_name} retrieved successfully from folder {folder}.")
55
56
  return response["Body"].read()
56
57
  except ClientError:
57
- logger.exception(f"Error retrieving file {file_name} from folder {folder}")
58
+ await logger.aexception(f"Error retrieving file {file_name} from folder {folder}")
58
59
  raise
59
60
 
60
61
  async def list_files(self, folder: str):
@@ -72,11 +73,11 @@ class S3StorageService(StorageService):
72
73
  try:
73
74
  response = self.s3_client.list_objects_v2(Bucket=self.bucket, Prefix=folder)
74
75
  except ClientError:
75
- logger.exception(f"Error listing files in folder {folder}")
76
+ await logger.aexception(f"Error listing files in folder {folder}")
76
77
  raise
77
78
 
78
79
  files = [item["Key"] for item in response.get("Contents", []) if "/" not in item["Key"][len(folder) :]]
79
- logger.info(f"{len(files)} files listed in folder {folder}.")
80
+ await logger.ainfo(f"{len(files)} files listed in folder {folder}.")
80
81
  return files
81
82
 
82
83
  async def delete_file(self, folder: str, file_name: str) -> None:
@@ -91,9 +92,9 @@ class S3StorageService(StorageService):
91
92
  """
92
93
  try:
93
94
  self.s3_client.delete_object(Bucket=self.bucket, Key=f"{folder}/{file_name}")
94
- logger.info(f"File {file_name} deleted successfully from folder {folder}.")
95
+ await logger.ainfo(f"File {file_name} deleted successfully from folder {folder}.")
95
96
  except ClientError:
96
- logger.exception(f"Error deleting file {file_name} from folder {folder}")
97
+ await logger.aexception(f"Error deleting file {file_name} from folder {folder}")
97
98
  raise
98
99
 
99
100
  async def teardown(self) -> None:
@@ -6,8 +6,8 @@ from uuid import UUID
6
6
 
7
7
  import httpx
8
8
  from httpx import HTTPError, HTTPStatusError
9
- from loguru import logger
10
9
 
10
+ from langflow.logging.logger import logger
11
11
  from langflow.services.base import Service
12
12
  from langflow.services.store.exceptions import APIKeyError, FilterError, ForbiddenError
13
13
  from langflow.services.store.schema import (
@@ -162,7 +162,7 @@ class StoreService(Service):
162
162
  except HTTPError:
163
163
  raise
164
164
  except Exception: # noqa: BLE001
165
- logger.opt(exception=True).debug("Webhook failed")
165
+ logger.debug("Webhook failed", exc_info=True)
166
166
 
167
167
  @staticmethod
168
168
  def build_tags_filter(tags: list[str]):
@@ -594,7 +594,7 @@ class StoreService(Service):
594
594
  authorized = True
595
595
  result = updated_result
596
596
  except Exception: # noqa: BLE001
597
- logger.opt(exception=True).debug("Error updating components with user data")
597
+ logger.debug("Error updating components with user data", exc_info=True)
598
598
  # If we get an error here, it means the user is not authorized
599
599
  authorized = False
600
600
  return ListComponentResponseModel(results=result, authorized=authorized, count=comp_count)
@@ -1,7 +1,8 @@
1
1
  from typing import TYPE_CHECKING
2
2
 
3
3
  import httpx
4
- from loguru import logger
4
+
5
+ from langflow.logging.logger import logger
5
6
 
6
7
  if TYPE_CHECKING:
7
8
  from langflow.services.store.schema import ListComponentResponse
@@ -49,7 +50,7 @@ async def get_lf_version_from_pypi():
49
50
  return None
50
51
  return response.json()["info"]["version"]
51
52
  except Exception: # noqa: BLE001
52
- logger.opt(exception=True).debug("Error getting the latest version of langflow from PyPI")
53
+ logger.debug("Error getting the latest version of langflow from PyPI", exc_info=True)
53
54
  return None
54
55
 
55
56
 
@@ -4,9 +4,9 @@ import asyncio
4
4
  import contextlib
5
5
  from typing import TYPE_CHECKING
6
6
 
7
- from loguru import logger
8
7
  from sqlmodel import col, delete, select
9
8
 
9
+ from langflow.logging.logger import logger
10
10
  from langflow.services.database.models.message.model import MessageTable
11
11
  from langflow.services.database.models.transactions.model import TransactionTable
12
12
  from langflow.services.database.models.vertex_builds.model import VertexBuildTable
@@ -79,23 +79,23 @@ class CleanupWorker:
79
79
  async def start(self):
80
80
  """Start the cleanup worker."""
81
81
  if self._task is not None:
82
- logger.warning("Cleanup worker is already running")
82
+ await logger.awarning("Cleanup worker is already running")
83
83
  return
84
84
 
85
85
  self._task = asyncio.create_task(self._run())
86
- logger.debug("Started database cleanup worker")
86
+ await logger.adebug("Started database cleanup worker")
87
87
 
88
88
  async def stop(self):
89
89
  """Stop the cleanup worker gracefully."""
90
90
  if self._task is None:
91
- logger.warning("Cleanup worker is not running")
91
+ await logger.awarning("Cleanup worker is not running")
92
92
  return
93
93
 
94
- logger.debug("Stopping database cleanup worker...")
94
+ await logger.adebug("Stopping database cleanup worker...")
95
95
  self._stop_event.set()
96
96
  await self._task
97
97
  self._task = None
98
- logger.debug("Database cleanup worker stopped")
98
+ await logger.adebug("Database cleanup worker stopped")
99
99
 
100
100
  async def _run(self):
101
101
  """Run the cleanup worker until stopped."""
@@ -105,7 +105,7 @@ class CleanupWorker:
105
105
  # Clean up any orphaned records
106
106
  await cleanup_orphaned_records()
107
107
  except Exception as exc: # noqa: BLE001
108
- logger.error(f"Error in cleanup worker: {exc!s}")
108
+ await logger.aerror(f"Error in cleanup worker: {exc!s}")
109
109
 
110
110
  try:
111
111
  # Create a task for the timeout