langflow-base-nightly 0.5.0.dev37__py3-none-any.whl → 0.5.0.dev39__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 (397) hide show
  1. langflow/__main__.py +1 -1
  2. langflow/alembic/versions/0882f9657f22_encrypt_existing_mcp_auth_settings_.py +122 -0
  3. langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py +24 -30
  4. langflow/alembic/versions/58b28437a398_modify_nullable.py +6 -6
  5. langflow/alembic/versions/79e675cb6752_change_datetime_type.py +24 -30
  6. langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py +12 -13
  7. langflow/api/build.py +21 -26
  8. langflow/api/health_check_router.py +3 -3
  9. langflow/api/utils.py +3 -3
  10. langflow/api/v1/callback.py +2 -2
  11. langflow/api/v1/chat.py +19 -31
  12. langflow/api/v1/endpoints.py +10 -10
  13. langflow/api/v1/flows.py +1 -1
  14. langflow/api/v1/knowledge_bases.py +3 -3
  15. langflow/api/v1/mcp.py +12 -12
  16. langflow/api/v1/mcp_projects.py +405 -120
  17. langflow/api/v1/mcp_utils.py +8 -8
  18. langflow/api/v1/schemas.py +2 -7
  19. langflow/api/v1/store.py +1 -1
  20. langflow/api/v1/validate.py +2 -2
  21. langflow/api/v1/voice_mode.py +58 -62
  22. langflow/api/v2/files.py +2 -2
  23. langflow/api/v2/mcp.py +10 -9
  24. langflow/base/composio/composio_base.py +21 -2
  25. langflow/base/data/docling_utils.py +194 -0
  26. langflow/base/embeddings/aiml_embeddings.py +1 -1
  27. langflow/base/flow_processing/utils.py +1 -2
  28. langflow/base/io/__init__.py +0 -1
  29. langflow/base/langwatch/utils.py +2 -1
  30. langflow/base/mcp/util.py +49 -47
  31. langflow/base/prompts/api_utils.py +1 -1
  32. langflow/base/tools/flow_tool.py +2 -2
  33. langflow/base/tools/run_flow.py +2 -6
  34. langflow/components/FAISS/__init__.py +34 -0
  35. langflow/components/Notion/add_content_to_page.py +2 -2
  36. langflow/components/Notion/list_database_properties.py +2 -2
  37. langflow/components/Notion/list_pages.py +2 -2
  38. langflow/components/Notion/page_content_viewer.py +2 -2
  39. langflow/components/Notion/update_page_property.py +1 -1
  40. langflow/components/agentql/agentql_api.py +2 -10
  41. langflow/components/agents/agent.py +249 -55
  42. langflow/components/agents/mcp_component.py +14 -14
  43. langflow/components/anthropic/anthropic.py +5 -4
  44. langflow/components/assemblyai/assemblyai_get_subtitles.py +2 -2
  45. langflow/components/assemblyai/assemblyai_lemur.py +2 -2
  46. langflow/components/assemblyai/assemblyai_list_transcripts.py +2 -2
  47. langflow/components/assemblyai/assemblyai_poll_transcript.py +2 -2
  48. langflow/components/assemblyai/assemblyai_start_transcript.py +2 -2
  49. langflow/components/cassandra/__init__.py +40 -0
  50. langflow/components/chroma/__init__.py +34 -0
  51. langflow/components/clickhouse/__init__.py +34 -0
  52. langflow/components/couchbase/__init__.py +34 -0
  53. langflow/components/data/file.py +575 -55
  54. langflow/components/data/url.py +1 -1
  55. langflow/components/datastax/__init__.py +3 -3
  56. langflow/components/datastax/astra_assistant_manager.py +3 -3
  57. langflow/components/datastax/create_assistant.py +1 -2
  58. langflow/components/deactivated/merge_data.py +1 -2
  59. langflow/components/deactivated/sub_flow.py +6 -7
  60. langflow/components/deactivated/vectara_self_query.py +3 -3
  61. langflow/components/docling/__init__.py +0 -198
  62. langflow/components/docling/docling_inline.py +1 -1
  63. langflow/components/elastic/__init__.py +37 -0
  64. langflow/components/embeddings/text_embedder.py +3 -3
  65. langflow/components/firecrawl/firecrawl_extract_api.py +2 -9
  66. langflow/components/google/gmail.py +1 -1
  67. langflow/components/google/google_generative_ai.py +5 -11
  68. langflow/components/groq/groq.py +4 -3
  69. langflow/components/helpers/current_date.py +2 -3
  70. langflow/components/helpers/memory.py +1 -1
  71. langflow/components/ibm/watsonx.py +1 -1
  72. langflow/components/ibm/watsonx_embeddings.py +1 -1
  73. langflow/components/langwatch/langwatch.py +3 -3
  74. langflow/components/logic/flow_tool.py +2 -2
  75. langflow/components/logic/notify.py +1 -1
  76. langflow/components/logic/run_flow.py +2 -3
  77. langflow/components/logic/sub_flow.py +4 -5
  78. langflow/components/mem0/mem0_chat_memory.py +2 -8
  79. langflow/components/milvus/__init__.py +34 -0
  80. langflow/components/mongodb/__init__.py +34 -0
  81. langflow/components/nvidia/nvidia.py +3 -3
  82. langflow/components/olivya/olivya.py +7 -7
  83. langflow/components/ollama/ollama.py +9 -6
  84. langflow/components/perplexity/perplexity.py +3 -13
  85. langflow/components/pgvector/__init__.py +34 -0
  86. langflow/components/pinecone/__init__.py +34 -0
  87. langflow/components/processing/batch_run.py +8 -8
  88. langflow/components/processing/data_operations.py +2 -2
  89. langflow/components/processing/merge_data.py +1 -2
  90. langflow/components/processing/message_to_data.py +2 -3
  91. langflow/components/processing/parse_json_data.py +1 -1
  92. langflow/components/prototypes/python_function.py +2 -3
  93. langflow/components/qdrant/__init__.py +34 -0
  94. langflow/components/redis/__init__.py +36 -2
  95. langflow/components/redis/redis.py +75 -29
  96. langflow/components/redis/redis_chat.py +43 -0
  97. langflow/components/serpapi/serp.py +1 -1
  98. langflow/components/supabase/__init__.py +37 -0
  99. langflow/components/tavily/tavily_extract.py +1 -1
  100. langflow/components/tavily/tavily_search.py +1 -1
  101. langflow/components/tools/calculator.py +2 -2
  102. langflow/components/tools/python_code_structured_tool.py +3 -10
  103. langflow/components/tools/python_repl.py +2 -2
  104. langflow/components/tools/searxng.py +3 -3
  105. langflow/components/tools/serp_api.py +2 -2
  106. langflow/components/tools/tavily_search_tool.py +2 -2
  107. langflow/components/tools/yahoo_finance.py +1 -1
  108. langflow/components/twelvelabs/video_embeddings.py +4 -4
  109. langflow/components/upstash/__init__.py +34 -0
  110. langflow/components/vectara/__init__.py +37 -0
  111. langflow/components/vectorstores/__init__.py +0 -69
  112. langflow/components/vectorstores/local_db.py +2 -1
  113. langflow/components/weaviate/__init__.py +34 -0
  114. langflow/components/yahoosearch/yahoo.py +1 -1
  115. langflow/components/youtube/trending.py +3 -4
  116. langflow/custom/attributes.py +2 -1
  117. langflow/custom/code_parser/code_parser.py +1 -1
  118. langflow/custom/custom_component/base_component.py +1 -1
  119. langflow/custom/custom_component/component.py +16 -2
  120. langflow/custom/dependency_analyzer.py +165 -0
  121. langflow/custom/directory_reader/directory_reader.py +7 -7
  122. langflow/custom/directory_reader/utils.py +1 -2
  123. langflow/custom/utils.py +63 -45
  124. langflow/events/event_manager.py +1 -1
  125. langflow/frontend/assets/{SlackIcon-CnvyOamQ.js → SlackIcon-Cr3Q15Px.js} +1 -1
  126. langflow/frontend/assets/{Wikipedia-nyTEXdr2.js → Wikipedia-GxM5sPdM.js} +1 -1
  127. langflow/frontend/assets/{Wolfram-BYMQkNSq.js → Wolfram-BN3-VOCA.js} +1 -1
  128. langflow/frontend/assets/{index-DZTC5pdT.js → index-28oOcafk.js} +1 -1
  129. langflow/frontend/assets/{index-ChXJpBz4.js → index-2wSXqBtB.js} +1 -1
  130. langflow/frontend/assets/{index-BB15_iOb.js → index-3wW7BClE.js} +1 -1
  131. langflow/frontend/assets/{index-DKHNourL.js → index-6pyH3ZJB.js} +1 -1
  132. langflow/frontend/assets/{index-BvwZfF2i.js → index-AWCSdofD.js} +1 -1
  133. langflow/frontend/assets/{index-Bvxg4_ux.js → index-B2Zgv_xv.js} +1 -1
  134. langflow/frontend/assets/{index-Bd6WtbKA.js → index-B2ptVQGM.js} +1 -1
  135. langflow/frontend/assets/{index-C7QWbnLK.js → index-B3TANVes.js} +1 -1
  136. langflow/frontend/assets/{index-CpvYQ0ug.js → index-B4yCvZKV.js} +1 -1
  137. langflow/frontend/assets/{index-Dg-63Si_.js → index-BC65VuWx.js} +1 -1
  138. langflow/frontend/assets/{index-C6jri9Wm.js → index-BCDSei1q.js} +1 -1
  139. langflow/frontend/assets/{index-OazXJdEl.js → index-BJy50PvP.js} +1 -1
  140. langflow/frontend/assets/{index-CWdkbVsd.js → index-BKseQQ2I.js} +1 -1
  141. langflow/frontend/assets/{index-CaQ_H9ww.js → index-BLTxEeTi.js} +1 -1
  142. langflow/frontend/assets/{index-DGRMNe9n.js → index-BRg1f4Mu.js} +1 -1
  143. langflow/frontend/assets/{index-D8lOi1GI.js → index-BS8Vo8nc.js} +1 -1
  144. langflow/frontend/assets/{index-B748uLP1.js → index-BTKOU4xC.js} +1 -1
  145. langflow/frontend/assets/{index-Dqd4RjYA.js → index-BVwJDmw-.js} +1 -1
  146. langflow/frontend/assets/{index-DbMFlnHE.js → index-BWYuQ2Sj.js} +1 -1
  147. langflow/frontend/assets/{index-BEMw2Np8.js → index-BWdLILDG.js} +1 -1
  148. langflow/frontend/assets/{index-BmX5CoED.js → index-BZcw4827.js} +1 -1
  149. langflow/frontend/assets/{index-CyPvTB63.js → index-Bbi87Ve4.js} +1 -1
  150. langflow/frontend/assets/{index-BTEW9e8P.js → index-Bf0IYKLd.js} +1 -1
  151. langflow/frontend/assets/{index-BZgXW854.js → index-Bg5nrMRh.js} +1 -1
  152. langflow/frontend/assets/{index-BBxAPk1y.js → index-BiC280Nx.js} +1 -1
  153. langflow/frontend/assets/{index-BR0bkVqX.js → index-BiKKN6FR.js} +1 -1
  154. langflow/frontend/assets/{index-CTrt1Q_j.js → index-Bief6eyJ.js} +1 -1
  155. langflow/frontend/assets/{index-D5_DsUJc.js → index-BkXec1Yf.js} +1 -1
  156. langflow/frontend/assets/{index-CZQ9rXNa.js → index-Bnl6QHtP.js} +1 -1
  157. langflow/frontend/assets/{index-BChjg6Az.js → index-BpxbUiZD.js} +1979 -1979
  158. langflow/frontend/assets/{index-BOeo01QB.js → index-BrJV8psX.js} +1 -1
  159. langflow/frontend/assets/{index-DysKpOuj.js → index-BwLWcUXL.js} +1 -1
  160. langflow/frontend/assets/{index-Bnqod3vk.js → index-Bx7dBY26.js} +1 -1
  161. langflow/frontend/assets/{index-D3DDfngy.js → index-C-EdnFdA.js} +1 -1
  162. langflow/frontend/assets/{index-Bsa0xZyL.js → index-C-Xfg4cD.js} +1 -1
  163. langflow/frontend/assets/{index-BTrsh9LS.js → index-C1f2wMat.js} +1 -1
  164. langflow/frontend/assets/index-C1xroOlH.css +1 -0
  165. langflow/frontend/assets/{index-B1YN7oMV.js → index-C3KequvP.js} +1 -1
  166. langflow/frontend/assets/{index-DzW2mfkK.js → index-C3ZjKdCD.js} +1 -1
  167. langflow/frontend/assets/{index-ajRge-Mg.js → index-C3l0zYn0.js} +1 -1
  168. langflow/frontend/assets/{index-cvZdgWHQ.js → index-C3yvArUT.js} +1 -1
  169. langflow/frontend/assets/{index-C-2hghRJ.js → index-C9Cxnkl8.js} +1 -1
  170. langflow/frontend/assets/{index-BhIOhlCH.js → index-CBc8fEAE.js} +1 -1
  171. langflow/frontend/assets/{index-B3Sur4Z3.js → index-CBvrGgID.js} +1 -1
  172. langflow/frontend/assets/{index-CCePCqkT.js → index-CD-PqGCY.js} +1 -1
  173. langflow/frontend/assets/{index-8yMsjVV2.js → index-CGO1CiUr.js} +1 -1
  174. langflow/frontend/assets/{index-DF5VwgU6.js → index-CH5UVA9b.js} +1 -1
  175. langflow/frontend/assets/{index-dcnYpT9N.js → index-CLJeJYjH.js} +1 -1
  176. langflow/frontend/assets/{index-DfxYyS3M.js → index-CMZ79X-Y.js} +1 -1
  177. langflow/frontend/assets/{index-ya2uXE8v.js → index-CMzfJKiW.js} +1 -1
  178. langflow/frontend/assets/{index-DkelbYy7.js → index-CNw1H-Wc.js} +1 -1
  179. langflow/frontend/assets/{index-DytJENYD.js → index-CPHEscq9.js} +1 -1
  180. langflow/frontend/assets/{index-Bv8h2Z-q.js → index-CRPKJZw9.js} +1 -1
  181. langflow/frontend/assets/{index-D-9TI74R.js → index-CRPyCfYy.js} +1 -1
  182. langflow/frontend/assets/{index-BLGYN-9b.js → index-CRcMqCIj.js} +1 -1
  183. langflow/frontend/assets/{index-tVYiABdp.js → index-CUVDws8F.js} +1 -1
  184. langflow/frontend/assets/{index-CpcbQZIF.js → index-CVWQfRYZ.js} +1 -1
  185. langflow/frontend/assets/{index-DPCzHdsC.js → index-CVl6MbaM.js} +1 -1
  186. langflow/frontend/assets/{index-DkXy1WFo.js → index-CVwWoX99.js} +1 -1
  187. langflow/frontend/assets/{index-DK1Ptcc4.js → index-CWPzZtSx.js} +1 -1
  188. langflow/frontend/assets/{index-DHq8TQPB.js → index-CZqRL9DE.js} +1 -1
  189. langflow/frontend/assets/{index-DnEGCgih.js → index-CdIf07Rw.js} +1 -1
  190. langflow/frontend/assets/{index-BIQQCMvz.js → index-Cewy7JZE.js} +1 -1
  191. langflow/frontend/assets/{index-D8GJngXa.js → index-CfwLpbMM.js} +1 -1
  192. langflow/frontend/assets/{index-C_TdzfAn.js → index-CiR1dxI4.js} +1 -1
  193. langflow/frontend/assets/{index-BzL_EoKd.js → index-CiixOzDG.js} +1 -1
  194. langflow/frontend/assets/{index-Boso-xEw.js → index-ClsuDmR6.js} +1 -1
  195. langflow/frontend/assets/{index-8WdfSTTz.js → index-CmEYYRN1.js} +1 -1
  196. langflow/frontend/assets/{index-FUxmznS-.js → index-Co20d-eQ.js} +1 -1
  197. langflow/frontend/assets/{index-C82JjCPD.js → index-CpzXS6md.js} +1 -1
  198. langflow/frontend/assets/{index-DIDDfmlJ.js → index-Cqpzl1J4.js} +1 -1
  199. langflow/frontend/assets/{index-_UcqeEjm.js → index-CtVIONP2.js} +1 -1
  200. langflow/frontend/assets/{index-Gkrq-vzm.js → index-CuFXdTx4.js} +1 -1
  201. langflow/frontend/assets/{index-WPFivmdQ.js → index-Cyd2HtHK.js} +1 -1
  202. langflow/frontend/assets/{index-BFp_O-c9.js → index-D-1tA8Dt.js} +1 -1
  203. langflow/frontend/assets/{index-BqPpO6KG.js → index-D-KY3kkq.js} +1 -1
  204. langflow/frontend/assets/{index-Db71w3lq.js → index-D-_B1a8v.js} +1 -1
  205. langflow/frontend/assets/{index-BIzTEqFh.js → index-D14EWPyZ.js} +1 -1
  206. langflow/frontend/assets/{index-BbJjt5m4.js → index-D2N3l-cw.js} +1 -1
  207. langflow/frontend/assets/{index-DCRk27Tp.js → index-D5ETnvJa.js} +1 -1
  208. langflow/frontend/assets/{index-CvcEzq4x.js → index-D7kquVv2.js} +1 -1
  209. langflow/frontend/assets/{index-Q9vDw0Xl.js → index-DA6-bvgN.js} +1 -1
  210. langflow/frontend/assets/{index-l7bzB8Ex.js → index-DDWBeudF.js} +1 -1
  211. langflow/frontend/assets/{index-BCCGvqay.js → index-DDcMAaG4.js} +1 -1
  212. langflow/frontend/assets/{index-pCQ_yw8m.js → index-DHgomBdh.js} +1 -1
  213. langflow/frontend/assets/{index-BxEuHa76.js → index-DJP-ss47.js} +1 -1
  214. langflow/frontend/assets/{index-BbRm7beF.js → index-DQ7VYqQc.js} +1 -1
  215. langflow/frontend/assets/{index-Car-zdor.js → index-DTqbvGC0.js} +1 -1
  216. langflow/frontend/assets/{index-BRxvproo.js → index-DUpri6zF.js} +1 -1
  217. langflow/frontend/assets/{index-BQ6NUdMY.js → index-DV3utZDZ.js} +1 -1
  218. langflow/frontend/assets/{index-DjQETUy8.js → index-DXRfN4HV.js} +1 -1
  219. langflow/frontend/assets/{index-DfngcQxO.js → index-Db9dYSzy.js} +1 -1
  220. langflow/frontend/assets/{index-rXV1G1aB.js → index-DdtMEn6I.js} +1 -1
  221. langflow/frontend/assets/{index-DmMDPoi0.js → index-DfDhMHgQ.js} +1 -1
  222. langflow/frontend/assets/{index-DJB12jIC.js → index-Dfe7qfvf.js} +1 -1
  223. langflow/frontend/assets/{index-C_veJlEb.js → index-DhtZ5hx8.js} +1 -1
  224. langflow/frontend/assets/{index-CQMoqLAu.js → index-DiB3CTo8.js} +1 -1
  225. langflow/frontend/assets/{index-DVlceYFD.js → index-DiGWASY5.js} +1 -1
  226. langflow/frontend/assets/{index-Du_18NCU.js → index-Dl5amdBz.js} +1 -1
  227. langflow/frontend/assets/{index-CYDAYm-i.js → index-DlD4dXlZ.js} +1 -1
  228. langflow/frontend/assets/{index-CLPdN-q6.js → index-DmeiHnfl.js} +1 -1
  229. langflow/frontend/assets/index-Dmu-X5-4.js +1 -0
  230. langflow/frontend/assets/{index-BzEUlaw_.js → index-DpVWih90.js} +1 -1
  231. langflow/frontend/assets/{index-D6PSjHxP.js → index-DrDrcajG.js} +1 -1
  232. langflow/frontend/assets/{index-Dq5ilsem.js → index-Du-pc0KE.js} +1 -1
  233. langflow/frontend/assets/{index-CYe8Ipef.js → index-DwPkMTaY.js} +1 -1
  234. langflow/frontend/assets/{index-BVEZDXxS.js → index-DwQEZe3C.js} +1 -1
  235. langflow/frontend/assets/{index-BvT7L317.js → index-DyJFTK24.js} +1 -1
  236. langflow/frontend/assets/{index-HK3bVMYA.js → index-J38wh62w.js} +1 -1
  237. langflow/frontend/assets/{index-CCxGSSTT.js → index-Kwdl-e29.js} +1 -1
  238. langflow/frontend/assets/{index-BOB_zsjl.js → index-OwPvCmpW.js} +1 -1
  239. langflow/frontend/assets/{index-Dsps-jKu.js → index-Tw3Os-DN.js} +1 -1
  240. langflow/frontend/assets/{index-CFDvOtKC.js → index-X0guhYF8.js} +1 -1
  241. langflow/frontend/assets/{index-BX5D-USa.js → index-dJWNxIRH.js} +1 -1
  242. langflow/frontend/assets/{index-BRYjyhAd.js → index-dcJ8-agu.js} +1 -1
  243. langflow/frontend/assets/{index-Ui4xUImO.js → index-eo2mAtL-.js} +1 -1
  244. langflow/frontend/assets/{index-CxvP91st.js → index-hG24k5xJ.js} +1 -1
  245. langflow/frontend/assets/{index-CVQmT7ZL.js → index-h_aSZHf3.js} +1 -1
  246. langflow/frontend/assets/{index-BIXaW2aY.js → index-hbndqB9B.js} +1 -1
  247. langflow/frontend/assets/{index-DIkNW9Cd.js → index-iJngutFo.js} +1 -1
  248. langflow/frontend/assets/{index-BWmPX4iQ.js → index-lTpteg8t.js} +1 -1
  249. langflow/frontend/assets/{index-xuIrH2Dq.js → index-lZX9AvZW.js} +1 -1
  250. langflow/frontend/assets/{index-yCHsaqs8.js → index-m8QA6VNM.js} +1 -1
  251. langflow/frontend/assets/{index-BkPYpfgw.js → index-o0D2S7xW.js} +1 -1
  252. langflow/frontend/assets/{index-DpClkXIV.js → index-ovFJ_0J6.js} +1 -1
  253. langflow/frontend/assets/{index-CmplyEaa.js → index-pYJJOcma.js} +1 -1
  254. langflow/frontend/assets/{index-CJo_cyWW.js → index-sI75DsdM.js} +1 -1
  255. langflow/frontend/assets/{index-nVwHLjuV.js → index-xvFOmxx4.js} +1 -1
  256. langflow/frontend/assets/{index-LbYjHKkn.js → index-z3SRY-mX.js} +1 -1
  257. langflow/frontend/assets/lazyIconImports-D97HEZkE.js +2 -0
  258. langflow/frontend/assets/{use-post-add-user-BrBYH9eR.js → use-post-add-user-C0MdTpQ5.js} +1 -1
  259. langflow/frontend/index.html +2 -2
  260. langflow/graph/edge/base.py +2 -3
  261. langflow/graph/graph/base.py +15 -13
  262. langflow/graph/graph/constants.py +3 -0
  263. langflow/graph/utils.py +6 -6
  264. langflow/graph/vertex/base.py +4 -5
  265. langflow/graph/vertex/param_handler.py +1 -1
  266. langflow/graph/vertex/vertex_types.py +2 -2
  267. langflow/helpers/flow.py +1 -1
  268. langflow/initial_setup/setup.py +32 -30
  269. langflow/initial_setup/starter_projects/Basic Prompt Chaining.json +26 -0
  270. langflow/initial_setup/starter_projects/Basic Prompting.json +26 -0
  271. langflow/initial_setup/starter_projects/Blog Writer.json +58 -2
  272. langflow/initial_setup/starter_projects/Custom Component Generator.json +37 -2
  273. langflow/initial_setup/starter_projects/Document Q&A.json +27 -1
  274. langflow/initial_setup/starter_projects/Financial Report Parser.json +43 -0
  275. langflow/initial_setup/starter_projects/Hybrid Search RAG.json +83 -1
  276. langflow/initial_setup/starter_projects/Image Sentiment Analysis.json +43 -0
  277. langflow/initial_setup/starter_projects/Instagram Copywriter.json +51 -3
  278. langflow/initial_setup/starter_projects/Invoice Summarizer.json +40 -1
  279. langflow/initial_setup/starter_projects/Knowledge Ingestion.json +73 -2
  280. langflow/initial_setup/starter_projects/Knowledge Retrieval.json +63 -0
  281. langflow/initial_setup/starter_projects/Market Research.json +59 -3
  282. langflow/initial_setup/starter_projects/Meeting Summary.json +101 -6
  283. langflow/initial_setup/starter_projects/Memory Chatbot.json +37 -2
  284. langflow/initial_setup/starter_projects/News Aggregator.json +63 -3
  285. langflow/initial_setup/starter_projects/Nvidia Remix.json +69 -4
  286. langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +48 -1
  287. langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json +44 -1
  288. langflow/initial_setup/starter_projects/Price Deal Finder.json +57 -5
  289. langflow/initial_setup/starter_projects/Research Agent.json +42 -3
  290. langflow/initial_setup/starter_projects/Research Translation Loop.json +66 -0
  291. langflow/initial_setup/starter_projects/SEO Keyword Generator.json +17 -0
  292. langflow/initial_setup/starter_projects/SaaS Pricing.json +27 -1
  293. langflow/initial_setup/starter_projects/Search agent.json +40 -1
  294. langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +76 -7
  295. langflow/initial_setup/starter_projects/Simple Agent.json +59 -3
  296. langflow/initial_setup/starter_projects/Social Media Agent.json +77 -1
  297. langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +35 -1
  298. langflow/initial_setup/starter_projects/Travel Planning Agents.json +51 -3
  299. langflow/initial_setup/starter_projects/Twitter Thread Generator.json +80 -0
  300. langflow/initial_setup/starter_projects/Vector Store RAG.json +110 -3
  301. langflow/initial_setup/starter_projects/Youtube Analysis.json +84 -3
  302. langflow/initial_setup/starter_projects/vector_store_rag.py +1 -1
  303. langflow/interface/components.py +23 -22
  304. langflow/interface/initialize/loading.py +5 -5
  305. langflow/interface/run.py +1 -1
  306. langflow/interface/utils.py +1 -1
  307. langflow/io/__init__.py +0 -1
  308. langflow/langflow_launcher.py +1 -1
  309. langflow/load/load.py +2 -7
  310. langflow/logging/__init__.py +0 -1
  311. langflow/logging/logger.py +191 -115
  312. langflow/logging/setup.py +1 -1
  313. langflow/main.py +37 -52
  314. langflow/memory.py +7 -7
  315. langflow/middleware.py +1 -1
  316. langflow/processing/process.py +6 -3
  317. langflow/schema/artifact.py +2 -2
  318. langflow/schema/data.py +10 -2
  319. langflow/schema/dataframe.py +1 -1
  320. langflow/schema/message.py +1 -1
  321. langflow/serialization/serialization.py +1 -1
  322. langflow/services/auth/mcp_encryption.py +104 -0
  323. langflow/services/auth/utils.py +2 -2
  324. langflow/services/cache/disk.py +1 -1
  325. langflow/services/cache/service.py +3 -3
  326. langflow/services/database/models/flow/model.py +2 -7
  327. langflow/services/database/models/transactions/crud.py +2 -2
  328. langflow/services/database/models/user/crud.py +2 -2
  329. langflow/services/database/service.py +8 -8
  330. langflow/services/database/utils.py +6 -5
  331. langflow/services/deps.py +2 -3
  332. langflow/services/factory.py +1 -1
  333. langflow/services/flow/flow_runner.py +7 -12
  334. langflow/services/job_queue/service.py +16 -15
  335. langflow/services/manager.py +3 -4
  336. langflow/services/settings/auth.py +1 -1
  337. langflow/services/settings/base.py +3 -8
  338. langflow/services/settings/feature_flags.py +1 -1
  339. langflow/services/settings/manager.py +1 -1
  340. langflow/services/settings/utils.py +1 -1
  341. langflow/services/socket/__init__.py +0 -1
  342. langflow/services/socket/service.py +3 -3
  343. langflow/services/socket/utils.py +4 -4
  344. langflow/services/state/service.py +1 -2
  345. langflow/services/storage/factory.py +1 -1
  346. langflow/services/storage/local.py +9 -8
  347. langflow/services/storage/s3.py +11 -10
  348. langflow/services/store/service.py +3 -3
  349. langflow/services/store/utils.py +3 -2
  350. langflow/services/task/temp_flow_cleanup.py +7 -7
  351. langflow/services/telemetry/service.py +10 -10
  352. langflow/services/tracing/arize_phoenix.py +2 -2
  353. langflow/services/tracing/langfuse.py +1 -1
  354. langflow/services/tracing/langsmith.py +1 -1
  355. langflow/services/tracing/langwatch.py +1 -1
  356. langflow/services/tracing/opik.py +1 -1
  357. langflow/services/tracing/service.py +25 -6
  358. langflow/services/tracing/traceloop.py +245 -0
  359. langflow/services/utils.py +7 -7
  360. langflow/services/variable/kubernetes.py +3 -3
  361. langflow/services/variable/kubernetes_secrets.py +2 -1
  362. langflow/services/variable/service.py +5 -5
  363. langflow/utils/component_utils.py +9 -6
  364. langflow/utils/util.py +5 -5
  365. langflow/utils/validate.py +3 -3
  366. langflow/utils/voice_utils.py +2 -2
  367. {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev39.dist-info}/METADATA +2 -1
  368. {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev39.dist-info}/RECORD +393 -374
  369. langflow/components/vectorstores/redis.py +0 -89
  370. langflow/frontend/assets/index-C26RqKWL.js +0 -1
  371. langflow/frontend/assets/index-CqS7zir1.css +0 -1
  372. langflow/frontend/assets/lazyIconImports-t6wEndt1.js +0 -2
  373. /langflow/components/{vectorstores → FAISS}/faiss.py +0 -0
  374. /langflow/components/{vectorstores → cassandra}/cassandra.py +0 -0
  375. /langflow/components/{datastax/cassandra.py → cassandra/cassandra_chat.py} +0 -0
  376. /langflow/components/{vectorstores → cassandra}/cassandra_graph.py +0 -0
  377. /langflow/components/{vectorstores → chroma}/chroma.py +0 -0
  378. /langflow/components/{vectorstores → clickhouse}/clickhouse.py +0 -0
  379. /langflow/components/{vectorstores → couchbase}/couchbase.py +0 -0
  380. /langflow/components/{vectorstores → datastax}/astradb.py +0 -0
  381. /langflow/components/{vectorstores → datastax}/astradb_graph.py +0 -0
  382. /langflow/components/{vectorstores → datastax}/graph_rag.py +0 -0
  383. /langflow/components/{vectorstores → datastax}/hcd.py +0 -0
  384. /langflow/components/{vectorstores → elastic}/elasticsearch.py +0 -0
  385. /langflow/components/{vectorstores → elastic}/opensearch.py +0 -0
  386. /langflow/components/{vectorstores → milvus}/milvus.py +0 -0
  387. /langflow/components/{vectorstores → mongodb}/mongodb_atlas.py +0 -0
  388. /langflow/components/{vectorstores → pgvector}/pgvector.py +0 -0
  389. /langflow/components/{vectorstores → pinecone}/pinecone.py +0 -0
  390. /langflow/components/{vectorstores → qdrant}/qdrant.py +0 -0
  391. /langflow/components/{vectorstores → supabase}/supabase.py +0 -0
  392. /langflow/components/{vectorstores → upstash}/upstash.py +0 -0
  393. /langflow/components/{vectorstores → vectara}/vectara.py +0 -0
  394. /langflow/components/{vectorstores → vectara}/vectara_rag.py +0 -0
  395. /langflow/components/{vectorstores → weaviate}/weaviate.py +0 -0
  396. {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev39.dist-info}/WHEEL +0 -0
  397. {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev39.dist-info}/entry_points.txt +0 -0
