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
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import asyncio
|
|
4
|
+
import contextlib
|
|
3
5
|
import hashlib
|
|
4
6
|
import json
|
|
5
7
|
import re
|
|
@@ -14,6 +16,7 @@ from cryptography.fernet import InvalidToken
|
|
|
14
16
|
from langchain_chroma import Chroma
|
|
15
17
|
from loguru import logger
|
|
16
18
|
|
|
19
|
+
from langflow.base.data.kb_utils import get_knowledge_bases
|
|
17
20
|
from langflow.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES
|
|
18
21
|
from langflow.custom import Component
|
|
19
22
|
from langflow.io import BoolInput, DataFrameInput, DropdownInput, IntInput, Output, SecretStrInput, StrInput, TableInput
|
|
@@ -21,7 +24,8 @@ from langflow.schema.data import Data
|
|
|
21
24
|
from langflow.schema.dotdict import dotdict # noqa: TC001
|
|
22
25
|
from langflow.schema.table import EditMode
|
|
23
26
|
from langflow.services.auth.utils import decrypt_api_key, encrypt_api_key
|
|
24
|
-
from langflow.services.
|
|
27
|
+
from langflow.services.database.models.user.crud import get_user_by_id
|
|
28
|
+
from langflow.services.deps import get_settings_service, get_variable_service, session_scope
|
|
25
29
|
|
|
26
30
|
HUGGINGFACE_MODEL_NAMES = ["sentence-transformers/all-MiniLM-L6-v2", "sentence-transformers/all-mpnet-base-v2"]
|
|
27
31
|
COHERE_MODEL_NAMES = ["embed-english-v3.0", "embed-multilingual-v3.0"]
|
|
@@ -43,6 +47,10 @@ class KBIngestionComponent(Component):
|
|
|
43
47
|
icon = "database"
|
|
44
48
|
name = "KBIngestion"
|
|
45
49
|
|
|
50
|
+
def __init__(self, *args, **kwargs) -> None:
|
|
51
|
+
super().__init__(*args, **kwargs)
|
|
52
|
+
self._cached_kb_path: Path | None = None
|
|
53
|
+
|
|
46
54
|
@dataclass
|
|
47
55
|
class NewKnowledgeBaseInput:
|
|
48
56
|
functionality: str = "create"
|
|
@@ -76,7 +84,7 @@ class KBIngestionComponent(Component):
|
|
|
76
84
|
display_name="API Key",
|
|
77
85
|
info="Provider API key for embedding model",
|
|
78
86
|
required=True,
|
|
79
|
-
load_from_db=
|
|
87
|
+
load_from_db=False,
|
|
80
88
|
),
|
|
81
89
|
},
|
|
82
90
|
},
|
|
@@ -91,11 +99,7 @@ class KBIngestionComponent(Component):
|
|
|
91
99
|
display_name="Knowledge",
|
|
92
100
|
info="Select the knowledge to load data from.",
|
|
93
101
|
required=True,
|
|
94
|
-
options=[
|
|
95
|
-
str(d.name) for d in KNOWLEDGE_BASES_ROOT_PATH.iterdir() if not d.name.startswith(".") and d.is_dir()
|
|
96
|
-
]
|
|
97
|
-
if KNOWLEDGE_BASES_ROOT_PATH.exists()
|
|
98
|
-
else [],
|
|
102
|
+
options=[],
|
|
99
103
|
refresh_button=True,
|
|
100
104
|
dialog_inputs=asdict(NewKnowledgeBaseInput()),
|
|
101
105
|
),
|
|
@@ -329,22 +333,23 @@ class KBIngestionComponent(Component):
|
|
|
329
333
|
|
|
330
334
|
return metadata
|
|
331
335
|
|
|
332
|
-
def _create_vector_store(
|
|
336
|
+
async def _create_vector_store(
|
|
333
337
|
self, df_source: pd.DataFrame, config_list: list[dict[str, Any]], embedding_model: str, api_key: str
|
|
334
338
|
) -> None:
|
|
335
339
|
"""Create vector store following Local DB component pattern."""
|
|
336
340
|
try:
|
|
337
341
|
# Set up vector store directory
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
342
|
+
vector_store_dir = await self._kb_path()
|
|
343
|
+
if not vector_store_dir:
|
|
344
|
+
msg = "Knowledge base path is not set. Please create a new knowledge base first."
|
|
345
|
+
raise ValueError(msg)
|
|
341
346
|
vector_store_dir.mkdir(parents=True, exist_ok=True)
|
|
342
347
|
|
|
343
348
|
# Create embeddings model
|
|
344
349
|
embedding_function = self._build_embeddings(embedding_model, api_key)
|
|
345
350
|
|
|
346
351
|
# Convert DataFrame to Data objects (following Local DB pattern)
|
|
347
|
-
data_objects = self._convert_df_to_data_objects(df_source, config_list)
|
|
352
|
+
data_objects = await self._convert_df_to_data_objects(df_source, config_list)
|
|
348
353
|
|
|
349
354
|
# Create vector store
|
|
350
355
|
chroma = Chroma(
|
|
@@ -367,16 +372,18 @@ class KBIngestionComponent(Component):
|
|
|
367
372
|
except (OSError, ValueError, RuntimeError) as e:
|
|
368
373
|
self.log(f"Error creating vector store: {e}")
|
|
369
374
|
|
|
370
|
-
def _convert_df_to_data_objects(
|
|
375
|
+
async def _convert_df_to_data_objects(
|
|
376
|
+
self, df_source: pd.DataFrame, config_list: list[dict[str, Any]]
|
|
377
|
+
) -> list[Data]:
|
|
371
378
|
"""Convert DataFrame to Data objects for vector store."""
|
|
372
379
|
data_objects: list[Data] = []
|
|
373
380
|
|
|
374
381
|
# Set up vector store directory
|
|
375
|
-
|
|
382
|
+
kb_path = await self._kb_path()
|
|
376
383
|
|
|
377
384
|
# If we don't allow duplicates, we need to get the existing hashes
|
|
378
385
|
chroma = Chroma(
|
|
379
|
-
persist_directory=str(
|
|
386
|
+
persist_directory=str(kb_path),
|
|
380
387
|
collection_name=self.knowledge_base,
|
|
381
388
|
)
|
|
382
389
|
|
|
@@ -466,10 +473,34 @@ class KBIngestionComponent(Component):
|
|
|
466
473
|
# Check allowed characters (condition 3)
|
|
467
474
|
return re.match(r"^[a-zA-Z0-9_-]+$", name) is not None
|
|
468
475
|
|
|
476
|
+
async def _kb_path(self) -> Path | None:
|
|
477
|
+
# Check if we already have the path cached
|
|
478
|
+
cached_path = getattr(self, "_cached_kb_path", None)
|
|
479
|
+
if cached_path is not None:
|
|
480
|
+
return cached_path
|
|
481
|
+
|
|
482
|
+
# If not cached, compute it
|
|
483
|
+
async with session_scope() as db:
|
|
484
|
+
if not self.user_id:
|
|
485
|
+
msg = "User ID is required for fetching knowledge base path."
|
|
486
|
+
raise ValueError(msg)
|
|
487
|
+
current_user = await get_user_by_id(db, self.user_id)
|
|
488
|
+
if not current_user:
|
|
489
|
+
msg = f"User with ID {self.user_id} not found."
|
|
490
|
+
raise ValueError(msg)
|
|
491
|
+
kb_user = current_user.username
|
|
492
|
+
|
|
493
|
+
kb_root = self._get_kb_root()
|
|
494
|
+
|
|
495
|
+
# Cache the result
|
|
496
|
+
self._cached_kb_path = kb_root / kb_user / self.knowledge_base
|
|
497
|
+
|
|
498
|
+
return self._cached_kb_path
|
|
499
|
+
|
|
469
500
|
# ---------------------------------------------------------------------
|
|
470
501
|
# OUTPUT METHODS
|
|
471
502
|
# ---------------------------------------------------------------------
|
|
472
|
-
def build_kb_info(self) -> Data:
|
|
503
|
+
async def build_kb_info(self) -> Data:
|
|
473
504
|
"""Main ingestion routine → returns a dict with KB metadata."""
|
|
474
505
|
try:
|
|
475
506
|
# Get source DataFrame
|
|
@@ -479,11 +510,11 @@ class KBIngestionComponent(Component):
|
|
|
479
510
|
config_list = self._validate_column_config(df_source)
|
|
480
511
|
column_metadata = self._build_column_metadata(config_list, df_source)
|
|
481
512
|
|
|
482
|
-
# Prepare KB folder (using File Component patterns)
|
|
483
|
-
kb_root = self._get_kb_root()
|
|
484
|
-
kb_path = kb_root / self.knowledge_base
|
|
485
|
-
|
|
486
513
|
# Read the embedding info from the knowledge base folder
|
|
514
|
+
kb_path = await self._kb_path()
|
|
515
|
+
if not kb_path:
|
|
516
|
+
msg = "Knowledge base path is not set. Please create a new knowledge base first."
|
|
517
|
+
raise ValueError(msg)
|
|
487
518
|
metadata_path = kb_path / "embedding_metadata.json"
|
|
488
519
|
|
|
489
520
|
# If the API key is not provided, try to read it from the metadata file
|
|
@@ -506,7 +537,7 @@ class KBIngestionComponent(Component):
|
|
|
506
537
|
)
|
|
507
538
|
|
|
508
539
|
# Create vector store following Local DB component pattern
|
|
509
|
-
self._create_vector_store(df_source, config_list, embedding_model=embedding_model, api_key=api_key)
|
|
540
|
+
await self._create_vector_store(df_source, config_list, embedding_model=embedding_model, api_key=api_key)
|
|
510
541
|
|
|
511
542
|
# Save KB files (using File Component storage patterns)
|
|
512
543
|
self._save_kb_files(kb_path, config_list)
|
|
@@ -532,40 +563,77 @@ class KBIngestionComponent(Component):
|
|
|
532
563
|
self.status = f"❌ KB ingestion failed: {e}"
|
|
533
564
|
return Data(data={"error": str(e), "kb_name": self.knowledge_base})
|
|
534
565
|
|
|
535
|
-
def
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
566
|
+
async def _get_api_key_variable(self, field_value: dict[str, Any]):
|
|
567
|
+
async with session_scope() as db:
|
|
568
|
+
if not self.user_id:
|
|
569
|
+
msg = "User ID is required for fetching global variables."
|
|
570
|
+
raise ValueError(msg)
|
|
571
|
+
current_user = await get_user_by_id(db, self.user_id)
|
|
572
|
+
if not current_user:
|
|
573
|
+
msg = f"User with ID {self.user_id} not found."
|
|
574
|
+
raise ValueError(msg)
|
|
575
|
+
variable_service = get_variable_service()
|
|
576
|
+
|
|
577
|
+
# Process the api_key field variable
|
|
578
|
+
return await variable_service.get_variable(
|
|
579
|
+
user_id=current_user.id,
|
|
580
|
+
name=field_value["03_api_key"],
|
|
581
|
+
field="",
|
|
582
|
+
session=db,
|
|
583
|
+
)
|
|
548
584
|
|
|
549
|
-
def update_build_config(
|
|
585
|
+
async def update_build_config(
|
|
586
|
+
self,
|
|
587
|
+
build_config: dotdict,
|
|
588
|
+
field_value: Any,
|
|
589
|
+
field_name: str | None = None,
|
|
590
|
+
) -> dotdict:
|
|
550
591
|
"""Update build configuration based on provider selection."""
|
|
551
592
|
# Create a new knowledge base
|
|
552
593
|
if field_name == "knowledge_base":
|
|
594
|
+
async with session_scope() as db:
|
|
595
|
+
if not self.user_id:
|
|
596
|
+
msg = "User ID is required for fetching knowledge base list."
|
|
597
|
+
raise ValueError(msg)
|
|
598
|
+
current_user = await get_user_by_id(db, self.user_id)
|
|
599
|
+
if not current_user:
|
|
600
|
+
msg = f"User with ID {self.user_id} not found."
|
|
601
|
+
raise ValueError(msg)
|
|
602
|
+
kb_user = current_user.username
|
|
553
603
|
if isinstance(field_value, dict) and "01_new_kb_name" in field_value:
|
|
554
604
|
# Validate the knowledge base name - Make sure it follows these rules:
|
|
555
605
|
if not self.is_valid_collection_name(field_value["01_new_kb_name"]):
|
|
556
606
|
msg = f"Invalid knowledge base name: {field_value['01_new_kb_name']}"
|
|
557
607
|
raise ValueError(msg)
|
|
558
608
|
|
|
609
|
+
api_key = field_value.get("03_api_key", None)
|
|
610
|
+
with contextlib.suppress(Exception):
|
|
611
|
+
# If the API key is a variable, resolve it
|
|
612
|
+
api_key = await self._get_api_key_variable(field_value)
|
|
613
|
+
|
|
614
|
+
# Make sure api_key is a string
|
|
615
|
+
if not isinstance(api_key, str):
|
|
616
|
+
msg = "API key must be a string."
|
|
617
|
+
raise ValueError(msg)
|
|
618
|
+
|
|
559
619
|
# We need to test the API Key one time against the embedding model
|
|
560
|
-
embed_model = self._build_embeddings(
|
|
561
|
-
embedding_model=field_value["02_embedding_model"], api_key=field_value["03_api_key"]
|
|
562
|
-
)
|
|
620
|
+
embed_model = self._build_embeddings(embedding_model=field_value["02_embedding_model"], api_key=api_key)
|
|
563
621
|
|
|
564
|
-
# Try to generate a dummy embedding to validate the API key
|
|
565
|
-
|
|
622
|
+
# Try to generate a dummy embedding to validate the API key without blocking the event loop
|
|
623
|
+
try:
|
|
624
|
+
await asyncio.wait_for(
|
|
625
|
+
asyncio.to_thread(embed_model.embed_query, "test"),
|
|
626
|
+
timeout=10,
|
|
627
|
+
)
|
|
628
|
+
except TimeoutError as e:
|
|
629
|
+
msg = "Embedding validation timed out. Please verify network connectivity and key."
|
|
630
|
+
raise ValueError(msg) from e
|
|
631
|
+
except Exception as e:
|
|
632
|
+
msg = f"Embedding validation failed: {e!s}"
|
|
633
|
+
raise ValueError(msg) from e
|
|
566
634
|
|
|
567
635
|
# Create the new knowledge base directory
|
|
568
|
-
kb_path = KNOWLEDGE_BASES_ROOT_PATH / field_value["01_new_kb_name"]
|
|
636
|
+
kb_path = KNOWLEDGE_BASES_ROOT_PATH / kb_user / field_value["01_new_kb_name"]
|
|
569
637
|
kb_path.mkdir(parents=True, exist_ok=True)
|
|
570
638
|
|
|
571
639
|
# Save the embedding metadata
|
|
@@ -573,11 +641,16 @@ class KBIngestionComponent(Component):
|
|
|
573
641
|
self._save_embedding_metadata(
|
|
574
642
|
kb_path=kb_path,
|
|
575
643
|
embedding_model=field_value["02_embedding_model"],
|
|
576
|
-
api_key=
|
|
644
|
+
api_key=api_key,
|
|
577
645
|
)
|
|
578
646
|
|
|
579
647
|
# Update the knowledge base options dynamically
|
|
580
|
-
build_config["knowledge_base"]["options"] =
|
|
648
|
+
build_config["knowledge_base"]["options"] = await get_knowledge_bases(
|
|
649
|
+
KNOWLEDGE_BASES_ROOT_PATH,
|
|
650
|
+
user_id=self.user_id,
|
|
651
|
+
)
|
|
652
|
+
|
|
653
|
+
# If the selected knowledge base is not available, reset it
|
|
581
654
|
if build_config["knowledge_base"]["value"] not in build_config["knowledge_base"]["options"]:
|
|
582
655
|
build_config["knowledge_base"]["value"] = None
|
|
583
656
|
|
|
@@ -5,13 +5,16 @@ from typing import Any
|
|
|
5
5
|
from cryptography.fernet import InvalidToken
|
|
6
6
|
from langchain_chroma import Chroma
|
|
7
7
|
from loguru import logger
|
|
8
|
+
from pydantic import SecretStr
|
|
8
9
|
|
|
10
|
+
from langflow.base.data.kb_utils import get_knowledge_bases
|
|
9
11
|
from langflow.custom import Component
|
|
10
12
|
from langflow.io import BoolInput, DropdownInput, IntInput, MessageTextInput, Output, SecretStrInput
|
|
11
13
|
from langflow.schema.data import Data
|
|
12
14
|
from langflow.schema.dataframe import DataFrame
|
|
13
15
|
from langflow.services.auth.utils import decrypt_api_key
|
|
14
|
-
from langflow.services.
|
|
16
|
+
from langflow.services.database.models.user.crud import get_user_by_id
|
|
17
|
+
from langflow.services.deps import get_settings_service, session_scope
|
|
15
18
|
|
|
16
19
|
settings = get_settings_service().settings
|
|
17
20
|
knowledge_directory = settings.knowledge_bases_dir
|
|
@@ -33,11 +36,7 @@ class KBRetrievalComponent(Component):
|
|
|
33
36
|
display_name="Knowledge",
|
|
34
37
|
info="Select the knowledge to load data from.",
|
|
35
38
|
required=True,
|
|
36
|
-
options=[
|
|
37
|
-
str(d.name) for d in KNOWLEDGE_BASES_ROOT_PATH.iterdir() if not d.name.startswith(".") and d.is_dir()
|
|
38
|
-
]
|
|
39
|
-
if KNOWLEDGE_BASES_ROOT_PATH.exists()
|
|
40
|
-
else [],
|
|
39
|
+
options=[],
|
|
41
40
|
refresh_button=True,
|
|
42
41
|
real_time_refresh=True,
|
|
43
42
|
),
|
|
@@ -79,21 +78,13 @@ class KBRetrievalComponent(Component):
|
|
|
79
78
|
),
|
|
80
79
|
]
|
|
81
80
|
|
|
82
|
-
def
|
|
83
|
-
"""Retrieve a list of available knowledge bases.
|
|
84
|
-
|
|
85
|
-
Returns:
|
|
86
|
-
A list of knowledge base names.
|
|
87
|
-
"""
|
|
88
|
-
if not KNOWLEDGE_BASES_ROOT_PATH.exists():
|
|
89
|
-
return []
|
|
90
|
-
|
|
91
|
-
return [str(d.name) for d in KNOWLEDGE_BASES_ROOT_PATH.iterdir() if not d.name.startswith(".") and d.is_dir()]
|
|
92
|
-
|
|
93
|
-
def update_build_config(self, build_config, field_value, field_name=None): # noqa: ARG002
|
|
81
|
+
async def update_build_config(self, build_config, field_value, field_name=None): # noqa: ARG002
|
|
94
82
|
if field_name == "knowledge_base":
|
|
95
83
|
# Update the knowledge base options dynamically
|
|
96
|
-
build_config["knowledge_base"]["options"] =
|
|
84
|
+
build_config["knowledge_base"]["options"] = await get_knowledge_bases(
|
|
85
|
+
KNOWLEDGE_BASES_ROOT_PATH,
|
|
86
|
+
user_id=self.user_id, # Use the user_id from the component context
|
|
87
|
+
)
|
|
97
88
|
|
|
98
89
|
# If the selected knowledge base is not available, reset it
|
|
99
90
|
if build_config["knowledge_base"]["value"] not in build_config["knowledge_base"]["options"]:
|
|
@@ -129,15 +120,12 @@ class KBRetrievalComponent(Component):
|
|
|
129
120
|
|
|
130
121
|
def _build_embeddings(self, metadata: dict):
|
|
131
122
|
"""Build embedding model from metadata."""
|
|
123
|
+
runtime_api_key = self.api_key.get_secret_value() if isinstance(self.api_key, SecretStr) else self.api_key
|
|
132
124
|
provider = metadata.get("embedding_provider")
|
|
133
125
|
model = metadata.get("embedding_model")
|
|
134
|
-
api_key = metadata.get("api_key")
|
|
126
|
+
api_key = runtime_api_key or metadata.get("api_key")
|
|
135
127
|
chunk_size = metadata.get("chunk_size")
|
|
136
128
|
|
|
137
|
-
# If user provided a key in the input, it overrides the stored one.
|
|
138
|
-
if self.api_key and self.api_key.get_secret_value():
|
|
139
|
-
api_key = self.api_key.get_secret_value()
|
|
140
|
-
|
|
141
129
|
# Handle various providers
|
|
142
130
|
if provider == "OpenAI":
|
|
143
131
|
from langchain_openai import OpenAIEmbeddings
|
|
@@ -174,13 +162,23 @@ class KBRetrievalComponent(Component):
|
|
|
174
162
|
msg = f"Embedding provider '{provider}' is not supported for retrieval."
|
|
175
163
|
raise NotImplementedError(msg)
|
|
176
164
|
|
|
177
|
-
def get_chroma_kb_data(self) -> DataFrame:
|
|
165
|
+
async def get_chroma_kb_data(self) -> DataFrame:
|
|
178
166
|
"""Retrieve data from the selected knowledge base by reading the Chroma collection.
|
|
179
167
|
|
|
180
168
|
Returns:
|
|
181
169
|
A DataFrame containing the data rows from the knowledge base.
|
|
182
170
|
"""
|
|
183
|
-
|
|
171
|
+
# Get the current user
|
|
172
|
+
async with session_scope() as db:
|
|
173
|
+
if not self.user_id:
|
|
174
|
+
msg = "User ID is required for fetching Knowledge Base data."
|
|
175
|
+
raise ValueError(msg)
|
|
176
|
+
current_user = await get_user_by_id(db, self.user_id)
|
|
177
|
+
if not current_user:
|
|
178
|
+
msg = f"User with ID {self.user_id} not found."
|
|
179
|
+
raise ValueError(msg)
|
|
180
|
+
kb_user = current_user.username
|
|
181
|
+
kb_path = KNOWLEDGE_BASES_ROOT_PATH / kb_user / self.knowledge_base
|
|
184
182
|
|
|
185
183
|
metadata = self._get_kb_metadata(kb_path)
|
|
186
184
|
if not metadata:
|
langflow/components/data/url.py
CHANGED
|
@@ -3,12 +3,12 @@ import re
|
|
|
3
3
|
import requests
|
|
4
4
|
from bs4 import BeautifulSoup
|
|
5
5
|
from langchain_community.document_loaders import RecursiveUrlLoader
|
|
6
|
-
from loguru import logger
|
|
7
6
|
|
|
8
7
|
from langflow.custom.custom_component.component import Component
|
|
9
8
|
from langflow.field_typing.range_spec import RangeSpec
|
|
10
9
|
from langflow.helpers.data import safe_convert
|
|
11
10
|
from langflow.io import BoolInput, DropdownInput, IntInput, MessageTextInput, Output, SliderInput, TableInput
|
|
11
|
+
from langflow.logging.logger import logger
|
|
12
12
|
from langflow.schema.dataframe import DataFrame
|
|
13
13
|
from langflow.schema.message import Message
|
|
14
14
|
from langflow.services.deps import get_settings_service
|
|
@@ -4,7 +4,6 @@ from typing import TYPE_CHECKING, Any, cast
|
|
|
4
4
|
|
|
5
5
|
from astra_assistants.astra_assistants_manager import AssistantManager
|
|
6
6
|
from langchain_core.agents import AgentFinish
|
|
7
|
-
from loguru import logger
|
|
8
7
|
|
|
9
8
|
from langflow.base.agents.events import ExceptionWithMessageError, process_agent_events
|
|
10
9
|
from langflow.base.astra_assistants.util import (
|
|
@@ -15,6 +14,7 @@ from langflow.base.astra_assistants.util import (
|
|
|
15
14
|
)
|
|
16
15
|
from langflow.custom.custom_component.component_with_cache import ComponentWithCache
|
|
17
16
|
from langflow.inputs.inputs import DropdownInput, FileInput, HandleInput, MultilineInput
|
|
17
|
+
from langflow.logging.logger import logger
|
|
18
18
|
from langflow.memory import delete_message
|
|
19
19
|
from langflow.schema.content_block import ContentBlock
|
|
20
20
|
from langflow.schema.message import Message
|
|
@@ -186,8 +186,8 @@ class AstraAssistantManager(ComponentWithCache):
|
|
|
186
186
|
self.initialized = True
|
|
187
187
|
|
|
188
188
|
async def process_inputs(self) -> None:
|
|
189
|
-
logger.
|
|
190
|
-
logger.
|
|
189
|
+
await logger.ainfo(f"env_set is {self.env_set}")
|
|
190
|
+
await logger.ainfo(self.input_tools)
|
|
191
191
|
tools = []
|
|
192
192
|
tool_obj = None
|
|
193
193
|
if self.input_tools is None:
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
from loguru import logger
|
|
2
|
-
|
|
3
1
|
from langflow.base.astra_assistants.util import get_patched_openai_client
|
|
4
2
|
from langflow.custom.custom_component.component_with_cache import ComponentWithCache
|
|
5
3
|
from langflow.inputs.inputs import MultilineInput, StrInput
|
|
4
|
+
from langflow.logging.logger import logger
|
|
6
5
|
from langflow.schema.message import Message
|
|
7
6
|
from langflow.template.field.base import Output
|
|
8
7
|
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
from typing import TYPE_CHECKING, Any
|
|
2
2
|
|
|
3
|
-
from loguru import logger
|
|
4
|
-
|
|
5
3
|
from langflow.base.flow_processing.utils import build_data_from_result_data
|
|
6
4
|
from langflow.custom.custom_component.custom_component import CustomComponent
|
|
7
5
|
from langflow.graph.graph.base import Graph
|
|
8
6
|
from langflow.graph.vertex.base import Vertex
|
|
9
7
|
from langflow.helpers.flow import get_flow_inputs
|
|
8
|
+
from langflow.logging.logger import logger
|
|
10
9
|
from langflow.schema.data import Data
|
|
11
10
|
from langflow.schema.dotdict import dotdict
|
|
12
11
|
from langflow.template.field.base import Input
|
|
@@ -36,7 +35,7 @@ class SubFlowComponent(CustomComponent):
|
|
|
36
35
|
return None
|
|
37
36
|
|
|
38
37
|
async def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
|
|
39
|
-
logger.
|
|
38
|
+
await logger.adebug(f"Updating build config with field value {field_value} and field name {field_name}")
|
|
40
39
|
if field_name == "flow_name":
|
|
41
40
|
build_config["flow_name"]["options"] = await self.get_flow_names()
|
|
42
41
|
# Clean up the build config
|
|
@@ -47,11 +46,11 @@ class SubFlowComponent(CustomComponent):
|
|
|
47
46
|
try:
|
|
48
47
|
flow_data = await self.get_flow(field_value)
|
|
49
48
|
except Exception: # noqa: BLE001
|
|
50
|
-
logger.
|
|
49
|
+
await logger.aexception(f"Error getting flow {field_value}")
|
|
51
50
|
else:
|
|
52
51
|
if not flow_data:
|
|
53
52
|
msg = f"Flow {field_value} not found."
|
|
54
|
-
logger.
|
|
53
|
+
await logger.aerror(msg)
|
|
55
54
|
else:
|
|
56
55
|
try:
|
|
57
56
|
graph = Graph.from_payload(flow_data.data["data"])
|
|
@@ -60,7 +59,7 @@ class SubFlowComponent(CustomComponent):
|
|
|
60
59
|
# Add inputs to the build config
|
|
61
60
|
build_config = self.add_inputs_to_build_config(inputs, build_config)
|
|
62
61
|
except Exception: # noqa: BLE001
|
|
63
|
-
logger.
|
|
62
|
+
await logger.aexception(f"Error building graph for flow {field_value}")
|
|
64
63
|
|
|
65
64
|
return build_config
|
|
66
65
|
|
|
@@ -121,5 +120,5 @@ class SubFlowComponent(CustomComponent):
|
|
|
121
120
|
data.extend(build_data_from_result_data(output))
|
|
122
121
|
|
|
123
122
|
self.status = data
|
|
124
|
-
logger.
|
|
123
|
+
await logger.adebug(data)
|
|
125
124
|
return data
|
|
@@ -68,9 +68,9 @@ class VectaraSelfQueryRetriverComponent(CustomComponent):
|
|
|
68
68
|
metadata_field_obj.append(attribute_info)
|
|
69
69
|
|
|
70
70
|
return SelfQueryRetriever.from_llm(
|
|
71
|
-
self.llm, #
|
|
72
|
-
self.vectorstore, #
|
|
73
|
-
self.document_content_description, #
|
|
71
|
+
self.llm, # type: ignore[attr-defined]
|
|
72
|
+
self.vectorstore, # type: ignore[attr-defined]
|
|
73
|
+
self.document_content_description, # type: ignore[attr-defined]
|
|
74
74
|
metadata_field_obj,
|
|
75
75
|
verbose=True,
|
|
76
76
|
)
|