langflow-base-nightly 0.5.1.dev2__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.
Files changed (935) hide show
  1. langflow/__init__.py +215 -0
  2. langflow/__main__.py +16 -2
  3. langflow/alembic/versions/006b3990db50_add_unique_constraints.py +4 -7
  4. langflow/alembic/versions/012fb73ac359_add_folder_table.py +4 -5
  5. langflow/alembic/versions/0ae3a2674f32_update_the_columns_that_need_to_change_.py +11 -20
  6. langflow/alembic/versions/0b8757876a7c_.py +4 -7
  7. langflow/alembic/versions/0d60fcbd4e8e_create_vertex_builds_table.py +4 -6
  8. langflow/alembic/versions/1a110b568907_replace_credential_table_with_variable.py +4 -5
  9. langflow/alembic/versions/1b8b740a6fa3_remove_fk_constraint_in_message_.py +32 -27
  10. langflow/alembic/versions/1c79524817ed_add_unique_constraints_per_user_in_.py +4 -5
  11. langflow/alembic/versions/1d90f8a0efe1_update_description_columns_type.py +4 -5
  12. langflow/alembic/versions/1eab2c3eb45e_event_error.py +14 -15
  13. langflow/alembic/versions/1ef9c4f3765d_.py +5 -10
  14. langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py +4 -5
  15. langflow/alembic/versions/260dbcc8b680_adds_tables.py +4 -5
  16. langflow/alembic/versions/29fe8f1f806b_add_missing_index.py +4 -5
  17. langflow/alembic/versions/2ac71eb9c3ae_adds_credential_table.py +4 -7
  18. langflow/alembic/versions/3bb0ddf32dfb_add_unique_constraints_per_user_in_flow_.py +4 -5
  19. langflow/alembic/versions/4e5980a44eaa_fix_date_times_again.py +1 -2
  20. langflow/alembic/versions/58b28437a398_modify_nullable.py +1 -2
  21. langflow/alembic/versions/5ace73a7f223_new_remove_table_upgrade_op.py +6 -12
  22. langflow/alembic/versions/631faacf5da2_add_webhook_columns.py +4 -5
  23. langflow/alembic/versions/63b9c451fd30_add_icon_and_icon_bg_color_to_flow.py +4 -5
  24. langflow/alembic/versions/66f72f04a1de_add_mcp_support_with_project_settings_.py +21 -23
  25. langflow/alembic/versions/67cc006d50bf_add_profile_image_column.py +4 -5
  26. langflow/alembic/versions/6e7b581b5648_fix_nullable.py +4 -5
  27. langflow/alembic/versions/7843803a87b5_store_updates.py +4 -6
  28. langflow/alembic/versions/79e675cb6752_change_datetime_type.py +1 -2
  29. langflow/alembic/versions/7d2162acc8b2_adds_updated_at_and_folder_cols.py +4 -10
  30. langflow/alembic/versions/90be8e2ed91e_create_transactions_table.py +4 -6
  31. langflow/alembic/versions/93e2705fa8d6_add_column_save_path_to_flow.py +7 -9
  32. langflow/alembic/versions/a72f5cf9c2f9_add_endpoint_name_col.py +4 -5
  33. langflow/alembic/versions/b2fa308044b5_add_unique_constraints.py +1 -2
  34. langflow/alembic/versions/bc2f01c40e4a_new_fixes.py +4 -5
  35. langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py +4 -5
  36. langflow/alembic/versions/d066bfd22890_add_message_table.py +4 -4
  37. langflow/alembic/versions/d2d475a1f7c0_add_tags_column_to_flow.py +12 -13
  38. langflow/alembic/versions/d3dbf656a499_add_gradient_column_in_flow.py +12 -12
  39. langflow/alembic/versions/d9a6ea21edcd_rename_default_folder.py +7 -10
  40. langflow/alembic/versions/dd9e0804ebd1_add_v2_file_table.py +8 -7
  41. langflow/alembic/versions/e3162c1804e6_add_persistent_locked_state.py +10 -10
  42. langflow/alembic/versions/e3bc869fa272_fix_nullable.py +4 -5
  43. langflow/alembic/versions/e56d87f8994a_add_optins_column_to_user.py +13 -14
  44. langflow/alembic/versions/e5a65ecff2cd_nullable_in_vertex_build.py +4 -5
  45. langflow/alembic/versions/eb5866d51fd2_change_columns_to_be_nullable.py +4 -5
  46. langflow/alembic/versions/eb5e72293a8e_add_error_and_edit_flags_to_message.py +4 -5
  47. langflow/alembic/versions/f3b2d1f1002d_add_column_access_type_to_flow.py +19 -15
  48. langflow/alembic/versions/f5ee9749d1a6_user_id_can_be_null_in_flow.py +4 -6
  49. langflow/alembic/versions/fd531f8868b1_fix_credential_table.py +5 -8
  50. langflow/api/build.py +5 -4
  51. langflow/api/health_check_router.py +1 -1
  52. langflow/api/limited_background_tasks.py +1 -1
  53. langflow/api/log_router.py +1 -2
  54. langflow/api/utils.py +2 -2
  55. langflow/api/v1/base.py +1 -2
  56. langflow/api/v1/callback.py +4 -9
  57. langflow/api/v1/chat.py +6 -7
  58. langflow/api/v1/endpoints.py +15 -15
  59. langflow/api/v1/files.py +1 -1
  60. langflow/api/v1/flows.py +1 -1
  61. langflow/api/v1/knowledge_bases.py +1 -1
  62. langflow/api/v1/mcp.py +1 -1
  63. langflow/api/v1/mcp_projects.py +14 -5
  64. langflow/api/v1/mcp_utils.py +3 -3
  65. langflow/api/v1/openai_responses.py +4 -4
  66. langflow/api/v1/schemas.py +3 -38
  67. langflow/api/v1/starter_projects.py +61 -3
  68. langflow/api/v1/store.py +1 -1
  69. langflow/api/v1/validate.py +3 -3
  70. langflow/api/v1/voice_mode.py +2 -2
  71. langflow/api/v2/files.py +1 -1
  72. langflow/api/v2/mcp.py +2 -2
  73. langflow/base/__init__.py +11 -0
  74. langflow/base/agents/__init__.py +3 -0
  75. langflow/base/data/__init__.py +2 -4
  76. langflow/base/data/utils.py +2 -197
  77. langflow/base/embeddings/__init__.py +3 -0
  78. langflow/base/io/__init__.py +7 -0
  79. langflow/base/io/chat.py +5 -18
  80. langflow/base/io/text.py +2 -21
  81. langflow/base/knowledge_bases/__init__.py +3 -0
  82. langflow/base/memory/__init__.py +3 -0
  83. langflow/base/models/__init__.py +2 -2
  84. langflow/base/models/openai_constants.py +6 -120
  85. langflow/base/prompts/__init__.py +3 -0
  86. langflow/base/prompts/api_utils.py +2 -223
  87. langflow/base/textsplitters/__init__.py +3 -0
  88. langflow/base/tools/__init__.py +3 -0
  89. langflow/base/vectorstores/__init__.py +3 -0
  90. langflow/components/__init__.py +7 -259
  91. langflow/components/agents.py +6 -0
  92. langflow/components/anthropic.py +6 -0
  93. langflow/components/data.py +6 -0
  94. langflow/components/helpers.py +6 -0
  95. langflow/components/knowledge_bases/ingestion.py +13 -14
  96. langflow/components/knowledge_bases/retrieval.py +8 -7
  97. langflow/components/openai.py +6 -0
  98. langflow/components/processing/__init__.py +1 -117
  99. langflow/components/processing/converter.py +3 -149
  100. langflow/custom/__init__.py +26 -3
  101. langflow/custom/custom_component/__init__.py +4 -0
  102. langflow/custom/custom_component/component.py +20 -1738
  103. langflow/custom/custom_component/component_with_cache.py +1 -8
  104. langflow/custom/custom_component/custom_component.py +1 -552
  105. langflow/custom/utils.py +1 -872
  106. langflow/custom/validate.py +1 -0
  107. langflow/events/event_manager.py +18 -108
  108. langflow/field_typing/__init__.py +6 -6
  109. langflow/field_typing/constants.py +87 -122
  110. langflow/field_typing/range_spec.py +2 -32
  111. langflow/frontend/assets/{SlackIcon-Cc7Qnzki.js → SlackIcon-v88osOTA.js} +1 -1
  112. langflow/frontend/assets/{Wikipedia-7ulMZY46.js → Wikipedia-DD_S2k00.js} +1 -1
  113. langflow/frontend/assets/{Wolfram-By9PGsHS.js → Wolfram-EO2C5noN.js} +1 -1
  114. langflow/frontend/assets/{index-DVLIDc2_.js → index-1Gv1mfvk.js} +1 -1
  115. langflow/frontend/assets/{index-MVW4HTEk.js → index-7v-bzlzf.js} +1 -1
  116. langflow/frontend/assets/{index-CUzlcce2.js → index-9CbMazbV.js} +1 -1
  117. langflow/frontend/assets/{index-CU16NJD7.js → index-B8ZHP8g2.js} +1 -1
  118. langflow/frontend/assets/{index-v8eXbWlM.js → index-B8y2e6vN.js} +1 -1
  119. langflow/frontend/assets/{index-BX_asvRB.js → index-BBRUGsyr.js} +1 -1
  120. langflow/frontend/assets/{index-9FL5xjkL.js → index-BGwqQwlh.js} +1 -1
  121. langflow/frontend/assets/{index-BAn-AzCS.js → index-BIq-k-FG.js} +1 -1
  122. langflow/frontend/assets/{index-D5c2nNvp.js → index-BSN73YP8.js} +1 -1
  123. langflow/frontend/assets/{index-DMCerPJM.js → index-BU8R8jRn.js} +1 -1
  124. langflow/frontend/assets/{index-CvSoff-8.js → index-BV6yx8ey.js} +1 -1
  125. langflow/frontend/assets/{index-BISPW-f6.js → index-BYIsg-Eh.js} +1 -1
  126. langflow/frontend/assets/{index-GzOGB_fo.js → index-B_ksDBSQ.js} +1 -1
  127. langflow/frontend/assets/{index-BIqEYjNT.js → index-Ba1UOZ9A.js} +1 -1
  128. langflow/frontend/assets/{index-ByxGmq5p.js → index-Ba9tKRQg.js} +1 -1
  129. langflow/frontend/assets/{index-BLEWsL1U.js → index-Bbfaw8ca.js} +1 -1
  130. langflow/frontend/assets/{index-C_MhBX6R.js → index-BbuGqvAx.js} +1 -1
  131. langflow/frontend/assets/{index-RH_I78z_.js → index-BeoXu1YX.js} +1 -1
  132. langflow/frontend/assets/{index-cYFKmtmg.js → index-BfjZmOnH.js} +1 -1
  133. langflow/frontend/assets/{index-Bm9i8F4W.js → index-Bjzy_HZB.js} +1 -1
  134. langflow/frontend/assets/{index-_szO7sta.js → index-BofEkpYB.js} +1 -1
  135. langflow/frontend/assets/{index-DP1oE6QB.js → index-Bp7Mty2H.js} +1 -1
  136. langflow/frontend/assets/{index-CeswGUz3.js → index-BqX1H6yK.js} +1 -1
  137. langflow/frontend/assets/{index-C8pI0lzi.js → index-BqtBAJAN.js} +1 -1
  138. langflow/frontend/assets/{index-BusCv3bR.js → index-Bsfraj7A.js} +1 -1
  139. langflow/frontend/assets/{index-BWnKMRFJ.js → index-BtFl7fER.js} +1 -1
  140. langflow/frontend/assets/{index-DnlVWWU8.js → index-BvX993Sv.js} +1 -1
  141. langflow/frontend/assets/{index-C676MS3I.js → index-BvgQ2vzM.js} +1 -1
  142. langflow/frontend/assets/{index-DJ6HD14g.js → index-BwY98u8n.js} +1 -1
  143. langflow/frontend/assets/{index-C51yNvIL.js → index-C-RIJAOS.js} +1 -1
  144. langflow/frontend/assets/{index-DiblXWmk.js → index-C1K6A38P.js} +1 -1
  145. langflow/frontend/assets/{index-Co__gFM1.js → index-C3Vwhx0t.js} +1 -1
  146. langflow/frontend/assets/{index-Coi86oqP.js → index-C5XUG_gr.js} +1 -1
  147. langflow/frontend/assets/{index-jwzN3Jd_.js → index-C6ouLG9o.js} +1 -1
  148. langflow/frontend/assets/{index-CQQ-4XMS.js → index-C7ZJ_Z6f.js} +1 -1
  149. langflow/frontend/assets/{index-Bl7RpmrB.js → index-CCOGIwGY.js} +1 -1
  150. langflow/frontend/assets/{index-CVkIdc6y.js → index-CCcye2rt.js} +1 -1
  151. langflow/frontend/assets/{index-bMhyLtgS.js → index-CFR4yJQB.js} +1 -1
  152. langflow/frontend/assets/{index-aAgSKWb3.js → index-CIGmPP0H.js} +1 -1
  153. langflow/frontend/assets/{index-BGt6jQ4x.js → index-CJmMEa6d.js} +1 -1
  154. langflow/frontend/assets/{index-DX7JcSMz.js → index-CJxD7lyU.js} +1 -1
  155. langflow/frontend/assets/{index-BZ-A4K98.js → index-CL_vu6ut.js} +1 -1
  156. langflow/frontend/assets/{index-BMpKFGhI.js → index-COf3UnBn.js} +1 -1
  157. langflow/frontend/assets/{index-xN8ogFdo.js → index-CV9650h_.js} +1 -1
  158. langflow/frontend/assets/{index-OsUvqIUr.js → index-CVDzych0.js} +1 -1
  159. langflow/frontend/assets/{index-BH7AyHxp.js → index-CWIHsC4D.js} +1 -1
  160. langflow/frontend/assets/{index-mjwtJmkP.js → index-CXCnFZ0L.js} +1 -1
  161. langflow/frontend/assets/{index-3jlSQi5Y.js → index-Ca_Pw_Dn.js} +1 -1
  162. langflow/frontend/assets/{index-D-SnFlhU.js → index-Cbb3bX9e.js} +1 -1
  163. langflow/frontend/assets/{index--e0oQqZh.js → index-CcJtOz-Z.js} +1 -1
  164. langflow/frontend/assets/{index-S-sc0Cm9.js → index-CfTbTHEv.js} +1 -1
  165. langflow/frontend/assets/{index-Deu8rlaZ.js → index-ChoxDAgX.js} +1 -1
  166. langflow/frontend/assets/{index-lnF9Eqr2.js → index-Cn4gw8aE.js} +1 -1
  167. langflow/frontend/assets/{index-C_NwzK6j.js → index-CnpLg4zX.js} +1 -1
  168. langflow/frontend/assets/{index-DznH7Jbq.js → index-Cpao2omG.js} +1 -1
  169. langflow/frontend/assets/{index-DpWrk8mA.js → index-CqoxM01j.js} +1 -1
  170. langflow/frontend/assets/{index-Bw-TIIC6.js → index-CrHf2Ic1.js} +1 -1
  171. langflow/frontend/assets/{index-DmYLDQag.js → index-CrV0uIjp.js} +1 -1
  172. langflow/frontend/assets/{index-Dp7ZQyL3.js → index-CssADaak.js} +1 -1
  173. langflow/frontend/assets/{index-CNh0rwur.js → index-CtJdNLy9.js} +1 -1
  174. langflow/frontend/assets/{index-Ca1b7Iag.js → index-CyeWD2dh.js} +1 -1
  175. langflow/frontend/assets/{index-DcApTyZ7.js → index-D1xzD7uc.js} +1 -1
  176. langflow/frontend/assets/{index-B3GvPjhD.js → index-D6MuXC4L.js} +1 -1
  177. langflow/frontend/assets/{index-Cw0UComa.js → index-D8w9zvIF.js} +1 -1
  178. langflow/frontend/assets/{index-C-2MRYoJ.js → index-D98Gn0A6.js} +1 -1
  179. langflow/frontend/assets/{index-aWnZIwHd.js → index-DBhjpWkf.js} +1 -1
  180. langflow/frontend/assets/{index-nw3WF9lY.js → index-DCCRJzcY.js} +1 -1
  181. langflow/frontend/assets/{index-RjeC0kaX.js → index-DCTRSkEW.js} +1 -1
  182. langflow/frontend/assets/{index-B_kBTgxV.js → index-DCUfitVj.js} +1 -1
  183. langflow/frontend/assets/{index-ChsGhZn3.js → index-DDdz-Xcl.js} +1 -1
  184. langflow/frontend/assets/{index-7yAHPRxv.js → index-DGdMwZjG.js} +1 -1
  185. langflow/frontend/assets/{index-DjQElpEg.js → index-DGtl2vMw.js} +1 -1
  186. langflow/frontend/assets/{index-BCXhKCOK.js → index-DHVdkrni.js} +1 -1
  187. langflow/frontend/assets/{index-S8uJXTOq.js → index-DJBWwjgl.js} +1 -1
  188. langflow/frontend/assets/{index-qiVTWUuf.js → index-DMAkJ_qX.js} +1 -1
  189. langflow/frontend/assets/{index-D-WStJI6.js → index-DMEvEQI5.js} +1 -1
  190. langflow/frontend/assets/{index-BhqVw9WQ.js → index-DNGRoOsp.js} +1 -1
  191. langflow/frontend/assets/{index-Cu7vC48Y.js → index-DNT_TUTa.js} +1 -1
  192. langflow/frontend/assets/{index-Bhcv5M0n.js → index-DQKOH_9K.js} +1 -1
  193. langflow/frontend/assets/{index-CLcaktde.js → index-DQhqqtqQ.js} +1 -1
  194. langflow/frontend/assets/{index-DZVgPCio.js → index-DRM7KKnG.js} +1 -1
  195. langflow/frontend/assets/{index-uybez8MR.js → index-DSCtl3a5.js} +1 -1
  196. langflow/frontend/assets/{index-CJ5A6STv.js → index-DSLNlm0Z.js} +1 -1
  197. langflow/frontend/assets/{index-Drg8me2a.js → index-DT-PspE-.js} +1 -1
  198. langflow/frontend/assets/{index-DsEZjOcp.js → index-DTpbH-p8.js} +1 -1
  199. langflow/frontend/assets/{index-DrXXKzpD.js → index-DWV6MsIq.js} +1 -1
  200. langflow/frontend/assets/{index-4JIEdyIM.js → index-DWeL4US_.js} +1 -1
  201. langflow/frontend/assets/{index-BlDsBQ_1.js → index-DYKZHhpU.js} +1 -1
  202. langflow/frontend/assets/{index-DFY8YFbC.js → index-DZyQHiMR.js} +1 -1
  203. langflow/frontend/assets/{index-CKPZpkQk.js → index-Dc6qVuSa.js} +1 -1
  204. langflow/frontend/assets/{index-yyAaYjLR.js → index-DkYuicnC.js} +1 -1
  205. langflow/frontend/assets/{index-DmVt5Jlx.js → index-Dlj_2mMs.js} +1 -1
  206. langflow/frontend/assets/{index-BvRIG6P5.js → index-DmGJUrEp.js} +1 -1
  207. langflow/frontend/assets/{index-BWFIrwW1.js → index-Dn6hpCAZ.js} +1 -1
  208. langflow/frontend/assets/{index-Cb5G9Ifd.js → index-DrJU8Fgb.js} +1 -1
  209. langflow/frontend/assets/{index-COoTCxvs.js → index-DsWfdCzp.js} +1 -1
  210. langflow/frontend/assets/{index-ZjeocHyu.js → index-DvCPWs2_.js} +1 -1
  211. langflow/frontend/assets/{index-B5LHnuQR.js → index-DvPVq7OP.js} +1 -1
  212. langflow/frontend/assets/{index-BnCnYnao.js → index-Dw71ufW4.js} +1 -1
  213. langflow/frontend/assets/{index-AALDfCyt.js → index-DxkJactf.js} +1 -1
  214. langflow/frontend/assets/{index-k9jP5chN.js → index-Dz2GTphU.js} +1 -1
  215. langflow/frontend/assets/{index-BdjfHsrf.js → index-Fvd524_c.js} +1 -1
  216. langflow/frontend/assets/{index-AKVkmT4S.js → index-GAQ0Mk2M.js} +1 -1
  217. langflow/frontend/assets/{index-BZSa2qz7.js → index-Hm5-4ItD.js} +1 -1
  218. langflow/frontend/assets/{index-DbfS_UH-.js → index-IT67FzsK.js} +1 -1
  219. langflow/frontend/assets/{index-BLXN681C.js → index-ItYiij1i.js} +1 -1
  220. langflow/frontend/assets/{index-CiklyQU3.js → index-IuR_FEdB.js} +1 -1
  221. langflow/frontend/assets/{index-xV6ystWy.js → index-Jj60FQkv.js} +1 -1
  222. langflow/frontend/assets/{index-C_157Mb-.js → index-LlvshmVz.js} +1 -1
  223. langflow/frontend/assets/{index-CDphUsa3.js → index-LwKh3I_W.js} +1 -1
  224. langflow/frontend/assets/{index-BrDz-PxE.js → index-N-xxmKKH.js} +1 -1
  225. langflow/frontend/assets/{index-BsdLyYMY.js → index-RwpaHIAH.js} +1 -1
  226. langflow/frontend/assets/{index-Cu2Xr6_j.js → index-TVvsp-xh.js} +1 -1
  227. langflow/frontend/assets/{index-CPiM2oyj.js → index-TdE2u9zP.js} +1 -1
  228. langflow/frontend/assets/{index-DOj_QWqG.js → index-_x-NkYeW.js} +1 -1
  229. langflow/frontend/assets/{index-YJsAl7vm.js → index-a-YclEbW.js} +1 -1
  230. langflow/frontend/assets/{index-5-CSw2-z.js → index-e9MFKUCo.js} +1 -1
  231. langflow/frontend/assets/{index-BSwBVwyF.js → index-krPr8f2F.js} +1 -1
  232. langflow/frontend/assets/{index-Df6psZEj.js → index-kveiUWuL.js} +1 -1
  233. langflow/frontend/assets/{index-CF4_Og1m.js → index-lE3oSjJi.js} +1 -1
  234. langflow/frontend/assets/{index-C6nzdeYx.js → index-lM3UYg7F.js} +1 -1
  235. langflow/frontend/assets/{index-C-wnbBBY.js → index-nsRk3qgA.js} +1 -1
  236. langflow/frontend/assets/{index-D234yKNJ.js → index-pBO0SZLD.js} +4 -4
  237. langflow/frontend/assets/{index-BMvp94tO.js → index-pbZHsbuE.js} +1 -1
  238. langflow/frontend/assets/{index-hg2y9OAt.js → index-sfX3aWyp.js} +1 -1
  239. langflow/frontend/assets/{index-DTCrijba.js → index-xQz-VJ0-.js} +1 -1
  240. langflow/frontend/assets/{index-SB4rw8D5.js → index-yfcsaHS6.js} +1 -1
  241. langflow/frontend/assets/{index-C-bjC2sz.js → index-zcGjo9fx.js} +1 -1
  242. langflow/frontend/assets/lazyIconImports-BjqDmNYG.js +2 -0
  243. langflow/frontend/assets/{use-post-add-user-JUeLDErC.js → use-post-add-user-w3vpKSOB.js} +1 -1
  244. langflow/frontend/index.html +1 -1
  245. langflow/graph/__init__.py +4 -4
  246. langflow/helpers/data.py +2 -2
  247. langflow/helpers/flow.py +9 -7
  248. langflow/helpers/user.py +2 -2
  249. langflow/initial_setup/setup.py +9 -9
  250. langflow/initial_setup/starter_projects/Basic Prompt Chaining.json +119 -41
  251. langflow/initial_setup/starter_projects/Basic Prompting.json +45 -19
  252. langflow/initial_setup/starter_projects/Blog Writer.json +53 -21
  253. langflow/initial_setup/starter_projects/Custom Component Generator.json +121 -97
  254. langflow/initial_setup/starter_projects/Document Q&A.json +46 -18
  255. langflow/initial_setup/starter_projects/Financial Report Parser.json +49 -17
  256. langflow/initial_setup/starter_projects/Hybrid Search RAG.json +89 -50
  257. langflow/initial_setup/starter_projects/Image Sentiment Analysis.json +86 -22
  258. langflow/initial_setup/starter_projects/Instagram Copywriter.json +210 -57
  259. langflow/initial_setup/starter_projects/Invoice Summarizer.json +132 -35
  260. langflow/initial_setup/starter_projects/Knowledge Ingestion.json +8 -8
  261. langflow/initial_setup/starter_projects/Knowledge Retrieval.json +8 -8
  262. langflow/initial_setup/starter_projects/Market Research.json +174 -48
  263. langflow/initial_setup/starter_projects/Meeting Summary.json +102 -38
  264. langflow/initial_setup/starter_projects/Memory Chatbot.json +49 -21
  265. langflow/initial_setup/starter_projects/News Aggregator.json +140 -39
  266. langflow/initial_setup/starter_projects/Nvidia Remix.json +153 -181
  267. langflow/initial_setup/starter_projects/Pok/303/251dex Agent.json" +132 -35
  268. langflow/initial_setup/starter_projects/Portfolio Website Code Generator.json +106 -43
  269. langflow/initial_setup/starter_projects/Price Deal Finder.json +136 -39
  270. langflow/initial_setup/starter_projects/Research Agent.json +206 -53
  271. langflow/initial_setup/starter_projects/Research Translation Loop.json +66 -34
  272. langflow/initial_setup/starter_projects/SEO Keyword Generator.json +41 -15
  273. langflow/initial_setup/starter_projects/SaaS Pricing.json +128 -31
  274. langflow/initial_setup/starter_projects/Search agent.json +132 -35
  275. langflow/initial_setup/starter_projects/Sequential Tasks Agents.json +422 -98
  276. langflow/initial_setup/starter_projects/Simple Agent.json +150 -42
  277. langflow/initial_setup/starter_projects/Social Media Agent.json +150 -42
  278. langflow/initial_setup/starter_projects/Text Sentiment Analysis.json +120 -24
  279. langflow/initial_setup/starter_projects/Travel Planning Agents.json +418 -94
  280. langflow/initial_setup/starter_projects/Twitter Thread Generator.json +69 -37
  281. langflow/initial_setup/starter_projects/Vector Store RAG.json +66 -38
  282. langflow/initial_setup/starter_projects/Youtube Analysis.json +191 -51
  283. langflow/initial_setup/starter_projects/basic_prompting.py +4 -4
  284. langflow/initial_setup/starter_projects/blog_writer.py +5 -5
  285. langflow/initial_setup/starter_projects/complex_agent.py +8 -8
  286. langflow/initial_setup/starter_projects/document_qa.py +5 -5
  287. langflow/initial_setup/starter_projects/hierarchical_tasks_agent.py +8 -8
  288. langflow/initial_setup/starter_projects/memory_chatbot.py +6 -6
  289. langflow/initial_setup/starter_projects/sequential_tasks_agent.py +7 -7
  290. langflow/initial_setup/starter_projects/vector_store_rag.py +8 -8
  291. langflow/inputs/__init__.py +3 -2
  292. langflow/inputs/constants.py +3 -2
  293. langflow/inputs/input_mixin.py +49 -310
  294. langflow/inputs/inputs.py +72 -703
  295. langflow/inputs/validators.py +2 -18
  296. langflow/interface/__init__.py +4 -0
  297. langflow/interface/components.py +3 -491
  298. langflow/interface/initialize/loading.py +7 -6
  299. langflow/interface/listing.py +3 -25
  300. langflow/interface/run.py +1 -1
  301. langflow/interface/utils.py +3 -111
  302. langflow/io/__init__.py +2 -2
  303. langflow/io/schema.py +11 -302
  304. langflow/load/__init__.py +4 -2
  305. langflow/load/utils.py +2 -96
  306. langflow/logging/__init__.py +2 -1
  307. langflow/logging/setup.py +1 -1
  308. langflow/main.py +8 -5
  309. langflow/memory.py +12 -6
  310. langflow/middleware.py +1 -1
  311. langflow/processing/process.py +7 -7
  312. langflow/schema/__init__.py +22 -5
  313. langflow/schema/artifact.py +1 -1
  314. langflow/schema/data.py +5 -303
  315. langflow/schema/dataframe.py +2 -205
  316. langflow/schema/graph.py +4 -45
  317. langflow/schema/image.py +2 -67
  318. langflow/schema/message.py +6 -470
  319. langflow/schema/playground_events.py +5 -6
  320. langflow/schema/schema.py +24 -117
  321. langflow/serialization/constants.py +3 -2
  322. langflow/serialization/serialization.py +1 -1
  323. langflow/server.py +1 -2
  324. langflow/services/__init__.py +1 -2
  325. langflow/services/auth/mcp_encryption.py +1 -1
  326. langflow/services/auth/service.py +1 -1
  327. langflow/services/auth/utils.py +5 -5
  328. langflow/services/cache/disk.py +2 -2
  329. langflow/services/cache/factory.py +2 -2
  330. langflow/services/cache/service.py +2 -2
  331. langflow/services/cache/utils.py +0 -11
  332. langflow/services/database/factory.py +1 -1
  333. langflow/services/database/models/flow/model.py +1 -1
  334. langflow/services/database/models/message/crud.py +2 -1
  335. langflow/services/database/models/transactions/crud.py +1 -1
  336. langflow/services/database/models/user/crud.py +1 -1
  337. langflow/services/database/service.py +2 -2
  338. langflow/services/database/utils.py +1 -2
  339. langflow/services/deps.py +12 -17
  340. langflow/services/enhanced_manager.py +71 -0
  341. langflow/services/factory.py +14 -7
  342. langflow/services/flow/flow_runner.py +4 -4
  343. langflow/services/job_queue/service.py +2 -1
  344. langflow/services/manager.py +14 -130
  345. langflow/services/schema.py +0 -1
  346. langflow/services/session/service.py +3 -2
  347. langflow/services/settings/__init__.py +0 -3
  348. langflow/services/settings/base.py +16 -549
  349. langflow/services/settings/factory.py +2 -21
  350. langflow/services/settings/feature_flags.py +2 -11
  351. langflow/services/settings/service.py +2 -31
  352. langflow/services/shared_component_cache/factory.py +1 -1
  353. langflow/services/socket/service.py +1 -1
  354. langflow/services/socket/utils.py +1 -8
  355. langflow/services/state/factory.py +1 -1
  356. langflow/services/state/service.py +3 -2
  357. langflow/services/storage/factory.py +2 -2
  358. langflow/services/storage/local.py +1 -2
  359. langflow/services/storage/s3.py +1 -2
  360. langflow/services/storage/service.py +2 -1
  361. langflow/services/store/factory.py +1 -1
  362. langflow/services/store/service.py +2 -2
  363. langflow/services/store/utils.py +1 -2
  364. langflow/services/task/service.py +2 -1
  365. langflow/services/task/temp_flow_cleanup.py +1 -1
  366. langflow/services/telemetry/factory.py +1 -1
  367. langflow/services/telemetry/service.py +2 -3
  368. langflow/services/tracing/arize_phoenix.py +3 -3
  369. langflow/services/tracing/base.py +1 -1
  370. langflow/services/tracing/factory.py +1 -1
  371. langflow/services/tracing/langfuse.py +2 -2
  372. langflow/services/tracing/langsmith.py +2 -2
  373. langflow/services/tracing/langwatch.py +4 -4
  374. langflow/services/tracing/opik.py +2 -2
  375. langflow/services/tracing/service.py +17 -11
  376. langflow/services/tracing/traceloop.py +2 -2
  377. langflow/services/tracing/utils.py +1 -1
  378. langflow/services/utils.py +54 -9
  379. langflow/services/variable/factory.py +1 -1
  380. langflow/services/variable/kubernetes.py +2 -3
  381. langflow/services/variable/kubernetes_secrets.py +1 -2
  382. langflow/services/variable/service.py +2 -3
  383. langflow/template/__init__.py +2 -9
  384. langflow/template/field/__init__.py +3 -0
  385. langflow/template/field/base.py +2 -256
  386. langflow/template/frontend_node.py +3 -0
  387. langflow/template/utils.py +2 -216
  388. langflow/utils/constants.py +28 -204
  389. langflow/utils/lazy_load.py +3 -14
  390. langflow/utils/schemas.py +2 -3
  391. langflow/utils/template_validation.py +2 -2
  392. langflow/utils/util.py +59 -479
  393. langflow/utils/validate.py +2 -488
  394. langflow/utils/voice_utils.py +1 -2
  395. langflow/worker.py +1 -1
  396. {langflow_base_nightly-0.5.1.dev2.dist-info → langflow_base_nightly-0.5.1.dev4.dist-info}/METADATA +2 -1
  397. langflow_base_nightly-0.5.1.dev4.dist-info/RECORD +633 -0
  398. langflow/base/agents/agent.py +0 -267
  399. langflow/base/agents/callback.py +0 -130
  400. langflow/base/agents/context.py +0 -109
  401. langflow/base/agents/crewai/__init__.py +0 -0
  402. langflow/base/agents/crewai/crew.py +0 -231
  403. langflow/base/agents/crewai/tasks.py +0 -12
  404. langflow/base/agents/default_prompts.py +0 -23
  405. langflow/base/agents/errors.py +0 -15
  406. langflow/base/agents/events.py +0 -346
  407. langflow/base/agents/utils.py +0 -205
  408. langflow/base/astra_assistants/__init__.py +0 -0
  409. langflow/base/astra_assistants/util.py +0 -171
  410. langflow/base/chains/__init__.py +0 -0
  411. langflow/base/chains/model.py +0 -19
  412. langflow/base/composio/__init__.py +0 -0
  413. langflow/base/composio/composio_base.py +0 -1297
  414. langflow/base/compressors/__init__.py +0 -0
  415. langflow/base/compressors/model.py +0 -60
  416. langflow/base/constants.py +0 -46
  417. langflow/base/curl/__init__.py +0 -0
  418. langflow/base/curl/parse.py +0 -188
  419. langflow/base/data/base_file.py +0 -685
  420. langflow/base/data/docling_utils.py +0 -245
  421. langflow/base/document_transformers/__init__.py +0 -0
  422. langflow/base/document_transformers/model.py +0 -43
  423. langflow/base/embeddings/aiml_embeddings.py +0 -62
  424. langflow/base/embeddings/model.py +0 -26
  425. langflow/base/flow_processing/__init__.py +0 -0
  426. langflow/base/flow_processing/utils.py +0 -86
  427. langflow/base/huggingface/__init__.py +0 -0
  428. langflow/base/huggingface/model_bridge.py +0 -133
  429. langflow/base/langchain_utilities/__init__.py +0 -0
  430. langflow/base/langchain_utilities/model.py +0 -35
  431. langflow/base/langchain_utilities/spider_constants.py +0 -1
  432. langflow/base/langwatch/__init__.py +0 -0
  433. langflow/base/langwatch/utils.py +0 -18
  434. langflow/base/mcp/__init__.py +0 -0
  435. langflow/base/mcp/constants.py +0 -2
  436. langflow/base/mcp/util.py +0 -1524
  437. langflow/base/memory/memory.py +0 -49
  438. langflow/base/memory/model.py +0 -38
  439. langflow/base/models/aiml_constants.py +0 -51
  440. langflow/base/models/anthropic_constants.py +0 -47
  441. langflow/base/models/aws_constants.py +0 -151
  442. langflow/base/models/chat_result.py +0 -76
  443. langflow/base/models/google_generative_ai_constants.py +0 -70
  444. langflow/base/models/groq_constants.py +0 -134
  445. langflow/base/models/model.py +0 -375
  446. langflow/base/models/model_input_constants.py +0 -299
  447. langflow/base/models/model_metadata.py +0 -41
  448. langflow/base/models/model_utils.py +0 -8
  449. langflow/base/models/novita_constants.py +0 -35
  450. langflow/base/models/ollama_constants.py +0 -49
  451. langflow/base/models/sambanova_constants.py +0 -18
  452. langflow/base/processing/__init__.py +0 -0
  453. langflow/base/prompts/utils.py +0 -61
  454. langflow/base/textsplitters/model.py +0 -28
  455. langflow/base/tools/base.py +0 -26
  456. langflow/base/tools/component_tool.py +0 -324
  457. langflow/base/tools/constants.py +0 -49
  458. langflow/base/tools/flow_tool.py +0 -131
  459. langflow/base/tools/run_flow.py +0 -227
  460. langflow/base/vectorstores/model.py +0 -193
  461. langflow/base/vectorstores/utils.py +0 -22
  462. langflow/base/vectorstores/vector_store_connection_decorator.py +0 -52
  463. langflow/components/FAISS/__init__.py +0 -34
  464. langflow/components/FAISS/faiss.py +0 -111
  465. langflow/components/Notion/__init__.py +0 -19
  466. langflow/components/Notion/add_content_to_page.py +0 -269
  467. langflow/components/Notion/create_page.py +0 -94
  468. langflow/components/Notion/list_database_properties.py +0 -68
  469. langflow/components/Notion/list_pages.py +0 -122
  470. langflow/components/Notion/list_users.py +0 -77
  471. langflow/components/Notion/page_content_viewer.py +0 -93
  472. langflow/components/Notion/search.py +0 -111
  473. langflow/components/Notion/update_page_property.py +0 -114
  474. langflow/components/_importing.py +0 -37
  475. langflow/components/agentql/__init__.py +0 -3
  476. langflow/components/agentql/agentql_api.py +0 -151
  477. langflow/components/agents/__init__.py +0 -4
  478. langflow/components/agents/agent.py +0 -554
  479. langflow/components/agents/mcp_component.py +0 -501
  480. langflow/components/aiml/__init__.py +0 -37
  481. langflow/components/aiml/aiml.py +0 -112
  482. langflow/components/aiml/aiml_embeddings.py +0 -37
  483. langflow/components/amazon/__init__.py +0 -36
  484. langflow/components/amazon/amazon_bedrock_embedding.py +0 -109
  485. langflow/components/amazon/amazon_bedrock_model.py +0 -124
  486. langflow/components/amazon/s3_bucket_uploader.py +0 -211
  487. langflow/components/anthropic/__init__.py +0 -34
  488. langflow/components/anthropic/anthropic.py +0 -187
  489. langflow/components/apify/__init__.py +0 -5
  490. langflow/components/apify/apify_actor.py +0 -325
  491. langflow/components/arxiv/__init__.py +0 -3
  492. langflow/components/arxiv/arxiv.py +0 -163
  493. langflow/components/assemblyai/__init__.py +0 -46
  494. langflow/components/assemblyai/assemblyai_get_subtitles.py +0 -83
  495. langflow/components/assemblyai/assemblyai_lemur.py +0 -183
  496. langflow/components/assemblyai/assemblyai_list_transcripts.py +0 -95
  497. langflow/components/assemblyai/assemblyai_poll_transcript.py +0 -72
  498. langflow/components/assemblyai/assemblyai_start_transcript.py +0 -188
  499. langflow/components/azure/__init__.py +0 -37
  500. langflow/components/azure/azure_openai.py +0 -95
  501. langflow/components/azure/azure_openai_embeddings.py +0 -83
  502. langflow/components/baidu/__init__.py +0 -32
  503. langflow/components/baidu/baidu_qianfan_chat.py +0 -113
  504. langflow/components/bing/__init__.py +0 -3
  505. langflow/components/bing/bing_search_api.py +0 -61
  506. langflow/components/cassandra/__init__.py +0 -40
  507. langflow/components/cassandra/cassandra.py +0 -264
  508. langflow/components/cassandra/cassandra_chat.py +0 -92
  509. langflow/components/cassandra/cassandra_graph.py +0 -238
  510. langflow/components/chains/__init__.py +0 -0
  511. langflow/components/chroma/__init__.py +0 -34
  512. langflow/components/chroma/chroma.py +0 -167
  513. langflow/components/cleanlab/__init__.py +0 -40
  514. langflow/components/cleanlab/cleanlab_evaluator.py +0 -157
  515. langflow/components/cleanlab/cleanlab_rag_evaluator.py +0 -254
  516. langflow/components/cleanlab/cleanlab_remediator.py +0 -131
  517. langflow/components/clickhouse/__init__.py +0 -34
  518. langflow/components/clickhouse/clickhouse.py +0 -135
  519. langflow/components/cloudflare/__init__.py +0 -32
  520. langflow/components/cloudflare/cloudflare.py +0 -81
  521. langflow/components/cohere/__init__.py +0 -40
  522. langflow/components/cohere/cohere_embeddings.py +0 -81
  523. langflow/components/cohere/cohere_models.py +0 -46
  524. langflow/components/cohere/cohere_rerank.py +0 -51
  525. langflow/components/composio/__init__.py +0 -73
  526. langflow/components/composio/composio_api.py +0 -268
  527. langflow/components/composio/dropbox_compnent.py +0 -11
  528. langflow/components/composio/github_composio.py +0 -11
  529. langflow/components/composio/gmail_composio.py +0 -38
  530. langflow/components/composio/googlecalendar_composio.py +0 -11
  531. langflow/components/composio/googlemeet_composio.py +0 -11
  532. langflow/components/composio/googletasks_composio.py +0 -8
  533. langflow/components/composio/linear_composio.py +0 -11
  534. langflow/components/composio/outlook_composio.py +0 -11
  535. langflow/components/composio/reddit_composio.py +0 -11
  536. langflow/components/composio/slack_composio.py +0 -11
  537. langflow/components/composio/slackbot_composio.py +0 -11
  538. langflow/components/composio/supabase_composio.py +0 -11
  539. langflow/components/composio/todoist_composio.py +0 -11
  540. langflow/components/composio/youtube_composio.py +0 -11
  541. langflow/components/confluence/__init__.py +0 -3
  542. langflow/components/confluence/confluence.py +0 -84
  543. langflow/components/couchbase/__init__.py +0 -34
  544. langflow/components/couchbase/couchbase.py +0 -102
  545. langflow/components/crewai/__init__.py +0 -49
  546. langflow/components/crewai/crewai.py +0 -107
  547. langflow/components/crewai/hierarchical_crew.py +0 -46
  548. langflow/components/crewai/hierarchical_task.py +0 -44
  549. langflow/components/crewai/sequential_crew.py +0 -52
  550. langflow/components/crewai/sequential_task.py +0 -73
  551. langflow/components/crewai/sequential_task_agent.py +0 -143
  552. langflow/components/custom_component/__init__.py +0 -34
  553. langflow/components/custom_component/custom_component.py +0 -31
  554. langflow/components/data/__init__.py +0 -25
  555. langflow/components/data/api_request.py +0 -545
  556. langflow/components/data/csv_to_data.py +0 -95
  557. langflow/components/data/directory.py +0 -113
  558. langflow/components/data/file.py +0 -586
  559. langflow/components/data/json_to_data.py +0 -98
  560. langflow/components/data/news_search.py +0 -164
  561. langflow/components/data/rss.py +0 -69
  562. langflow/components/data/sql_executor.py +0 -99
  563. langflow/components/data/url.py +0 -299
  564. langflow/components/data/web_search.py +0 -112
  565. langflow/components/data/webhook.py +0 -56
  566. langflow/components/datastax/__init__.py +0 -70
  567. langflow/components/datastax/astra_assistant_manager.py +0 -306
  568. langflow/components/datastax/astra_db.py +0 -69
  569. langflow/components/datastax/astra_vectorize.py +0 -124
  570. langflow/components/datastax/astradb_cql.py +0 -314
  571. langflow/components/datastax/astradb_graph.py +0 -319
  572. langflow/components/datastax/astradb_tool.py +0 -414
  573. langflow/components/datastax/astradb_vectorstore.py +0 -1285
  574. langflow/components/datastax/create_assistant.py +0 -58
  575. langflow/components/datastax/create_thread.py +0 -32
  576. langflow/components/datastax/dotenv.py +0 -35
  577. langflow/components/datastax/get_assistant.py +0 -37
  578. langflow/components/datastax/getenvvar.py +0 -30
  579. langflow/components/datastax/graph_rag.py +0 -141
  580. langflow/components/datastax/hcd.py +0 -314
  581. langflow/components/datastax/list_assistants.py +0 -25
  582. langflow/components/datastax/run.py +0 -89
  583. langflow/components/deactivated/__init__.py +0 -19
  584. langflow/components/deactivated/amazon_kendra.py +0 -66
  585. langflow/components/deactivated/chat_litellm_model.py +0 -158
  586. langflow/components/deactivated/code_block_extractor.py +0 -26
  587. langflow/components/deactivated/documents_to_data.py +0 -22
  588. langflow/components/deactivated/embed.py +0 -16
  589. langflow/components/deactivated/extract_key_from_data.py +0 -46
  590. langflow/components/deactivated/json_document_builder.py +0 -59
  591. langflow/components/deactivated/list_flows.py +0 -20
  592. langflow/components/deactivated/mcp_sse.py +0 -61
  593. langflow/components/deactivated/mcp_stdio.py +0 -62
  594. langflow/components/deactivated/merge_data.py +0 -93
  595. langflow/components/deactivated/message.py +0 -37
  596. langflow/components/deactivated/metal.py +0 -54
  597. langflow/components/deactivated/multi_query.py +0 -59
  598. langflow/components/deactivated/retriever.py +0 -43
  599. langflow/components/deactivated/selective_passthrough.py +0 -77
  600. langflow/components/deactivated/should_run_next.py +0 -40
  601. langflow/components/deactivated/split_text.py +0 -63
  602. langflow/components/deactivated/store_message.py +0 -24
  603. langflow/components/deactivated/sub_flow.py +0 -124
  604. langflow/components/deactivated/vectara_self_query.py +0 -76
  605. langflow/components/deactivated/vector_store.py +0 -24
  606. langflow/components/deepseek/__init__.py +0 -34
  607. langflow/components/deepseek/deepseek.py +0 -136
  608. langflow/components/docling/__init__.py +0 -43
  609. langflow/components/docling/chunk_docling_document.py +0 -186
  610. langflow/components/docling/docling_inline.py +0 -235
  611. langflow/components/docling/docling_remote.py +0 -193
  612. langflow/components/docling/export_docling_document.py +0 -117
  613. langflow/components/documentloaders/__init__.py +0 -0
  614. langflow/components/duckduckgo/__init__.py +0 -3
  615. langflow/components/duckduckgo/duck_duck_go_search_run.py +0 -92
  616. langflow/components/elastic/__init__.py +0 -37
  617. langflow/components/elastic/elasticsearch.py +0 -267
  618. langflow/components/elastic/opensearch.py +0 -243
  619. langflow/components/embeddings/__init__.py +0 -37
  620. langflow/components/embeddings/similarity.py +0 -76
  621. langflow/components/embeddings/text_embedder.py +0 -64
  622. langflow/components/exa/__init__.py +0 -3
  623. langflow/components/exa/exa_search.py +0 -68
  624. langflow/components/firecrawl/__init__.py +0 -43
  625. langflow/components/firecrawl/firecrawl_crawl_api.py +0 -88
  626. langflow/components/firecrawl/firecrawl_extract_api.py +0 -136
  627. langflow/components/firecrawl/firecrawl_map_api.py +0 -89
  628. langflow/components/firecrawl/firecrawl_scrape_api.py +0 -73
  629. langflow/components/git/__init__.py +0 -4
  630. langflow/components/git/git.py +0 -262
  631. langflow/components/git/gitextractor.py +0 -196
  632. langflow/components/glean/__init__.py +0 -3
  633. langflow/components/glean/glean_search_api.py +0 -173
  634. langflow/components/google/__init__.py +0 -17
  635. langflow/components/google/gmail.py +0 -192
  636. langflow/components/google/google_bq_sql_executor.py +0 -157
  637. langflow/components/google/google_drive.py +0 -92
  638. langflow/components/google/google_drive_search.py +0 -152
  639. langflow/components/google/google_generative_ai.py +0 -147
  640. langflow/components/google/google_generative_ai_embeddings.py +0 -141
  641. langflow/components/google/google_oauth_token.py +0 -89
  642. langflow/components/google/google_search_api_core.py +0 -68
  643. langflow/components/google/google_serper_api_core.py +0 -74
  644. langflow/components/groq/__init__.py +0 -34
  645. langflow/components/groq/groq.py +0 -140
  646. langflow/components/helpers/__init__.py +0 -52
  647. langflow/components/helpers/calculator_core.py +0 -89
  648. langflow/components/helpers/create_list.py +0 -40
  649. langflow/components/helpers/current_date.py +0 -42
  650. langflow/components/helpers/id_generator.py +0 -42
  651. langflow/components/helpers/memory.py +0 -251
  652. langflow/components/helpers/output_parser.py +0 -45
  653. langflow/components/helpers/store_message.py +0 -90
  654. langflow/components/homeassistant/__init__.py +0 -7
  655. langflow/components/homeassistant/home_assistant_control.py +0 -152
  656. langflow/components/homeassistant/list_home_assistant_states.py +0 -137
  657. langflow/components/huggingface/__init__.py +0 -37
  658. langflow/components/huggingface/huggingface.py +0 -197
  659. langflow/components/huggingface/huggingface_inference_api.py +0 -106
  660. langflow/components/ibm/__init__.py +0 -34
  661. langflow/components/ibm/watsonx.py +0 -203
  662. langflow/components/ibm/watsonx_embeddings.py +0 -135
  663. langflow/components/icosacomputing/__init__.py +0 -5
  664. langflow/components/icosacomputing/combinatorial_reasoner.py +0 -84
  665. langflow/components/input_output/__init__.py +0 -38
  666. langflow/components/input_output/chat.py +0 -120
  667. langflow/components/input_output/chat_output.py +0 -200
  668. langflow/components/input_output/text.py +0 -27
  669. langflow/components/input_output/text_output.py +0 -29
  670. langflow/components/jigsawstack/__init__.py +0 -23
  671. langflow/components/jigsawstack/ai_scrape.py +0 -126
  672. langflow/components/jigsawstack/ai_web_search.py +0 -136
  673. langflow/components/jigsawstack/file_read.py +0 -115
  674. langflow/components/jigsawstack/file_upload.py +0 -94
  675. langflow/components/jigsawstack/image_generation.py +0 -205
  676. langflow/components/jigsawstack/nsfw.py +0 -60
  677. langflow/components/jigsawstack/object_detection.py +0 -124
  678. langflow/components/jigsawstack/sentiment.py +0 -112
  679. langflow/components/jigsawstack/text_to_sql.py +0 -90
  680. langflow/components/jigsawstack/text_translate.py +0 -77
  681. langflow/components/jigsawstack/vocr.py +0 -107
  682. langflow/components/langchain_utilities/__init__.py +0 -109
  683. langflow/components/langchain_utilities/character.py +0 -53
  684. langflow/components/langchain_utilities/conversation.py +0 -52
  685. langflow/components/langchain_utilities/csv_agent.py +0 -107
  686. langflow/components/langchain_utilities/fake_embeddings.py +0 -26
  687. langflow/components/langchain_utilities/html_link_extractor.py +0 -35
  688. langflow/components/langchain_utilities/json_agent.py +0 -45
  689. langflow/components/langchain_utilities/langchain_hub.py +0 -126
  690. langflow/components/langchain_utilities/language_recursive.py +0 -49
  691. langflow/components/langchain_utilities/language_semantic.py +0 -138
  692. langflow/components/langchain_utilities/llm_checker.py +0 -39
  693. langflow/components/langchain_utilities/llm_math.py +0 -42
  694. langflow/components/langchain_utilities/natural_language.py +0 -61
  695. langflow/components/langchain_utilities/openai_tools.py +0 -53
  696. langflow/components/langchain_utilities/openapi.py +0 -48
  697. langflow/components/langchain_utilities/recursive_character.py +0 -60
  698. langflow/components/langchain_utilities/retrieval_qa.py +0 -83
  699. langflow/components/langchain_utilities/runnable_executor.py +0 -137
  700. langflow/components/langchain_utilities/self_query.py +0 -80
  701. langflow/components/langchain_utilities/spider.py +0 -142
  702. langflow/components/langchain_utilities/sql.py +0 -40
  703. langflow/components/langchain_utilities/sql_database.py +0 -35
  704. langflow/components/langchain_utilities/sql_generator.py +0 -78
  705. langflow/components/langchain_utilities/tool_calling.py +0 -59
  706. langflow/components/langchain_utilities/vector_store_info.py +0 -49
  707. langflow/components/langchain_utilities/vector_store_router.py +0 -33
  708. langflow/components/langchain_utilities/xml_agent.py +0 -71
  709. langflow/components/langwatch/__init__.py +0 -3
  710. langflow/components/langwatch/langwatch.py +0 -278
  711. langflow/components/link_extractors/__init__.py +0 -0
  712. langflow/components/lmstudio/__init__.py +0 -34
  713. langflow/components/lmstudio/lmstudioembeddings.py +0 -89
  714. langflow/components/lmstudio/lmstudiomodel.py +0 -129
  715. langflow/components/logic/__init__.py +0 -52
  716. langflow/components/logic/conditional_router.py +0 -171
  717. langflow/components/logic/data_conditional_router.py +0 -125
  718. langflow/components/logic/flow_tool.py +0 -110
  719. langflow/components/logic/listen.py +0 -29
  720. langflow/components/logic/loop.py +0 -125
  721. langflow/components/logic/notify.py +0 -88
  722. langflow/components/logic/pass_message.py +0 -35
  723. langflow/components/logic/run_flow.py +0 -71
  724. langflow/components/logic/sub_flow.py +0 -114
  725. langflow/components/maritalk/__init__.py +0 -32
  726. langflow/components/maritalk/maritalk.py +0 -52
  727. langflow/components/mem0/__init__.py +0 -3
  728. langflow/components/mem0/mem0_chat_memory.py +0 -136
  729. langflow/components/milvus/__init__.py +0 -34
  730. langflow/components/milvus/milvus.py +0 -115
  731. langflow/components/mistral/__init__.py +0 -37
  732. langflow/components/mistral/mistral.py +0 -114
  733. langflow/components/mistral/mistral_embeddings.py +0 -58
  734. langflow/components/models/__init__.py +0 -34
  735. langflow/components/models/embedding_model.py +0 -114
  736. langflow/components/models/language_model.py +0 -144
  737. langflow/components/mongodb/__init__.py +0 -34
  738. langflow/components/mongodb/mongodb_atlas.py +0 -213
  739. langflow/components/needle/__init__.py +0 -3
  740. langflow/components/needle/needle.py +0 -104
  741. langflow/components/notdiamond/__init__.py +0 -36
  742. langflow/components/notdiamond/notdiamond.py +0 -228
  743. langflow/components/novita/__init__.py +0 -32
  744. langflow/components/novita/novita.py +0 -130
  745. langflow/components/nvidia/__init__.py +0 -57
  746. langflow/components/nvidia/nvidia.py +0 -157
  747. langflow/components/nvidia/nvidia_embedding.py +0 -77
  748. langflow/components/nvidia/nvidia_ingest.py +0 -317
  749. langflow/components/nvidia/nvidia_rerank.py +0 -63
  750. langflow/components/nvidia/system_assist.py +0 -65
  751. langflow/components/olivya/__init__.py +0 -3
  752. langflow/components/olivya/olivya.py +0 -116
  753. langflow/components/ollama/__init__.py +0 -37
  754. langflow/components/ollama/ollama.py +0 -330
  755. langflow/components/ollama/ollama_embeddings.py +0 -106
  756. langflow/components/openai/__init__.py +0 -37
  757. langflow/components/openai/openai.py +0 -100
  758. langflow/components/openai/openai_chat_model.py +0 -158
  759. langflow/components/openrouter/__init__.py +0 -32
  760. langflow/components/openrouter/openrouter.py +0 -202
  761. langflow/components/output_parsers/__init__.py +0 -0
  762. langflow/components/perplexity/__init__.py +0 -34
  763. langflow/components/perplexity/perplexity.py +0 -75
  764. langflow/components/pgvector/__init__.py +0 -34
  765. langflow/components/pgvector/pgvector.py +0 -72
  766. langflow/components/pinecone/__init__.py +0 -34
  767. langflow/components/pinecone/pinecone.py +0 -134
  768. langflow/components/processing/alter_metadata.py +0 -108
  769. langflow/components/processing/batch_run.py +0 -205
  770. langflow/components/processing/combine_text.py +0 -39
  771. langflow/components/processing/create_data.py +0 -110
  772. langflow/components/processing/data_operations.py +0 -438
  773. langflow/components/processing/data_to_dataframe.py +0 -70
  774. langflow/components/processing/dataframe_operations.py +0 -321
  775. langflow/components/processing/extract_key.py +0 -53
  776. langflow/components/processing/filter_data.py +0 -42
  777. langflow/components/processing/filter_data_values.py +0 -88
  778. langflow/components/processing/json_cleaner.py +0 -103
  779. langflow/components/processing/lambda_filter.py +0 -154
  780. langflow/components/processing/llm_router.py +0 -499
  781. langflow/components/processing/merge_data.py +0 -90
  782. langflow/components/processing/message_to_data.py +0 -36
  783. langflow/components/processing/parse_data.py +0 -70
  784. langflow/components/processing/parse_dataframe.py +0 -68
  785. langflow/components/processing/parse_json_data.py +0 -90
  786. langflow/components/processing/parser.py +0 -143
  787. langflow/components/processing/prompt.py +0 -67
  788. langflow/components/processing/python_repl_core.py +0 -98
  789. langflow/components/processing/regex.py +0 -82
  790. langflow/components/processing/save_file.py +0 -208
  791. langflow/components/processing/select_data.py +0 -48
  792. langflow/components/processing/split_text.py +0 -141
  793. langflow/components/processing/structured_output.py +0 -202
  794. langflow/components/processing/update_data.py +0 -160
  795. langflow/components/prototypes/__init__.py +0 -34
  796. langflow/components/prototypes/python_function.py +0 -73
  797. langflow/components/qdrant/__init__.py +0 -34
  798. langflow/components/qdrant/qdrant.py +0 -109
  799. langflow/components/redis/__init__.py +0 -37
  800. langflow/components/redis/redis.py +0 -89
  801. langflow/components/redis/redis_chat.py +0 -43
  802. langflow/components/sambanova/__init__.py +0 -32
  803. langflow/components/sambanova/sambanova.py +0 -84
  804. langflow/components/scrapegraph/__init__.py +0 -40
  805. langflow/components/scrapegraph/scrapegraph_markdownify_api.py +0 -64
  806. langflow/components/scrapegraph/scrapegraph_search_api.py +0 -64
  807. langflow/components/scrapegraph/scrapegraph_smart_scraper_api.py +0 -71
  808. langflow/components/searchapi/__init__.py +0 -36
  809. langflow/components/searchapi/search.py +0 -79
  810. langflow/components/serpapi/__init__.py +0 -3
  811. langflow/components/serpapi/serp.py +0 -115
  812. langflow/components/serper/__init__.py +0 -3
  813. langflow/components/serper/google_serper_api_core.py +0 -74
  814. langflow/components/supabase/__init__.py +0 -37
  815. langflow/components/supabase/supabase.py +0 -76
  816. langflow/components/tavily/__init__.py +0 -4
  817. langflow/components/tavily/tavily_extract.py +0 -117
  818. langflow/components/tavily/tavily_search.py +0 -212
  819. langflow/components/textsplitters/__init__.py +0 -0
  820. langflow/components/toolkits/__init__.py +0 -0
  821. langflow/components/tools/__init__.py +0 -72
  822. langflow/components/tools/calculator.py +0 -103
  823. langflow/components/tools/google_search_api.py +0 -45
  824. langflow/components/tools/google_serper_api.py +0 -115
  825. langflow/components/tools/python_code_structured_tool.py +0 -327
  826. langflow/components/tools/python_repl.py +0 -97
  827. langflow/components/tools/search_api.py +0 -87
  828. langflow/components/tools/searxng.py +0 -145
  829. langflow/components/tools/serp_api.py +0 -119
  830. langflow/components/tools/tavily_search_tool.py +0 -344
  831. langflow/components/tools/wikidata_api.py +0 -102
  832. langflow/components/tools/wikipedia_api.py +0 -49
  833. langflow/components/tools/yahoo_finance.py +0 -124
  834. langflow/components/twelvelabs/__init__.py +0 -52
  835. langflow/components/twelvelabs/convert_astra_results.py +0 -84
  836. langflow/components/twelvelabs/pegasus_index.py +0 -311
  837. langflow/components/twelvelabs/split_video.py +0 -291
  838. langflow/components/twelvelabs/text_embeddings.py +0 -57
  839. langflow/components/twelvelabs/twelvelabs_pegasus.py +0 -408
  840. langflow/components/twelvelabs/video_embeddings.py +0 -100
  841. langflow/components/twelvelabs/video_file.py +0 -179
  842. langflow/components/unstructured/__init__.py +0 -3
  843. langflow/components/unstructured/unstructured.py +0 -121
  844. langflow/components/upstash/__init__.py +0 -34
  845. langflow/components/upstash/upstash.py +0 -124
  846. langflow/components/vectara/__init__.py +0 -37
  847. langflow/components/vectara/vectara.py +0 -97
  848. langflow/components/vectara/vectara_rag.py +0 -164
  849. langflow/components/vectorstores/__init__.py +0 -34
  850. langflow/components/vectorstores/local_db.py +0 -261
  851. langflow/components/vertexai/__init__.py +0 -37
  852. langflow/components/vertexai/vertexai.py +0 -71
  853. langflow/components/vertexai/vertexai_embeddings.py +0 -67
  854. langflow/components/weaviate/__init__.py +0 -34
  855. langflow/components/weaviate/weaviate.py +0 -89
  856. langflow/components/wikipedia/__init__.py +0 -4
  857. langflow/components/wikipedia/wikidata.py +0 -86
  858. langflow/components/wikipedia/wikipedia.py +0 -53
  859. langflow/components/wolframalpha/__init__.py +0 -3
  860. langflow/components/wolframalpha/wolfram_alpha_api.py +0 -54
  861. langflow/components/xai/__init__.py +0 -32
  862. langflow/components/xai/xai.py +0 -167
  863. langflow/components/yahoosearch/__init__.py +0 -3
  864. langflow/components/yahoosearch/yahoo.py +0 -137
  865. langflow/components/youtube/__init__.py +0 -52
  866. langflow/components/youtube/channel.py +0 -227
  867. langflow/components/youtube/comments.py +0 -231
  868. langflow/components/youtube/playlist.py +0 -33
  869. langflow/components/youtube/search.py +0 -120
  870. langflow/components/youtube/trending.py +0 -285
  871. langflow/components/youtube/video_details.py +0 -263
  872. langflow/components/youtube/youtube_transcripts.py +0 -118
  873. langflow/components/zep/__init__.py +0 -3
  874. langflow/components/zep/zep.py +0 -44
  875. langflow/custom/attributes.py +0 -86
  876. langflow/custom/code_parser/__init__.py +0 -3
  877. langflow/custom/code_parser/code_parser.py +0 -361
  878. langflow/custom/custom_component/base_component.py +0 -118
  879. langflow/custom/dependency_analyzer.py +0 -165
  880. langflow/custom/directory_reader/__init__.py +0 -3
  881. langflow/custom/directory_reader/directory_reader.py +0 -359
  882. langflow/custom/directory_reader/utils.py +0 -171
  883. langflow/custom/eval.py +0 -12
  884. langflow/custom/schema.py +0 -32
  885. langflow/custom/tree_visitor.py +0 -21
  886. langflow/frontend/assets/lazyIconImports-Ci-S9xBA.js +0 -2
  887. langflow/graph/edge/__init__.py +0 -0
  888. langflow/graph/edge/base.py +0 -277
  889. langflow/graph/edge/schema.py +0 -119
  890. langflow/graph/edge/utils.py +0 -0
  891. langflow/graph/graph/__init__.py +0 -0
  892. langflow/graph/graph/ascii.py +0 -202
  893. langflow/graph/graph/base.py +0 -2185
  894. langflow/graph/graph/constants.py +0 -58
  895. langflow/graph/graph/runnable_vertices_manager.py +0 -133
  896. langflow/graph/graph/schema.py +0 -53
  897. langflow/graph/graph/state_model.py +0 -66
  898. langflow/graph/graph/utils.py +0 -1024
  899. langflow/graph/schema.py +0 -75
  900. langflow/graph/state/__init__.py +0 -0
  901. langflow/graph/state/model.py +0 -237
  902. langflow/graph/utils.py +0 -229
  903. langflow/graph/vertex/__init__.py +0 -0
  904. langflow/graph/vertex/base.py +0 -811
  905. langflow/graph/vertex/constants.py +0 -0
  906. langflow/graph/vertex/exceptions.py +0 -4
  907. langflow/graph/vertex/param_handler.py +0 -255
  908. langflow/graph/vertex/schema.py +0 -26
  909. langflow/graph/vertex/utils.py +0 -19
  910. langflow/graph/vertex/vertex_types.py +0 -489
  911. langflow/legacy_custom/__init__.py +0 -0
  912. langflow/legacy_custom/customs.py +0 -16
  913. langflow/load/load.py +0 -250
  914. langflow/logging/logger.py +0 -369
  915. langflow/processing/utils.py +0 -25
  916. langflow/schema/openai_responses_schemas.py +0 -74
  917. langflow/schema/serialize.py +0 -13
  918. langflow/services/chat/config.py +0 -2
  919. langflow/services/settings/auth.py +0 -130
  920. langflow/services/settings/constants.py +0 -31
  921. langflow/services/settings/manager.py +0 -49
  922. langflow/services/settings/utils.py +0 -40
  923. langflow/template/field/prompt.py +0 -2
  924. langflow/template/frontend_node/__init__.py +0 -6
  925. langflow/template/frontend_node/base.py +0 -212
  926. langflow/template/frontend_node/constants.py +0 -65
  927. langflow/template/frontend_node/custom_components.py +0 -97
  928. langflow/template/template/__init__.py +0 -0
  929. langflow/template/template/base.py +0 -99
  930. langflow/utils/async_helpers.py +0 -42
  931. langflow/utils/concurrency.py +0 -60
  932. langflow/utils/util_strings.py +0 -56
  933. langflow_base_nightly-0.5.1.dev2.dist-info/RECORD +0 -1159
  934. {langflow_base_nightly-0.5.1.dev2.dist-info → langflow_base_nightly-0.5.1.dev4.dist-info}/WHEEL +0 -0
  935. {langflow_base_nightly-0.5.1.dev2.dist-info → langflow_base_nightly-0.5.1.dev4.dist-info}/entry_points.txt +0 -0