@@ -1,33 +1,43 @@
1
+ """Logging configuration for Langflow using structlog."""
2
+
1
3
  import json
2
4
  import logging
5
+ import logging.handlers
3
6
  import os
4
7
  import sys
5
8
  from collections import deque
9
+ from datetime import datetime
6
10
  from pathlib import Path
7
11
  from threading import Lock, Semaphore
8
- from typing import TypedDict
12
+ from typing import Any, TypedDict
9
13
 
10
14
  import orjson
11
- from loguru import logger
15
+ import structlog
12
16
  from platformdirs import user_cache_dir
13
- from rich.logging import RichHandler
14
- from typing_extensions import NotRequired, override
17
+ from typing_extensions import NotRequired
15
18
 
16
19
  from langflow.settings import DEV
17
20
 
18
- VALID_LOG_LEVELS = ["TRACE", "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
19
- # Human-readable
20
- DEFAULT_LOG_FORMAT = (
21
- "<green>{time:YYYY-MM-DD HH:mm:ss}</green> - <level>{level: <8}</level> - {module} - <level>{message}</level>"
22
- )
21
+ VALID_LOG_LEVELS = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
22
+
23
+ # Map log level names to integers
24
+ LOG_LEVEL_MAP = {
25
+ "DEBUG": logging.DEBUG,
26
+ "INFO": logging.INFO,
27
+ "WARNING": logging.WARNING,
28
+ "ERROR": logging.ERROR,
29
+ "CRITICAL": logging.CRITICAL,
30
+ }
23
31
 
24
32
 
25
33
  class SizedLogBuffer:
34
+ """A buffer for storing log messages for the log retrieval API."""
35
+
26
36
  def __init__(
27
37
  self,
28
38
  max_readers: int = 20, # max number of concurrent readers for the buffer
29
39
  ):
30
- """A buffer for storing log messages for the log retrieval API.
40
+ """Initialize the buffer.
31
41
 
32
42
  The buffer can be overwritten by an env variable LANGFLOW_LOG_RETRIEVER_BUFFER_SIZE
33
43
  because the logger is initialized before the settings_service are loaded.
@@ -40,12 +50,28 @@ class SizedLogBuffer:
40
50
  self._max = 0
41
51
 
42
52
  def get_write_lock(self) -> Lock:
53
+ """Get the write lock."""
43
54
  return self._wlock
44
55
 
45
56
  def write(self, message: str) -> None:
57
+ """Write a message to the buffer."""
46
58
  record = json.loads(message)
47
- log_entry = record["text"]
48
- epoch = int(record["record"]["time"]["timestamp"] * 1000)
59
+ log_entry = record.get("event", record.get("msg", record.get("text", "")))
60
+
61
+ # Extract timestamp - support both direct timestamp and nested record.time.timestamp
62
+ timestamp = record.get("timestamp", 0)
63
+ if timestamp == 0 and "record" in record:
64
+ # Support nested structure from tests: record.time.timestamp
65
+ time_info = record["record"].get("time", {})
66
+ timestamp = time_info.get("timestamp", 0)
67
+
68
+ if isinstance(timestamp, str):
69
+ # Parse ISO format timestamp
70
+ dt = datetime.fromisoformat(timestamp.replace("Z", "+00:00"))
71
+ epoch = int(dt.timestamp() * 1000)
72
+ else:
73
+ epoch = int(timestamp * 1000)
74
+
49
75
  with self._wlock:
50
76
  if len(self.buffer) >= self.max:
51
77
  for _ in range(len(self.buffer) - self.max + 1):
@@ -53,9 +79,11 @@ class SizedLogBuffer:
53
79
  self.buffer.append((epoch, log_entry))
54
80
 
55
81
  def __len__(self) -> int:
82
+ """Get the length of the buffer."""
56
83
  return len(self.buffer)
57
84
 
58
85
  def get_after_timestamp(self, timestamp: int, lines: int = 5) -> dict[int, str]:
86
+ """Get log entries after a timestamp."""
59
87
  rc = {}
60
88
 
61
89
  self._rsemaphore.acquire()
@@ -73,6 +101,7 @@ class SizedLogBuffer:
73
101
  return rc
74
102
 
75
103
  def get_before_timestamp(self, timestamp: int, lines: int = 5) -> dict[int, str]:
104
+ """Get log entries before a timestamp."""
76
105
  self._rsemaphore.acquire()
77
106
  try:
78
107
  with self._wlock:
@@ -94,6 +123,7 @@ class SizedLogBuffer:
94
123
  self._rsemaphore.release()
95
124
 
96
125
  def get_last_n(self, last_idx: int) -> dict[int, str]:
126
+ """Get the last n log entries."""
97
127
  self._rsemaphore.acquire()
98
128
  try:
99
129
  with self._wlock:
@@ -104,6 +134,7 @@ class SizedLogBuffer:
104
134
 
105
135
  @property
106
136
  def max(self) -> int:
137
+ """Get the maximum buffer size."""
107
138
  # Get it dynamically to allow for env variable changes
108
139
  if self._max == 0:
109
140
  env_buffer_size = os.getenv("LANGFLOW_LOG_RETRIEVER_BUFFER_SIZE", "0")
@@ -113,12 +144,15 @@ class SizedLogBuffer:
113
144
 
114
145
  @max.setter
115
146
  def max(self, value: int) -> None:
147
+ """Set the maximum buffer size."""
116
148
  self._max = value
117
149
 
118
150
  def enabled(self) -> bool:
151
+ """Check if the buffer is enabled."""
119
152
  return self.max > 0
120
153
 
121
154
  def max_size(self) -> int:
155
+ """Get the maximum buffer size."""
122
156
  return self.max
123
157
 
124
158
 
@@ -126,23 +160,39 @@ class SizedLogBuffer:
126
160
  log_buffer = SizedLogBuffer()
127
161
 
128
162
 
129
- def serialize_log(record):
130
- subset = {
131
- "timestamp": record["time"].timestamp(),
132
- "message": record["message"],
133
- "level": record["level"].name,
134
- "module": record["module"],
135
- }
136
- return orjson.dumps(subset)
163
+ def add_serialized(_logger: Any, _method_name: str, event_dict: dict[str, Any]) -> dict[str, Any]:
164
+ """Add serialized version of the log entry."""
165
+ # Only add serialized if we're in JSON mode (for log buffer)
166
+ if log_buffer.enabled():
167
+ subset = {
168
+ "timestamp": event_dict.get("timestamp", 0),
169
+ "message": event_dict.get("event", ""),
170
+ "level": _method_name.upper(),
171
+ "module": event_dict.get("module", ""),
172
+ }
173
+ event_dict["serialized"] = orjson.dumps(subset)
174
+ return event_dict
175
+
176
+
177
+ def remove_exception_in_production(_logger: Any, _method_name: str, event_dict: dict[str, Any]) -> dict[str, Any]:
178
+ """Remove exception details in production."""
179
+ if DEV is False:
180
+ event_dict.pop("exception", None)
181
+ event_dict.pop("exc_info", None)
182
+ return event_dict
137
183
 
138
184
 
139
- def patching(record) -> None:
140
- record["extra"]["serialized"] = serialize_log(record)
141
- if DEV is False:
142
- record.pop("exception", None)
185
+ def buffer_writer(_logger: Any, _method_name: str, event_dict: dict[str, Any]) -> dict[str, Any]:
186
+ """Write to log buffer if enabled."""
187
+ if log_buffer.enabled():
188
+ # Create a JSON representation for the buffer
189
+ log_buffer.write(json.dumps(event_dict))
190
+ return event_dict
143
191
 
144
192
 
145
193
  class LogConfig(TypedDict):
194
+ """Configuration for logging."""
195
+
146
196
  log_level: NotRequired[str]
147
197
  log_file: NotRequired[Path]
148
198
  disable: NotRequired[bool]
@@ -150,30 +200,6 @@ class LogConfig(TypedDict):
150
200
  log_format: NotRequired[str]
151
201
 
152
202
 
153
- def is_valid_log_format(format_string) -> bool:
154
- """Validates a logging format string by attempting to format it with a dummy LogRecord.
155
-
156
- Args:
157
- format_string (str): The format string to validate.
158
-
159
- Returns:
160
- bool: True if the format string is valid, False otherwise.
161
- """
162
- record = logging.LogRecord(
163
- name="dummy", level=logging.INFO, pathname="dummy_path", lineno=0, msg="dummy message", args=None, exc_info=None
164
- )
165
-
166
- formatter = logging.Formatter(format_string)
167
-
168
- try:
169
- # Attempt to format the record
170
- formatter.format(record)
171
- except (KeyError, ValueError, TypeError):
172
- logger.error("Invalid log format string passed, fallback to default")
173
- return False
174
- return True
175
-
176
-
177
203
  def configure(
178
204
  *,
179
205
  log_level: str | None = None,
@@ -181,11 +207,9 @@ def configure(
181
207
  disable: bool | None = False,
182
208
  log_env: str | None = None,
183
209
  log_format: str | None = None,
184
- async_file: bool = False,
185
210
  log_rotation: str | None = None,
186
211
  ) -> None:
187
- if disable and log_level is None and log_file is None:
188
- logger.disable("langflow")
212
+ """Configure the logger."""
189
213
  if os.getenv("LANGFLOW_LOG_LEVEL", "").upper() in VALID_LOG_LEVELS and log_level is None:
190
214
  log_level = os.getenv("LANGFLOW_LOG_LEVEL")
191
215
  if log_level is None:
@@ -198,96 +222,148 @@ def configure(
198
222
  if log_env is None:
199
223
  log_env = os.getenv("LANGFLOW_LOG_ENV", "")
200
224
 
201
- logger.remove() # Remove default handlers
202
- logger.patch(patching)
225
+ # Get log format from env if not provided
226
+ if log_format is None:
227
+ log_format = os.getenv("LANGFLOW_LOG_FORMAT")
228
+
229
+ # Configure processors based on environment
230
+ processors = [
231
+ structlog.contextvars.merge_contextvars,
232
+ structlog.processors.add_log_level,
233
+ structlog.processors.TimeStamper(fmt="iso"),
234
+ add_serialized,
235
+ remove_exception_in_production,
236
+ buffer_writer,
237
+ ]
238
+
239
+ # Configure output based on environment
203
240
  if log_env.lower() == "container" or log_env.lower() == "container_json":
204
- logger.add(sys.stdout, format="{message}", serialize=True)
241
+ processors.append(structlog.processors.JSONRenderer())
205
242
  elif log_env.lower() == "container_csv":
206
- logger.add(sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss.SSS} {level} {file} {line} {function} {message}")
243
+ processors.append(
244
+ structlog.processors.KeyValueRenderer(
245
+ key_order=["timestamp", "level", "module", "event"], drop_missing=True
246
+ )
247
+ )
207
248
  else:
208
- if os.getenv("LANGFLOW_LOG_FORMAT") and log_format is None:
209
- log_format = os.getenv("LANGFLOW_LOG_FORMAT")
210
-
211
- if log_format is None or not is_valid_log_format(log_format):
212
- log_format = DEFAULT_LOG_FORMAT
213
- # pretty print to rich stdout development-friendly but poor performance, It's better for debugger.
214
- # suggest directly print to stdout in production
249
+ # Use rich console for pretty printing based on environment variable
215
250
  log_stdout_pretty = os.getenv("LANGFLOW_PRETTY_LOGS", "true").lower() == "true"
216
251
  if log_stdout_pretty:
217
- logger.configure(
218
- handlers=[
219
- {
220
- "sink": RichHandler(rich_tracebacks=True, markup=True),
221
- "format": log_format,
222
- "level": log_level.upper(),
223
- }
224
- ]
225
- )
252
+ # If custom format is provided, use KeyValueRenderer with custom format
253
+ if log_format:
254
+ processors.append(structlog.processors.KeyValueRenderer())
255
+ else:
256
+ processors.append(structlog.dev.ConsoleRenderer(colors=True))
226
257
  else:
227
- logger.add(sys.stdout, level=log_level.upper(), format=log_format, backtrace=True, diagnose=True)
258
+ processors.append(structlog.processors.JSONRenderer())
259
+
260
+ # Get numeric log level
261
+ numeric_level = LOG_LEVEL_MAP.get(log_level.upper(), logging.ERROR)
262
+
263
+ # Configure structlog
264
+ structlog.configure(
265
+ processors=processors,
266
+ wrapper_class=structlog.make_filtering_bound_logger(numeric_level),
267
+ context_class=dict,
268
+ logger_factory=structlog.PrintLoggerFactory(file=sys.stdout)
269
+ if not log_file
270
+ else structlog.stdlib.LoggerFactory(),
271
+ cache_logger_on_first_use=True,
272
+ )
228
273
 
229
- if not log_file:
274
+ # Set up file logging if needed
275
+ if log_file:
276
+ if not log_file.parent.exists():
230
277
  cache_dir = Path(user_cache_dir("langflow"))
231
- logger.debug(f"Cache directory: {cache_dir}")
232
278
  log_file = cache_dir / "langflow.log"
233
- logger.debug(f"Log file: {log_file}")
234
279
 
235
- if os.getenv("LANGFLOW_LOG_ROTATION") and log_rotation is None:
236
- log_rotation = os.getenv("LANGFLOW_LOG_ROTATION")
237
- elif log_rotation is None:
238
- log_rotation = "1 day"
239
-
240
- try:
241
- logger.add(
242
- sink=log_file,
243
- level=log_level.upper(),
244
- format=log_format,
245
- serialize=True,
246
- enqueue=async_file,
247
- rotation=log_rotation,
248
- )
249
- except Exception: # noqa: BLE001
250
- logger.exception("Error setting up log file")
280
+ # Parse rotation settings
281
+ if log_rotation:
282
+ # Handle rotation like "1 day", "100 MB", etc.
283
+ max_bytes = 10 * 1024 * 1024 # Default 10MB
284
+ if "MB" in log_rotation.upper():
285
+ try:
286
+ # Look for pattern like "100 MB" (with space)
287
+ parts = log_rotation.split()
288
+ expected_parts = 2
289
+ if len(parts) >= expected_parts and parts[1].upper() == "MB":
290
+ mb = int(parts[0])
291
+ if mb > 0: # Only use valid positive values
292
+ max_bytes = mb * 1024 * 1024
293
+ except (ValueError, IndexError):
294
+ pass
295
+ else:
296
+ max_bytes = 10 * 1024 * 1024 # Default 10MB
251
297
 
252
- if log_buffer.enabled():
253
- logger.add(sink=log_buffer.write, format="{time} {level} {message}", serialize=True)
298
+ # Since structlog doesn't have built-in rotation, we'll use stdlib logging for file output
299
+ file_handler = logging.handlers.RotatingFileHandler(
300
+ log_file,
301
+ maxBytes=max_bytes,
302
+ backupCount=5,
303
+ )
304
+ file_handler.setFormatter(logging.Formatter("%(message)s"))
254
305
 
255
- logger.debug(f"Logger set up with log level: {log_level}")
306
+ # Add file handler to root logger
307
+ logging.root.addHandler(file_handler)
308
+ logging.root.setLevel(numeric_level)
256
309
 
310
+ # Set up interceptors for uvicorn and gunicorn
257
311
  setup_uvicorn_logger()
258
312
  setup_gunicorn_logger()
259
313
 
314
+ # Create the global logger instance
315
+ global logger # noqa: PLW0603
316
+ logger = structlog.get_logger()
317
+
318
+ if disable:
319
+ # In structlog, we can set a very high filter level to effectively disable logging
320
+ structlog.configure(
321
+ wrapper_class=structlog.make_filtering_bound_logger(logging.CRITICAL),
322
+ )
323
+
324
+ logger.debug("Logger set up with log level: %s", log_level)
325
+
260
326
 
261
327
  def setup_uvicorn_logger() -> None:
328
+ """Redirect uvicorn logs through structlog."""
262
329
  loggers = (logging.getLogger(name) for name in logging.root.manager.loggerDict if name.startswith("uvicorn."))
263
330
  for uvicorn_logger in loggers:
264
331
  uvicorn_logger.handlers = []
265
- logging.getLogger("uvicorn").handlers = [InterceptHandler()]
332
+ uvicorn_logger.propagate = True
266
333
 
267
334
 
268
335
  def setup_gunicorn_logger() -> None:
269
- logging.getLogger("gunicorn.error").handlers = [InterceptHandler()]
270
- logging.getLogger("gunicorn.access").handlers = [InterceptHandler()]
336
+ """Redirect gunicorn logs through structlog."""
337
+ logging.getLogger("gunicorn.error").handlers = []
338
+ logging.getLogger("gunicorn.error").propagate = True
339
+ logging.getLogger("gunicorn.access").handlers = []
340
+ logging.getLogger("gunicorn.access").propagate = True
271
341
 
272
342
 
273
343
  class InterceptHandler(logging.Handler):
274
- """Default handler from examples in loguru documentation.
275
-
276
- See https://loguru.readthedocs.io/en/stable/overview.html#entirely-compatible-with-standard-logging.
277
- """
278
-
279
- @override
280
- def emit(self, record) -> None:
281
- # Get corresponding Loguru level if it exists
282
- try:
283
- level = logger.level(record.levelname).name
284
- except ValueError:
285
- level = record.levelno
344
+ """Intercept standard logging messages and route them to structlog."""
345
+
346
+ def emit(self, record: logging.LogRecord) -> None:
347
+ """Emit a log record by passing it to structlog."""
348
+ # Get corresponding structlog logger
349
+ logger_name = record.name
350
+ structlog_logger = structlog.get_logger(logger_name)
351
+
352
+ # Map log levels
353
+ level = record.levelno
354
+ if level >= logging.CRITICAL:
355
+ structlog_logger.critical(record.getMessage())
356
+ elif level >= logging.ERROR:
357
+ structlog_logger.error(record.getMessage())
358
+ elif level >= logging.WARNING:
359
+ structlog_logger.warning(record.getMessage())
360
+ elif level >= logging.INFO:
361
+ structlog_logger.info(record.getMessage())
362
+ else:
363
+ structlog_logger.debug(record.getMessage())
286
364
 
287
- # Find caller from where originated the logged message
288
- frame, depth = logging.currentframe(), 2
289
- while frame.f_code.co_filename == logging.__file__ and frame.f_back:
290
- frame = frame.f_back
291
- depth += 1
292
365
 
293
- logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())
366
+ # Initialize logger - will be reconfigured when configure() is called
367
+ # Set it to critical level
368
+ logger: structlog.BoundLogger = structlog.get_logger()
369
+ configure(log_level="CRITICAL", disable=True)
langflow/logging/setup.py CHANGED
@@ -1,4 +1,4 @@
1
- from loguru import logger
1
+ from langflow.logging.logger import logger
2
2
 
3
3
  LOGGING_CONFIGURED = False
4
4