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.
- langflow/__main__.py +1 -1
- langflow/alembic/versions/0882f9657f22_encrypt_existing_mcp_auth_settings_.py +122 -0
- 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 +3 -3
- langflow/api/v1/mcp.py +12 -12
- langflow/api/v1/mcp_projects.py +405 -120
- langflow/api/v1/mcp_utils.py +8 -8
- langflow/api/v1/schemas.py +2 -7
- 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 +2 -2
- 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/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/prompts/api_utils.py +1 -1
- langflow/base/tools/flow_tool.py +2 -2
- langflow/base/tools/run_flow.py +2 -6
- langflow/components/FAISS/__init__.py +34 -0
- 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 +249 -55
- langflow/components/agents/mcp_component.py +14 -14
- 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/cassandra/__init__.py +40 -0
- langflow/components/chroma/__init__.py +34 -0
- langflow/components/clickhouse/__init__.py +34 -0
- langflow/components/couchbase/__init__.py +34 -0
- langflow/components/data/file.py +575 -55
- langflow/components/data/url.py +1 -1
- langflow/components/datastax/__init__.py +3 -3
- 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/elastic/__init__.py +37 -0
- 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/milvus/__init__.py +34 -0
- langflow/components/mongodb/__init__.py +34 -0
- langflow/components/nvidia/nvidia.py +3 -3
- langflow/components/olivya/olivya.py +7 -7
- langflow/components/ollama/ollama.py +9 -6
- langflow/components/perplexity/perplexity.py +3 -13
- langflow/components/pgvector/__init__.py +34 -0
- langflow/components/pinecone/__init__.py +34 -0
- 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/prototypes/python_function.py +2 -3
- langflow/components/qdrant/__init__.py +34 -0
- langflow/components/redis/__init__.py +36 -2
- langflow/components/redis/redis.py +75 -29
- langflow/components/redis/redis_chat.py +43 -0
- langflow/components/serpapi/serp.py +1 -1
- langflow/components/supabase/__init__.py +37 -0
- 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/upstash/__init__.py +34 -0
- langflow/components/vectara/__init__.py +37 -0
- langflow/components/vectorstores/__init__.py +0 -69
- langflow/components/vectorstores/local_db.py +2 -1
- langflow/components/weaviate/__init__.py +34 -0
- 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/dependency_analyzer.py +165 -0
- langflow/custom/directory_reader/directory_reader.py +7 -7
- langflow/custom/directory_reader/utils.py +1 -2
- langflow/custom/utils.py +63 -45
- langflow/events/event_manager.py +1 -1
- langflow/frontend/assets/{SlackIcon-CnvyOamQ.js → SlackIcon-Cr3Q15Px.js} +1 -1
- langflow/frontend/assets/{Wikipedia-nyTEXdr2.js → Wikipedia-GxM5sPdM.js} +1 -1
- langflow/frontend/assets/{Wolfram-BYMQkNSq.js → Wolfram-BN3-VOCA.js} +1 -1
- langflow/frontend/assets/{index-DZTC5pdT.js → index-28oOcafk.js} +1 -1
- langflow/frontend/assets/{index-ChXJpBz4.js → index-2wSXqBtB.js} +1 -1
- langflow/frontend/assets/{index-BB15_iOb.js → index-3wW7BClE.js} +1 -1
- langflow/frontend/assets/{index-DKHNourL.js → index-6pyH3ZJB.js} +1 -1
- langflow/frontend/assets/{index-BvwZfF2i.js → index-AWCSdofD.js} +1 -1
- langflow/frontend/assets/{index-Bvxg4_ux.js → index-B2Zgv_xv.js} +1 -1
- langflow/frontend/assets/{index-Bd6WtbKA.js → index-B2ptVQGM.js} +1 -1
- langflow/frontend/assets/{index-C7QWbnLK.js → index-B3TANVes.js} +1 -1
- langflow/frontend/assets/{index-CpvYQ0ug.js → index-B4yCvZKV.js} +1 -1
- langflow/frontend/assets/{index-Dg-63Si_.js → index-BC65VuWx.js} +1 -1
- langflow/frontend/assets/{index-C6jri9Wm.js → index-BCDSei1q.js} +1 -1
- langflow/frontend/assets/{index-OazXJdEl.js → index-BJy50PvP.js} +1 -1
- langflow/frontend/assets/{index-CWdkbVsd.js → index-BKseQQ2I.js} +1 -1
- langflow/frontend/assets/{index-CaQ_H9ww.js → index-BLTxEeTi.js} +1 -1
- langflow/frontend/assets/{index-DGRMNe9n.js → index-BRg1f4Mu.js} +1 -1
- langflow/frontend/assets/{index-D8lOi1GI.js → index-BS8Vo8nc.js} +1 -1
- langflow/frontend/assets/{index-B748uLP1.js → index-BTKOU4xC.js} +1 -1
- langflow/frontend/assets/{index-Dqd4RjYA.js → index-BVwJDmw-.js} +1 -1
- langflow/frontend/assets/{index-DbMFlnHE.js → index-BWYuQ2Sj.js} +1 -1
- langflow/frontend/assets/{index-BEMw2Np8.js → index-BWdLILDG.js} +1 -1
- langflow/frontend/assets/{index-BmX5CoED.js → index-BZcw4827.js} +1 -1
- langflow/frontend/assets/{index-CyPvTB63.js → index-Bbi87Ve4.js} +1 -1
- langflow/frontend/assets/{index-BTEW9e8P.js → index-Bf0IYKLd.js} +1 -1
- langflow/frontend/assets/{index-BZgXW854.js → index-Bg5nrMRh.js} +1 -1
- langflow/frontend/assets/{index-BBxAPk1y.js → index-BiC280Nx.js} +1 -1
- langflow/frontend/assets/{index-BR0bkVqX.js → index-BiKKN6FR.js} +1 -1
- langflow/frontend/assets/{index-CTrt1Q_j.js → index-Bief6eyJ.js} +1 -1
- langflow/frontend/assets/{index-D5_DsUJc.js → index-BkXec1Yf.js} +1 -1
- langflow/frontend/assets/{index-CZQ9rXNa.js → index-Bnl6QHtP.js} +1 -1
- langflow/frontend/assets/{index-BChjg6Az.js → index-BpxbUiZD.js} +1979 -1979
- langflow/frontend/assets/{index-BOeo01QB.js → index-BrJV8psX.js} +1 -1
- langflow/frontend/assets/{index-DysKpOuj.js → index-BwLWcUXL.js} +1 -1
- langflow/frontend/assets/{index-Bnqod3vk.js → index-Bx7dBY26.js} +1 -1
- langflow/frontend/assets/{index-D3DDfngy.js → index-C-EdnFdA.js} +1 -1
- langflow/frontend/assets/{index-Bsa0xZyL.js → index-C-Xfg4cD.js} +1 -1
- langflow/frontend/assets/{index-BTrsh9LS.js → index-C1f2wMat.js} +1 -1
- langflow/frontend/assets/index-C1xroOlH.css +1 -0
- langflow/frontend/assets/{index-B1YN7oMV.js → index-C3KequvP.js} +1 -1
- langflow/frontend/assets/{index-DzW2mfkK.js → index-C3ZjKdCD.js} +1 -1
- langflow/frontend/assets/{index-ajRge-Mg.js → index-C3l0zYn0.js} +1 -1
- langflow/frontend/assets/{index-cvZdgWHQ.js → index-C3yvArUT.js} +1 -1
- langflow/frontend/assets/{index-C-2hghRJ.js → index-C9Cxnkl8.js} +1 -1
- langflow/frontend/assets/{index-BhIOhlCH.js → index-CBc8fEAE.js} +1 -1
- langflow/frontend/assets/{index-B3Sur4Z3.js → index-CBvrGgID.js} +1 -1
- langflow/frontend/assets/{index-CCePCqkT.js → index-CD-PqGCY.js} +1 -1
- langflow/frontend/assets/{index-8yMsjVV2.js → index-CGO1CiUr.js} +1 -1
- langflow/frontend/assets/{index-DF5VwgU6.js → index-CH5UVA9b.js} +1 -1
- langflow/frontend/assets/{index-dcnYpT9N.js → index-CLJeJYjH.js} +1 -1
- langflow/frontend/assets/{index-DfxYyS3M.js → index-CMZ79X-Y.js} +1 -1
- langflow/frontend/assets/{index-ya2uXE8v.js → index-CMzfJKiW.js} +1 -1
- langflow/frontend/assets/{index-DkelbYy7.js → index-CNw1H-Wc.js} +1 -1
- langflow/frontend/assets/{index-DytJENYD.js → index-CPHEscq9.js} +1 -1
- langflow/frontend/assets/{index-Bv8h2Z-q.js → index-CRPKJZw9.js} +1 -1
- langflow/frontend/assets/{index-D-9TI74R.js → index-CRPyCfYy.js} +1 -1
- langflow/frontend/assets/{index-BLGYN-9b.js → index-CRcMqCIj.js} +1 -1
- langflow/frontend/assets/{index-tVYiABdp.js → index-CUVDws8F.js} +1 -1
- langflow/frontend/assets/{index-CpcbQZIF.js → index-CVWQfRYZ.js} +1 -1
- langflow/frontend/assets/{index-DPCzHdsC.js → index-CVl6MbaM.js} +1 -1
- langflow/frontend/assets/{index-DkXy1WFo.js → index-CVwWoX99.js} +1 -1
- langflow/frontend/assets/{index-DK1Ptcc4.js → index-CWPzZtSx.js} +1 -1
- langflow/frontend/assets/{index-DHq8TQPB.js → index-CZqRL9DE.js} +1 -1
- langflow/frontend/assets/{index-DnEGCgih.js → index-CdIf07Rw.js} +1 -1
- langflow/frontend/assets/{index-BIQQCMvz.js → index-Cewy7JZE.js} +1 -1
- langflow/frontend/assets/{index-D8GJngXa.js → index-CfwLpbMM.js} +1 -1
- langflow/frontend/assets/{index-C_TdzfAn.js → index-CiR1dxI4.js} +1 -1
- langflow/frontend/assets/{index-BzL_EoKd.js → index-CiixOzDG.js} +1 -1
- langflow/frontend/assets/{index-Boso-xEw.js → index-ClsuDmR6.js} +1 -1
- langflow/frontend/assets/{index-8WdfSTTz.js → index-CmEYYRN1.js} +1 -1
- langflow/frontend/assets/{index-FUxmznS-.js → index-Co20d-eQ.js} +1 -1
- langflow/frontend/assets/{index-C82JjCPD.js → index-CpzXS6md.js} +1 -1
- langflow/frontend/assets/{index-DIDDfmlJ.js → index-Cqpzl1J4.js} +1 -1
- langflow/frontend/assets/{index-_UcqeEjm.js → index-CtVIONP2.js} +1 -1
- langflow/frontend/assets/{index-Gkrq-vzm.js → index-CuFXdTx4.js} +1 -1
- langflow/frontend/assets/{index-WPFivmdQ.js → index-Cyd2HtHK.js} +1 -1
- langflow/frontend/assets/{index-BFp_O-c9.js → index-D-1tA8Dt.js} +1 -1
- langflow/frontend/assets/{index-BqPpO6KG.js → index-D-KY3kkq.js} +1 -1
- langflow/frontend/assets/{index-Db71w3lq.js → index-D-_B1a8v.js} +1 -1
- langflow/frontend/assets/{index-BIzTEqFh.js → index-D14EWPyZ.js} +1 -1
- langflow/frontend/assets/{index-BbJjt5m4.js → index-D2N3l-cw.js} +1 -1
- langflow/frontend/assets/{index-DCRk27Tp.js → index-D5ETnvJa.js} +1 -1
- langflow/frontend/assets/{index-CvcEzq4x.js → index-D7kquVv2.js} +1 -1
- langflow/frontend/assets/{index-Q9vDw0Xl.js → index-DA6-bvgN.js} +1 -1
- langflow/frontend/assets/{index-l7bzB8Ex.js → index-DDWBeudF.js} +1 -1
- langflow/frontend/assets/{index-BCCGvqay.js → index-DDcMAaG4.js} +1 -1
- langflow/frontend/assets/{index-pCQ_yw8m.js → index-DHgomBdh.js} +1 -1
- langflow/frontend/assets/{index-BxEuHa76.js → index-DJP-ss47.js} +1 -1
- langflow/frontend/assets/{index-BbRm7beF.js → index-DQ7VYqQc.js} +1 -1
- langflow/frontend/assets/{index-Car-zdor.js → index-DTqbvGC0.js} +1 -1
- langflow/frontend/assets/{index-BRxvproo.js → index-DUpri6zF.js} +1 -1
- langflow/frontend/assets/{index-BQ6NUdMY.js → index-DV3utZDZ.js} +1 -1
- langflow/frontend/assets/{index-DjQETUy8.js → index-DXRfN4HV.js} +1 -1
- langflow/frontend/assets/{index-DfngcQxO.js → index-Db9dYSzy.js} +1 -1
- langflow/frontend/assets/{index-rXV1G1aB.js → index-DdtMEn6I.js} +1 -1
- langflow/frontend/assets/{index-DmMDPoi0.js → index-DfDhMHgQ.js} +1 -1
- langflow/frontend/assets/{index-DJB12jIC.js → index-Dfe7qfvf.js} +1 -1
- langflow/frontend/assets/{index-C_veJlEb.js → index-DhtZ5hx8.js} +1 -1
- langflow/frontend/assets/{index-CQMoqLAu.js → index-DiB3CTo8.js} +1 -1
- langflow/frontend/assets/{index-DVlceYFD.js → index-DiGWASY5.js} +1 -1
- langflow/frontend/assets/{index-Du_18NCU.js → index-Dl5amdBz.js} +1 -1
- langflow/frontend/assets/{index-CYDAYm-i.js → index-DlD4dXlZ.js} +1 -1
- langflow/frontend/assets/{index-CLPdN-q6.js → index-DmeiHnfl.js} +1 -1
- langflow/frontend/assets/index-Dmu-X5-4.js +1 -0
- langflow/frontend/assets/{index-BzEUlaw_.js → index-DpVWih90.js} +1 -1
- langflow/frontend/assets/{index-D6PSjHxP.js → index-DrDrcajG.js} +1 -1
- langflow/frontend/assets/{index-Dq5ilsem.js → index-Du-pc0KE.js} +1 -1
- langflow/frontend/assets/{index-CYe8Ipef.js → index-DwPkMTaY.js} +1 -1
- langflow/frontend/assets/{index-BVEZDXxS.js → index-DwQEZe3C.js} +1 -1
- langflow/frontend/assets/{index-BvT7L317.js → index-DyJFTK24.js} +1 -1
- langflow/frontend/assets/{index-HK3bVMYA.js → index-J38wh62w.js} +1 -1
- langflow/frontend/assets/{index-CCxGSSTT.js → index-Kwdl-e29.js} +1 -1
- langflow/frontend/assets/{index-BOB_zsjl.js → index-OwPvCmpW.js} +1 -1
- langflow/frontend/assets/{index-Dsps-jKu.js → index-Tw3Os-DN.js} +1 -1
- langflow/frontend/assets/{index-CFDvOtKC.js → index-X0guhYF8.js} +1 -1
- langflow/frontend/assets/{index-BX5D-USa.js → index-dJWNxIRH.js} +1 -1
- langflow/frontend/assets/{index-BRYjyhAd.js → index-dcJ8-agu.js} +1 -1
- langflow/frontend/assets/{index-Ui4xUImO.js → index-eo2mAtL-.js} +1 -1
- langflow/frontend/assets/{index-CxvP91st.js → index-hG24k5xJ.js} +1 -1
- langflow/frontend/assets/{index-CVQmT7ZL.js → index-h_aSZHf3.js} +1 -1
- langflow/frontend/assets/{index-BIXaW2aY.js → index-hbndqB9B.js} +1 -1
- langflow/frontend/assets/{index-DIkNW9Cd.js → index-iJngutFo.js} +1 -1
- langflow/frontend/assets/{index-BWmPX4iQ.js → index-lTpteg8t.js} +1 -1
- langflow/frontend/assets/{index-xuIrH2Dq.js → index-lZX9AvZW.js} +1 -1
- langflow/frontend/assets/{index-yCHsaqs8.js → index-m8QA6VNM.js} +1 -1
- langflow/frontend/assets/{index-BkPYpfgw.js → index-o0D2S7xW.js} +1 -1
- langflow/frontend/assets/{index-DpClkXIV.js → index-ovFJ_0J6.js} +1 -1
- langflow/frontend/assets/{index-CmplyEaa.js → index-pYJJOcma.js} +1 -1
- langflow/frontend/assets/{index-CJo_cyWW.js → index-sI75DsdM.js} +1 -1
- langflow/frontend/assets/{index-nVwHLjuV.js → index-xvFOmxx4.js} +1 -1
- langflow/frontend/assets/{index-LbYjHKkn.js → index-z3SRY-mX.js} +1 -1
- langflow/frontend/assets/lazyIconImports-D97HEZkE.js +2 -0
- langflow/frontend/assets/{use-post-add-user-BrBYH9eR.js → use-post-add-user-C0MdTpQ5.js} +1 -1
- langflow/frontend/index.html +2 -2
- langflow/graph/edge/base.py +2 -3
- langflow/graph/graph/base.py +15 -13
- 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/Basic Prompt Chaining.json +26 -0
- langflow/initial_setup/starter_projects/Basic Prompting.json +26 -0
- langflow/initial_setup/starter_projects/Blog Writer.json +58 -2
- langflow/initial_setup/starter_projects/Custom Component Generator.json +37 -2
- langflow/initial_setup/starter_projects/Document Q&A.json +27 -1
- langflow/initial_setup/starter_projects/Financial Report Parser.json +43 -0
- langflow/initial_setup/starter_projects/Hybrid Search RAG.json +83 -1
- langflow/initial_setup/starter_projects/Image Sentiment Analysis.json +43 -0
- langflow/initial_setup/starter_projects/Instagram Copywriter.json +51 -3
- langflow/initial_setup/starter_projects/Invoice Summarizer.json +40 -1
- langflow/initial_setup/starter_projects/Knowledge Ingestion.json +73 -2
- langflow/initial_setup/starter_projects/Knowledge Retrieval.json +63 -0
- langflow/initial_setup/starter_projects/Market Research.json +59 -3
- langflow/initial_setup/starter_projects/Meeting Summary.json +101 -6
- langflow/initial_setup/starter_projects/Memory Chatbot.json +37 -2
- langflow/initial_setup/starter_projects/News Aggregator.json +63 -3
- langflow/initial_setup/starter_projects/Nvidia Remix.json +69 -4
- langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +48 -1
- langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json +44 -1
- langflow/initial_setup/starter_projects/Price Deal Finder.json +57 -5
- langflow/initial_setup/starter_projects/Research Agent.json +42 -3
- langflow/initial_setup/starter_projects/Research Translation Loop.json +66 -0
- langflow/initial_setup/starter_projects/SEO Keyword Generator.json +17 -0
- langflow/initial_setup/starter_projects/SaaS Pricing.json +27 -1
- langflow/initial_setup/starter_projects/Search agent.json +40 -1
- langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +76 -7
- langflow/initial_setup/starter_projects/Simple Agent.json +59 -3
- langflow/initial_setup/starter_projects/Social Media Agent.json +77 -1
- langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +35 -1
- langflow/initial_setup/starter_projects/Travel Planning Agents.json +51 -3
- langflow/initial_setup/starter_projects/Twitter Thread Generator.json +80 -0
- langflow/initial_setup/starter_projects/Vector Store RAG.json +110 -3
- langflow/initial_setup/starter_projects/Youtube Analysis.json +84 -3
- langflow/initial_setup/starter_projects/vector_store_rag.py +1 -1
- 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 +6 -3
- 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/mcp_encryption.py +104 -0
- 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/feature_flags.py +1 -1
- 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.dev37.dist-info → langflow_base_nightly-0.5.0.dev39.dist-info}/METADATA +2 -1
- {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev39.dist-info}/RECORD +393 -374
- langflow/components/vectorstores/redis.py +0 -89
- langflow/frontend/assets/index-C26RqKWL.js +0 -1
- langflow/frontend/assets/index-CqS7zir1.css +0 -1
- langflow/frontend/assets/lazyIconImports-t6wEndt1.js +0 -2
- /langflow/components/{vectorstores → FAISS}/faiss.py +0 -0
- /langflow/components/{vectorstores → cassandra}/cassandra.py +0 -0
- /langflow/components/{datastax/cassandra.py → cassandra/cassandra_chat.py} +0 -0
- /langflow/components/{vectorstores → cassandra}/cassandra_graph.py +0 -0
- /langflow/components/{vectorstores → chroma}/chroma.py +0 -0
- /langflow/components/{vectorstores → clickhouse}/clickhouse.py +0 -0
- /langflow/components/{vectorstores → couchbase}/couchbase.py +0 -0
- /langflow/components/{vectorstores → datastax}/astradb.py +0 -0
- /langflow/components/{vectorstores → datastax}/astradb_graph.py +0 -0
- /langflow/components/{vectorstores → datastax}/graph_rag.py +0 -0
- /langflow/components/{vectorstores → datastax}/hcd.py +0 -0
- /langflow/components/{vectorstores → elastic}/elasticsearch.py +0 -0
- /langflow/components/{vectorstores → elastic}/opensearch.py +0 -0
- /langflow/components/{vectorstores → milvus}/milvus.py +0 -0
- /langflow/components/{vectorstores → mongodb}/mongodb_atlas.py +0 -0
- /langflow/components/{vectorstores → pgvector}/pgvector.py +0 -0
- /langflow/components/{vectorstores → pinecone}/pinecone.py +0 -0
- /langflow/components/{vectorstores → qdrant}/qdrant.py +0 -0
- /langflow/components/{vectorstores → supabase}/supabase.py +0 -0
- /langflow/components/{vectorstores → upstash}/upstash.py +0 -0
- /langflow/components/{vectorstores → vectara}/vectara.py +0 -0
- /langflow/components/{vectorstores → vectara}/vectara_rag.py +0 -0
- /langflow/components/{vectorstores → weaviate}/weaviate.py +0 -0
- {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev39.dist-info}/WHEEL +0 -0
- {langflow_base_nightly-0.5.0.dev37.dist-info → langflow_base_nightly-0.5.0.dev39.dist-info}/entry_points.txt +0 -0
|
@@ -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()
|
|
@@ -5,16 +5,17 @@ from dataclasses import dataclass
|
|
|
5
5
|
from typing import TYPE_CHECKING
|
|
6
6
|
|
|
7
7
|
from alembic.util.exc import CommandError
|
|
8
|
-
from loguru import logger
|
|
9
8
|
from sqlmodel import text
|
|
10
9
|
from sqlmodel.ext.asyncio.session import AsyncSession
|
|
11
10
|
|
|
11
|
+
from langflow.logging.logger import logger
|
|
12
|
+
|
|
12
13
|
if TYPE_CHECKING:
|
|
13
14
|
from langflow.services.database.service import DatabaseService
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
async def initialize_database(*, fix_migration: bool = False) -> None:
|
|
17
|
-
logger.
|
|
18
|
+
await logger.adebug("Initializing database")
|
|
18
19
|
from langflow.services.deps import get_db_service
|
|
19
20
|
|
|
20
21
|
database_service: DatabaseService = get_db_service()
|
|
@@ -28,7 +29,7 @@ async def initialize_database(*, fix_migration: bool = False) -> None:
|
|
|
28
29
|
# we can ignore it
|
|
29
30
|
if "already exists" not in str(exc):
|
|
30
31
|
msg = "Error creating DB and tables"
|
|
31
|
-
logger.
|
|
32
|
+
await logger.aexception(msg)
|
|
32
33
|
raise RuntimeError(msg) from exc
|
|
33
34
|
try:
|
|
34
35
|
await database_service.check_schema_health()
|
|
@@ -58,7 +59,7 @@ async def initialize_database(*, fix_migration: bool = False) -> None:
|
|
|
58
59
|
if "already exists" not in str(exc):
|
|
59
60
|
logger.exception(exc)
|
|
60
61
|
raise
|
|
61
|
-
logger.
|
|
62
|
+
await logger.adebug("Database initialized")
|
|
62
63
|
|
|
63
64
|
|
|
64
65
|
@asynccontextmanager
|
|
@@ -67,7 +68,7 @@ async def session_getter(db_service: DatabaseService):
|
|
|
67
68
|
session = AsyncSession(db_service.engine, expire_on_commit=False)
|
|
68
69
|
yield session
|
|
69
70
|
except Exception:
|
|
70
|
-
logger.
|
|
71
|
+
await logger.aexception("Session rollback because of exception")
|
|
71
72
|
await session.rollback()
|
|
72
73
|
raise
|
|
73
74
|
finally:
|
langflow/services/deps.py
CHANGED
|
@@ -3,8 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from contextlib import asynccontextmanager
|
|
4
4
|
from typing import TYPE_CHECKING
|
|
5
5
|
|
|
6
|
-
from
|
|
7
|
-
|
|
6
|
+
from langflow.logging.logger import logger
|
|
8
7
|
from langflow.services.schema import ServiceType
|
|
9
8
|
|
|
10
9
|
if TYPE_CHECKING:
|
|
@@ -174,7 +173,7 @@ async def session_scope() -> AsyncGenerator[AsyncSession, None]:
|
|
|
174
173
|
yield session
|
|
175
174
|
await session.commit()
|
|
176
175
|
except Exception:
|
|
177
|
-
logger.
|
|
176
|
+
await logger.aexception("An error occurred during the session scope.")
|
|
178
177
|
await session.rollback()
|
|
179
178
|
raise
|
|
180
179
|
|
langflow/services/factory.py
CHANGED
|
@@ -4,18 +4,15 @@ from pathlib import Path
|
|
|
4
4
|
from uuid import UUID, uuid4
|
|
5
5
|
|
|
6
6
|
from aiofile import async_open
|
|
7
|
-
from loguru import logger
|
|
8
7
|
from sqlmodel import delete, select, text
|
|
9
8
|
|
|
10
9
|
from langflow.api.utils import cascade_delete_flow
|
|
11
10
|
from langflow.graph import Graph
|
|
12
11
|
from langflow.graph.vertex.param_handler import ParameterHandler
|
|
13
12
|
from langflow.load.utils import replace_tweaks_with_env
|
|
14
|
-
from langflow.logging.logger import configure
|
|
13
|
+
from langflow.logging.logger import configure, logger
|
|
15
14
|
from langflow.processing.process import process_tweaks, run_graph
|
|
16
|
-
from langflow.services.auth.utils import
|
|
17
|
-
get_password_hash,
|
|
18
|
-
)
|
|
15
|
+
from langflow.services.auth.utils import get_password_hash
|
|
19
16
|
from langflow.services.cache.service import AsyncBaseCacheService
|
|
20
17
|
from langflow.services.database.models import Flow, User, Variable
|
|
21
18
|
from langflow.services.database.utils import initialize_database
|
|
@@ -48,7 +45,6 @@ class LangflowRunnerExperimental:
|
|
|
48
45
|
log_file: str | None = None,
|
|
49
46
|
log_rotation: str | None = None,
|
|
50
47
|
disable_logs: bool = False,
|
|
51
|
-
async_log_file: bool = True,
|
|
52
48
|
):
|
|
53
49
|
self.should_initialize_db = should_initialize_db
|
|
54
50
|
log_file_path = Path(log_file) if log_file else None
|
|
@@ -57,7 +53,6 @@ class LangflowRunnerExperimental:
|
|
|
57
53
|
log_file=log_file_path,
|
|
58
54
|
log_rotation=log_rotation,
|
|
59
55
|
disable=disable_logs,
|
|
60
|
-
async_file=async_log_file,
|
|
61
56
|
)
|
|
62
57
|
|
|
63
58
|
async def run(
|
|
@@ -76,7 +71,7 @@ class LangflowRunnerExperimental:
|
|
|
76
71
|
tweaks_values: dict | None = None,
|
|
77
72
|
):
|
|
78
73
|
try:
|
|
79
|
-
logger.
|
|
74
|
+
await logger.ainfo(f"Start Handling {session_id=}")
|
|
80
75
|
await self.init_db_if_needed()
|
|
81
76
|
# Update settings with cache and components path
|
|
82
77
|
await update_settings(cache=cache)
|
|
@@ -118,7 +113,7 @@ class LangflowRunnerExperimental:
|
|
|
118
113
|
result = await self.run_graph(input_value, input_type, output_type, session_id, graph, stream=stream)
|
|
119
114
|
finally:
|
|
120
115
|
await self.clear_flow_state(flow_dict)
|
|
121
|
-
logger.
|
|
116
|
+
await logger.ainfo(f"Finish Handling {session_id=}")
|
|
122
117
|
return result
|
|
123
118
|
|
|
124
119
|
async def prepare_flow_and_add_to_db(
|
|
@@ -242,10 +237,10 @@ class LangflowRunnerExperimental:
|
|
|
242
237
|
|
|
243
238
|
async def init_db_if_needed(self):
|
|
244
239
|
if not await self.database_exists_check() and self.should_initialize_db:
|
|
245
|
-
logger.
|
|
240
|
+
await logger.ainfo("Initializing database...")
|
|
246
241
|
await initialize_database(fix_migration=True)
|
|
247
242
|
self.should_initialize_db = False
|
|
248
|
-
logger.
|
|
243
|
+
await logger.ainfo("Database initialized.")
|
|
249
244
|
|
|
250
245
|
@staticmethod
|
|
251
246
|
async def database_exists_check():
|
|
@@ -254,7 +249,7 @@ class LangflowRunnerExperimental:
|
|
|
254
249
|
result = await session.exec(text("SELECT version_num FROM public.alembic_version"))
|
|
255
250
|
return result.first() is not None
|
|
256
251
|
except Exception as e: # noqa: BLE001
|
|
257
|
-
logger.
|
|
252
|
+
await logger.adebug(f"Database check failed: {e}")
|
|
258
253
|
return False
|
|
259
254
|
|
|
260
255
|
@staticmethod
|
|
@@ -2,9 +2,8 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
|
|
5
|
-
from loguru import logger
|
|
6
|
-
|
|
7
5
|
from langflow.events.event_manager import EventManager
|
|
6
|
+
from langflow.logging.logger import logger
|
|
8
7
|
from langflow.services.base import Service
|
|
9
8
|
|
|
10
9
|
|
|
@@ -117,7 +116,7 @@ class JobQueueService(Service):
|
|
|
117
116
|
# Clean up each registered job queue.
|
|
118
117
|
for job_id in list(self._queues.keys()):
|
|
119
118
|
await self.cleanup_job(job_id)
|
|
120
|
-
logger.
|
|
119
|
+
await logger.adebug("JobQueueService stopped: all job queues have been cleaned up.")
|
|
121
120
|
|
|
122
121
|
async def teardown(self) -> None:
|
|
123
122
|
await self.stop()
|
|
@@ -221,21 +220,21 @@ class JobQueueService(Service):
|
|
|
221
220
|
job_id (str): Unique identifier for the job to be cleaned up.
|
|
222
221
|
"""
|
|
223
222
|
if job_id not in self._queues:
|
|
224
|
-
logger.
|
|
223
|
+
await logger.adebug(f"No queue found for job_id {job_id} during cleanup.")
|
|
225
224
|
return
|
|
226
225
|
|
|
227
|
-
logger.
|
|
226
|
+
await logger.adebug(f"Commencing cleanup for job_id {job_id}")
|
|
228
227
|
main_queue, _event_manager, task, _ = self._queues[job_id]
|
|
229
228
|
|
|
230
229
|
# Cancel the associated task if it is still running.
|
|
231
230
|
if task and not task.done():
|
|
232
|
-
logger.
|
|
231
|
+
await logger.adebug(f"Cancelling active task for job_id {job_id}")
|
|
233
232
|
task.cancel()
|
|
234
233
|
await asyncio.wait([task])
|
|
235
234
|
# Log any exceptions that occurred during the task's execution.
|
|
236
235
|
if exc := task.exception():
|
|
237
|
-
logger.
|
|
238
|
-
logger.
|
|
236
|
+
await logger.aerror(f"Error in task for job_id {job_id}: {exc}")
|
|
237
|
+
await logger.adebug(f"Task cancellation complete for job_id {job_id}")
|
|
239
238
|
|
|
240
239
|
# Clear the queue since we just cancelled the task or it has completed
|
|
241
240
|
items_cleared = 0
|
|
@@ -246,10 +245,10 @@ class JobQueueService(Service):
|
|
|
246
245
|
except asyncio.QueueEmpty:
|
|
247
246
|
break
|
|
248
247
|
|
|
249
|
-
logger.
|
|
248
|
+
await logger.adebug(f"Removed {items_cleared} items from queue for job_id {job_id}")
|
|
250
249
|
# Remove the job entry from the registry
|
|
251
250
|
self._queues.pop(job_id, None)
|
|
252
|
-
logger.
|
|
251
|
+
await logger.adebug(f"Cleanup successful for job_id {job_id}: resources have been released.")
|
|
253
252
|
|
|
254
253
|
async def _periodic_cleanup(self) -> None:
|
|
255
254
|
"""Execute a periodic task that cleans up completed or cancelled job queues.
|
|
@@ -266,10 +265,10 @@ class JobQueueService(Service):
|
|
|
266
265
|
await asyncio.sleep(60) # Sleep for 60 seconds before next cleanup attempt.
|
|
267
266
|
await self._cleanup_old_queues()
|
|
268
267
|
except asyncio.CancelledError:
|
|
269
|
-
logger.
|
|
268
|
+
await logger.adebug("Periodic cleanup task received cancellation signal.")
|
|
270
269
|
raise
|
|
271
270
|
except Exception as exc: # noqa: BLE001
|
|
272
|
-
logger.
|
|
271
|
+
await logger.aerror(f"Exception encountered during periodic cleanup: {exc}")
|
|
273
272
|
|
|
274
273
|
async def _cleanup_old_queues(self) -> None:
|
|
275
274
|
"""Scan all registered job queues and clean up those with completed or failed tasks."""
|
|
@@ -278,7 +277,7 @@ class JobQueueService(Service):
|
|
|
278
277
|
for job_id in list(self._queues.keys()):
|
|
279
278
|
_, _, task, cleanup_time = self._queues[job_id]
|
|
280
279
|
if task:
|
|
281
|
-
logger.
|
|
280
|
+
await logger.adebug(
|
|
282
281
|
f"Queue {job_id} status - Done: {task.done()}, "
|
|
283
282
|
f"Cancelled: {task.cancelled()}, "
|
|
284
283
|
f"Has exception: {task.exception() is not None if task.done() else 'N/A'}"
|
|
@@ -294,10 +293,12 @@ class JobQueueService(Service):
|
|
|
294
293
|
self._queues[job_id][2],
|
|
295
294
|
current_time,
|
|
296
295
|
)
|
|
297
|
-
logger.
|
|
296
|
+
await logger.adebug(
|
|
297
|
+
f"Job queue for job_id {job_id} marked for cleanup - Task cancelled or failed"
|
|
298
|
+
)
|
|
298
299
|
elif current_time - cleanup_time >= self.CLEANUP_GRACE_PERIOD:
|
|
299
300
|
# Enough time has passed, perform the actual cleanup
|
|
300
|
-
logger.
|
|
301
|
+
await logger.adebug(f"Cleaning up job_id {job_id} after grace period")
|
|
301
302
|
await self.cleanup_job(job_id)
|
|
302
303
|
|
|
303
304
|
def _create_default_event_manager(self, queue: asyncio.Queue) -> EventManager:
|
langflow/services/manager.py
CHANGED
|
@@ -4,8 +4,7 @@ import importlib
|
|
|
4
4
|
import inspect
|
|
5
5
|
from typing import TYPE_CHECKING
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
|
|
7
|
+
from langflow.logging.logger import logger
|
|
9
8
|
from langflow.utils.concurrency import KeyedMemoryLockManager
|
|
10
9
|
|
|
11
10
|
if TYPE_CHECKING:
|
|
@@ -92,11 +91,11 @@ class ServiceManager:
|
|
|
92
91
|
for service in list(self.services.values()):
|
|
93
92
|
if service is None:
|
|
94
93
|
continue
|
|
95
|
-
logger.
|
|
94
|
+
await logger.adebug(f"Teardown service {service.name}")
|
|
96
95
|
try:
|
|
97
96
|
await service.teardown()
|
|
98
97
|
except Exception as exc: # noqa: BLE001
|
|
99
|
-
logger.
|
|
98
|
+
await logger.aexception(exc)
|
|
100
99
|
self.services = {}
|
|
101
100
|
self.factories = {}
|
|
102
101
|
|
|
@@ -2,11 +2,11 @@ import secrets
|
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
from typing import Literal
|
|
4
4
|
|
|
5
|
-
from loguru import logger
|
|
6
5
|
from passlib.context import CryptContext
|
|
7
6
|
from pydantic import Field, SecretStr, field_validator
|
|
8
7
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
9
8
|
|
|
9
|
+
from langflow.logging.logger import logger
|
|
10
10
|
from langflow.services.settings.constants import DEFAULT_SUPERUSER, DEFAULT_SUPERUSER_PASSWORD
|
|
11
11
|
from langflow.services.settings.utils import read_secret_from_file, write_secret_to_file
|
|
12
12
|
|
|
@@ -9,17 +9,12 @@ from typing import Any, Literal
|
|
|
9
9
|
import orjson
|
|
10
10
|
import yaml
|
|
11
11
|
from aiofile import async_open
|
|
12
|
-
from loguru import logger
|
|
13
12
|
from pydantic import Field, field_validator
|
|
14
13
|
from pydantic.fields import FieldInfo
|
|
15
|
-
from pydantic_settings import
|
|
16
|
-
BaseSettings,
|
|
17
|
-
EnvSettingsSource,
|
|
18
|
-
PydanticBaseSettingsSource,
|
|
19
|
-
SettingsConfigDict,
|
|
20
|
-
)
|
|
14
|
+
from pydantic_settings import BaseSettings, EnvSettingsSource, PydanticBaseSettingsSource, SettingsConfigDict
|
|
21
15
|
from typing_extensions import override
|
|
22
16
|
|
|
17
|
+
from langflow.logging.logger import logger
|
|
23
18
|
from langflow.serialization.constants import MAX_ITEMS_LENGTH, MAX_TEXT_LENGTH
|
|
24
19
|
from langflow.services.settings.constants import VARIABLES_TO_GET_FROM_ENVIRONMENT
|
|
25
20
|
from langflow.utils.util_strings import is_valid_database_url
|
|
@@ -549,6 +544,6 @@ async def load_settings_from_yaml(file_path: str) -> Settings:
|
|
|
549
544
|
if key not in Settings.model_fields:
|
|
550
545
|
msg = f"Key {key} not found in settings"
|
|
551
546
|
raise KeyError(msg)
|
|
552
|
-
logger.
|
|
547
|
+
await logger.adebug(f"Loading {len(settings_dict[key])} {key} from {file_path}")
|
|
553
548
|
|
|
554
549
|
return await asyncio.to_thread(Settings, **settings_dict)
|
|
@@ -3,8 +3,8 @@ from __future__ import annotations
|
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
|
|
5
5
|
import yaml
|
|
6
|
-
from loguru import logger
|
|
7
6
|
|
|
7
|
+
from langflow.logging.logger import logger
|
|
8
8
|
from langflow.services.base import Service
|
|
9
9
|
from langflow.services.settings.auth import AuthSettings
|
|
10
10
|
from langflow.services.settings.base import Settings
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# noqa: A005
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from typing import Any
|
|
2
2
|
|
|
3
3
|
import socketio
|
|
4
|
-
from loguru import logger
|
|
5
4
|
|
|
5
|
+
from langflow.logging.logger import logger
|
|
6
6
|
from langflow.services.base import Service
|
|
7
7
|
from langflow.services.cache.base import AsyncBaseCacheService, CacheService
|
|
8
8
|
from langflow.services.deps import get_chat_service
|
|
@@ -30,11 +30,11 @@ class SocketIOService(Service):
|
|
|
30
30
|
await self.sio.emit("error", to=sid, data=error)
|
|
31
31
|
|
|
32
32
|
async def connect(self, sid, environ) -> None:
|
|
33
|
-
logger.
|
|
33
|
+
await logger.ainfo(f"Socket connected: {sid}")
|
|
34
34
|
self.sessions[sid] = environ
|
|
35
35
|
|
|
36
36
|
async def disconnect(self, sid) -> None:
|
|
37
|
-
logger.
|
|
37
|
+
await logger.ainfo(f"Socket disconnected: {sid}")
|
|
38
38
|
self.sessions.pop(sid, None)
|
|
39
39
|
|
|
40
40
|
async def message(self, sid, data=None) -> None:
|
|
@@ -2,7 +2,6 @@ import time
|
|
|
2
2
|
from collections.abc import Callable
|
|
3
3
|
|
|
4
4
|
import socketio
|
|
5
|
-
from loguru import logger
|
|
6
5
|
from sqlmodel import select
|
|
7
6
|
|
|
8
7
|
from langflow.api.utils import format_elapsed_time
|
|
@@ -11,6 +10,7 @@ from langflow.graph.graph.base import Graph
|
|
|
11
10
|
from langflow.graph.graph.utils import layered_topological_sort
|
|
12
11
|
from langflow.graph.utils import log_vertex_build
|
|
13
12
|
from langflow.graph.vertex.base import Vertex
|
|
13
|
+
from langflow.logging.logger import logger
|
|
14
14
|
from langflow.services.database.models.flow.model import Flow
|
|
15
15
|
from langflow.services.deps import get_session
|
|
16
16
|
|
|
@@ -44,7 +44,7 @@ async def get_vertices(sio, sid, flow_id, chat_service) -> None:
|
|
|
44
44
|
await sio.emit("vertices_order", data=vertices, to=sid)
|
|
45
45
|
|
|
46
46
|
except Exception as exc: # noqa: BLE001
|
|
47
|
-
logger.
|
|
47
|
+
logger.debug("Error getting vertices", exc_info=True)
|
|
48
48
|
await sio.emit("error", data=str(exc), to=sid)
|
|
49
49
|
|
|
50
50
|
|
|
@@ -88,7 +88,7 @@ async def build_vertex(
|
|
|
88
88
|
timedelta=timedelta,
|
|
89
89
|
)
|
|
90
90
|
except Exception as exc: # noqa: BLE001
|
|
91
|
-
logger.
|
|
91
|
+
logger.debug("Error building vertex", exc_info=True)
|
|
92
92
|
params = str(exc)
|
|
93
93
|
valid = False
|
|
94
94
|
result_dict = ResultDataResponse(results={})
|
|
@@ -108,5 +108,5 @@ async def build_vertex(
|
|
|
108
108
|
await sio.emit("vertex_build", data=response.model_dump(), to=sid)
|
|
109
109
|
|
|
110
110
|
except Exception as exc: # noqa: BLE001
|
|
111
|
-
logger.
|
|
111
|
+
logger.debug("Error building vertex", exc_info=True)
|
|
112
112
|
await sio.emit("error", data=str(exc), to=sid)
|
|
@@ -2,8 +2,7 @@ from collections import defaultdict
|
|
|
2
2
|
from collections.abc import Callable
|
|
3
3
|
from threading import Lock
|
|
4
4
|
|
|
5
|
-
from
|
|
6
|
-
|
|
5
|
+
from langflow.logging.logger import logger
|
|
7
6
|
from langflow.services.base import Service
|
|
8
7
|
from langflow.services.settings.service import SettingsService
|
|
9
8
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
from loguru import logger
|
|
2
1
|
from typing_extensions import override
|
|
3
2
|
|
|
3
|
+
from langflow.logging.logger import logger
|
|
4
4
|
from langflow.services.factory import ServiceFactory
|
|
5
5
|
from langflow.services.session.service import SessionService
|
|
6
6
|
from langflow.services.settings.service import SettingsService
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import anyio
|
|
2
2
|
from aiofile import async_open
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
from langflow.logging.logger import logger
|
|
4
5
|
|
|
5
6
|
from .service import StorageService
|
|
6
7
|
|
|
@@ -37,7 +38,7 @@ class LocalStorageService(StorageService):
|
|
|
37
38
|
try:
|
|
38
39
|
async with async_open(str(file_path), "wb") as f:
|
|
39
40
|
await f.write(data)
|
|
40
|
-
logger.
|
|
41
|
+
await logger.ainfo(f"File {file_name} saved successfully in flow {flow_id}.")
|
|
41
42
|
except Exception:
|
|
42
43
|
logger.exception(f"Error saving file {file_name} in flow {flow_id}")
|
|
43
44
|
raise
|
|
@@ -57,7 +58,7 @@ class LocalStorageService(StorageService):
|
|
|
57
58
|
"""
|
|
58
59
|
file_path = self.data_dir / flow_id / file_name
|
|
59
60
|
if not await file_path.exists():
|
|
60
|
-
logger.
|
|
61
|
+
await logger.awarning(f"File {file_name} not found in flow {flow_id}.")
|
|
61
62
|
msg = f"File {file_name} not found in flow {flow_id}"
|
|
62
63
|
raise FileNotFoundError(msg)
|
|
63
64
|
|
|
@@ -83,7 +84,7 @@ class LocalStorageService(StorageService):
|
|
|
83
84
|
flow_id = str(flow_id)
|
|
84
85
|
folder_path = self.data_dir / flow_id
|
|
85
86
|
if not await folder_path.exists() or not await folder_path.is_dir():
|
|
86
|
-
logger.
|
|
87
|
+
await logger.awarning(f"Flow {flow_id} directory does not exist.")
|
|
87
88
|
msg = f"Flow {flow_id} directory does not exist."
|
|
88
89
|
raise FileNotFoundError(msg)
|
|
89
90
|
|
|
@@ -93,7 +94,7 @@ class LocalStorageService(StorageService):
|
|
|
93
94
|
if await anyio.Path(file).is_file()
|
|
94
95
|
]
|
|
95
96
|
|
|
96
|
-
logger.
|
|
97
|
+
await logger.ainfo(f"Listed {len(files)} files in flow {flow_id}.")
|
|
97
98
|
return files
|
|
98
99
|
|
|
99
100
|
async def delete_file(self, flow_id: str, file_name: str) -> None:
|
|
@@ -105,9 +106,9 @@ class LocalStorageService(StorageService):
|
|
|
105
106
|
file_path = self.data_dir / flow_id / file_name
|
|
106
107
|
if await file_path.exists():
|
|
107
108
|
await file_path.unlink()
|
|
108
|
-
logger.
|
|
109
|
+
await logger.ainfo(f"File {file_name} deleted successfully from flow {flow_id}.")
|
|
109
110
|
else:
|
|
110
|
-
logger.
|
|
111
|
+
await logger.awarning(f"Attempted to delete non-existent file {file_name} in flow {flow_id}.")
|
|
111
112
|
|
|
112
113
|
async def teardown(self) -> None:
|
|
113
114
|
"""Perform any cleanup operations when the service is being torn down."""
|
|
@@ -118,7 +119,7 @@ class LocalStorageService(StorageService):
|
|
|
118
119
|
# Get the file size from the file path
|
|
119
120
|
file_path = self.data_dir / flow_id / file_name
|
|
120
121
|
if not await file_path.exists():
|
|
121
|
-
logger.
|
|
122
|
+
await logger.awarning(f"File {file_name} not found in flow {flow_id}.")
|
|
122
123
|
msg = f"File {file_name} not found in flow {flow_id}"
|
|
123
124
|
raise FileNotFoundError(msg)
|
|
124
125
|
|
langflow/services/storage/s3.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import boto3
|
|
2
2
|
from botocore.exceptions import ClientError, NoCredentialsError
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
from langflow.logging.logger import logger
|
|
4
5
|
|
|
5
6
|
from .service import StorageService
|
|
6
7
|
|
|
@@ -28,12 +29,12 @@ class S3StorageService(StorageService):
|
|
|
28
29
|
"""
|
|
29
30
|
try:
|
|
30
31
|
self.s3_client.put_object(Bucket=self.bucket, Key=f"{folder}/{file_name}", Body=data)
|
|
31
|
-
logger.
|
|
32
|
+
await logger.ainfo(f"File {file_name} saved successfully in folder {folder}.")
|
|
32
33
|
except NoCredentialsError:
|
|
33
|
-
logger.
|
|
34
|
+
await logger.aexception("Credentials not available for AWS S3.")
|
|
34
35
|
raise
|
|
35
36
|
except ClientError:
|
|
36
|
-
logger.
|
|
37
|
+
await logger.aexception(f"Error saving file {file_name} in folder {folder}")
|
|
37
38
|
raise
|
|
38
39
|
|
|
39
40
|
async def get_file(self, folder: str, file_name: str):
|
|
@@ -51,10 +52,10 @@ class S3StorageService(StorageService):
|
|
|
51
52
|
"""
|
|
52
53
|
try:
|
|
53
54
|
response = self.s3_client.get_object(Bucket=self.bucket, Key=f"{folder}/{file_name}")
|
|
54
|
-
logger.
|
|
55
|
+
await logger.ainfo(f"File {file_name} retrieved successfully from folder {folder}.")
|
|
55
56
|
return response["Body"].read()
|
|
56
57
|
except ClientError:
|
|
57
|
-
logger.
|
|
58
|
+
await logger.aexception(f"Error retrieving file {file_name} from folder {folder}")
|
|
58
59
|
raise
|
|
59
60
|
|
|
60
61
|
async def list_files(self, folder: str):
|
|
@@ -72,11 +73,11 @@ class S3StorageService(StorageService):
|
|
|
72
73
|
try:
|
|
73
74
|
response = self.s3_client.list_objects_v2(Bucket=self.bucket, Prefix=folder)
|
|
74
75
|
except ClientError:
|
|
75
|
-
logger.
|
|
76
|
+
await logger.aexception(f"Error listing files in folder {folder}")
|
|
76
77
|
raise
|
|
77
78
|
|
|
78
79
|
files = [item["Key"] for item in response.get("Contents", []) if "/" not in item["Key"][len(folder) :]]
|
|
79
|
-
logger.
|
|
80
|
+
await logger.ainfo(f"{len(files)} files listed in folder {folder}.")
|
|
80
81
|
return files
|
|
81
82
|
|
|
82
83
|
async def delete_file(self, folder: str, file_name: str) -> None:
|
|
@@ -91,9 +92,9 @@ class S3StorageService(StorageService):
|
|
|
91
92
|
"""
|
|
92
93
|
try:
|
|
93
94
|
self.s3_client.delete_object(Bucket=self.bucket, Key=f"{folder}/{file_name}")
|
|
94
|
-
logger.
|
|
95
|
+
await logger.ainfo(f"File {file_name} deleted successfully from folder {folder}.")
|
|
95
96
|
except ClientError:
|
|
96
|
-
logger.
|
|
97
|
+
await logger.aexception(f"Error deleting file {file_name} from folder {folder}")
|
|
97
98
|
raise
|
|
98
99
|
|
|
99
100
|
async def teardown(self) -> None:
|