langflow/custom/utils.py CHANGED
@@ -1,872 +1 @@
1
- # mypy: ignore-errors
2
- from __future__ import annotations
3
-
4
- import ast
5
- import asyncio
6
- import contextlib
7
- import hashlib
8
- import inspect
9
- import re
10
- import traceback
11
- from pathlib import Path
12
- from typing import TYPE_CHECKING, Any
13
-
14
- from fastapi import HTTPException
15
- from pydantic import BaseModel
16
-
17
- from langflow.custom.custom_component.component import Component
18
- from langflow.custom.dependency_analyzer import analyze_component_dependencies
19
- from langflow.custom.directory_reader.utils import (
20
- abuild_custom_component_list_from_path,
21
- build_custom_component_list_from_path,
22
- merge_nested_dicts_with_renaming,
23
- )
24
- from langflow.custom.eval import eval_custom_component_code
25
- from langflow.custom.schema import MissingDefault
26
- from langflow.field_typing.range_spec import RangeSpec
27
- from langflow.helpers.custom import format_type
28
- from langflow.logging.logger import logger
29
- from langflow.schema.dotdict import dotdict
30
- from langflow.template.field.base import Input
31
- from langflow.template.frontend_node.custom_components import ComponentFrontendNode, CustomComponentFrontendNode
32
- from langflow.type_extraction.type_extraction import extract_inner_type
33
- from langflow.utils import validate
34
- from langflow.utils.util import get_base_classes
35
-
36
- if TYPE_CHECKING:
37
- from uuid import UUID
38
-
39
- from langflow.custom.custom_component.custom_component import CustomComponent
40
-
41
-
42
- def _generate_code_hash(source_code: str, modname: str) -> str:
43
- """Generate a hash of the component source code.
44
-
45
- Args:
46
- source_code: The source code string
47
- modname: The module name for context
48
-
49
- Returns:
50
- SHA256 hash of the source code
51
-
52
- Raises:
53
- ValueError: If source_code is empty or None
54
- UnicodeEncodeError: If source_code cannot be encoded
55
- TypeError: If source_code is not a string
56
- """
57
- if not source_code:
58
- msg = f"Empty source code for {modname}"
59
- raise ValueError(msg)
60
-
61
- # Generate SHA256 hash of the source code
62
- return hashlib.sha256(source_code.encode("utf-8")).hexdigest()[:12] # First 12 chars for brevity
63
-
64
-
65
- class UpdateBuildConfigError(Exception):
66
- pass
67
-
68
-
69
- def add_output_types(frontend_node: CustomComponentFrontendNode, return_types: list[str]) -> None:
70
- """Add output types to the frontend node."""
71
- for return_type in return_types:
72
- if return_type is None:
73
- raise HTTPException(
74
- status_code=400,
75
- detail={
76
- "error": ("Invalid return type. Please check your code and try again."),
77
- "traceback": traceback.format_exc(),
78
- },
79
- )
80
- if return_type is str:
81
- return_type_ = "Text"
82
- elif hasattr(return_type, "__name__"):
83
- return_type_ = return_type.__name__
84
- elif hasattr(return_type, "__class__"):
85
- return_type_ = return_type.__class__.__name__
86
- else:
87
- return_type_ = str(return_type)
88
-
89
- frontend_node.add_output_type(return_type_)
90
-
91
-
92
- def reorder_fields(frontend_node: CustomComponentFrontendNode, field_order: list[str]) -> None:
93
- """Reorder fields in the frontend node based on the specified field_order."""
94
- if not field_order:
95
- return
96
-
97
- # Create a dictionary for O(1) lookup time.
98
- field_dict = {field.name: field for field in frontend_node.template.fields}
99
- reordered_fields = [field_dict[name] for name in field_order if name in field_dict]
100
- # Add any fields that are not in the field_order list
101
- reordered_fields.extend(field for field in frontend_node.template.fields if field.name not in field_order)
102
- frontend_node.template.fields = reordered_fields
103
- frontend_node.field_order = field_order
104
-
105
-
106
- def add_base_classes(frontend_node: CustomComponentFrontendNode, return_types: list[str]) -> None:
107
- """Add base classes to the frontend node."""
108
- for return_type_instance in return_types:
109
- if return_type_instance is None:
110
- raise HTTPException(
111
- status_code=400,
112
- detail={
113
- "error": ("Invalid return type. Please check your code and try again."),
114
- "traceback": traceback.format_exc(),
115
- },
116
- )
117
-
118
- base_classes = get_base_classes(return_type_instance)
119
- if return_type_instance is str:
120
- base_classes.append("Text")
121
-
122
- for base_class in base_classes:
123
- frontend_node.add_base_class(base_class)
124
-
125
-
126
- def extract_type_from_optional(field_type):
127
- """Extract the type from a string formatted as "Optional[<type>]".
128
-
129
- Parameters:
130
- field_type (str): The string from which to extract the type.
131
-
132
- Returns:
133
- str: The extracted type, or an empty string if no type was found.
134
- """
135
- if "optional" not in field_type.lower():
136
- return field_type
137
- match = re.search(r"\[(.*?)\]$", field_type)
138
- return match[1] if match else field_type
139
-
140
-
141
- def get_field_properties(extra_field):
142
- """Get the properties of an extra field."""
143
- field_name = extra_field["name"]
144
- field_type = extra_field.get("type", "str")
145
- field_value = extra_field.get("default", "")
146
- # a required field is a field that does not contain
147
- # optional in field_type
148
- # and a field that does not have a default value
149
- field_required = "optional" not in field_type.lower() and isinstance(field_value, MissingDefault)
150
- field_value = field_value if not isinstance(field_value, MissingDefault) else None
151
-
152
- if not field_required:
153
- field_type = extract_type_from_optional(field_type)
154
- if field_value is not None:
155
- with contextlib.suppress(Exception):
156
- field_value = ast.literal_eval(field_value)
157
- return field_name, field_type, field_value, field_required
158
-
159
-
160
- def process_type(field_type: str):
161
- if field_type.startswith(("list", "List")):
162
- return extract_inner_type(field_type)
163
-
164
- # field_type is a string can be Prompt or Code too
165
- # so we just need to lower if it is the case
166
- lowercase_type = field_type.lower()
167
- if lowercase_type in {"prompt", "code"}:
168
- return lowercase_type
169
- return field_type
170
-
171
-
172
- def add_new_custom_field(
173
- *,
174
- frontend_node: CustomComponentFrontendNode,
175
- field_name: str,
176
- field_type: str,
177
- field_value: Any,
178
- field_required: bool,
179
- field_config: dict,
180
- ):
181
- # Check field_config if any of the keys are in it
182
- # if it is, update the value
183
- display_name = field_config.pop("display_name", None)
184
- if not field_type:
185
- if "type" in field_config and field_config["type"] is not None:
186
- field_type = field_config.pop("type")
187
- elif "field_type" in field_config and field_config["field_type"] is not None:
188
- field_type = field_config.pop("field_type")
189
- field_contains_list = "list" in field_type.lower()
190
- field_type = process_type(field_type)
191
- field_value = field_config.pop("value", field_value)
192
- field_advanced = field_config.pop("advanced", False)
193
-
194
- if field_type == "Dict":
195
- field_type = "dict"
196
-
197
- if field_type == "bool" and field_value is None:
198
- field_value = False
199
-
200
- if field_type == "SecretStr":
201
- field_config["password"] = True
202
- field_config["load_from_db"] = True
203
- field_config["input_types"] = ["Text"]
204
-
205
- # If options is a list, then it's a dropdown or multiselect
206
- # If options is None, then it's a list of strings
207
- is_list = isinstance(field_config.get("options"), list)
208
- field_config["is_list"] = is_list or field_config.get("list", False) or field_contains_list
209
-
210
- if "name" in field_config:
211
- logger.warning("The 'name' key in field_config is used to build the object and can't be changed.")
212
- required = field_config.pop("required", field_required)
213
- placeholder = field_config.pop("placeholder", "")
214
-
215
- new_field = Input(
216
- name=field_name,
217
- field_type=field_type,
218
- value=field_value,
219
- show=True,
220
- required=required,
221
- advanced=field_advanced,
222
- placeholder=placeholder,
223
- display_name=display_name,
224
- **sanitize_field_config(field_config),
225
- )
226
- frontend_node.template.upsert_field(field_name, new_field)
227
- if isinstance(frontend_node.custom_fields, dict):
228
- frontend_node.custom_fields[field_name] = None
229
-
230
- return frontend_node
231
-
232
-
233
- def add_extra_fields(frontend_node, field_config, function_args) -> None:
234
- """Add extra fields to the frontend node."""
235
- if not function_args:
236
- return
237
- field_config_ = field_config.copy()
238
- function_args_names = [arg["name"] for arg in function_args]
239
- # If kwargs is in the function_args and not all field_config keys are in function_args
240
- # then we need to add the extra fields
241
-
242
- for extra_field in function_args:
243
- if "name" not in extra_field or extra_field["name"] in {
244
- "self",
245
- "kwargs",
246
- "args",
247
- }:
248
- continue
249
-
250
- field_name, field_type, field_value, field_required = get_field_properties(extra_field)
251
- config = field_config_.pop(field_name, {})
252
- frontend_node = add_new_custom_field(
253
- frontend_node=frontend_node,
254
- field_name=field_name,
255
- field_type=field_type,
256
- field_value=field_value,
257
- field_required=field_required,
258
- field_config=config,
259
- )
260
- if "kwargs" in function_args_names and not all(key in function_args_names for key in field_config):
261
- for field_name, config in field_config_.items():
262
- if "name" not in config or field_name == "code":
263
- continue
264
- config_ = config.model_dump() if isinstance(config, BaseModel) else config
265
- field_name_, field_type, field_value, field_required = get_field_properties(extra_field=config_)
266
- frontend_node = add_new_custom_field(
267
- frontend_node=frontend_node,
268
- field_name=field_name_,
269
- field_type=field_type,
270
- field_value=field_value,
271
- field_required=field_required,
272
- field_config=config_,
273
- )
274
-
275
-
276
- def get_field_dict(field: Input | dict):
277
- """Get the field dictionary from a Input or a dict."""
278
- if isinstance(field, Input):
279
- return dotdict(field.model_dump(by_alias=True, exclude_none=True))
280
- return field
281
-
282
-
283
- def run_build_inputs(
284
- custom_component: Component,
285
- ):
286
- """Run the build inputs of a custom component."""
287
- try:
288
- return custom_component.build_inputs()
289
- # add_extra_fields(frontend_node, field_config, field_config.values())
290
- except Exception as exc:
291
- logger.exception("Error running build inputs")
292
- raise HTTPException(status_code=500, detail=str(exc)) from exc
293
-
294
-
295
- def get_component_instance(custom_component: CustomComponent | Component, user_id: str | UUID | None = None):
296
- """Returns an instance of a custom component, evaluating its code if necessary.
297
-
298
- If the input is already an instance of `Component` or `CustomComponent`, it is returned directly.
299
- Otherwise, the function evaluates the component's code to create and return an instance. Raises an
300
- HTTP 400 error if the code is missing, invalid, or instantiation fails.
301
- """
302
- # Fast path: avoid repeated str comparisons
303
-
304
- code = custom_component._code
305
- if not isinstance(code, str):
306
- # Only two failure cases: None, or other non-str
307
- error = "Code is None" if code is None else "Invalid code type"
308
- msg = f"Invalid type conversion: {error}. Please check your code and try again."
309
- logger.error(msg)
310
- raise HTTPException(status_code=400, detail={"error": msg})
311
-
312
- # Only now, try to process expensive exception/log traceback only *if needed*
313
- try:
314
- custom_class = eval_custom_component_code(code)
315
- except Exception as exc:
316
- # Only generate traceback if an error occurs (save time on success)
317
- tb = traceback.format_exc()
318
- logger.error("Error while evaluating custom component code\n%s", tb)
319
- raise HTTPException(
320
- status_code=400,
321
- detail={
322
- "error": "Invalid type conversion. Please check your code and try again.",
323
- "traceback": tb,
324
- },
325
- ) from exc
326
-
327
- try:
328
- return custom_class(_user_id=user_id, _code=code)
329
- except Exception as exc:
330
- tb = traceback.format_exc()
331
- logger.error("Error while instantiating custom component\n%s", tb)
332
- # Only log inner traceback if present in 'detail'
333
- detail_tb = getattr(exc, "detail", {}).get("traceback", None)
334
- if detail_tb is not None:
335
- logger.error(detail_tb)
336
- raise
337
-
338
-
339
- def is_a_preimported_component(custom_component: CustomComponent):
340
- """Check if the component is a preimported component."""
341
- klass = type(custom_component)
342
- # This avoids double type lookups, and may speed up the common-case short-circuit
343
- return issubclass(klass, Component) and klass is not Component
344
-
345
-
346
- def run_build_config(
347
- custom_component: CustomComponent,
348
- user_id: str | UUID | None = None,
349
- ) -> tuple[dict, CustomComponent]:
350
- """Builds the field configuration dictionary for a custom component.
351
-
352
- If the input is an instance of a subclass of Component (excluding Component itself), returns its
353
- build configuration and the instance. Otherwise, evaluates the component's code to create an instance,
354
- calls its build_config method, and processes any RangeSpec objects in the configuration. Raises an
355
- HTTP 400 error if the code is missing or invalid, or if instantiation or configuration building fails.
356
-
357
- Returns:
358
- A tuple containing the field configuration dictionary and the component instance.
359
- """
360
- # Check if the instance's class is a subclass of Component (but not Component itself)
361
- # If we have a Component that is a subclass of Component, that means
362
- # we have imported it
363
- # If not, it means the component was loaded through LANGFLOW_COMPONENTS_PATH
364
- # and loaded from a file
365
- if is_a_preimported_component(custom_component):
366
- return custom_component.build_config(), custom_component
367
-
368
- if custom_component._code is None:
369
- error = "Code is None"
370
- elif not isinstance(custom_component._code, str):
371
- error = "Invalid code type"
372
- else:
373
- try:
374
- custom_class = eval_custom_component_code(custom_component._code)
375
- except Exception as exc:
376
- logger.exception("Error while evaluating custom component code")
377
- raise HTTPException(
378
- status_code=400,
379
- detail={
380
- "error": ("Invalid type conversion. Please check your code and try again."),
381
- "traceback": traceback.format_exc(),
382
- },
383
- ) from exc
384
-
385
- try:
386
- custom_instance = custom_class(_user_id=user_id)
387
- build_config: dict = custom_instance.build_config()
388
-
389
- for field_name, field in build_config.copy().items():
390
- # Allow user to build Input as well
391
- # as a dict with the same keys as Input
392
- field_dict = get_field_dict(field)
393
- # Let's check if "rangeSpec" is a RangeSpec object
394
- if "rangeSpec" in field_dict and isinstance(field_dict["rangeSpec"], RangeSpec):
395
- field_dict["rangeSpec"] = field_dict["rangeSpec"].model_dump()
396
- build_config[field_name] = field_dict
397
-
398
- except Exception as exc:
399
- logger.exception("Error while building field config")
400
- if hasattr(exc, "detail") and "traceback" in exc.detail:
401
- logger.error(exc.detail["traceback"])
402
- raise
403
- return build_config, custom_instance
404
-
405
- msg = f"Invalid type conversion: {error}. Please check your code and try again."
406
- logger.error(msg)
407
- raise HTTPException(
408
- status_code=400,
409
- detail={"error": msg},
410
- )
411
-
412
-
413
- def add_code_field(frontend_node: CustomComponentFrontendNode, raw_code):
414
- code_field = Input(
415
- dynamic=True,
416
- required=True,
417
- placeholder="",
418
- multiline=True,
419
- value=raw_code,
420
- password=False,
421
- name="code",
422
- advanced=True,
423
- field_type="code",
424
- is_list=False,
425
- )
426
- frontend_node.template.add_field(code_field)
427
-
428
- return frontend_node
429
-
430
-
431
- def add_code_field_to_build_config(build_config: dict, raw_code: str):
432
- build_config["code"] = Input(
433
- dynamic=True,
434
- required=True,
435
- placeholder="",
436
- multiline=True,
437
- value=raw_code,
438
- password=False,
439
- name="code",
440
- advanced=True,
441
- field_type="code",
442
- is_list=False,
443
- ).model_dump()
444
- return build_config
445
-
446
-
447
- def get_module_name_from_display_name(display_name: str):
448
- """Get the module name from the display name."""
449
- # Convert display name to snake_case for Python module name
450
- # e.g., "Custom Component" -> "custom_component"
451
- # Remove extra spaces and convert to lowercase
452
- cleaned_name = re.sub(r"\s+", " ", display_name.strip())
453
- # Replace spaces with underscores and convert to lowercase
454
- module_name = cleaned_name.replace(" ", "_").lower()
455
- # Remove any non-alphanumeric characters except underscores
456
- return re.sub(r"[^a-z0-9_]", "", module_name)
457
-
458
-
459
- def build_custom_component_template_from_inputs(
460
- custom_component: Component | CustomComponent, user_id: str | UUID | None = None, module_name: str | None = None
461
- ):
462
- # The List of Inputs fills the role of the build_config and the entrypoint_args
463
- """Builds a frontend node template from a custom component using its input-based configuration.
464
-
465
- This function generates a frontend node template by extracting input fields from the component,
466
- adding the code field, determining output types from method return types, validating the component,
467
- setting base classes, and reordering fields. Returns the frontend node as a dictionary along with
468
- the component instance.
469
-
470
- Returns:
471
- A tuple containing the frontend node dictionary and the component instance.
472
- """
473
- ctype_name = custom_component.__class__.__name__
474
- if ctype_name in _COMPONENT_TYPE_NAMES:
475
- cc_instance = get_component_instance(custom_component, user_id=user_id)
476
-
477
- field_config = cc_instance.get_template_config(cc_instance)
478
- frontend_node = ComponentFrontendNode.from_inputs(**field_config)
479
-
480
- else:
481
- frontend_node = ComponentFrontendNode.from_inputs(**custom_component.template_config)
482
- cc_instance = custom_component
483
- frontend_node = add_code_field(frontend_node, custom_component._code)
484
- # But we now need to calculate the return_type of the methods in the outputs
485
- for output in frontend_node.outputs:
486
- if output.types:
487
- continue
488
- return_types = cc_instance.get_method_return_type(output.method)
489
- return_types = [format_type(return_type) for return_type in return_types]
490
- output.add_types(return_types)
491
-
492
- # Validate that there is not name overlap between inputs and outputs
493
- frontend_node.validate_component()
494
- # ! This should be removed when we have a better way to handle this
495
- frontend_node.set_base_classes_from_outputs()
496
- reorder_fields(frontend_node, cc_instance._get_field_order())
497
- frontend_node = build_component_metadata(frontend_node, cc_instance, module_name, ctype_name)
498
-
499
- return frontend_node.to_dict(keep_name=False), cc_instance
500
-
501
-
502
- def build_component_metadata(
503
- frontend_node: CustomComponentFrontendNode, custom_component: CustomComponent, module_name: str, ctype_name: str
504
- ):
505
- """Build the metadata for a custom component."""
506
- if module_name:
507
- frontend_node.metadata["module"] = module_name
508
- else:
509
- module_name = get_module_name_from_display_name(frontend_node.display_name)
510
- frontend_node.metadata["module"] = f"custom_components.{module_name}"
511
-
512
- # Generate code hash for cache invalidation and debugging
513
- try:
514
- code_hash = _generate_code_hash(custom_component._code, module_name)
515
- if code_hash:
516
- frontend_node.metadata["code_hash"] = code_hash
517
- except Exception as exc: # noqa: BLE001
518
- logger.debug(f"Error generating code hash for {custom_component.__class__.__name__}", exc_info=exc)
519
-
520
- # Analyze component dependencies
521
- try:
522
- dependency_info = analyze_component_dependencies(custom_component._code)
523
- frontend_node.metadata["dependencies"] = dependency_info
524
- except (SyntaxError, TypeError, ValueError, ImportError) as exc:
525
- logger.warning(f"Failed to analyze dependencies for component {ctype_name}: {exc}")
526
- # Set minimal dependency info on failure
527
- frontend_node.metadata["dependencies"] = {
528
- "total_dependencies": 0,
529
- "dependencies": [],
530
- }
531
-
532
- return frontend_node
533
-
534
-
535
- def build_custom_component_template(
536
- custom_component: CustomComponent,
537
- user_id: str | UUID | None = None,
538
- module_name: str | None = None,
539
- ) -> tuple[dict[str, Any], CustomComponent | Component]:
540
- """Builds a frontend node template and instance for a custom component.
541
-
542
- If the component uses input-based configuration, delegates to the appropriate builder. Otherwise,
543
- constructs a frontend node from the component's template configuration, adds extra fields, code,
544
- base classes, and output types, reorders fields, and returns the resulting template dictionary
545
- along with the component instance.
546
-
547
- Raises:
548
- HTTPException: If the component is missing required attributes or if any error occurs during
549
- template construction.
550
- """
551
- try:
552
- has_template_config = hasattr(custom_component, "template_config")
553
- except Exception as exc:
554
- raise HTTPException(
555
- status_code=400,
556
- detail={
557
- "error": (f"Error building Component: {exc}"),
558
- "traceback": traceback.format_exc(),
559
- },
560
- ) from exc
561
- if not has_template_config:
562
- raise HTTPException(
563
- status_code=400,
564
- detail={
565
- "error": ("Error building Component. Please check if you are importing Component correctly."),
566
- },
567
- )
568
- try:
569
- if "inputs" in custom_component.template_config:
570
- return build_custom_component_template_from_inputs(
571
- custom_component, user_id=user_id, module_name=module_name
572
- )
573
- frontend_node = CustomComponentFrontendNode(**custom_component.template_config)
574
-
575
- field_config, custom_instance = run_build_config(
576
- custom_component,
577
- user_id=user_id,
578
- )
579
-
580
- entrypoint_args = custom_component.get_function_entrypoint_args
581
-
582
- add_extra_fields(frontend_node, field_config, entrypoint_args)
583
-
584
- frontend_node = add_code_field(frontend_node, custom_component._code)
585
-
586
- add_base_classes(frontend_node, custom_component._get_function_entrypoint_return_type)
587
- add_output_types(frontend_node, custom_component._get_function_entrypoint_return_type)
588
-
589
- reorder_fields(frontend_node, custom_instance._get_field_order())
590
-
591
- if module_name:
592
- frontend_node = build_component_metadata(
593
- frontend_node, custom_component, module_name, custom_component.__class__.__name__
594
- )
595
-
596
- return frontend_node.to_dict(keep_name=False), custom_instance
597
- except Exception as exc:
598
- if isinstance(exc, HTTPException):
599
- raise
600
- raise HTTPException(
601
- status_code=400,
602
- detail={
603
- "error": (f"Error building Component: {exc}"),
604
- "traceback": traceback.format_exc(),
605
- },
606
- ) from exc
607
-
608
-
609
- def create_component_template(
610
- component: dict | None = None,
611
- component_extractor: Component | CustomComponent | None = None,
612
- module_name: str | None = None,
613
- ):
614
- """Creates a component template and instance from either a component dictionary or an existing component extractor.
615
-
616
- If a component dictionary is provided, a new Component instance is created from its code. If a component
617
- extractor is provided, it is used directly. The function returns the generated template and the component
618
- instance. Output types are set on the template if missing.
619
- """
620
- component_output_types = []
621
- if component_extractor is None and component is not None:
622
- component_code = component["code"]
623
- component_output_types = component["output_types"]
624
-
625
- component_extractor = Component(_code=component_code)
626
-
627
- component_template, component_instance = build_custom_component_template(
628
- component_extractor, module_name=module_name
629
- )
630
- if not component_template["output_types"] and component_output_types:
631
- component_template["output_types"] = component_output_types
632
-
633
- return component_template, component_instance
634
-
635
-
636
- def build_custom_components(components_paths: list[str]):
637
- """Build custom components from the specified paths."""
638
- if not components_paths:
639
- return {}
640
-
641
- logger.info(f"Building custom components from {components_paths}")
642
-
643
- custom_components_from_file: dict = {}
644
- processed_paths = set()
645
- for path in components_paths:
646
- path_str = str(path)
647
- if path_str in processed_paths:
648
- continue
649
-
650
- custom_component_dict = build_custom_component_list_from_path(path_str)
651
- if custom_component_dict:
652
- category = next(iter(custom_component_dict))
653
- logger.debug(f"Loading {len(custom_component_dict[category])} component(s) from category {category}")
654
- custom_components_from_file = merge_nested_dicts_with_renaming(
655
- custom_components_from_file, custom_component_dict
656
- )
657
- processed_paths.add(path_str)
658
-
659
- return custom_components_from_file
660
-
661
-
662
- async def abuild_custom_components(components_paths: list[str]):
663
- """Build custom components from the specified paths."""
664
- if not components_paths:
665
- return {}
666
-
667
- await logger.adebug(f"Building custom components from {components_paths}")
668
- custom_components_from_file: dict = {}
669
- processed_paths = set()
670
- for path in components_paths:
671
- path_str = str(path)
672
- if path_str in processed_paths:
673
- continue
674
-
675
- custom_component_dict = await abuild_custom_component_list_from_path(path_str)
676
- if custom_component_dict:
677
- category = next(iter(custom_component_dict))
678
- await logger.adebug(f"Loading {len(custom_component_dict[category])} component(s) from category {category}")
679
- custom_components_from_file = merge_nested_dicts_with_renaming(
680
- custom_components_from_file, custom_component_dict
681
- )
682
- processed_paths.add(path_str)
683
-
684
- return custom_components_from_file
685
-
686
-
687
- def sanitize_field_config(field_config: dict | Input):
688
- # If any of the already existing keys are in field_config, remove them
689
- field_dict = field_config.to_dict() if isinstance(field_config, Input) else field_config
690
- for key in [
691
- "name",
692
- "field_type",
693
- "value",
694
- "required",
695
- "placeholder",
696
- "display_name",
697
- "advanced",
698
- "show",
699
- ]:
700
- field_dict.pop(key, None)
701
-
702
- # Remove field_type and type because they were extracted already
703
- field_dict.pop("field_type", None)
704
- field_dict.pop("type", None)
705
-
706
- return field_dict
707
-
708
-
709
- def build_component(component):
710
- """Build a single component."""
711
- component_template, component_instance = create_component_template(component)
712
- component_name = get_instance_name(component_instance)
713
- return component_name, component_template
714
-
715
-
716
- def get_function(code):
717
- """Get the function."""
718
- function_name = validate.extract_function_name(code)
719
-
720
- return validate.create_function(code, function_name)
721
-
722
-
723
- def get_instance_name(instance):
724
- name = instance.__class__.__name__
725
- if hasattr(instance, "name") and instance.name:
726
- name = instance.name
727
- return name
728
-
729
-
730
- async def update_component_build_config(
731
- component: CustomComponent,
732
- build_config: dotdict,
733
- field_value: Any,
734
- field_name: str | None = None,
735
- ):
736
- if inspect.iscoroutinefunction(component.update_build_config):
737
- return await component.update_build_config(build_config, field_value, field_name)
738
- return await asyncio.to_thread(component.update_build_config, build_config, field_value, field_name)
739
-
740
-
741
- async def get_all_types_dict(components_paths: list[str]):
742
- """Get all types dictionary with full component loading."""
743
- # This is the async version of the existing function
744
- return await abuild_custom_components(components_paths=components_paths)
745
-
746
-
747
- async def get_single_component_dict(component_type: str, component_name: str, components_paths: list[str]):
748
- """Get a single component dictionary."""
749
- # For example, if components are loaded by importing Python modules:
750
- for base_path in components_paths:
751
- module_path = Path(base_path) / component_type / f"{component_name}.py"
752
- if module_path.exists():
753
- # Try to import the module
754
- module_name = f"langflow.components.{component_type}.{component_name}"
755
- try:
756
- # This is a simplified example - actual implementation may vary
757
- import importlib.util
758
-
759
- spec = importlib.util.spec_from_file_location(module_name, module_path)
760
- if spec and spec.loader:
761
- module = importlib.util.module_from_spec(spec)
762
- spec.loader.exec_module(module)
763
- if hasattr(module, "template"):
764
- return module.template
765
- except ImportError as e:
766
- await logger.aerror(f"Import error loading component {module_path}: {e!s}")
767
- except AttributeError as e:
768
- await logger.aerror(f"Attribute error loading component {module_path}: {e!s}")
769
- except ValueError as e:
770
- await logger.aerror(f"Value error loading component {module_path}: {e!s}")
771
- except (KeyError, IndexError) as e:
772
- await logger.aerror(f"Data structure error loading component {module_path}: {e!s}")
773
- except RuntimeError as e:
774
- await logger.aerror(f"Runtime error loading component {module_path}: {e!s}")
775
- await logger.adebug("Full traceback for runtime error", exc_info=True)
776
- except OSError as e:
777
- await logger.aerror(f"OS error loading component {module_path}: {e!s}")
778
-
779
- # If we get here, the component wasn't found or couldn't be loaded
780
- return None
781
-
782
-
783
- async def load_custom_component(component_name: str, components_paths: list[str]):
784
- """Load a custom component by name.
785
-
786
- Args:
787
- component_name: Name of the component to load
788
- components_paths: List of paths to search for components
789
- """
790
- from langflow.interface.custom_component import get_custom_component_from_name
791
-
792
- try:
793
- # First try to get the component from the registered components
794
- component_class = get_custom_component_from_name(component_name)
795
- if component_class:
796
- # Define the function locally if it's not imported
797
- def get_custom_component_template(component_cls):
798
- """Get template for a custom component class."""
799
- # This is a simplified implementation - adjust as needed
800
- if hasattr(component_cls, "get_template"):
801
- return component_cls.get_template()
802
- if hasattr(component_cls, "template"):
803
- return component_cls.template
804
- return None
805
-
806
- return get_custom_component_template(component_class)
807
-
808
- # If not found in registered components, search in the provided paths
809
- for path in components_paths:
810
- # Try to find the component in different category directories
811
- base_path = Path(path)
812
- if base_path.exists() and base_path.is_dir():
813
- # Search for the component in all subdirectories
814
- for category_dir in base_path.iterdir():
815
- if category_dir.is_dir():
816
- component_file = category_dir / f"{component_name}.py"
817
- if component_file.exists():
818
- # Try to import the module
819
- module_name = f"langflow.components.{category_dir.name}.{component_name}"
820
- try:
821
- import importlib.util
822
-
823
- spec = importlib.util.spec_from_file_location(module_name, component_file)
824
- if spec and spec.loader:
825
- module = importlib.util.module_from_spec(spec)
826
- spec.loader.exec_module(module)
827
- if hasattr(module, "template"):
828
- return module.template
829
- if hasattr(module, "get_template"):
830
- return module.get_template()
831
- except ImportError as e:
832
- await logger.aerror(f"Import error loading component {component_file}: {e!s}")
833
- await logger.adebug("Import error traceback", exc_info=True)
834
- except AttributeError as e:
835
- await logger.aerror(f"Attribute error loading component {component_file}: {e!s}")
836
- await logger.adebug("Attribute error traceback", exc_info=True)
837
- except (ValueError, TypeError) as e:
838
- await logger.aerror(f"Value/Type error loading component {component_file}: {e!s}")
839
- await logger.adebug("Value/Type error traceback", exc_info=True)
840
- except (KeyError, IndexError) as e:
841
- await logger.aerror(f"Data structure error loading component {component_file}: {e!s}")
842
- await logger.adebug("Data structure error traceback", exc_info=True)
843
- except RuntimeError as e:
844
- await logger.aerror(f"Runtime error loading component {component_file}: {e!s}")
845
- await logger.adebug("Runtime error traceback", exc_info=True)
846
- except OSError as e:
847
- await logger.aerror(f"OS error loading component {component_file}: {e!s}")
848
- await logger.adebug("OS error traceback", exc_info=True)
849
-
850
- except ImportError as e:
851
- await logger.aerror(f"Import error loading custom component {component_name}: {e!s}")
852
- return None
853
- except AttributeError as e:
854
- await logger.aerror(f"Attribute error loading custom component {component_name}: {e!s}")
855
- return None
856
- except ValueError as e:
857
- await logger.aerror(f"Value error loading custom component {component_name}: {e!s}")
858
- return None
859
- except (KeyError, IndexError) as e:
860
- await logger.aerror(f"Data structure error loading custom component {component_name}: {e!s}")
861
- return None
862
- except RuntimeError as e:
863
- await logger.aerror(f"Runtime error loading custom component {component_name}: {e!s}")
864
- logger.debug("Full traceback for runtime error", exc_info=True)
865
- return None
866
-
867
- # If we get here, the component wasn't found in any of the paths
868
- await logger.awarning(f"Component {component_name} not found in any of the provided paths")
869
- return None
870
-
871
-
872
- _COMPONENT_TYPE_NAMES = {"Component", "CustomComponent"}
1
+ from lfx.custom.utils import * # noqa: F403