langflow-base-nightly 0.5.0.dev36__py3-none-any.whl → 0.5.0.dev38__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- langflow/__main__.py +1 -1
- langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py +24 -30
- langflow/alembic/versions/58b28437a398_modify_nullable.py +6 -6
- langflow/alembic/versions/79e675cb6752_change_datetime_type.py +24 -30
- langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py +12 -13
- langflow/api/build.py +21 -26
- langflow/api/health_check_router.py +3 -3
- langflow/api/utils.py +3 -3
- langflow/api/v1/callback.py +2 -2
- langflow/api/v1/chat.py +19 -31
- langflow/api/v1/endpoints.py +10 -10
- langflow/api/v1/flows.py +1 -1
- langflow/api/v1/knowledge_bases.py +19 -12
- langflow/api/v1/mcp.py +12 -12
- langflow/api/v1/mcp_projects.py +45 -81
- langflow/api/v1/mcp_utils.py +8 -8
- langflow/api/v1/schemas.py +1 -5
- langflow/api/v1/store.py +1 -1
- langflow/api/v1/validate.py +2 -2
- langflow/api/v1/voice_mode.py +58 -62
- langflow/api/v2/files.py +5 -3
- langflow/api/v2/mcp.py +10 -9
- langflow/base/composio/composio_base.py +21 -2
- langflow/base/data/docling_utils.py +194 -0
- langflow/base/data/kb_utils.py +33 -0
- langflow/base/embeddings/aiml_embeddings.py +1 -1
- langflow/base/flow_processing/utils.py +1 -2
- langflow/base/io/__init__.py +0 -1
- langflow/base/langwatch/utils.py +2 -1
- langflow/base/mcp/util.py +49 -47
- langflow/base/models/model.py +3 -3
- langflow/base/prompts/api_utils.py +1 -1
- langflow/base/tools/flow_tool.py +2 -2
- langflow/base/tools/run_flow.py +2 -6
- langflow/components/Notion/add_content_to_page.py +2 -2
- langflow/components/Notion/list_database_properties.py +2 -2
- langflow/components/Notion/list_pages.py +2 -2
- langflow/components/Notion/page_content_viewer.py +2 -2
- langflow/components/Notion/update_page_property.py +1 -1
- langflow/components/agentql/agentql_api.py +2 -10
- langflow/components/agents/agent.py +3 -3
- langflow/components/agents/mcp_component.py +54 -69
- langflow/components/anthropic/anthropic.py +5 -4
- langflow/components/assemblyai/assemblyai_get_subtitles.py +2 -2
- langflow/components/assemblyai/assemblyai_lemur.py +2 -2
- langflow/components/assemblyai/assemblyai_list_transcripts.py +2 -2
- langflow/components/assemblyai/assemblyai_poll_transcript.py +2 -2
- langflow/components/assemblyai/assemblyai_start_transcript.py +2 -2
- langflow/components/data/file.py +575 -55
- langflow/components/data/kb_ingest.py +116 -43
- langflow/components/data/kb_retrieval.py +24 -26
- langflow/components/data/url.py +1 -1
- langflow/components/datastax/astra_assistant_manager.py +3 -3
- langflow/components/datastax/create_assistant.py +1 -2
- langflow/components/deactivated/merge_data.py +1 -2
- langflow/components/deactivated/sub_flow.py +6 -7
- langflow/components/deactivated/vectara_self_query.py +3 -3
- langflow/components/docling/__init__.py +0 -198
- langflow/components/docling/docling_inline.py +1 -1
- langflow/components/embeddings/text_embedder.py +3 -3
- langflow/components/firecrawl/firecrawl_extract_api.py +2 -9
- langflow/components/google/gmail.py +1 -1
- langflow/components/google/google_generative_ai.py +5 -11
- langflow/components/groq/groq.py +4 -3
- langflow/components/helpers/current_date.py +2 -3
- langflow/components/helpers/memory.py +1 -1
- langflow/components/ibm/watsonx.py +1 -1
- langflow/components/ibm/watsonx_embeddings.py +1 -1
- langflow/components/langwatch/langwatch.py +3 -3
- langflow/components/logic/flow_tool.py +2 -2
- langflow/components/logic/notify.py +1 -1
- langflow/components/logic/run_flow.py +2 -3
- langflow/components/logic/sub_flow.py +4 -5
- langflow/components/mem0/mem0_chat_memory.py +2 -8
- langflow/components/nvidia/nvidia.py +3 -3
- langflow/components/olivya/olivya.py +7 -7
- langflow/components/ollama/ollama.py +8 -6
- langflow/components/processing/batch_run.py +8 -8
- langflow/components/processing/data_operations.py +2 -2
- langflow/components/processing/merge_data.py +1 -2
- langflow/components/processing/message_to_data.py +2 -3
- langflow/components/processing/parse_json_data.py +1 -1
- langflow/components/processing/save_file.py +6 -32
- langflow/components/prototypes/python_function.py +2 -3
- langflow/components/serpapi/serp.py +1 -1
- langflow/components/tavily/tavily_extract.py +1 -1
- langflow/components/tavily/tavily_search.py +1 -1
- langflow/components/tools/calculator.py +2 -2
- langflow/components/tools/python_code_structured_tool.py +3 -10
- langflow/components/tools/python_repl.py +2 -2
- langflow/components/tools/searxng.py +3 -3
- langflow/components/tools/serp_api.py +2 -2
- langflow/components/tools/tavily_search_tool.py +2 -2
- langflow/components/tools/yahoo_finance.py +1 -1
- langflow/components/twelvelabs/video_embeddings.py +4 -4
- langflow/components/vectorstores/astradb.py +30 -19
- langflow/components/vectorstores/local_db.py +1 -1
- langflow/components/yahoosearch/yahoo.py +1 -1
- langflow/components/youtube/trending.py +3 -4
- langflow/custom/attributes.py +2 -1
- langflow/custom/code_parser/code_parser.py +1 -1
- langflow/custom/custom_component/base_component.py +1 -1
- langflow/custom/custom_component/component.py +16 -2
- langflow/custom/directory_reader/directory_reader.py +7 -7
- langflow/custom/directory_reader/utils.py +1 -2
- langflow/custom/utils.py +30 -30
- langflow/events/event_manager.py +1 -1
- langflow/frontend/assets/{SlackIcon-B260Qg_R.js → SlackIcon-BhW6H3JR.js} +1 -1
- langflow/frontend/assets/{Wikipedia-BB2mbgyd.js → Wikipedia-Dx5jbiy3.js} +1 -1
- langflow/frontend/assets/{Wolfram-DytXC9hF.js → Wolfram-CIyonzwo.js} +1 -1
- langflow/frontend/assets/{index-DPX6X_bw.js → index-0XQqYgdG.js} +1 -1
- langflow/frontend/assets/{index-DtJyCbzF.js → index-1Q3VBqKn.js} +1 -1
- langflow/frontend/assets/{index-DztLFiip.js → index-35sspuLu.js} +1 -1
- langflow/frontend/assets/{index-BeNby7qF.js → index-7hzXChQz.js} +1 -1
- langflow/frontend/assets/{index-BOEf7-ty.js → index-8cuhogZP.js} +1 -1
- langflow/frontend/assets/{index-D0s9f6Re.js → index-B0m53xKd.js} +1 -1
- langflow/frontend/assets/{index-DpJiH-Rk.js → index-B1XqWJhG.js} +1 -1
- langflow/frontend/assets/{index-DuAeoC-H.js → index-B3KCdQ91.js} +1 -1
- langflow/frontend/assets/{index-Bxml6wXu.js → index-B7uEuOPK.js} +1 -1
- langflow/frontend/assets/{index-CDFLVFB4.js → index-B8UR8v-Q.js} +1 -1
- langflow/frontend/assets/{index-ci4XHjbJ.js → index-BD7Io1hL.js} +6 -6
- langflow/frontend/assets/{index-DasrI03Y.js → index-BDQrd7Tj.js} +1 -1
- langflow/frontend/assets/{index-CkQ-bJ4G.js → index-BDuk0d7P.js} +1 -1
- langflow/frontend/assets/{index-C_1RBTul.js → index-BFQ8KFK0.js} +1 -1
- langflow/frontend/assets/{index-DqSH4x-R.js → index-BFf0HTFI.js} +1 -1
- langflow/frontend/assets/{index-BXMhmvTj.js → index-BHhnpSkW.js} +1 -1
- langflow/frontend/assets/{index-Uq2ij_SS.js → index-BKKrUElc.js} +1 -1
- langflow/frontend/assets/{index-3TJWUdmx.js → index-BKeZt2hQ.js} +1 -1
- langflow/frontend/assets/{index-DHlEwAxb.js → index-BKlQbl-6.js} +1 -1
- langflow/frontend/assets/{index-Bisa4IQF.js → index-BLYw9MK2.js} +1 -1
- langflow/frontend/assets/{index-GODbXlHC.js → index-BLsVo9iW.js} +1 -1
- langflow/frontend/assets/{index-CHFO5O4g.js → index-BNQIbda3.js} +1 -1
- langflow/frontend/assets/{index-3uOAA_XX.js → index-BPR2mEFC.js} +1 -1
- langflow/frontend/assets/{index-3qMh9x6K.js → index-BPfdqCc_.js} +1 -1
- langflow/frontend/assets/{index-rcdQpNcU.js → index-BQrVDjR1.js} +1 -1
- langflow/frontend/assets/{index-4eRtaV45.js → index-BRmSeoWR.js} +1 -1
- langflow/frontend/assets/{index-Ct9_T9ox.js → index-BUse-kxM.js} +1 -1
- langflow/frontend/assets/{index-BdYgKk1d.js → index-BVFaF7HW.js} +1 -1
- langflow/frontend/assets/{index-CWWo2zOA.js → index-BWgIWfv2.js} +1 -1
- langflow/frontend/assets/{index-Du9aJK7m.js → index-BWt5xGeA.js} +1 -1
- langflow/frontend/assets/{index-Baka5dKE.js → index-BYhcGLTV.js} +1 -1
- langflow/frontend/assets/{index-BWq9GTzt.js → index-BYjw7Gk3.js} +1 -1
- langflow/frontend/assets/{index-r1LZg-PY.js → index-BZFljdMa.js} +1 -1
- langflow/frontend/assets/index-BcAgItH4.js +1 -0
- langflow/frontend/assets/{index-B8TlNgn-.js → index-Bct1s6__.js} +1 -1
- langflow/frontend/assets/{index-DZzbmg3J.js → index-Bhv79Zso.js} +1 -1
- langflow/frontend/assets/{index-CqDUqHfd.js → index-Bj3lSwvZ.js} +1 -1
- langflow/frontend/assets/{index-dkS0ek2S.js → index-Bk4mTwnI.js} +1 -1
- langflow/frontend/assets/{index-tOy_uloT.js → index-BmIx1cws.js} +1 -1
- langflow/frontend/assets/{index-BVtf6m9S.js → index-BmYJJ5YS.js} +1 -1
- langflow/frontend/assets/{index-mBjJYD9q.js → index-BnAFhkSN.js} +1 -1
- langflow/frontend/assets/{index-Ba3RTMXI.js → index-Bo-ww0Bb.js} +1 -1
- langflow/frontend/assets/{index-BsBWP-Dh.js → index-BpmqDOeZ.js} +1 -1
- langflow/frontend/assets/{index-BqUeOc7Y.js → index-BrVhdPZb.js} +1 -1
- langflow/frontend/assets/{index-DWkMJnbd.js → index-BvGQfVBD.js} +1 -1
- langflow/frontend/assets/{index-DdzVmJHE.js → index-Bwi4flFg.js} +1 -1
- langflow/frontend/assets/{index-Ccb5B8zG.js → index-BzoRPtTY.js} +1 -1
- langflow/frontend/assets/{index-Ym6gz0T6.js → index-C--IDAyc.js} +1 -1
- langflow/frontend/assets/{index-CvQ0w8Pj.js → index-C0E3_MIK.js} +1 -1
- langflow/frontend/assets/{index-DxIs8VSp.js → index-C27Jj_26.js} +1 -1
- langflow/frontend/assets/{index-BxWXWRmZ.js → index-C2eQmQsn.js} +1 -1
- langflow/frontend/assets/{index-B536IPXH.js → index-C8K0r39B.js} +1 -1
- langflow/frontend/assets/{index-BEDxAk3N.js → index-CEJNWPhA.js} +1 -1
- langflow/frontend/assets/{index-G_U_kPAd.js → index-CFNTYfFK.js} +1 -1
- langflow/frontend/assets/{index-CMGZGIx_.js → index-CMHpjHZl.js} +1 -1
- langflow/frontend/assets/{index-C76aBV_h.js → index-CSu8KHOi.js} +1 -1
- langflow/frontend/assets/{index-B-c82Fnu.js → index-CUKmGsI6.js} +1 -1
- langflow/frontend/assets/{index-DX7XsAcx.js → index-CWYiSeWV.js} +1 -1
- langflow/frontend/assets/{index-COL0eiWI.js → index-CY7_TBTC.js} +1 -1
- langflow/frontend/assets/{index-BlBl2tvQ.js → index-CbnWRlYY.js} +1 -1
- langflow/frontend/assets/{index-BQB-iDYl.js → index-CfPBgkqg.js} +1 -1
- langflow/frontend/assets/{index-DWr_zPkx.js → index-Cg53lrYh.js} +1 -1
- langflow/frontend/assets/{index-BcgB3rXH.js → index-CgU7KF4I.js} +1 -1
- langflow/frontend/assets/{index-CkSzjCqM.js → index-CgwykVGh.js} +1 -1
- langflow/frontend/assets/{index-BbsND1Qg.js → index-Ch5r0oW6.js} +1 -1
- langflow/frontend/assets/{index-AY5Dm2mG.js → index-CjsommIr.js} +1 -1
- langflow/frontend/assets/{index-BtJ2o21k.js → index-CkK25zZO.js} +1 -1
- langflow/frontend/assets/{index-BKvKC-12.js → index-CkjwSTSM.js} +1 -1
- langflow/frontend/assets/{index-BVHvIhT5.js → index-CmSFKgiD.js} +1 -1
- langflow/frontend/assets/{index-D-zkHcob.js → index-Cr5v2ave.js} +1 -1
- langflow/frontend/assets/{index-js8ceOaP.js → index-CrAF-31Y.js} +1 -1
- langflow/frontend/assets/{index-BNbWMmAV.js → index-CsLQiWNf.js} +1 -1
- langflow/frontend/assets/{index-VcXZzovW.js → index-CuCM7Wu7.js} +1 -1
- langflow/frontend/assets/{index-DzeIsaBm.js → index-Cxy9sEpy.js} +1 -1
- langflow/frontend/assets/{index-LrMzDsq9.js → index-CyP3py8K.js} +1 -1
- langflow/frontend/assets/{index-C8KD3LPb.js → index-CzHzeZuA.js} +1 -1
- langflow/frontend/assets/{index-DS1EgA10.js → index-D1oynC8a.js} +1 -1
- langflow/frontend/assets/{index-ByFXr9Iq.js → index-D4tjMhfY.js} +1 -1
- langflow/frontend/assets/{index-DyJDHm2D.js → index-D6CSIrp1.js} +1 -1
- langflow/frontend/assets/{index-DIqSyDVO.js → index-D9kwEzPB.js} +1 -1
- langflow/frontend/assets/{index-D5PeCofu.js → index-DDXsm8tz.js} +1 -1
- langflow/frontend/assets/{index-CJwYfDBz.js → index-DDhJVVel.js} +1 -1
- langflow/frontend/assets/{index-C7x9R_Yo.js → index-DH6o91_s.js} +1 -1
- langflow/frontend/assets/{index-DpQKtcXu.js → index-DHngW1k8.js} +1 -1
- langflow/frontend/assets/{index-VZnN0P6C.js → index-DIKUsGLF.js} +1 -1
- langflow/frontend/assets/{index-VHmUHUUU.js → index-DJESSNJi.js} +1 -1
- langflow/frontend/assets/{index-BdIWbCEL.js → index-DMCWDJOl.js} +1 -1
- langflow/frontend/assets/{index-DK8vNpXK.js → index-DOEvKC2X.js} +1 -1
- langflow/frontend/assets/{index-C7V5U9yH.js → index-DOQDkSoK.js} +1 -1
- langflow/frontend/assets/{index-D0HmkH0H.js → index-DXAfIEvs.js} +1 -1
- langflow/frontend/assets/{index-C9N80hP8.js → index-DZP_SaHb.js} +1 -1
- langflow/frontend/assets/{index-B2ggrBuR.js → index-DZxUIhWh.js} +1 -1
- langflow/frontend/assets/{index-DS9I4y48.js → index-Dda2u_yz.js} +1 -1
- langflow/frontend/assets/{index-BLROcaSz.js → index-Dg8N3NSO.js} +1 -1
- langflow/frontend/assets/{index-Dpz3oBf5.js → index-DkGhPNeA.js} +1 -1
- langflow/frontend/assets/{index-BnLT29qW.js → index-Dka_Rk4-.js} +1 -1
- langflow/frontend/assets/{index-B5ed-sAv.js → index-DljpLeCW.js} +1 -1
- langflow/frontend/assets/{index-Cx__T92e.js → index-DnVYJtVO.js} +1 -1
- langflow/frontend/assets/{index-hOkEW3JP.js → index-DqbzUcI5.js} +1 -1
- langflow/frontend/assets/{index-BxkZkBgQ.js → index-Dr6pVDPI.js} +1 -1
- langflow/frontend/assets/{index-BIkqesA-.js → index-DsoX2o1S.js} +1 -1
- langflow/frontend/assets/{index-Cpgkb0Q3.js → index-DwfHWnX7.js} +1 -1
- langflow/frontend/assets/{index-B9Mo3ndZ.js → index-Dx-Z87KT.js} +1 -1
- langflow/frontend/assets/{index-R7q8cAek.js → index-DyqITq51.js} +1 -1
- langflow/frontend/assets/{index-DKEXZFUO.js → index-DzIv3RyR.js} +1 -1
- langflow/frontend/assets/{index-BJrY2Fiu.js → index-G4ro0MjT.js} +1 -1
- langflow/frontend/assets/{index-IFGgPiye.js → index-H7J7w7fa.js} +1 -1
- langflow/frontend/assets/{index-lKEJpUsF.js → index-KWY77KfV.js} +1 -1
- langflow/frontend/assets/{index-DDNNv4C0.js → index-U9GWm1eH.js} +1 -1
- langflow/frontend/assets/{index-BRWNIt9F.js → index-Un9pWxnP.js} +1 -1
- langflow/frontend/assets/{index-BCK-ZyIh.js → index-Xi4TplbI.js} +1 -1
- langflow/frontend/assets/{index-BEKoRwsX.js → index-_cbGmjF4.js} +1 -1
- langflow/frontend/assets/{index-7xXgqu09.js → index-cEXY6V06.js} +1 -1
- langflow/frontend/assets/{index-D87Zw62M.js → index-dyXKnkMi.js} +1 -1
- langflow/frontend/assets/{index-CG7cp0nD.js → index-eUkS6iJM.js} +1 -1
- langflow/frontend/assets/{index-CoUlHbtg.js → index-ekfMOqrF.js} +1 -1
- langflow/frontend/assets/{index-DhzEUXfr.js → index-gdb7XMS8.js} +1 -1
- langflow/frontend/assets/{index-D9eflZfP.js → index-hZUcL0MZ.js} +1 -1
- langflow/frontend/assets/{index-CwIxqYlT.js → index-kkA-qHB_.js} +1 -1
- langflow/frontend/assets/{index-sS6XLk3j.js → index-mzl9ULw5.js} +1 -1
- langflow/frontend/assets/{index-BjENqyKe.js → index-oxHBZk2v.js} +1 -1
- langflow/frontend/assets/{index-BejHxU5W.js → index-p2kStSPe.js} +1 -1
- langflow/frontend/assets/{index-BOYTBrh9.js → index-paQEWYGT.js} +1 -1
- langflow/frontend/assets/{index-Cd5zuUUK.js → index-r_8gs4nL.js} +1 -1
- langflow/frontend/assets/{index-AlJ7td-D.js → index-uiKla4UR.js} +1 -1
- langflow/frontend/assets/{index-B8y58M9b.js → index-vJOO5U8M.js} +1 -1
- langflow/frontend/assets/{index-CF4dtI6S.js → index-w72fDjpG.js} +1 -1
- langflow/frontend/assets/{index-C2Xd7UkR.js → index-zV82kQ6k.js} +1 -1
- langflow/frontend/assets/lazyIconImports-DTNgvPE-.js +2 -0
- langflow/frontend/assets/{use-post-add-user-HN0rRnhv.js → use-post-add-user-CvtuazTg.js} +1 -1
- langflow/frontend/index.html +1 -1
- langflow/graph/edge/base.py +2 -3
- langflow/graph/graph/base.py +14 -12
- langflow/graph/graph/constants.py +3 -0
- langflow/graph/utils.py +6 -6
- langflow/graph/vertex/base.py +4 -5
- langflow/graph/vertex/param_handler.py +1 -1
- langflow/graph/vertex/vertex_types.py +2 -2
- langflow/helpers/flow.py +1 -1
- langflow/initial_setup/setup.py +32 -30
- langflow/initial_setup/starter_projects/Blog Writer.json +2 -2
- langflow/initial_setup/starter_projects/Custom Component Generator.json +2 -2
- langflow/initial_setup/starter_projects/Document Q&A.json +1 -1
- langflow/initial_setup/starter_projects/Hybrid Search RAG.json +2 -2
- langflow/initial_setup/starter_projects/Instagram Copywriter.json +3 -3
- langflow/initial_setup/starter_projects/Invoice Summarizer.json +1 -1
- langflow/initial_setup/starter_projects/Knowledge Ingestion.json +4 -4
- langflow/initial_setup/starter_projects/Knowledge Retrieval.json +2 -2
- langflow/initial_setup/starter_projects/Market Research.json +3 -3
- langflow/initial_setup/starter_projects/Meeting Summary.json +6 -6
- langflow/initial_setup/starter_projects/Memory Chatbot.json +2 -2
- langflow/initial_setup/starter_projects/News Aggregator.json +5 -22
- langflow/initial_setup/starter_projects/Nvidia Remix.json +3 -20
- langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +1 -1
- langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json +1 -1
- langflow/initial_setup/starter_projects/Price Deal Finder.json +5 -5
- langflow/initial_setup/starter_projects/Research Agent.json +3 -3
- langflow/initial_setup/starter_projects/SaaS Pricing.json +1 -1
- langflow/initial_setup/starter_projects/Search agent.json +1 -1
- langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +7 -7
- langflow/initial_setup/starter_projects/Simple Agent.json +3 -3
- langflow/initial_setup/starter_projects/Social Media Agent.json +1 -1
- langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +1 -1
- langflow/initial_setup/starter_projects/Travel Planning Agents.json +3 -3
- langflow/initial_setup/starter_projects/Vector Store RAG.json +5 -5
- langflow/initial_setup/starter_projects/Youtube Analysis.json +3 -3
- langflow/interface/components.py +23 -22
- langflow/interface/initialize/loading.py +5 -5
- langflow/interface/run.py +1 -1
- langflow/interface/utils.py +1 -1
- langflow/io/__init__.py +0 -1
- langflow/langflow_launcher.py +1 -1
- langflow/load/load.py +2 -7
- langflow/logging/__init__.py +0 -1
- langflow/logging/logger.py +191 -115
- langflow/logging/setup.py +1 -1
- langflow/main.py +37 -52
- langflow/memory.py +7 -7
- langflow/middleware.py +1 -1
- langflow/processing/process.py +4 -4
- langflow/schema/artifact.py +2 -2
- langflow/schema/data.py +10 -2
- langflow/schema/dataframe.py +1 -1
- langflow/schema/message.py +1 -1
- langflow/serialization/serialization.py +1 -1
- langflow/services/auth/utils.py +2 -2
- langflow/services/cache/disk.py +1 -1
- langflow/services/cache/service.py +3 -3
- langflow/services/database/models/flow/model.py +2 -7
- langflow/services/database/models/transactions/crud.py +2 -2
- langflow/services/database/models/user/crud.py +2 -2
- langflow/services/database/service.py +8 -8
- langflow/services/database/utils.py +6 -5
- langflow/services/deps.py +2 -3
- langflow/services/factory.py +1 -1
- langflow/services/flow/flow_runner.py +7 -12
- langflow/services/job_queue/service.py +16 -15
- langflow/services/manager.py +3 -4
- langflow/services/settings/auth.py +1 -1
- langflow/services/settings/base.py +3 -8
- langflow/services/settings/manager.py +1 -1
- langflow/services/settings/utils.py +1 -1
- langflow/services/socket/__init__.py +0 -1
- langflow/services/socket/service.py +3 -3
- langflow/services/socket/utils.py +4 -4
- langflow/services/state/service.py +1 -2
- langflow/services/storage/factory.py +1 -1
- langflow/services/storage/local.py +9 -8
- langflow/services/storage/s3.py +11 -10
- langflow/services/store/service.py +3 -3
- langflow/services/store/utils.py +3 -2
- langflow/services/task/temp_flow_cleanup.py +7 -7
- langflow/services/telemetry/service.py +10 -10
- langflow/services/tracing/arize_phoenix.py +2 -2
- langflow/services/tracing/langfuse.py +1 -1
- langflow/services/tracing/langsmith.py +1 -1
- langflow/services/tracing/langwatch.py +1 -1
- langflow/services/tracing/opik.py +1 -1
- langflow/services/tracing/service.py +25 -6
- langflow/services/tracing/traceloop.py +245 -0
- langflow/services/utils.py +7 -7
- langflow/services/variable/kubernetes.py +3 -3
- langflow/services/variable/kubernetes_secrets.py +2 -1
- langflow/services/variable/service.py +5 -5
- langflow/utils/component_utils.py +9 -6
- langflow/utils/util.py +5 -5
- langflow/utils/validate.py +3 -3
- langflow/utils/voice_utils.py +2 -2
- {langflow_base_nightly-0.5.0.dev36.dist-info → langflow_base_nightly-0.5.0.dev38.dist-info}/METADATA +2 -1
- {langflow_base_nightly-0.5.0.dev36.dist-info → langflow_base_nightly-0.5.0.dev38.dist-info}/RECORD +342 -340
- langflow/frontend/assets/lazyIconImports-Bh1TFfvH.js +0 -2
- {langflow_base_nightly-0.5.0.dev36.dist-info → langflow_base_nightly-0.5.0.dev38.dist-info}/WHEEL +0 -0
- {langflow_base_nightly-0.5.0.dev36.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.
|
|
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.
|
|
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(
|
|
121
|
+
configure()
|
|
127
122
|
|
|
128
123
|
# Startup message
|
|
129
124
|
if version:
|
|
130
|
-
logger.
|
|
125
|
+
await logger.adebug(f"Starting Langflow v{version}...")
|
|
131
126
|
else:
|
|
132
|
-
logger.
|
|
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.
|
|
135
|
+
await logger.adebug("Initializing services")
|
|
141
136
|
await initialize_services(fix_migration=fix_migration)
|
|
142
|
-
logger.
|
|
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.
|
|
140
|
+
await logger.adebug("Setting up LLM caching")
|
|
146
141
|
setup_llm_caching()
|
|
147
|
-
logger.
|
|
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.
|
|
145
|
+
await logger.adebug("Initializing super user")
|
|
151
146
|
await initialize_super_user_if_needed()
|
|
152
|
-
logger.
|
|
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.
|
|
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.
|
|
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.
|
|
156
|
+
await logger.adebug("Caching types")
|
|
162
157
|
all_types_dict = await get_and_cache_all_types_dict(get_settings_service())
|
|
163
|
-
logger.
|
|
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.
|
|
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.
|
|
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.
|
|
180
|
+
await logger.adebug("Another worker is creating starter projects, skipping")
|
|
186
181
|
except Exception as e: # noqa: BLE001
|
|
187
|
-
logger.
|
|
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.
|
|
187
|
+
await logger.adebug("Starting telemetry service")
|
|
193
188
|
telemetry_service.start()
|
|
194
|
-
logger.
|
|
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.
|
|
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.
|
|
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.
|
|
201
|
+
await logger.adebug("Loading mcp servers for projects")
|
|
207
202
|
await init_mcp_servers()
|
|
208
|
-
logger.
|
|
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.
|
|
206
|
+
await logger.adebug(f"Total initialization time: {total_time:.2f}s")
|
|
212
207
|
yield
|
|
213
208
|
|
|
214
209
|
except asyncio.CancelledError:
|
|
215
|
-
logger.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
273
|
-
raise
|
|
266
|
+
await logger.adebug("Teardown cancelled during shutdown.")
|
|
274
267
|
except Exception as e: # noqa: BLE001
|
|
275
|
-
logger.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
langflow/processing/process.py
CHANGED
|
@@ -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
|
|
@@ -13,9 +13,9 @@ from langflow.services.deps import get_settings_service
|
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
15
|
from langflow.api.v1.schemas import InputValueRequest
|
|
16
|
+
from langflow.events.event_manager import EventManager
|
|
16
17
|
from langflow.graph.graph.base import Graph
|
|
17
18
|
from langflow.graph.schema import RunOutputs
|
|
18
|
-
from langflow.services.event_manager import EventManager
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class Result(BaseModel):
|
|
@@ -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.
|
|
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.
|
|
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})
|
langflow/schema/artifact.py
CHANGED
|
@@ -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.
|
|
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.
|
|
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):
|
langflow/schema/dataframe.py
CHANGED
|
@@ -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
|
langflow/schema/message.py
CHANGED
|
@@ -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
|
|
langflow/services/auth/utils.py
CHANGED
|
@@ -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.
|
|
313
|
+
logger.debug("Error creating superuser.", exc_info=True)
|
|
314
314
|
|
|
315
315
|
return super_user
|
|
316
316
|
|
langflow/services/cache/disk.py
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
484
|
+
await logger.aexception("Error tearing down database")
|
|
485
485
|
await self.engine.dispose()
|