langflow-base-nightly 0.5.1.dev3__py3-none-any.whl → 0.5.1.dev4__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/__init__.py +215 -0
- langflow/__main__.py +16 -2
- langflow/alembic/versions/006b3990db50_add_unique_constraints.py +4 -7
- langflow/alembic/versions/012fb73ac359_add_folder_table.py +4 -5
- langflow/alembic/versions/0ae3a2674f32_update_the_columns_that_need_to_change_.py +11 -20
- langflow/alembic/versions/0b8757876a7c_.py +4 -7
- langflow/alembic/versions/0d60fcbd4e8e_create_vertex_builds_table.py +4 -6
- langflow/alembic/versions/1a110b568907_replace_credential_table_with_variable.py +4 -5
- langflow/alembic/versions/1b8b740a6fa3_remove_fk_constraint_in_message_.py +32 -27
- langflow/alembic/versions/1c79524817ed_add_unique_constraints_per_user_in_.py +4 -5
- langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py +4 -5
- langflow/alembic/versions/1eab2c3eb45e_event_error.py +14 -15
- langflow/alembic/versions/1ef9c4f3765d_.py +5 -10
- langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py +4 -5
- langflow/alembic/versions/260dbcc8b680_adds_tables.py +4 -5
- langflow/alembic/versions/29fe8f1f806b_add_missing_index.py +4 -5
- langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py +4 -7
- langflow/alembic/versions/3bb0ddf32dfb_add_unique_constraints_per_user_in_flow_.py +4 -5
- langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py +1 -2
- langflow/alembic/versions/58b28437a398_modify_nullable.py +1 -2
- langflow/alembic/versions/5ace73a7f223_new_remove_table_upgrade_op.py +6 -12
- langflow/alembic/versions/631faacf5da2_add_webhook_columns.py +4 -5
- langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py +4 -5
- langflow/alembic/versions/66f72f04a1de_add_mcp_support_with_project_settings_.py +21 -23
- langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py +4 -5
- langflow/alembic/versions/6e7b581b5648_fix_nullable.py +4 -5
- langflow/alembic/versions/7843803a87b5_store_updates.py +4 -6
- langflow/alembic/versions/79e675cb6752_change_datetime_type.py +1 -2
- langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py +4 -10
- langflow/alembic/versions/90be8e2ed91e_create_transactions_table.py +4 -6
- langflow/alembic/versions/93e2705fa8d6_add_column_save_path_to_flow.py +7 -9
- langflow/alembic/versions/a72f5cf9c2f9_add_endpoint_name_col.py +4 -5
- langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py +1 -2
- langflow/alembic/versions/bc2f01c40e4a_new_fixes.py +4 -5
- langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py +4 -5
- langflow/alembic/versions/d066bfd22890_add_message_table.py +4 -4
- langflow/alembic/versions/d2d475a1f7c0_add_tags_column_to_flow.py +12 -13
- langflow/alembic/versions/d3dbf656a499_add_gradient_column_in_flow.py +12 -12
- langflow/alembic/versions/d9a6ea21edcd_rename_default_folder.py +7 -10
- langflow/alembic/versions/dd9e0804ebd1_add_v2_file_table.py +8 -7
- langflow/alembic/versions/e3162c1804e6_add_persistent_locked_state.py +10 -10
- langflow/alembic/versions/e3bc869fa272_fix_nullable.py +4 -5
- langflow/alembic/versions/e56d87f8994a_add_optins_column_to_user.py +13 -14
- langflow/alembic/versions/e5a65ecff2cd_nullable_in_vertex_build.py +4 -5
- langflow/alembic/versions/eb5866d51fd2_change_columns_to_be_nullable.py +4 -5
- langflow/alembic/versions/eb5e72293a8e_add_error_and_edit_flags_to_message.py +4 -5
- langflow/alembic/versions/f3b2d1f1002d_add_column_access_type_to_flow.py +19 -15
- langflow/alembic/versions/f5ee9749d1a6_user_id_can_be_null_in_flow.py +4 -6
- langflow/alembic/versions/fd531f8868b1_fix_credential_table.py +5 -8
- langflow/api/build.py +5 -4
- langflow/api/health_check_router.py +1 -1
- langflow/api/limited_background_tasks.py +1 -1
- langflow/api/log_router.py +1 -2
- langflow/api/utils.py +2 -2
- langflow/api/v1/base.py +1 -2
- langflow/api/v1/callback.py +4 -9
- langflow/api/v1/chat.py +6 -7
- langflow/api/v1/endpoints.py +15 -15
- langflow/api/v1/files.py +1 -1
- langflow/api/v1/flows.py +1 -1
- langflow/api/v1/knowledge_bases.py +1 -1
- langflow/api/v1/mcp.py +1 -1
- langflow/api/v1/mcp_projects.py +14 -5
- langflow/api/v1/mcp_utils.py +3 -3
- langflow/api/v1/openai_responses.py +4 -4
- langflow/api/v1/schemas.py +3 -38
- langflow/api/v1/starter_projects.py +61 -3
- langflow/api/v1/store.py +1 -1
- langflow/api/v1/validate.py +3 -3
- langflow/api/v1/voice_mode.py +2 -2
- langflow/api/v2/files.py +1 -1
- langflow/api/v2/mcp.py +2 -2
- langflow/base/__init__.py +11 -0
- langflow/base/agents/__init__.py +3 -0
- langflow/base/data/__init__.py +2 -4
- langflow/base/data/utils.py +2 -197
- langflow/base/embeddings/__init__.py +3 -0
- langflow/base/io/__init__.py +7 -0
- langflow/base/io/chat.py +5 -18
- langflow/base/io/text.py +2 -21
- langflow/base/knowledge_bases/__init__.py +3 -0
- langflow/base/memory/__init__.py +3 -0
- langflow/base/models/__init__.py +2 -2
- langflow/base/models/openai_constants.py +6 -120
- langflow/base/prompts/__init__.py +3 -0
- langflow/base/prompts/api_utils.py +2 -223
- langflow/base/textsplitters/__init__.py +3 -0
- langflow/base/tools/__init__.py +3 -0
- langflow/base/vectorstores/__init__.py +3 -0
- langflow/components/__init__.py +7 -259
- langflow/components/agents.py +6 -0
- langflow/components/anthropic.py +6 -0
- langflow/components/data.py +6 -0
- langflow/components/helpers.py +6 -0
- langflow/components/knowledge_bases/ingestion.py +13 -14
- langflow/components/knowledge_bases/retrieval.py +8 -7
- langflow/components/openai.py +6 -0
- langflow/components/processing/__init__.py +1 -117
- langflow/components/processing/converter.py +3 -149
- langflow/custom/__init__.py +26 -3
- langflow/custom/custom_component/__init__.py +4 -0
- langflow/custom/custom_component/component.py +20 -1738
- langflow/custom/custom_component/component_with_cache.py +1 -8
- langflow/custom/custom_component/custom_component.py +1 -552
- langflow/custom/utils.py +1 -872
- langflow/custom/validate.py +1 -0
- langflow/events/event_manager.py +18 -108
- langflow/field_typing/__init__.py +6 -6
- langflow/field_typing/constants.py +87 -122
- langflow/field_typing/range_spec.py +2 -32
- langflow/frontend/assets/{SlackIcon-Cc7Qnzki.js → SlackIcon-v88osOTA.js} +1 -1
- langflow/frontend/assets/{Wikipedia-7ulMZY46.js → Wikipedia-DD_S2k00.js} +1 -1
- langflow/frontend/assets/{Wolfram-By9PGsHS.js → Wolfram-EO2C5noN.js} +1 -1
- langflow/frontend/assets/{index-DVLIDc2_.js → index-1Gv1mfvk.js} +1 -1
- langflow/frontend/assets/{index-MVW4HTEk.js → index-7v-bzlzf.js} +1 -1
- langflow/frontend/assets/{index-CUzlcce2.js → index-9CbMazbV.js} +1 -1
- langflow/frontend/assets/{index-CU16NJD7.js → index-B8ZHP8g2.js} +1 -1
- langflow/frontend/assets/{index-v8eXbWlM.js → index-B8y2e6vN.js} +1 -1
- langflow/frontend/assets/{index-BX_asvRB.js → index-BBRUGsyr.js} +1 -1
- langflow/frontend/assets/{index-9FL5xjkL.js → index-BGwqQwlh.js} +1 -1
- langflow/frontend/assets/{index-BAn-AzCS.js → index-BIq-k-FG.js} +1 -1
- langflow/frontend/assets/{index-D5c2nNvp.js → index-BSN73YP8.js} +1 -1
- langflow/frontend/assets/{index-DMCerPJM.js → index-BU8R8jRn.js} +1 -1
- langflow/frontend/assets/{index-CvSoff-8.js → index-BV6yx8ey.js} +1 -1
- langflow/frontend/assets/{index-BISPW-f6.js → index-BYIsg-Eh.js} +1 -1
- langflow/frontend/assets/{index-GzOGB_fo.js → index-B_ksDBSQ.js} +1 -1
- langflow/frontend/assets/{index-BIqEYjNT.js → index-Ba1UOZ9A.js} +1 -1
- langflow/frontend/assets/{index-ByxGmq5p.js → index-Ba9tKRQg.js} +1 -1
- langflow/frontend/assets/{index-BLEWsL1U.js → index-Bbfaw8ca.js} +1 -1
- langflow/frontend/assets/{index-C_MhBX6R.js → index-BbuGqvAx.js} +1 -1
- langflow/frontend/assets/{index-RH_I78z_.js → index-BeoXu1YX.js} +1 -1
- langflow/frontend/assets/{index-cYFKmtmg.js → index-BfjZmOnH.js} +1 -1
- langflow/frontend/assets/{index-Bm9i8F4W.js → index-Bjzy_HZB.js} +1 -1
- langflow/frontend/assets/{index-_szO7sta.js → index-BofEkpYB.js} +1 -1
- langflow/frontend/assets/{index-DP1oE6QB.js → index-Bp7Mty2H.js} +1 -1
- langflow/frontend/assets/{index-CeswGUz3.js → index-BqX1H6yK.js} +1 -1
- langflow/frontend/assets/{index-C8pI0lzi.js → index-BqtBAJAN.js} +1 -1
- langflow/frontend/assets/{index-BusCv3bR.js → index-Bsfraj7A.js} +1 -1
- langflow/frontend/assets/{index-BWnKMRFJ.js → index-BtFl7fER.js} +1 -1
- langflow/frontend/assets/{index-DnlVWWU8.js → index-BvX993Sv.js} +1 -1
- langflow/frontend/assets/{index-C676MS3I.js → index-BvgQ2vzM.js} +1 -1
- langflow/frontend/assets/{index-DJ6HD14g.js → index-BwY98u8n.js} +1 -1
- langflow/frontend/assets/{index-C51yNvIL.js → index-C-RIJAOS.js} +1 -1
- langflow/frontend/assets/{index-DiblXWmk.js → index-C1K6A38P.js} +1 -1
- langflow/frontend/assets/{index-Co__gFM1.js → index-C3Vwhx0t.js} +1 -1
- langflow/frontend/assets/{index-Coi86oqP.js → index-C5XUG_gr.js} +1 -1
- langflow/frontend/assets/{index-jwzN3Jd_.js → index-C6ouLG9o.js} +1 -1
- langflow/frontend/assets/{index-CQQ-4XMS.js → index-C7ZJ_Z6f.js} +1 -1
- langflow/frontend/assets/{index-Bl7RpmrB.js → index-CCOGIwGY.js} +1 -1
- langflow/frontend/assets/{index-CVkIdc6y.js → index-CCcye2rt.js} +1 -1
- langflow/frontend/assets/{index-bMhyLtgS.js → index-CFR4yJQB.js} +1 -1
- langflow/frontend/assets/{index-aAgSKWb3.js → index-CIGmPP0H.js} +1 -1
- langflow/frontend/assets/{index-BGt6jQ4x.js → index-CJmMEa6d.js} +1 -1
- langflow/frontend/assets/{index-DX7JcSMz.js → index-CJxD7lyU.js} +1 -1
- langflow/frontend/assets/{index-BZ-A4K98.js → index-CL_vu6ut.js} +1 -1
- langflow/frontend/assets/{index-BMpKFGhI.js → index-COf3UnBn.js} +1 -1
- langflow/frontend/assets/{index-xN8ogFdo.js → index-CV9650h_.js} +1 -1
- langflow/frontend/assets/{index-OsUvqIUr.js → index-CVDzych0.js} +1 -1
- langflow/frontend/assets/{index-BH7AyHxp.js → index-CWIHsC4D.js} +1 -1
- langflow/frontend/assets/{index-mjwtJmkP.js → index-CXCnFZ0L.js} +1 -1
- langflow/frontend/assets/{index-3jlSQi5Y.js → index-Ca_Pw_Dn.js} +1 -1
- langflow/frontend/assets/{index-D-SnFlhU.js → index-Cbb3bX9e.js} +1 -1
- langflow/frontend/assets/{index--e0oQqZh.js → index-CcJtOz-Z.js} +1 -1
- langflow/frontend/assets/{index-S-sc0Cm9.js → index-CfTbTHEv.js} +1 -1
- langflow/frontend/assets/{index-Deu8rlaZ.js → index-ChoxDAgX.js} +1 -1
- langflow/frontend/assets/{index-lnF9Eqr2.js → index-Cn4gw8aE.js} +1 -1
- langflow/frontend/assets/{index-C_NwzK6j.js → index-CnpLg4zX.js} +1 -1
- langflow/frontend/assets/{index-DznH7Jbq.js → index-Cpao2omG.js} +1 -1
- langflow/frontend/assets/{index-DpWrk8mA.js → index-CqoxM01j.js} +1 -1
- langflow/frontend/assets/{index-Bw-TIIC6.js → index-CrHf2Ic1.js} +1 -1
- langflow/frontend/assets/{index-DmYLDQag.js → index-CrV0uIjp.js} +1 -1
- langflow/frontend/assets/{index-Dp7ZQyL3.js → index-CssADaak.js} +1 -1
- langflow/frontend/assets/{index-CNh0rwur.js → index-CtJdNLy9.js} +1 -1
- langflow/frontend/assets/{index-Ca1b7Iag.js → index-CyeWD2dh.js} +1 -1
- langflow/frontend/assets/{index-DcApTyZ7.js → index-D1xzD7uc.js} +1 -1
- langflow/frontend/assets/{index-B3GvPjhD.js → index-D6MuXC4L.js} +1 -1
- langflow/frontend/assets/{index-Cw0UComa.js → index-D8w9zvIF.js} +1 -1
- langflow/frontend/assets/{index-C-2MRYoJ.js → index-D98Gn0A6.js} +1 -1
- langflow/frontend/assets/{index-aWnZIwHd.js → index-DBhjpWkf.js} +1 -1
- langflow/frontend/assets/{index-nw3WF9lY.js → index-DCCRJzcY.js} +1 -1
- langflow/frontend/assets/{index-RjeC0kaX.js → index-DCTRSkEW.js} +1 -1
- langflow/frontend/assets/{index-B_kBTgxV.js → index-DCUfitVj.js} +1 -1
- langflow/frontend/assets/{index-ChsGhZn3.js → index-DDdz-Xcl.js} +1 -1
- langflow/frontend/assets/{index-7yAHPRxv.js → index-DGdMwZjG.js} +1 -1
- langflow/frontend/assets/{index-DjQElpEg.js → index-DGtl2vMw.js} +1 -1
- langflow/frontend/assets/{index-BCXhKCOK.js → index-DHVdkrni.js} +1 -1
- langflow/frontend/assets/{index-S8uJXTOq.js → index-DJBWwjgl.js} +1 -1
- langflow/frontend/assets/{index-qiVTWUuf.js → index-DMAkJ_qX.js} +1 -1
- langflow/frontend/assets/{index-D-WStJI6.js → index-DMEvEQI5.js} +1 -1
- langflow/frontend/assets/{index-BhqVw9WQ.js → index-DNGRoOsp.js} +1 -1
- langflow/frontend/assets/{index-Cu7vC48Y.js → index-DNT_TUTa.js} +1 -1
- langflow/frontend/assets/{index-Bhcv5M0n.js → index-DQKOH_9K.js} +1 -1
- langflow/frontend/assets/{index-CLcaktde.js → index-DQhqqtqQ.js} +1 -1
- langflow/frontend/assets/{index-DZVgPCio.js → index-DRM7KKnG.js} +1 -1
- langflow/frontend/assets/{index-uybez8MR.js → index-DSCtl3a5.js} +1 -1
- langflow/frontend/assets/{index-CJ5A6STv.js → index-DSLNlm0Z.js} +1 -1
- langflow/frontend/assets/{index-Drg8me2a.js → index-DT-PspE-.js} +1 -1
- langflow/frontend/assets/{index-DsEZjOcp.js → index-DTpbH-p8.js} +1 -1
- langflow/frontend/assets/{index-DrXXKzpD.js → index-DWV6MsIq.js} +1 -1
- langflow/frontend/assets/{index-4JIEdyIM.js → index-DWeL4US_.js} +1 -1
- langflow/frontend/assets/{index-BlDsBQ_1.js → index-DYKZHhpU.js} +1 -1
- langflow/frontend/assets/{index-DFY8YFbC.js → index-DZyQHiMR.js} +1 -1
- langflow/frontend/assets/{index-CKPZpkQk.js → index-Dc6qVuSa.js} +1 -1
- langflow/frontend/assets/{index-yyAaYjLR.js → index-DkYuicnC.js} +1 -1
- langflow/frontend/assets/{index-DmVt5Jlx.js → index-Dlj_2mMs.js} +1 -1
- langflow/frontend/assets/{index-BvRIG6P5.js → index-DmGJUrEp.js} +1 -1
- langflow/frontend/assets/{index-BWFIrwW1.js → index-Dn6hpCAZ.js} +1 -1
- langflow/frontend/assets/{index-Cb5G9Ifd.js → index-DrJU8Fgb.js} +1 -1
- langflow/frontend/assets/{index-COoTCxvs.js → index-DsWfdCzp.js} +1 -1
- langflow/frontend/assets/{index-ZjeocHyu.js → index-DvCPWs2_.js} +1 -1
- langflow/frontend/assets/{index-B5LHnuQR.js → index-DvPVq7OP.js} +1 -1
- langflow/frontend/assets/{index-BnCnYnao.js → index-Dw71ufW4.js} +1 -1
- langflow/frontend/assets/{index-AALDfCyt.js → index-DxkJactf.js} +1 -1
- langflow/frontend/assets/{index-k9jP5chN.js → index-Dz2GTphU.js} +1 -1
- langflow/frontend/assets/{index-BdjfHsrf.js → index-Fvd524_c.js} +1 -1
- langflow/frontend/assets/{index-AKVkmT4S.js → index-GAQ0Mk2M.js} +1 -1
- langflow/frontend/assets/{index-BZSa2qz7.js → index-Hm5-4ItD.js} +1 -1
- langflow/frontend/assets/{index-DbfS_UH-.js → index-IT67FzsK.js} +1 -1
- langflow/frontend/assets/{index-BLXN681C.js → index-ItYiij1i.js} +1 -1
- langflow/frontend/assets/{index-CiklyQU3.js → index-IuR_FEdB.js} +1 -1
- langflow/frontend/assets/{index-xV6ystWy.js → index-Jj60FQkv.js} +1 -1
- langflow/frontend/assets/{index-C_157Mb-.js → index-LlvshmVz.js} +1 -1
- langflow/frontend/assets/{index-CDphUsa3.js → index-LwKh3I_W.js} +1 -1
- langflow/frontend/assets/{index-BrDz-PxE.js → index-N-xxmKKH.js} +1 -1
- langflow/frontend/assets/{index-BsdLyYMY.js → index-RwpaHIAH.js} +1 -1
- langflow/frontend/assets/{index-Cu2Xr6_j.js → index-TVvsp-xh.js} +1 -1
- langflow/frontend/assets/{index-CPiM2oyj.js → index-TdE2u9zP.js} +1 -1
- langflow/frontend/assets/{index-DOj_QWqG.js → index-_x-NkYeW.js} +1 -1
- langflow/frontend/assets/{index-YJsAl7vm.js → index-a-YclEbW.js} +1 -1
- langflow/frontend/assets/{index-5-CSw2-z.js → index-e9MFKUCo.js} +1 -1
- langflow/frontend/assets/{index-BSwBVwyF.js → index-krPr8f2F.js} +1 -1
- langflow/frontend/assets/{index-Df6psZEj.js → index-kveiUWuL.js} +1 -1
- langflow/frontend/assets/{index-CF4_Og1m.js → index-lE3oSjJi.js} +1 -1
- langflow/frontend/assets/{index-C6nzdeYx.js → index-lM3UYg7F.js} +1 -1
- langflow/frontend/assets/{index-C-wnbBBY.js → index-nsRk3qgA.js} +1 -1
- langflow/frontend/assets/{index-D234yKNJ.js → index-pBO0SZLD.js} +4 -4
- langflow/frontend/assets/{index-BMvp94tO.js → index-pbZHsbuE.js} +1 -1
- langflow/frontend/assets/{index-hg2y9OAt.js → index-sfX3aWyp.js} +1 -1
- langflow/frontend/assets/{index-DTCrijba.js → index-xQz-VJ0-.js} +1 -1
- langflow/frontend/assets/{index-SB4rw8D5.js → index-yfcsaHS6.js} +1 -1
- langflow/frontend/assets/{index-C-bjC2sz.js → index-zcGjo9fx.js} +1 -1
- langflow/frontend/assets/lazyIconImports-BjqDmNYG.js +2 -0
- langflow/frontend/assets/{use-post-add-user-JUeLDErC.js → use-post-add-user-w3vpKSOB.js} +1 -1
- langflow/frontend/index.html +1 -1
- langflow/graph/__init__.py +4 -4
- langflow/helpers/data.py +2 -2
- langflow/helpers/flow.py +9 -7
- langflow/helpers/user.py +2 -2
- langflow/initial_setup/setup.py +9 -9
- langflow/initial_setup/starter_projects/Basic Prompt Chaining.json +119 -41
- langflow/initial_setup/starter_projects/Basic Prompting.json +45 -19
- langflow/initial_setup/starter_projects/Blog Writer.json +53 -21
- langflow/initial_setup/starter_projects/Custom Component Generator.json +121 -97
- langflow/initial_setup/starter_projects/Document Q&A.json +46 -18
- langflow/initial_setup/starter_projects/Financial Report Parser.json +49 -17
- langflow/initial_setup/starter_projects/Hybrid Search RAG.json +89 -50
- langflow/initial_setup/starter_projects/Image Sentiment Analysis.json +86 -22
- langflow/initial_setup/starter_projects/Instagram Copywriter.json +210 -57
- langflow/initial_setup/starter_projects/Invoice Summarizer.json +132 -35
- langflow/initial_setup/starter_projects/Knowledge Ingestion.json +8 -8
- langflow/initial_setup/starter_projects/Knowledge Retrieval.json +8 -8
- langflow/initial_setup/starter_projects/Market Research.json +174 -48
- langflow/initial_setup/starter_projects/Meeting Summary.json +102 -38
- langflow/initial_setup/starter_projects/Memory Chatbot.json +49 -21
- langflow/initial_setup/starter_projects/News Aggregator.json +140 -39
- langflow/initial_setup/starter_projects/Nvidia Remix.json +153 -181
- langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +132 -35
- langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json +106 -43
- langflow/initial_setup/starter_projects/Price Deal Finder.json +136 -39
- langflow/initial_setup/starter_projects/Research Agent.json +206 -53
- langflow/initial_setup/starter_projects/Research Translation Loop.json +66 -34
- langflow/initial_setup/starter_projects/SEO Keyword Generator.json +41 -15
- langflow/initial_setup/starter_projects/SaaS Pricing.json +128 -31
- langflow/initial_setup/starter_projects/Search agent.json +132 -35
- langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +422 -98
- langflow/initial_setup/starter_projects/Simple Agent.json +150 -42
- langflow/initial_setup/starter_projects/Social Media Agent.json +150 -42
- langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +120 -24
- langflow/initial_setup/starter_projects/Travel Planning Agents.json +418 -94
- langflow/initial_setup/starter_projects/Twitter Thread Generator.json +69 -37
- langflow/initial_setup/starter_projects/Vector Store RAG.json +66 -38
- langflow/initial_setup/starter_projects/Youtube Analysis.json +191 -51
- langflow/initial_setup/starter_projects/basic_prompting.py +4 -4
- langflow/initial_setup/starter_projects/blog_writer.py +5 -5
- langflow/initial_setup/starter_projects/complex_agent.py +8 -8
- langflow/initial_setup/starter_projects/document_qa.py +5 -5
- langflow/initial_setup/starter_projects/hierarchical_tasks_agent.py +8 -8
- langflow/initial_setup/starter_projects/memory_chatbot.py +6 -6
- langflow/initial_setup/starter_projects/sequential_tasks_agent.py +7 -7
- langflow/initial_setup/starter_projects/vector_store_rag.py +8 -8
- langflow/inputs/__init__.py +3 -2
- langflow/inputs/constants.py +3 -2
- langflow/inputs/input_mixin.py +49 -310
- langflow/inputs/inputs.py +72 -703
- langflow/inputs/validators.py +2 -18
- langflow/interface/__init__.py +4 -0
- langflow/interface/components.py +3 -491
- langflow/interface/initialize/loading.py +7 -6
- langflow/interface/listing.py +3 -25
- langflow/interface/run.py +1 -1
- langflow/interface/utils.py +3 -111
- langflow/io/__init__.py +2 -2
- langflow/io/schema.py +11 -302
- langflow/load/__init__.py +4 -2
- langflow/load/utils.py +2 -96
- langflow/logging/__init__.py +2 -1
- langflow/logging/setup.py +1 -1
- langflow/main.py +8 -5
- langflow/memory.py +12 -6
- langflow/middleware.py +1 -1
- langflow/processing/process.py +7 -7
- langflow/schema/__init__.py +22 -5
- langflow/schema/artifact.py +1 -1
- langflow/schema/data.py +5 -303
- langflow/schema/dataframe.py +2 -205
- langflow/schema/graph.py +4 -45
- langflow/schema/image.py +2 -67
- langflow/schema/message.py +6 -470
- langflow/schema/playground_events.py +5 -6
- langflow/schema/schema.py +24 -117
- langflow/serialization/constants.py +3 -2
- langflow/serialization/serialization.py +1 -1
- langflow/server.py +1 -2
- langflow/services/__init__.py +1 -2
- langflow/services/auth/mcp_encryption.py +1 -1
- langflow/services/auth/service.py +1 -1
- langflow/services/auth/utils.py +5 -5
- langflow/services/cache/disk.py +2 -2
- langflow/services/cache/factory.py +2 -2
- langflow/services/cache/service.py +2 -2
- langflow/services/cache/utils.py +0 -11
- langflow/services/database/factory.py +1 -1
- langflow/services/database/models/flow/model.py +1 -1
- langflow/services/database/models/message/crud.py +2 -1
- langflow/services/database/models/transactions/crud.py +1 -1
- langflow/services/database/models/user/crud.py +1 -1
- langflow/services/database/service.py +2 -2
- langflow/services/database/utils.py +1 -2
- langflow/services/deps.py +12 -17
- langflow/services/enhanced_manager.py +71 -0
- langflow/services/factory.py +14 -7
- langflow/services/flow/flow_runner.py +4 -4
- langflow/services/job_queue/service.py +2 -1
- langflow/services/manager.py +14 -130
- langflow/services/schema.py +0 -1
- langflow/services/session/service.py +3 -2
- langflow/services/settings/__init__.py +0 -3
- langflow/services/settings/base.py +16 -549
- langflow/services/settings/factory.py +2 -21
- langflow/services/settings/feature_flags.py +2 -11
- langflow/services/settings/service.py +2 -31
- langflow/services/shared_component_cache/factory.py +1 -1
- langflow/services/socket/service.py +1 -1
- langflow/services/socket/utils.py +1 -8
- langflow/services/state/factory.py +1 -1
- langflow/services/state/service.py +3 -2
- langflow/services/storage/factory.py +2 -2
- langflow/services/storage/local.py +1 -2
- langflow/services/storage/s3.py +1 -2
- langflow/services/storage/service.py +2 -1
- langflow/services/store/factory.py +1 -1
- langflow/services/store/service.py +2 -2
- langflow/services/store/utils.py +1 -2
- langflow/services/task/service.py +2 -1
- langflow/services/task/temp_flow_cleanup.py +1 -1
- langflow/services/telemetry/factory.py +1 -1
- langflow/services/telemetry/service.py +2 -3
- langflow/services/tracing/arize_phoenix.py +3 -3
- langflow/services/tracing/base.py +1 -1
- langflow/services/tracing/factory.py +1 -1
- langflow/services/tracing/langfuse.py +2 -2
- langflow/services/tracing/langsmith.py +2 -2
- langflow/services/tracing/langwatch.py +4 -4
- langflow/services/tracing/opik.py +2 -2
- langflow/services/tracing/service.py +17 -11
- langflow/services/tracing/traceloop.py +2 -2
- langflow/services/tracing/utils.py +1 -1
- langflow/services/utils.py +54 -9
- langflow/services/variable/factory.py +1 -1
- langflow/services/variable/kubernetes.py +2 -3
- langflow/services/variable/kubernetes_secrets.py +1 -2
- langflow/services/variable/service.py +2 -3
- langflow/template/__init__.py +2 -9
- langflow/template/field/__init__.py +3 -0
- langflow/template/field/base.py +2 -256
- langflow/template/frontend_node.py +3 -0
- langflow/template/utils.py +2 -216
- langflow/utils/constants.py +28 -204
- langflow/utils/lazy_load.py +3 -14
- langflow/utils/schemas.py +2 -3
- langflow/utils/template_validation.py +2 -2
- langflow/utils/util.py +59 -479
- langflow/utils/validate.py +2 -488
- langflow/utils/voice_utils.py +1 -2
- langflow/worker.py +1 -1
- {langflow_base_nightly-0.5.1.dev3.dist-info → langflow_base_nightly-0.5.1.dev4.dist-info}/METADATA +2 -1
- langflow_base_nightly-0.5.1.dev4.dist-info/RECORD +633 -0
- langflow/base/agents/agent.py +0 -267
- langflow/base/agents/callback.py +0 -130
- langflow/base/agents/context.py +0 -109
- langflow/base/agents/crewai/__init__.py +0 -0
- langflow/base/agents/crewai/crew.py +0 -231
- langflow/base/agents/crewai/tasks.py +0 -12
- langflow/base/agents/default_prompts.py +0 -23
- langflow/base/agents/errors.py +0 -15
- langflow/base/agents/events.py +0 -346
- langflow/base/agents/utils.py +0 -205
- langflow/base/astra_assistants/__init__.py +0 -0
- langflow/base/astra_assistants/util.py +0 -171
- langflow/base/chains/__init__.py +0 -0
- langflow/base/chains/model.py +0 -19
- langflow/base/composio/__init__.py +0 -0
- langflow/base/composio/composio_base.py +0 -1297
- langflow/base/compressors/__init__.py +0 -0
- langflow/base/compressors/model.py +0 -60
- langflow/base/constants.py +0 -46
- langflow/base/curl/__init__.py +0 -0
- langflow/base/curl/parse.py +0 -188
- langflow/base/data/base_file.py +0 -685
- langflow/base/data/docling_utils.py +0 -245
- langflow/base/document_transformers/__init__.py +0 -0
- langflow/base/document_transformers/model.py +0 -43
- langflow/base/embeddings/aiml_embeddings.py +0 -62
- langflow/base/embeddings/model.py +0 -26
- langflow/base/flow_processing/__init__.py +0 -0
- langflow/base/flow_processing/utils.py +0 -86
- langflow/base/huggingface/__init__.py +0 -0
- langflow/base/huggingface/model_bridge.py +0 -133
- langflow/base/langchain_utilities/__init__.py +0 -0
- langflow/base/langchain_utilities/model.py +0 -35
- langflow/base/langchain_utilities/spider_constants.py +0 -1
- langflow/base/langwatch/__init__.py +0 -0
- langflow/base/langwatch/utils.py +0 -18
- langflow/base/mcp/__init__.py +0 -0
- langflow/base/mcp/constants.py +0 -2
- langflow/base/mcp/util.py +0 -1524
- langflow/base/memory/memory.py +0 -49
- langflow/base/memory/model.py +0 -38
- langflow/base/models/aiml_constants.py +0 -51
- langflow/base/models/anthropic_constants.py +0 -47
- langflow/base/models/aws_constants.py +0 -151
- langflow/base/models/chat_result.py +0 -76
- langflow/base/models/google_generative_ai_constants.py +0 -70
- langflow/base/models/groq_constants.py +0 -134
- langflow/base/models/model.py +0 -375
- langflow/base/models/model_input_constants.py +0 -299
- langflow/base/models/model_metadata.py +0 -41
- langflow/base/models/model_utils.py +0 -8
- langflow/base/models/novita_constants.py +0 -35
- langflow/base/models/ollama_constants.py +0 -49
- langflow/base/models/sambanova_constants.py +0 -18
- langflow/base/processing/__init__.py +0 -0
- langflow/base/prompts/utils.py +0 -61
- langflow/base/textsplitters/model.py +0 -28
- langflow/base/tools/base.py +0 -26
- langflow/base/tools/component_tool.py +0 -324
- langflow/base/tools/constants.py +0 -49
- langflow/base/tools/flow_tool.py +0 -131
- langflow/base/tools/run_flow.py +0 -227
- langflow/base/vectorstores/model.py +0 -193
- langflow/base/vectorstores/utils.py +0 -22
- langflow/base/vectorstores/vector_store_connection_decorator.py +0 -52
- langflow/components/FAISS/__init__.py +0 -34
- langflow/components/FAISS/faiss.py +0 -111
- langflow/components/Notion/__init__.py +0 -19
- langflow/components/Notion/add_content_to_page.py +0 -269
- langflow/components/Notion/create_page.py +0 -94
- langflow/components/Notion/list_database_properties.py +0 -68
- langflow/components/Notion/list_pages.py +0 -122
- langflow/components/Notion/list_users.py +0 -77
- langflow/components/Notion/page_content_viewer.py +0 -93
- langflow/components/Notion/search.py +0 -111
- langflow/components/Notion/update_page_property.py +0 -114
- langflow/components/_importing.py +0 -37
- langflow/components/agentql/__init__.py +0 -3
- langflow/components/agentql/agentql_api.py +0 -151
- langflow/components/agents/__init__.py +0 -4
- langflow/components/agents/agent.py +0 -554
- langflow/components/agents/mcp_component.py +0 -501
- langflow/components/aiml/__init__.py +0 -37
- langflow/components/aiml/aiml.py +0 -112
- langflow/components/aiml/aiml_embeddings.py +0 -37
- langflow/components/amazon/__init__.py +0 -36
- langflow/components/amazon/amazon_bedrock_embedding.py +0 -109
- langflow/components/amazon/amazon_bedrock_model.py +0 -124
- langflow/components/amazon/s3_bucket_uploader.py +0 -211
- langflow/components/anthropic/__init__.py +0 -34
- langflow/components/anthropic/anthropic.py +0 -187
- langflow/components/apify/__init__.py +0 -5
- langflow/components/apify/apify_actor.py +0 -325
- langflow/components/arxiv/__init__.py +0 -3
- langflow/components/arxiv/arxiv.py +0 -163
- langflow/components/assemblyai/__init__.py +0 -46
- langflow/components/assemblyai/assemblyai_get_subtitles.py +0 -83
- langflow/components/assemblyai/assemblyai_lemur.py +0 -183
- langflow/components/assemblyai/assemblyai_list_transcripts.py +0 -95
- langflow/components/assemblyai/assemblyai_poll_transcript.py +0 -72
- langflow/components/assemblyai/assemblyai_start_transcript.py +0 -188
- langflow/components/azure/__init__.py +0 -37
- langflow/components/azure/azure_openai.py +0 -95
- langflow/components/azure/azure_openai_embeddings.py +0 -83
- langflow/components/baidu/__init__.py +0 -32
- langflow/components/baidu/baidu_qianfan_chat.py +0 -113
- langflow/components/bing/__init__.py +0 -3
- langflow/components/bing/bing_search_api.py +0 -61
- langflow/components/cassandra/__init__.py +0 -40
- langflow/components/cassandra/cassandra.py +0 -264
- langflow/components/cassandra/cassandra_chat.py +0 -92
- langflow/components/cassandra/cassandra_graph.py +0 -238
- langflow/components/chains/__init__.py +0 -0
- langflow/components/chroma/__init__.py +0 -34
- langflow/components/chroma/chroma.py +0 -167
- langflow/components/cleanlab/__init__.py +0 -40
- langflow/components/cleanlab/cleanlab_evaluator.py +0 -157
- langflow/components/cleanlab/cleanlab_rag_evaluator.py +0 -254
- langflow/components/cleanlab/cleanlab_remediator.py +0 -131
- langflow/components/clickhouse/__init__.py +0 -34
- langflow/components/clickhouse/clickhouse.py +0 -135
- langflow/components/cloudflare/__init__.py +0 -32
- langflow/components/cloudflare/cloudflare.py +0 -81
- langflow/components/cohere/__init__.py +0 -40
- langflow/components/cohere/cohere_embeddings.py +0 -81
- langflow/components/cohere/cohere_models.py +0 -46
- langflow/components/cohere/cohere_rerank.py +0 -51
- langflow/components/composio/__init__.py +0 -73
- langflow/components/composio/composio_api.py +0 -268
- langflow/components/composio/dropbox_compnent.py +0 -11
- langflow/components/composio/github_composio.py +0 -11
- langflow/components/composio/gmail_composio.py +0 -38
- langflow/components/composio/googlecalendar_composio.py +0 -11
- langflow/components/composio/googlemeet_composio.py +0 -11
- langflow/components/composio/googletasks_composio.py +0 -8
- langflow/components/composio/linear_composio.py +0 -11
- langflow/components/composio/outlook_composio.py +0 -11
- langflow/components/composio/reddit_composio.py +0 -11
- langflow/components/composio/slack_composio.py +0 -11
- langflow/components/composio/slackbot_composio.py +0 -11
- langflow/components/composio/supabase_composio.py +0 -11
- langflow/components/composio/todoist_composio.py +0 -11
- langflow/components/composio/youtube_composio.py +0 -11
- langflow/components/confluence/__init__.py +0 -3
- langflow/components/confluence/confluence.py +0 -84
- langflow/components/couchbase/__init__.py +0 -34
- langflow/components/couchbase/couchbase.py +0 -102
- langflow/components/crewai/__init__.py +0 -49
- langflow/components/crewai/crewai.py +0 -107
- langflow/components/crewai/hierarchical_crew.py +0 -46
- langflow/components/crewai/hierarchical_task.py +0 -44
- langflow/components/crewai/sequential_crew.py +0 -52
- langflow/components/crewai/sequential_task.py +0 -73
- langflow/components/crewai/sequential_task_agent.py +0 -143
- langflow/components/custom_component/__init__.py +0 -34
- langflow/components/custom_component/custom_component.py +0 -31
- langflow/components/data/__init__.py +0 -25
- langflow/components/data/api_request.py +0 -545
- langflow/components/data/csv_to_data.py +0 -95
- langflow/components/data/directory.py +0 -113
- langflow/components/data/file.py +0 -586
- langflow/components/data/json_to_data.py +0 -98
- langflow/components/data/news_search.py +0 -164
- langflow/components/data/rss.py +0 -69
- langflow/components/data/sql_executor.py +0 -99
- langflow/components/data/url.py +0 -299
- langflow/components/data/web_search.py +0 -112
- langflow/components/data/webhook.py +0 -56
- langflow/components/datastax/__init__.py +0 -70
- langflow/components/datastax/astra_assistant_manager.py +0 -306
- langflow/components/datastax/astra_db.py +0 -69
- langflow/components/datastax/astra_vectorize.py +0 -124
- langflow/components/datastax/astradb_cql.py +0 -314
- langflow/components/datastax/astradb_graph.py +0 -319
- langflow/components/datastax/astradb_tool.py +0 -414
- langflow/components/datastax/astradb_vectorstore.py +0 -1285
- langflow/components/datastax/create_assistant.py +0 -58
- langflow/components/datastax/create_thread.py +0 -32
- langflow/components/datastax/dotenv.py +0 -35
- langflow/components/datastax/get_assistant.py +0 -37
- langflow/components/datastax/getenvvar.py +0 -30
- langflow/components/datastax/graph_rag.py +0 -141
- langflow/components/datastax/hcd.py +0 -314
- langflow/components/datastax/list_assistants.py +0 -25
- langflow/components/datastax/run.py +0 -89
- langflow/components/deactivated/__init__.py +0 -19
- langflow/components/deactivated/amazon_kendra.py +0 -66
- langflow/components/deactivated/chat_litellm_model.py +0 -158
- langflow/components/deactivated/code_block_extractor.py +0 -26
- langflow/components/deactivated/documents_to_data.py +0 -22
- langflow/components/deactivated/embed.py +0 -16
- langflow/components/deactivated/extract_key_from_data.py +0 -46
- langflow/components/deactivated/json_document_builder.py +0 -59
- langflow/components/deactivated/list_flows.py +0 -20
- langflow/components/deactivated/mcp_sse.py +0 -61
- langflow/components/deactivated/mcp_stdio.py +0 -62
- langflow/components/deactivated/merge_data.py +0 -93
- langflow/components/deactivated/message.py +0 -37
- langflow/components/deactivated/metal.py +0 -54
- langflow/components/deactivated/multi_query.py +0 -59
- langflow/components/deactivated/retriever.py +0 -43
- langflow/components/deactivated/selective_passthrough.py +0 -77
- langflow/components/deactivated/should_run_next.py +0 -40
- langflow/components/deactivated/split_text.py +0 -63
- langflow/components/deactivated/store_message.py +0 -24
- langflow/components/deactivated/sub_flow.py +0 -124
- langflow/components/deactivated/vectara_self_query.py +0 -76
- langflow/components/deactivated/vector_store.py +0 -24
- langflow/components/deepseek/__init__.py +0 -34
- langflow/components/deepseek/deepseek.py +0 -136
- langflow/components/docling/__init__.py +0 -43
- langflow/components/docling/chunk_docling_document.py +0 -186
- langflow/components/docling/docling_inline.py +0 -235
- langflow/components/docling/docling_remote.py +0 -193
- langflow/components/docling/export_docling_document.py +0 -117
- langflow/components/documentloaders/__init__.py +0 -0
- langflow/components/duckduckgo/__init__.py +0 -3
- langflow/components/duckduckgo/duck_duck_go_search_run.py +0 -92
- langflow/components/elastic/__init__.py +0 -37
- langflow/components/elastic/elasticsearch.py +0 -267
- langflow/components/elastic/opensearch.py +0 -243
- langflow/components/embeddings/__init__.py +0 -37
- langflow/components/embeddings/similarity.py +0 -76
- langflow/components/embeddings/text_embedder.py +0 -64
- langflow/components/exa/__init__.py +0 -3
- langflow/components/exa/exa_search.py +0 -68
- langflow/components/firecrawl/__init__.py +0 -43
- langflow/components/firecrawl/firecrawl_crawl_api.py +0 -88
- langflow/components/firecrawl/firecrawl_extract_api.py +0 -136
- langflow/components/firecrawl/firecrawl_map_api.py +0 -89
- langflow/components/firecrawl/firecrawl_scrape_api.py +0 -73
- langflow/components/git/__init__.py +0 -4
- langflow/components/git/git.py +0 -262
- langflow/components/git/gitextractor.py +0 -196
- langflow/components/glean/__init__.py +0 -3
- langflow/components/glean/glean_search_api.py +0 -173
- langflow/components/google/__init__.py +0 -17
- langflow/components/google/gmail.py +0 -192
- langflow/components/google/google_bq_sql_executor.py +0 -157
- langflow/components/google/google_drive.py +0 -92
- langflow/components/google/google_drive_search.py +0 -152
- langflow/components/google/google_generative_ai.py +0 -147
- langflow/components/google/google_generative_ai_embeddings.py +0 -141
- langflow/components/google/google_oauth_token.py +0 -89
- langflow/components/google/google_search_api_core.py +0 -68
- langflow/components/google/google_serper_api_core.py +0 -74
- langflow/components/groq/__init__.py +0 -34
- langflow/components/groq/groq.py +0 -140
- langflow/components/helpers/__init__.py +0 -52
- langflow/components/helpers/calculator_core.py +0 -89
- langflow/components/helpers/create_list.py +0 -40
- langflow/components/helpers/current_date.py +0 -42
- langflow/components/helpers/id_generator.py +0 -42
- langflow/components/helpers/memory.py +0 -251
- langflow/components/helpers/output_parser.py +0 -45
- langflow/components/helpers/store_message.py +0 -90
- langflow/components/homeassistant/__init__.py +0 -7
- langflow/components/homeassistant/home_assistant_control.py +0 -152
- langflow/components/homeassistant/list_home_assistant_states.py +0 -137
- langflow/components/huggingface/__init__.py +0 -37
- langflow/components/huggingface/huggingface.py +0 -197
- langflow/components/huggingface/huggingface_inference_api.py +0 -106
- langflow/components/ibm/__init__.py +0 -34
- langflow/components/ibm/watsonx.py +0 -203
- langflow/components/ibm/watsonx_embeddings.py +0 -135
- langflow/components/icosacomputing/__init__.py +0 -5
- langflow/components/icosacomputing/combinatorial_reasoner.py +0 -84
- langflow/components/input_output/__init__.py +0 -38
- langflow/components/input_output/chat.py +0 -120
- langflow/components/input_output/chat_output.py +0 -200
- langflow/components/input_output/text.py +0 -27
- langflow/components/input_output/text_output.py +0 -29
- langflow/components/jigsawstack/__init__.py +0 -23
- langflow/components/jigsawstack/ai_scrape.py +0 -126
- langflow/components/jigsawstack/ai_web_search.py +0 -136
- langflow/components/jigsawstack/file_read.py +0 -115
- langflow/components/jigsawstack/file_upload.py +0 -94
- langflow/components/jigsawstack/image_generation.py +0 -205
- langflow/components/jigsawstack/nsfw.py +0 -60
- langflow/components/jigsawstack/object_detection.py +0 -124
- langflow/components/jigsawstack/sentiment.py +0 -112
- langflow/components/jigsawstack/text_to_sql.py +0 -90
- langflow/components/jigsawstack/text_translate.py +0 -77
- langflow/components/jigsawstack/vocr.py +0 -107
- langflow/components/langchain_utilities/__init__.py +0 -109
- langflow/components/langchain_utilities/character.py +0 -53
- langflow/components/langchain_utilities/conversation.py +0 -52
- langflow/components/langchain_utilities/csv_agent.py +0 -107
- langflow/components/langchain_utilities/fake_embeddings.py +0 -26
- langflow/components/langchain_utilities/html_link_extractor.py +0 -35
- langflow/components/langchain_utilities/json_agent.py +0 -45
- langflow/components/langchain_utilities/langchain_hub.py +0 -126
- langflow/components/langchain_utilities/language_recursive.py +0 -49
- langflow/components/langchain_utilities/language_semantic.py +0 -138
- langflow/components/langchain_utilities/llm_checker.py +0 -39
- langflow/components/langchain_utilities/llm_math.py +0 -42
- langflow/components/langchain_utilities/natural_language.py +0 -61
- langflow/components/langchain_utilities/openai_tools.py +0 -53
- langflow/components/langchain_utilities/openapi.py +0 -48
- langflow/components/langchain_utilities/recursive_character.py +0 -60
- langflow/components/langchain_utilities/retrieval_qa.py +0 -83
- langflow/components/langchain_utilities/runnable_executor.py +0 -137
- langflow/components/langchain_utilities/self_query.py +0 -80
- langflow/components/langchain_utilities/spider.py +0 -142
- langflow/components/langchain_utilities/sql.py +0 -40
- langflow/components/langchain_utilities/sql_database.py +0 -35
- langflow/components/langchain_utilities/sql_generator.py +0 -78
- langflow/components/langchain_utilities/tool_calling.py +0 -59
- langflow/components/langchain_utilities/vector_store_info.py +0 -49
- langflow/components/langchain_utilities/vector_store_router.py +0 -33
- langflow/components/langchain_utilities/xml_agent.py +0 -71
- langflow/components/langwatch/__init__.py +0 -3
- langflow/components/langwatch/langwatch.py +0 -278
- langflow/components/link_extractors/__init__.py +0 -0
- langflow/components/lmstudio/__init__.py +0 -34
- langflow/components/lmstudio/lmstudioembeddings.py +0 -89
- langflow/components/lmstudio/lmstudiomodel.py +0 -129
- langflow/components/logic/__init__.py +0 -52
- langflow/components/logic/conditional_router.py +0 -171
- langflow/components/logic/data_conditional_router.py +0 -125
- langflow/components/logic/flow_tool.py +0 -110
- langflow/components/logic/listen.py +0 -29
- langflow/components/logic/loop.py +0 -125
- langflow/components/logic/notify.py +0 -88
- langflow/components/logic/pass_message.py +0 -35
- langflow/components/logic/run_flow.py +0 -71
- langflow/components/logic/sub_flow.py +0 -114
- langflow/components/maritalk/__init__.py +0 -32
- langflow/components/maritalk/maritalk.py +0 -52
- langflow/components/mem0/__init__.py +0 -3
- langflow/components/mem0/mem0_chat_memory.py +0 -136
- langflow/components/milvus/__init__.py +0 -34
- langflow/components/milvus/milvus.py +0 -115
- langflow/components/mistral/__init__.py +0 -37
- langflow/components/mistral/mistral.py +0 -114
- langflow/components/mistral/mistral_embeddings.py +0 -58
- langflow/components/models/__init__.py +0 -34
- langflow/components/models/embedding_model.py +0 -114
- langflow/components/models/language_model.py +0 -144
- langflow/components/mongodb/__init__.py +0 -34
- langflow/components/mongodb/mongodb_atlas.py +0 -213
- langflow/components/needle/__init__.py +0 -3
- langflow/components/needle/needle.py +0 -104
- langflow/components/notdiamond/__init__.py +0 -36
- langflow/components/notdiamond/notdiamond.py +0 -228
- langflow/components/novita/__init__.py +0 -32
- langflow/components/novita/novita.py +0 -130
- langflow/components/nvidia/__init__.py +0 -57
- langflow/components/nvidia/nvidia.py +0 -157
- langflow/components/nvidia/nvidia_embedding.py +0 -77
- langflow/components/nvidia/nvidia_ingest.py +0 -317
- langflow/components/nvidia/nvidia_rerank.py +0 -63
- langflow/components/nvidia/system_assist.py +0 -65
- langflow/components/olivya/__init__.py +0 -3
- langflow/components/olivya/olivya.py +0 -116
- langflow/components/ollama/__init__.py +0 -37
- langflow/components/ollama/ollama.py +0 -330
- langflow/components/ollama/ollama_embeddings.py +0 -106
- langflow/components/openai/__init__.py +0 -37
- langflow/components/openai/openai.py +0 -100
- langflow/components/openai/openai_chat_model.py +0 -158
- langflow/components/openrouter/__init__.py +0 -32
- langflow/components/openrouter/openrouter.py +0 -202
- langflow/components/output_parsers/__init__.py +0 -0
- langflow/components/perplexity/__init__.py +0 -34
- langflow/components/perplexity/perplexity.py +0 -75
- langflow/components/pgvector/__init__.py +0 -34
- langflow/components/pgvector/pgvector.py +0 -72
- langflow/components/pinecone/__init__.py +0 -34
- langflow/components/pinecone/pinecone.py +0 -134
- langflow/components/processing/alter_metadata.py +0 -108
- langflow/components/processing/batch_run.py +0 -205
- langflow/components/processing/combine_text.py +0 -39
- langflow/components/processing/create_data.py +0 -110
- langflow/components/processing/data_operations.py +0 -438
- langflow/components/processing/data_to_dataframe.py +0 -70
- langflow/components/processing/dataframe_operations.py +0 -321
- langflow/components/processing/extract_key.py +0 -53
- langflow/components/processing/filter_data.py +0 -42
- langflow/components/processing/filter_data_values.py +0 -88
- langflow/components/processing/json_cleaner.py +0 -103
- langflow/components/processing/lambda_filter.py +0 -154
- langflow/components/processing/llm_router.py +0 -499
- langflow/components/processing/merge_data.py +0 -90
- langflow/components/processing/message_to_data.py +0 -36
- langflow/components/processing/parse_data.py +0 -70
- langflow/components/processing/parse_dataframe.py +0 -68
- langflow/components/processing/parse_json_data.py +0 -90
- langflow/components/processing/parser.py +0 -143
- langflow/components/processing/prompt.py +0 -67
- langflow/components/processing/python_repl_core.py +0 -98
- langflow/components/processing/regex.py +0 -82
- langflow/components/processing/save_file.py +0 -208
- langflow/components/processing/select_data.py +0 -48
- langflow/components/processing/split_text.py +0 -141
- langflow/components/processing/structured_output.py +0 -202
- langflow/components/processing/update_data.py +0 -160
- langflow/components/prototypes/__init__.py +0 -34
- langflow/components/prototypes/python_function.py +0 -73
- langflow/components/qdrant/__init__.py +0 -34
- langflow/components/qdrant/qdrant.py +0 -109
- langflow/components/redis/__init__.py +0 -37
- langflow/components/redis/redis.py +0 -89
- langflow/components/redis/redis_chat.py +0 -43
- langflow/components/sambanova/__init__.py +0 -32
- langflow/components/sambanova/sambanova.py +0 -84
- langflow/components/scrapegraph/__init__.py +0 -40
- langflow/components/scrapegraph/scrapegraph_markdownify_api.py +0 -64
- langflow/components/scrapegraph/scrapegraph_search_api.py +0 -64
- langflow/components/scrapegraph/scrapegraph_smart_scraper_api.py +0 -71
- langflow/components/searchapi/__init__.py +0 -36
- langflow/components/searchapi/search.py +0 -79
- langflow/components/serpapi/__init__.py +0 -3
- langflow/components/serpapi/serp.py +0 -115
- langflow/components/serper/__init__.py +0 -3
- langflow/components/serper/google_serper_api_core.py +0 -74
- langflow/components/supabase/__init__.py +0 -37
- langflow/components/supabase/supabase.py +0 -76
- langflow/components/tavily/__init__.py +0 -4
- langflow/components/tavily/tavily_extract.py +0 -117
- langflow/components/tavily/tavily_search.py +0 -212
- langflow/components/textsplitters/__init__.py +0 -0
- langflow/components/toolkits/__init__.py +0 -0
- langflow/components/tools/__init__.py +0 -72
- langflow/components/tools/calculator.py +0 -103
- langflow/components/tools/google_search_api.py +0 -45
- langflow/components/tools/google_serper_api.py +0 -115
- langflow/components/tools/python_code_structured_tool.py +0 -327
- langflow/components/tools/python_repl.py +0 -97
- langflow/components/tools/search_api.py +0 -87
- langflow/components/tools/searxng.py +0 -145
- langflow/components/tools/serp_api.py +0 -119
- langflow/components/tools/tavily_search_tool.py +0 -344
- langflow/components/tools/wikidata_api.py +0 -102
- langflow/components/tools/wikipedia_api.py +0 -49
- langflow/components/tools/yahoo_finance.py +0 -124
- langflow/components/twelvelabs/__init__.py +0 -52
- langflow/components/twelvelabs/convert_astra_results.py +0 -84
- langflow/components/twelvelabs/pegasus_index.py +0 -311
- langflow/components/twelvelabs/split_video.py +0 -291
- langflow/components/twelvelabs/text_embeddings.py +0 -57
- langflow/components/twelvelabs/twelvelabs_pegasus.py +0 -408
- langflow/components/twelvelabs/video_embeddings.py +0 -100
- langflow/components/twelvelabs/video_file.py +0 -179
- langflow/components/unstructured/__init__.py +0 -3
- langflow/components/unstructured/unstructured.py +0 -121
- langflow/components/upstash/__init__.py +0 -34
- langflow/components/upstash/upstash.py +0 -124
- langflow/components/vectara/__init__.py +0 -37
- langflow/components/vectara/vectara.py +0 -97
- langflow/components/vectara/vectara_rag.py +0 -164
- langflow/components/vectorstores/__init__.py +0 -34
- langflow/components/vectorstores/local_db.py +0 -261
- langflow/components/vertexai/__init__.py +0 -37
- langflow/components/vertexai/vertexai.py +0 -71
- langflow/components/vertexai/vertexai_embeddings.py +0 -67
- langflow/components/weaviate/__init__.py +0 -34
- langflow/components/weaviate/weaviate.py +0 -89
- langflow/components/wikipedia/__init__.py +0 -4
- langflow/components/wikipedia/wikidata.py +0 -86
- langflow/components/wikipedia/wikipedia.py +0 -53
- langflow/components/wolframalpha/__init__.py +0 -3
- langflow/components/wolframalpha/wolfram_alpha_api.py +0 -54
- langflow/components/xai/__init__.py +0 -32
- langflow/components/xai/xai.py +0 -167
- langflow/components/yahoosearch/__init__.py +0 -3
- langflow/components/yahoosearch/yahoo.py +0 -137
- langflow/components/youtube/__init__.py +0 -52
- langflow/components/youtube/channel.py +0 -227
- langflow/components/youtube/comments.py +0 -231
- langflow/components/youtube/playlist.py +0 -33
- langflow/components/youtube/search.py +0 -120
- langflow/components/youtube/trending.py +0 -285
- langflow/components/youtube/video_details.py +0 -263
- langflow/components/youtube/youtube_transcripts.py +0 -118
- langflow/components/zep/__init__.py +0 -3
- langflow/components/zep/zep.py +0 -44
- langflow/custom/attributes.py +0 -86
- langflow/custom/code_parser/__init__.py +0 -3
- langflow/custom/code_parser/code_parser.py +0 -361
- langflow/custom/custom_component/base_component.py +0 -118
- langflow/custom/dependency_analyzer.py +0 -165
- langflow/custom/directory_reader/__init__.py +0 -3
- langflow/custom/directory_reader/directory_reader.py +0 -359
- langflow/custom/directory_reader/utils.py +0 -171
- langflow/custom/eval.py +0 -12
- langflow/custom/schema.py +0 -32
- langflow/custom/tree_visitor.py +0 -21
- langflow/frontend/assets/lazyIconImports-Ci-S9xBA.js +0 -2
- langflow/graph/edge/__init__.py +0 -0
- langflow/graph/edge/base.py +0 -277
- langflow/graph/edge/schema.py +0 -119
- langflow/graph/edge/utils.py +0 -0
- langflow/graph/graph/__init__.py +0 -0
- langflow/graph/graph/ascii.py +0 -202
- langflow/graph/graph/base.py +0 -2185
- langflow/graph/graph/constants.py +0 -58
- langflow/graph/graph/runnable_vertices_manager.py +0 -133
- langflow/graph/graph/schema.py +0 -53
- langflow/graph/graph/state_model.py +0 -66
- langflow/graph/graph/utils.py +0 -1024
- langflow/graph/schema.py +0 -75
- langflow/graph/state/__init__.py +0 -0
- langflow/graph/state/model.py +0 -237
- langflow/graph/utils.py +0 -229
- langflow/graph/vertex/__init__.py +0 -0
- langflow/graph/vertex/base.py +0 -811
- langflow/graph/vertex/constants.py +0 -0
- langflow/graph/vertex/exceptions.py +0 -4
- langflow/graph/vertex/param_handler.py +0 -255
- langflow/graph/vertex/schema.py +0 -26
- langflow/graph/vertex/utils.py +0 -19
- langflow/graph/vertex/vertex_types.py +0 -489
- langflow/legacy_custom/__init__.py +0 -0
- langflow/legacy_custom/customs.py +0 -16
- langflow/load/load.py +0 -250
- langflow/logging/logger.py +0 -369
- langflow/processing/utils.py +0 -25
- langflow/schema/openai_responses_schemas.py +0 -74
- langflow/schema/serialize.py +0 -13
- langflow/services/chat/config.py +0 -2
- langflow/services/settings/auth.py +0 -130
- langflow/services/settings/constants.py +0 -31
- langflow/services/settings/manager.py +0 -49
- langflow/services/settings/utils.py +0 -40
- langflow/template/field/prompt.py +0 -2
- langflow/template/frontend_node/__init__.py +0 -6
- langflow/template/frontend_node/base.py +0 -212
- langflow/template/frontend_node/constants.py +0 -65
- langflow/template/frontend_node/custom_components.py +0 -97
- langflow/template/template/__init__.py +0 -0
- langflow/template/template/base.py +0 -99
- langflow/utils/async_helpers.py +0 -42
- langflow/utils/concurrency.py +0 -60
- langflow/utils/util_strings.py +0 -56
- langflow_base_nightly-0.5.1.dev3.dist-info/RECORD +0 -1159
- {langflow_base_nightly-0.5.1.dev3.dist-info → langflow_base_nightly-0.5.1.dev4.dist-info}/WHEEL +0 -0
- {langflow_base_nightly-0.5.1.dev3.dist-info → langflow_base_nightly-0.5.1.dev4.dist-info}/entry_points.txt +0 -0
langflow/components/zep/zep.py
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
from langflow.base.memory.model import LCChatMemoryComponent
|
|
2
|
-
from langflow.field_typing.constants import Memory
|
|
3
|
-
from langflow.inputs.inputs import DropdownInput, MessageTextInput, SecretStrInput
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class ZepChatMemory(LCChatMemoryComponent):
|
|
7
|
-
display_name = "Zep Chat Memory"
|
|
8
|
-
description = "Retrieves and store chat messages from Zep."
|
|
9
|
-
name = "ZepChatMemory"
|
|
10
|
-
icon = "ZepMemory"
|
|
11
|
-
legacy = True
|
|
12
|
-
|
|
13
|
-
inputs = [
|
|
14
|
-
MessageTextInput(name="url", display_name="Zep URL", info="URL of the Zep instance."),
|
|
15
|
-
SecretStrInput(name="api_key", display_name="API Key", info="API Key for the Zep instance."),
|
|
16
|
-
DropdownInput(
|
|
17
|
-
name="api_base_path",
|
|
18
|
-
display_name="API Base Path",
|
|
19
|
-
options=["api/v1", "api/v2"],
|
|
20
|
-
value="api/v1",
|
|
21
|
-
advanced=True,
|
|
22
|
-
),
|
|
23
|
-
MessageTextInput(
|
|
24
|
-
name="session_id", display_name="Session ID", info="Session ID for the message.", advanced=True
|
|
25
|
-
),
|
|
26
|
-
]
|
|
27
|
-
|
|
28
|
-
def build_message_history(self) -> Memory:
|
|
29
|
-
try:
|
|
30
|
-
# Monkeypatch API_BASE_PATH to
|
|
31
|
-
# avoid 404
|
|
32
|
-
# This is a workaround for the local Zep instance
|
|
33
|
-
# cloud Zep works with v2
|
|
34
|
-
import zep_python.zep_client
|
|
35
|
-
from zep_python import ZepClient
|
|
36
|
-
from zep_python.langchain import ZepChatMessageHistory
|
|
37
|
-
|
|
38
|
-
zep_python.zep_client.API_BASE_PATH = self.api_base_path
|
|
39
|
-
except ImportError as e:
|
|
40
|
-
msg = "Could not import zep-python package. Please install it with `pip install zep-python`."
|
|
41
|
-
raise ImportError(msg) from e
|
|
42
|
-
|
|
43
|
-
zep_client = ZepClient(api_url=self.url, api_key=self.api_key)
|
|
44
|
-
return ZepChatMessageHistory(session_id=self.session_id, zep_client=zep_client)
|
langflow/custom/attributes.py
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
from collections.abc import Callable
|
|
2
|
-
|
|
3
|
-
import emoji
|
|
4
|
-
|
|
5
|
-
from langflow.logging.logger import logger
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def validate_icon(value: str):
|
|
9
|
-
# we are going to use the emoji library to validate the emoji
|
|
10
|
-
# emojis can be defined using the :emoji_name: syntax
|
|
11
|
-
|
|
12
|
-
if not value.startswith(":") and not value.endswith(":"):
|
|
13
|
-
return value
|
|
14
|
-
if not value.startswith(":") or not value.endswith(":"):
|
|
15
|
-
# emoji should have both starting and ending colons
|
|
16
|
-
# so if one of them is missing, we will raise
|
|
17
|
-
msg = f"Invalid emoji. {value} is not a valid emoji."
|
|
18
|
-
raise ValueError(msg)
|
|
19
|
-
|
|
20
|
-
emoji_value = emoji.emojize(value, variant="emoji_type")
|
|
21
|
-
if value == emoji_value:
|
|
22
|
-
logger.warning(f"Invalid emoji. {value} is not a valid emoji.")
|
|
23
|
-
return value
|
|
24
|
-
return emoji_value
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def getattr_return_str(value):
|
|
28
|
-
return str(value) if value else ""
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def getattr_return_bool(value):
|
|
32
|
-
if isinstance(value, bool):
|
|
33
|
-
return value
|
|
34
|
-
return None
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def getattr_return_int(value):
|
|
38
|
-
if isinstance(value, int):
|
|
39
|
-
return value
|
|
40
|
-
return None
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def getattr_return_list_of_str(value):
|
|
44
|
-
if isinstance(value, list):
|
|
45
|
-
return [str(val) for val in value]
|
|
46
|
-
return []
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def getattr_return_list_of_object(value):
|
|
50
|
-
if isinstance(value, list):
|
|
51
|
-
return value
|
|
52
|
-
return []
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
def getattr_return_list_of_values_from_dict(value):
|
|
56
|
-
if isinstance(value, dict):
|
|
57
|
-
return list(value.values())
|
|
58
|
-
return []
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def getattr_return_dict(value):
|
|
62
|
-
if isinstance(value, dict):
|
|
63
|
-
return value
|
|
64
|
-
return {}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
ATTR_FUNC_MAPPING: dict[str, Callable] = {
|
|
68
|
-
"display_name": getattr_return_str,
|
|
69
|
-
"description": getattr_return_str,
|
|
70
|
-
"beta": getattr_return_bool,
|
|
71
|
-
"legacy": getattr_return_bool,
|
|
72
|
-
"documentation": getattr_return_str,
|
|
73
|
-
"priority": getattr_return_int,
|
|
74
|
-
"icon": validate_icon,
|
|
75
|
-
"minimized": getattr_return_bool,
|
|
76
|
-
"frozen": getattr_return_bool,
|
|
77
|
-
"is_input": getattr_return_bool,
|
|
78
|
-
"is_output": getattr_return_bool,
|
|
79
|
-
"conditional_paths": getattr_return_list_of_str,
|
|
80
|
-
"_outputs_map": getattr_return_list_of_values_from_dict,
|
|
81
|
-
"_inputs": getattr_return_list_of_values_from_dict,
|
|
82
|
-
"outputs": getattr_return_list_of_object,
|
|
83
|
-
"inputs": getattr_return_list_of_object,
|
|
84
|
-
"metadata": getattr_return_dict,
|
|
85
|
-
"tool_mode": getattr_return_bool,
|
|
86
|
-
}
|
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
import ast
|
|
2
|
-
import contextlib
|
|
3
|
-
import inspect
|
|
4
|
-
import traceback
|
|
5
|
-
from itertools import starmap
|
|
6
|
-
from pathlib import Path
|
|
7
|
-
from typing import Any
|
|
8
|
-
|
|
9
|
-
from cachetools import TTLCache, keys
|
|
10
|
-
from fastapi import HTTPException
|
|
11
|
-
|
|
12
|
-
from langflow.custom.eval import eval_custom_component_code
|
|
13
|
-
from langflow.custom.schema import CallableCodeDetails, ClassCodeDetails, MissingDefault
|
|
14
|
-
from langflow.logging.logger import logger
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class CodeSyntaxError(HTTPException):
|
|
18
|
-
pass
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def get_data_type():
|
|
22
|
-
from langflow.field_typing import Data
|
|
23
|
-
|
|
24
|
-
return Data
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def find_class_ast_node(class_obj):
|
|
28
|
-
"""Finds the AST node corresponding to the given class object."""
|
|
29
|
-
# Get the source file where the class is defined
|
|
30
|
-
source_file = inspect.getsourcefile(class_obj)
|
|
31
|
-
if not source_file:
|
|
32
|
-
return None, []
|
|
33
|
-
|
|
34
|
-
# Read the source code from the file
|
|
35
|
-
source_code = Path(source_file).read_text(encoding="utf-8")
|
|
36
|
-
|
|
37
|
-
# Parse the source code into an AST
|
|
38
|
-
tree = ast.parse(source_code)
|
|
39
|
-
|
|
40
|
-
# Search for the class definition node in the AST
|
|
41
|
-
class_node = None
|
|
42
|
-
import_nodes = []
|
|
43
|
-
for node in ast.walk(tree):
|
|
44
|
-
if isinstance(node, ast.ClassDef) and node.name == class_obj.__name__:
|
|
45
|
-
class_node = node
|
|
46
|
-
elif isinstance(node, ast.Import | ast.ImportFrom):
|
|
47
|
-
import_nodes.append(node)
|
|
48
|
-
|
|
49
|
-
return class_node, import_nodes
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def imports_key(*args, **kwargs):
|
|
53
|
-
imports = kwargs.pop("imports")
|
|
54
|
-
key = keys.methodkey(*args, **kwargs)
|
|
55
|
-
key += tuple(imports)
|
|
56
|
-
return key
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
class CodeParser:
|
|
60
|
-
"""A parser for Python source code, extracting code details."""
|
|
61
|
-
|
|
62
|
-
def __init__(self, code: str | type) -> None:
|
|
63
|
-
"""Initializes the parser with the provided code."""
|
|
64
|
-
self.cache: TTLCache = TTLCache(maxsize=1024, ttl=60)
|
|
65
|
-
if isinstance(code, type):
|
|
66
|
-
if not inspect.isclass(code):
|
|
67
|
-
msg = "The provided code must be a class."
|
|
68
|
-
raise ValueError(msg)
|
|
69
|
-
# If the code is a class, get its source code
|
|
70
|
-
code = inspect.getsource(code)
|
|
71
|
-
self.code = code
|
|
72
|
-
self.data: dict[str, Any] = {
|
|
73
|
-
"imports": [],
|
|
74
|
-
"functions": [],
|
|
75
|
-
"classes": [],
|
|
76
|
-
"global_vars": [],
|
|
77
|
-
}
|
|
78
|
-
self.handlers = {
|
|
79
|
-
ast.Import: self.parse_imports,
|
|
80
|
-
ast.ImportFrom: self.parse_imports,
|
|
81
|
-
ast.FunctionDef: self.parse_functions,
|
|
82
|
-
ast.ClassDef: self.parse_classes,
|
|
83
|
-
ast.Assign: self.parse_global_vars,
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
def get_tree(self):
|
|
87
|
-
"""Parses the provided code to validate its syntax.
|
|
88
|
-
|
|
89
|
-
It tries to parse the code into an abstract syntax tree (AST).
|
|
90
|
-
"""
|
|
91
|
-
try:
|
|
92
|
-
tree = ast.parse(self.code)
|
|
93
|
-
except SyntaxError as err:
|
|
94
|
-
raise CodeSyntaxError(
|
|
95
|
-
status_code=400,
|
|
96
|
-
detail={"error": err.msg, "traceback": traceback.format_exc()},
|
|
97
|
-
) from err
|
|
98
|
-
|
|
99
|
-
return tree
|
|
100
|
-
|
|
101
|
-
def parse_node(self, node: ast.stmt | ast.AST) -> None:
|
|
102
|
-
"""Parses an AST node and updates the data dictionary with the relevant information."""
|
|
103
|
-
if handler := self.handlers.get(type(node)):
|
|
104
|
-
handler(node) # type: ignore[operator]
|
|
105
|
-
|
|
106
|
-
def parse_imports(self, node: ast.Import | ast.ImportFrom) -> None:
|
|
107
|
-
"""Extracts "imports" from the code, including aliases."""
|
|
108
|
-
if isinstance(node, ast.Import):
|
|
109
|
-
for alias in node.names:
|
|
110
|
-
if alias.asname:
|
|
111
|
-
self.data["imports"].append(f"{alias.name} as {alias.asname}")
|
|
112
|
-
else:
|
|
113
|
-
self.data["imports"].append(alias.name)
|
|
114
|
-
elif isinstance(node, ast.ImportFrom):
|
|
115
|
-
for alias in node.names:
|
|
116
|
-
if alias.asname:
|
|
117
|
-
self.data["imports"].append((node.module, f"{alias.name} as {alias.asname}"))
|
|
118
|
-
else:
|
|
119
|
-
self.data["imports"].append((node.module, alias.name))
|
|
120
|
-
|
|
121
|
-
def parse_functions(self, node: ast.FunctionDef) -> None:
|
|
122
|
-
"""Extracts "functions" from the code."""
|
|
123
|
-
self.data["functions"].append(self.parse_callable_details(node))
|
|
124
|
-
|
|
125
|
-
def parse_arg(self, arg, default):
|
|
126
|
-
"""Parses an argument and its default value."""
|
|
127
|
-
arg_dict = {"name": arg.arg, "default": default}
|
|
128
|
-
if arg.annotation:
|
|
129
|
-
arg_dict["type"] = ast.unparse(arg.annotation)
|
|
130
|
-
return arg_dict
|
|
131
|
-
|
|
132
|
-
# @cachedmethod(operator.attrgetter("cache"))
|
|
133
|
-
def construct_eval_env(self, return_type_str: str, imports) -> dict:
|
|
134
|
-
"""Constructs an evaluation environment.
|
|
135
|
-
|
|
136
|
-
Constructs an evaluation environment with the necessary imports for the return type,
|
|
137
|
-
taking into account module aliases.
|
|
138
|
-
"""
|
|
139
|
-
eval_env: dict = {}
|
|
140
|
-
for import_entry in imports:
|
|
141
|
-
if isinstance(import_entry, tuple): # from module import name
|
|
142
|
-
module, name = import_entry
|
|
143
|
-
if name in return_type_str:
|
|
144
|
-
exec(f"import {module}", eval_env)
|
|
145
|
-
exec(f"from {module} import {name}", eval_env)
|
|
146
|
-
else: # import module
|
|
147
|
-
module = import_entry
|
|
148
|
-
alias = None
|
|
149
|
-
if " as " in module:
|
|
150
|
-
module, alias = module.split(" as ")
|
|
151
|
-
if module in return_type_str or (alias and alias in return_type_str):
|
|
152
|
-
exec(f"import {module} as {alias or module}", eval_env)
|
|
153
|
-
return eval_env
|
|
154
|
-
|
|
155
|
-
def parse_callable_details(self, node: ast.FunctionDef) -> dict[str, Any]:
|
|
156
|
-
"""Extracts details from a single function or method node."""
|
|
157
|
-
return_type = None
|
|
158
|
-
if node.returns:
|
|
159
|
-
return_type_str = ast.unparse(node.returns)
|
|
160
|
-
eval_env = self.construct_eval_env(return_type_str, tuple(self.data["imports"]))
|
|
161
|
-
|
|
162
|
-
# Handle cases where the type is not found in the constructed environment
|
|
163
|
-
with contextlib.suppress(NameError):
|
|
164
|
-
return_type = eval(return_type_str, eval_env) # noqa: S307
|
|
165
|
-
|
|
166
|
-
func = CallableCodeDetails(
|
|
167
|
-
name=node.name,
|
|
168
|
-
doc=ast.get_docstring(node),
|
|
169
|
-
args=self.parse_function_args(node),
|
|
170
|
-
body=self.parse_function_body(node),
|
|
171
|
-
return_type=return_type,
|
|
172
|
-
has_return=self.parse_return_statement(node),
|
|
173
|
-
)
|
|
174
|
-
|
|
175
|
-
return func.model_dump()
|
|
176
|
-
|
|
177
|
-
def parse_function_args(self, node: ast.FunctionDef) -> list[dict[str, Any]]:
|
|
178
|
-
"""Parses the arguments of a function or method node."""
|
|
179
|
-
args = []
|
|
180
|
-
|
|
181
|
-
args += self.parse_positional_args(node)
|
|
182
|
-
args += self.parse_varargs(node)
|
|
183
|
-
args += self.parse_keyword_args(node)
|
|
184
|
-
# Commented out because we don't want kwargs
|
|
185
|
-
# showing up as fields in the frontend
|
|
186
|
-
args += self.parse_kwargs(node)
|
|
187
|
-
|
|
188
|
-
return args
|
|
189
|
-
|
|
190
|
-
def parse_positional_args(self, node: ast.FunctionDef) -> list[dict[str, Any]]:
|
|
191
|
-
"""Parses the positional arguments of a function or method node."""
|
|
192
|
-
num_args = len(node.args.args)
|
|
193
|
-
num_defaults = len(node.args.defaults)
|
|
194
|
-
num_missing_defaults = num_args - num_defaults
|
|
195
|
-
missing_defaults = [MissingDefault()] * num_missing_defaults
|
|
196
|
-
default_values = [ast.unparse(default).strip("'") if default else None for default in node.args.defaults]
|
|
197
|
-
# Now check all default values to see if there
|
|
198
|
-
# are any "None" values in the middle
|
|
199
|
-
default_values = [None if value == "None" else value for value in default_values]
|
|
200
|
-
|
|
201
|
-
defaults = missing_defaults + default_values
|
|
202
|
-
|
|
203
|
-
return list(starmap(self.parse_arg, zip(node.args.args, defaults, strict=True)))
|
|
204
|
-
|
|
205
|
-
def parse_varargs(self, node: ast.FunctionDef) -> list[dict[str, Any]]:
|
|
206
|
-
"""Parses the *args argument of a function or method node."""
|
|
207
|
-
args = []
|
|
208
|
-
|
|
209
|
-
if node.args.vararg:
|
|
210
|
-
args.append(self.parse_arg(node.args.vararg, None))
|
|
211
|
-
|
|
212
|
-
return args
|
|
213
|
-
|
|
214
|
-
def parse_keyword_args(self, node: ast.FunctionDef) -> list[dict[str, Any]]:
|
|
215
|
-
"""Parses the keyword-only arguments of a function or method node."""
|
|
216
|
-
kw_defaults = [None] * (len(node.args.kwonlyargs) - len(node.args.kw_defaults)) + [
|
|
217
|
-
ast.unparse(default) if default else None for default in node.args.kw_defaults
|
|
218
|
-
]
|
|
219
|
-
|
|
220
|
-
return list(starmap(self.parse_arg, zip(node.args.kwonlyargs, kw_defaults, strict=True)))
|
|
221
|
-
|
|
222
|
-
def parse_kwargs(self, node: ast.FunctionDef) -> list[dict[str, Any]]:
|
|
223
|
-
"""Parses the **kwargs argument of a function or method node."""
|
|
224
|
-
args = []
|
|
225
|
-
|
|
226
|
-
if node.args.kwarg:
|
|
227
|
-
args.append(self.parse_arg(node.args.kwarg, None))
|
|
228
|
-
|
|
229
|
-
return args
|
|
230
|
-
|
|
231
|
-
def parse_function_body(self, node: ast.FunctionDef) -> list[str]:
|
|
232
|
-
"""Parses the body of a function or method node."""
|
|
233
|
-
return [ast.unparse(line) for line in node.body]
|
|
234
|
-
|
|
235
|
-
def parse_return_statement(self, node: ast.FunctionDef) -> bool:
|
|
236
|
-
"""Parses the return statement of a function or method node, including nested returns."""
|
|
237
|
-
|
|
238
|
-
def has_return(node):
|
|
239
|
-
if isinstance(node, ast.Return):
|
|
240
|
-
return True
|
|
241
|
-
if isinstance(node, ast.If):
|
|
242
|
-
return any(has_return(child) for child in node.body) or any(has_return(child) for child in node.orelse)
|
|
243
|
-
if isinstance(node, ast.Try):
|
|
244
|
-
return (
|
|
245
|
-
any(has_return(child) for child in node.body)
|
|
246
|
-
or any(has_return(child) for child in node.handlers)
|
|
247
|
-
or any(has_return(child) for child in node.finalbody)
|
|
248
|
-
)
|
|
249
|
-
if isinstance(node, ast.For | ast.While):
|
|
250
|
-
return any(has_return(child) for child in node.body) or any(has_return(child) for child in node.orelse)
|
|
251
|
-
if isinstance(node, ast.With):
|
|
252
|
-
return any(has_return(child) for child in node.body)
|
|
253
|
-
return False
|
|
254
|
-
|
|
255
|
-
return any(has_return(child) for child in node.body)
|
|
256
|
-
|
|
257
|
-
def parse_assign(self, stmt):
|
|
258
|
-
"""Parses an Assign statement and returns a dictionary with the target's name and value."""
|
|
259
|
-
for target in stmt.targets:
|
|
260
|
-
if isinstance(target, ast.Name):
|
|
261
|
-
return {"name": target.id, "value": ast.unparse(stmt.value)}
|
|
262
|
-
return None
|
|
263
|
-
|
|
264
|
-
def parse_ann_assign(self, stmt):
|
|
265
|
-
"""Parses an AnnAssign statement and returns a dictionary with the target's name, value, and annotation."""
|
|
266
|
-
if isinstance(stmt.target, ast.Name):
|
|
267
|
-
return {
|
|
268
|
-
"name": stmt.target.id,
|
|
269
|
-
"value": ast.unparse(stmt.value) if stmt.value else None,
|
|
270
|
-
"annotation": ast.unparse(stmt.annotation),
|
|
271
|
-
}
|
|
272
|
-
return None
|
|
273
|
-
|
|
274
|
-
def parse_function_def(self, stmt):
|
|
275
|
-
"""Parse a FunctionDef statement.
|
|
276
|
-
|
|
277
|
-
Parse a FunctionDef statement and return the parsed method and a boolean indicating if it's an __init__ method.
|
|
278
|
-
"""
|
|
279
|
-
method = self.parse_callable_details(stmt)
|
|
280
|
-
return (method, True) if stmt.name == "__init__" else (method, False)
|
|
281
|
-
|
|
282
|
-
def get_base_classes(self):
|
|
283
|
-
"""Returns the base classes of the custom component class."""
|
|
284
|
-
try:
|
|
285
|
-
bases = self.execute_and_inspect_classes(self.code)
|
|
286
|
-
except Exception:
|
|
287
|
-
# If the code cannot be executed, return an empty list
|
|
288
|
-
bases = []
|
|
289
|
-
raise
|
|
290
|
-
return bases
|
|
291
|
-
|
|
292
|
-
def parse_classes(self, node: ast.ClassDef) -> None:
|
|
293
|
-
"""Extracts "classes" from the code, including inheritance and init methods."""
|
|
294
|
-
bases = self.get_base_classes()
|
|
295
|
-
nodes = []
|
|
296
|
-
for base in bases:
|
|
297
|
-
if base.__name__ == node.name or base.__name__ in {"CustomComponent", "Component", "BaseComponent"}:
|
|
298
|
-
continue
|
|
299
|
-
try:
|
|
300
|
-
class_node, import_nodes = find_class_ast_node(base)
|
|
301
|
-
if class_node is None:
|
|
302
|
-
continue
|
|
303
|
-
for import_node in import_nodes:
|
|
304
|
-
self.parse_imports(import_node)
|
|
305
|
-
nodes.append(class_node)
|
|
306
|
-
except Exception: # noqa: BLE001
|
|
307
|
-
logger.exception("Error finding base class node")
|
|
308
|
-
nodes.insert(0, node)
|
|
309
|
-
class_details = ClassCodeDetails(
|
|
310
|
-
name=node.name,
|
|
311
|
-
doc=ast.get_docstring(node),
|
|
312
|
-
bases=[b.__name__ for b in bases],
|
|
313
|
-
attributes=[],
|
|
314
|
-
methods=[],
|
|
315
|
-
init=None,
|
|
316
|
-
)
|
|
317
|
-
for _node in nodes:
|
|
318
|
-
self.process_class_node(_node, class_details)
|
|
319
|
-
self.data["classes"].append(class_details.model_dump())
|
|
320
|
-
|
|
321
|
-
def process_class_node(self, node, class_details) -> None:
|
|
322
|
-
for stmt in node.body:
|
|
323
|
-
if isinstance(stmt, ast.Assign):
|
|
324
|
-
if attr := self.parse_assign(stmt):
|
|
325
|
-
class_details.attributes.append(attr)
|
|
326
|
-
elif isinstance(stmt, ast.AnnAssign):
|
|
327
|
-
if attr := self.parse_ann_assign(stmt):
|
|
328
|
-
class_details.attributes.append(attr)
|
|
329
|
-
elif isinstance(stmt, ast.FunctionDef | ast.AsyncFunctionDef):
|
|
330
|
-
method, is_init = self.parse_function_def(stmt)
|
|
331
|
-
if is_init:
|
|
332
|
-
class_details.init = method
|
|
333
|
-
else:
|
|
334
|
-
class_details.methods.append(method)
|
|
335
|
-
|
|
336
|
-
def parse_global_vars(self, node: ast.Assign) -> None:
|
|
337
|
-
"""Extracts global variables from the code."""
|
|
338
|
-
global_var = {
|
|
339
|
-
"targets": [t.id if hasattr(t, "id") else ast.dump(t) for t in node.targets],
|
|
340
|
-
"value": ast.unparse(node.value),
|
|
341
|
-
}
|
|
342
|
-
self.data["global_vars"].append(global_var)
|
|
343
|
-
|
|
344
|
-
def execute_and_inspect_classes(self, code: str):
|
|
345
|
-
custom_component_class = eval_custom_component_code(code)
|
|
346
|
-
custom_component = custom_component_class(_code=code)
|
|
347
|
-
dunder_class = custom_component.__class__
|
|
348
|
-
# Get the base classes at two levels of inheritance
|
|
349
|
-
bases = []
|
|
350
|
-
for base in dunder_class.__bases__:
|
|
351
|
-
bases.append(base)
|
|
352
|
-
bases.extend(base.__bases__)
|
|
353
|
-
return bases
|
|
354
|
-
|
|
355
|
-
def parse_code(self) -> dict[str, Any]:
|
|
356
|
-
"""Runs all parsing operations and returns the resulting data."""
|
|
357
|
-
tree = self.get_tree()
|
|
358
|
-
|
|
359
|
-
for node in ast.walk(tree):
|
|
360
|
-
self.parse_node(node)
|
|
361
|
-
return self.data
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import copy
|
|
2
|
-
import operator
|
|
3
|
-
import re
|
|
4
|
-
from typing import TYPE_CHECKING, Any, ClassVar
|
|
5
|
-
|
|
6
|
-
from cachetools import TTLCache, cachedmethod
|
|
7
|
-
from fastapi import HTTPException
|
|
8
|
-
|
|
9
|
-
from langflow.custom.attributes import ATTR_FUNC_MAPPING
|
|
10
|
-
from langflow.custom.code_parser.code_parser import CodeParser
|
|
11
|
-
from langflow.custom.eval import eval_custom_component_code
|
|
12
|
-
from langflow.logging.logger import logger
|
|
13
|
-
from langflow.utils import validate
|
|
14
|
-
|
|
15
|
-
if TYPE_CHECKING:
|
|
16
|
-
from uuid import UUID
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class ComponentCodeNullError(HTTPException):
|
|
20
|
-
pass
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class ComponentFunctionEntrypointNameNullError(HTTPException):
|
|
24
|
-
pass
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class BaseComponent:
|
|
28
|
-
ERROR_CODE_NULL: ClassVar[str] = "Python code must be provided."
|
|
29
|
-
ERROR_FUNCTION_ENTRYPOINT_NAME_NULL: ClassVar[str] = "The name of the entrypoint function must be provided."
|
|
30
|
-
|
|
31
|
-
def __init__(self, **data) -> None:
|
|
32
|
-
self._code: str | None = None
|
|
33
|
-
self._function_entrypoint_name: str = "build"
|
|
34
|
-
self.field_config: dict = {}
|
|
35
|
-
self._user_id: str | UUID | None = None
|
|
36
|
-
self._template_config: dict = {}
|
|
37
|
-
|
|
38
|
-
self.cache: TTLCache = TTLCache(maxsize=1024, ttl=60)
|
|
39
|
-
|
|
40
|
-
for key, value in data.items():
|
|
41
|
-
if key == "user_id":
|
|
42
|
-
self._user_id = value
|
|
43
|
-
else:
|
|
44
|
-
setattr(self, key, value)
|
|
45
|
-
|
|
46
|
-
def __setattr__(self, key, value) -> None:
|
|
47
|
-
if key == "_user_id":
|
|
48
|
-
try:
|
|
49
|
-
if self._user_id is not None:
|
|
50
|
-
logger.warning("user_id is immutable and cannot be changed.")
|
|
51
|
-
except (KeyError, AttributeError):
|
|
52
|
-
pass
|
|
53
|
-
super().__setattr__(key, value)
|
|
54
|
-
|
|
55
|
-
@cachedmethod(cache=operator.attrgetter("cache"))
|
|
56
|
-
def get_code_tree(self, code: str):
|
|
57
|
-
parser = CodeParser(code)
|
|
58
|
-
return parser.parse_code()
|
|
59
|
-
|
|
60
|
-
def get_function(self):
|
|
61
|
-
if not self._code:
|
|
62
|
-
raise ComponentCodeNullError(
|
|
63
|
-
status_code=400,
|
|
64
|
-
detail={"error": self.ERROR_CODE_NULL, "traceback": ""},
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
if not self._function_entrypoint_name:
|
|
68
|
-
raise ComponentFunctionEntrypointNameNullError(
|
|
69
|
-
status_code=400,
|
|
70
|
-
detail={
|
|
71
|
-
"error": self.ERROR_FUNCTION_ENTRYPOINT_NAME_NULL,
|
|
72
|
-
"traceback": "",
|
|
73
|
-
},
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
return validate.create_function(self._code, self._function_entrypoint_name)
|
|
77
|
-
|
|
78
|
-
@staticmethod
|
|
79
|
-
def get_template_config(component):
|
|
80
|
-
"""Gets the template configuration for the custom component itself."""
|
|
81
|
-
template_config = {}
|
|
82
|
-
|
|
83
|
-
for attribute, func in ATTR_FUNC_MAPPING.items():
|
|
84
|
-
if hasattr(component, attribute):
|
|
85
|
-
value = getattr(component, attribute)
|
|
86
|
-
if value is not None:
|
|
87
|
-
value_copy = copy.deepcopy(value)
|
|
88
|
-
template_config[attribute] = func(value=value_copy)
|
|
89
|
-
|
|
90
|
-
for key in template_config.copy():
|
|
91
|
-
if key not in ATTR_FUNC_MAPPING:
|
|
92
|
-
template_config.pop(key, None)
|
|
93
|
-
|
|
94
|
-
return template_config
|
|
95
|
-
|
|
96
|
-
def build_template_config(self) -> dict:
|
|
97
|
-
"""Builds the template configuration for the custom component.
|
|
98
|
-
|
|
99
|
-
Returns:
|
|
100
|
-
A dictionary representing the template configuration.
|
|
101
|
-
"""
|
|
102
|
-
if not self._code:
|
|
103
|
-
return {}
|
|
104
|
-
|
|
105
|
-
try:
|
|
106
|
-
cc_class = eval_custom_component_code(self._code)
|
|
107
|
-
|
|
108
|
-
except AttributeError as e:
|
|
109
|
-
pattern = r"module '.*?' has no attribute '.*?'"
|
|
110
|
-
if re.search(pattern, str(e)):
|
|
111
|
-
raise ImportError(e) from e
|
|
112
|
-
raise
|
|
113
|
-
|
|
114
|
-
component_instance = cc_class(_code=self._code)
|
|
115
|
-
return self.get_template_config(component_instance)
|
|
116
|
-
|
|
117
|
-
def build(self, *args: Any, **kwargs: Any) -> Any:
|
|
118
|
-
raise NotImplementedError
|