lfx-nightly 0.1.11.dev0__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 (699) hide show
  1. lfx/__init__.py +0 -0
  2. lfx/__main__.py +25 -0
  3. lfx/base/__init__.py +0 -0
  4. lfx/base/agents/__init__.py +0 -0
  5. lfx/base/agents/agent.py +268 -0
  6. lfx/base/agents/callback.py +130 -0
  7. lfx/base/agents/context.py +109 -0
  8. lfx/base/agents/crewai/__init__.py +0 -0
  9. lfx/base/agents/crewai/crew.py +231 -0
  10. lfx/base/agents/crewai/tasks.py +12 -0
  11. lfx/base/agents/default_prompts.py +23 -0
  12. lfx/base/agents/errors.py +15 -0
  13. lfx/base/agents/events.py +346 -0
  14. lfx/base/agents/utils.py +205 -0
  15. lfx/base/astra_assistants/__init__.py +0 -0
  16. lfx/base/astra_assistants/util.py +171 -0
  17. lfx/base/chains/__init__.py +0 -0
  18. lfx/base/chains/model.py +19 -0
  19. lfx/base/composio/__init__.py +0 -0
  20. lfx/base/composio/composio_base.py +1291 -0
  21. lfx/base/compressors/__init__.py +0 -0
  22. lfx/base/compressors/model.py +60 -0
  23. lfx/base/constants.py +46 -0
  24. lfx/base/curl/__init__.py +0 -0
  25. lfx/base/curl/parse.py +188 -0
  26. lfx/base/data/__init__.py +5 -0
  27. lfx/base/data/base_file.py +685 -0
  28. lfx/base/data/docling_utils.py +245 -0
  29. lfx/base/data/utils.py +198 -0
  30. lfx/base/document_transformers/__init__.py +0 -0
  31. lfx/base/document_transformers/model.py +43 -0
  32. lfx/base/embeddings/__init__.py +0 -0
  33. lfx/base/embeddings/aiml_embeddings.py +62 -0
  34. lfx/base/embeddings/model.py +26 -0
  35. lfx/base/flow_processing/__init__.py +0 -0
  36. lfx/base/flow_processing/utils.py +86 -0
  37. lfx/base/huggingface/__init__.py +0 -0
  38. lfx/base/huggingface/model_bridge.py +133 -0
  39. lfx/base/io/__init__.py +0 -0
  40. lfx/base/io/chat.py +20 -0
  41. lfx/base/io/text.py +22 -0
  42. lfx/base/langchain_utilities/__init__.py +0 -0
  43. lfx/base/langchain_utilities/model.py +35 -0
  44. lfx/base/langchain_utilities/spider_constants.py +1 -0
  45. lfx/base/langwatch/__init__.py +0 -0
  46. lfx/base/langwatch/utils.py +18 -0
  47. lfx/base/mcp/__init__.py +0 -0
  48. lfx/base/mcp/constants.py +2 -0
  49. lfx/base/mcp/util.py +1398 -0
  50. lfx/base/memory/__init__.py +0 -0
  51. lfx/base/memory/memory.py +49 -0
  52. lfx/base/memory/model.py +38 -0
  53. lfx/base/models/__init__.py +3 -0
  54. lfx/base/models/aiml_constants.py +51 -0
  55. lfx/base/models/anthropic_constants.py +47 -0
  56. lfx/base/models/aws_constants.py +151 -0
  57. lfx/base/models/chat_result.py +76 -0
  58. lfx/base/models/google_generative_ai_constants.py +70 -0
  59. lfx/base/models/groq_constants.py +134 -0
  60. lfx/base/models/model.py +375 -0
  61. lfx/base/models/model_input_constants.py +307 -0
  62. lfx/base/models/model_metadata.py +41 -0
  63. lfx/base/models/model_utils.py +8 -0
  64. lfx/base/models/novita_constants.py +35 -0
  65. lfx/base/models/ollama_constants.py +49 -0
  66. lfx/base/models/openai_constants.py +122 -0
  67. lfx/base/models/sambanova_constants.py +18 -0
  68. lfx/base/processing/__init__.py +0 -0
  69. lfx/base/prompts/__init__.py +0 -0
  70. lfx/base/prompts/api_utils.py +224 -0
  71. lfx/base/prompts/utils.py +61 -0
  72. lfx/base/textsplitters/__init__.py +0 -0
  73. lfx/base/textsplitters/model.py +28 -0
  74. lfx/base/tools/__init__.py +0 -0
  75. lfx/base/tools/base.py +26 -0
  76. lfx/base/tools/component_tool.py +325 -0
  77. lfx/base/tools/constants.py +49 -0
  78. lfx/base/tools/flow_tool.py +132 -0
  79. lfx/base/tools/run_flow.py +224 -0
  80. lfx/base/vectorstores/__init__.py +0 -0
  81. lfx/base/vectorstores/model.py +193 -0
  82. lfx/base/vectorstores/utils.py +22 -0
  83. lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
  84. lfx/cli/__init__.py +5 -0
  85. lfx/cli/commands.py +319 -0
  86. lfx/cli/common.py +650 -0
  87. lfx/cli/run.py +441 -0
  88. lfx/cli/script_loader.py +247 -0
  89. lfx/cli/serve_app.py +546 -0
  90. lfx/cli/validation.py +69 -0
  91. lfx/components/FAISS/__init__.py +34 -0
  92. lfx/components/FAISS/faiss.py +111 -0
  93. lfx/components/Notion/__init__.py +19 -0
  94. lfx/components/Notion/add_content_to_page.py +269 -0
  95. lfx/components/Notion/create_page.py +94 -0
  96. lfx/components/Notion/list_database_properties.py +68 -0
  97. lfx/components/Notion/list_pages.py +122 -0
  98. lfx/components/Notion/list_users.py +77 -0
  99. lfx/components/Notion/page_content_viewer.py +93 -0
  100. lfx/components/Notion/search.py +111 -0
  101. lfx/components/Notion/update_page_property.py +114 -0
  102. lfx/components/__init__.py +411 -0
  103. lfx/components/_importing.py +42 -0
  104. lfx/components/agentql/__init__.py +3 -0
  105. lfx/components/agentql/agentql_api.py +151 -0
  106. lfx/components/agents/__init__.py +34 -0
  107. lfx/components/agents/agent.py +558 -0
  108. lfx/components/agents/mcp_component.py +501 -0
  109. lfx/components/aiml/__init__.py +37 -0
  110. lfx/components/aiml/aiml.py +112 -0
  111. lfx/components/aiml/aiml_embeddings.py +37 -0
  112. lfx/components/amazon/__init__.py +36 -0
  113. lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
  114. lfx/components/amazon/amazon_bedrock_model.py +124 -0
  115. lfx/components/amazon/s3_bucket_uploader.py +211 -0
  116. lfx/components/anthropic/__init__.py +34 -0
  117. lfx/components/anthropic/anthropic.py +187 -0
  118. lfx/components/apify/__init__.py +5 -0
  119. lfx/components/apify/apify_actor.py +325 -0
  120. lfx/components/arxiv/__init__.py +3 -0
  121. lfx/components/arxiv/arxiv.py +163 -0
  122. lfx/components/assemblyai/__init__.py +46 -0
  123. lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  124. lfx/components/assemblyai/assemblyai_lemur.py +183 -0
  125. lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  126. lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  127. lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
  128. lfx/components/azure/__init__.py +37 -0
  129. lfx/components/azure/azure_openai.py +95 -0
  130. lfx/components/azure/azure_openai_embeddings.py +83 -0
  131. lfx/components/baidu/__init__.py +32 -0
  132. lfx/components/baidu/baidu_qianfan_chat.py +113 -0
  133. lfx/components/bing/__init__.py +3 -0
  134. lfx/components/bing/bing_search_api.py +61 -0
  135. lfx/components/cassandra/__init__.py +40 -0
  136. lfx/components/cassandra/cassandra.py +264 -0
  137. lfx/components/cassandra/cassandra_chat.py +92 -0
  138. lfx/components/cassandra/cassandra_graph.py +238 -0
  139. lfx/components/chains/__init__.py +3 -0
  140. lfx/components/chroma/__init__.py +34 -0
  141. lfx/components/chroma/chroma.py +167 -0
  142. lfx/components/cleanlab/__init__.py +40 -0
  143. lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
  144. lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  145. lfx/components/cleanlab/cleanlab_remediator.py +131 -0
  146. lfx/components/clickhouse/__init__.py +34 -0
  147. lfx/components/clickhouse/clickhouse.py +135 -0
  148. lfx/components/cloudflare/__init__.py +32 -0
  149. lfx/components/cloudflare/cloudflare.py +81 -0
  150. lfx/components/cohere/__init__.py +40 -0
  151. lfx/components/cohere/cohere_embeddings.py +81 -0
  152. lfx/components/cohere/cohere_models.py +46 -0
  153. lfx/components/cohere/cohere_rerank.py +51 -0
  154. lfx/components/composio/__init__.py +74 -0
  155. lfx/components/composio/composio_api.py +268 -0
  156. lfx/components/composio/dropbox_compnent.py +11 -0
  157. lfx/components/composio/github_composio.py +11 -0
  158. lfx/components/composio/gmail_composio.py +38 -0
  159. lfx/components/composio/googlecalendar_composio.py +11 -0
  160. lfx/components/composio/googlemeet_composio.py +11 -0
  161. lfx/components/composio/googletasks_composio.py +8 -0
  162. lfx/components/composio/linear_composio.py +11 -0
  163. lfx/components/composio/outlook_composio.py +11 -0
  164. lfx/components/composio/reddit_composio.py +11 -0
  165. lfx/components/composio/slack_composio.py +582 -0
  166. lfx/components/composio/slackbot_composio.py +11 -0
  167. lfx/components/composio/supabase_composio.py +11 -0
  168. lfx/components/composio/todoist_composio.py +11 -0
  169. lfx/components/composio/youtube_composio.py +11 -0
  170. lfx/components/confluence/__init__.py +3 -0
  171. lfx/components/confluence/confluence.py +84 -0
  172. lfx/components/couchbase/__init__.py +34 -0
  173. lfx/components/couchbase/couchbase.py +102 -0
  174. lfx/components/crewai/__init__.py +49 -0
  175. lfx/components/crewai/crewai.py +107 -0
  176. lfx/components/crewai/hierarchical_crew.py +46 -0
  177. lfx/components/crewai/hierarchical_task.py +44 -0
  178. lfx/components/crewai/sequential_crew.py +52 -0
  179. lfx/components/crewai/sequential_task.py +73 -0
  180. lfx/components/crewai/sequential_task_agent.py +143 -0
  181. lfx/components/custom_component/__init__.py +34 -0
  182. lfx/components/custom_component/custom_component.py +31 -0
  183. lfx/components/data/__init__.py +64 -0
  184. lfx/components/data/api_request.py +544 -0
  185. lfx/components/data/csv_to_data.py +95 -0
  186. lfx/components/data/directory.py +113 -0
  187. lfx/components/data/file.py +577 -0
  188. lfx/components/data/json_to_data.py +98 -0
  189. lfx/components/data/news_search.py +164 -0
  190. lfx/components/data/rss.py +69 -0
  191. lfx/components/data/sql_executor.py +101 -0
  192. lfx/components/data/url.py +311 -0
  193. lfx/components/data/web_search.py +112 -0
  194. lfx/components/data/webhook.py +56 -0
  195. lfx/components/datastax/__init__.py +70 -0
  196. lfx/components/datastax/astra_assistant_manager.py +306 -0
  197. lfx/components/datastax/astra_db.py +75 -0
  198. lfx/components/datastax/astra_vectorize.py +124 -0
  199. lfx/components/datastax/astradb.py +1285 -0
  200. lfx/components/datastax/astradb_cql.py +314 -0
  201. lfx/components/datastax/astradb_graph.py +330 -0
  202. lfx/components/datastax/astradb_tool.py +414 -0
  203. lfx/components/datastax/astradb_vectorstore.py +1285 -0
  204. lfx/components/datastax/cassandra.py +92 -0
  205. lfx/components/datastax/create_assistant.py +58 -0
  206. lfx/components/datastax/create_thread.py +32 -0
  207. lfx/components/datastax/dotenv.py +35 -0
  208. lfx/components/datastax/get_assistant.py +37 -0
  209. lfx/components/datastax/getenvvar.py +30 -0
  210. lfx/components/datastax/graph_rag.py +141 -0
  211. lfx/components/datastax/hcd.py +314 -0
  212. lfx/components/datastax/list_assistants.py +25 -0
  213. lfx/components/datastax/run.py +89 -0
  214. lfx/components/deactivated/__init__.py +15 -0
  215. lfx/components/deactivated/amazon_kendra.py +66 -0
  216. lfx/components/deactivated/chat_litellm_model.py +158 -0
  217. lfx/components/deactivated/code_block_extractor.py +26 -0
  218. lfx/components/deactivated/documents_to_data.py +22 -0
  219. lfx/components/deactivated/embed.py +16 -0
  220. lfx/components/deactivated/extract_key_from_data.py +46 -0
  221. lfx/components/deactivated/json_document_builder.py +57 -0
  222. lfx/components/deactivated/list_flows.py +20 -0
  223. lfx/components/deactivated/mcp_sse.py +61 -0
  224. lfx/components/deactivated/mcp_stdio.py +62 -0
  225. lfx/components/deactivated/merge_data.py +93 -0
  226. lfx/components/deactivated/message.py +37 -0
  227. lfx/components/deactivated/metal.py +54 -0
  228. lfx/components/deactivated/multi_query.py +59 -0
  229. lfx/components/deactivated/retriever.py +43 -0
  230. lfx/components/deactivated/selective_passthrough.py +77 -0
  231. lfx/components/deactivated/should_run_next.py +40 -0
  232. lfx/components/deactivated/split_text.py +63 -0
  233. lfx/components/deactivated/store_message.py +24 -0
  234. lfx/components/deactivated/sub_flow.py +124 -0
  235. lfx/components/deactivated/vectara_self_query.py +76 -0
  236. lfx/components/deactivated/vector_store.py +24 -0
  237. lfx/components/deepseek/__init__.py +34 -0
  238. lfx/components/deepseek/deepseek.py +136 -0
  239. lfx/components/docling/__init__.py +43 -0
  240. lfx/components/docling/chunk_docling_document.py +186 -0
  241. lfx/components/docling/docling_inline.py +231 -0
  242. lfx/components/docling/docling_remote.py +193 -0
  243. lfx/components/docling/export_docling_document.py +117 -0
  244. lfx/components/documentloaders/__init__.py +3 -0
  245. lfx/components/duckduckgo/__init__.py +3 -0
  246. lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  247. lfx/components/elastic/__init__.py +37 -0
  248. lfx/components/elastic/elasticsearch.py +267 -0
  249. lfx/components/elastic/opensearch.py +243 -0
  250. lfx/components/embeddings/__init__.py +37 -0
  251. lfx/components/embeddings/similarity.py +76 -0
  252. lfx/components/embeddings/text_embedder.py +64 -0
  253. lfx/components/exa/__init__.py +3 -0
  254. lfx/components/exa/exa_search.py +68 -0
  255. lfx/components/firecrawl/__init__.py +43 -0
  256. lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
  257. lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
  258. lfx/components/firecrawl/firecrawl_map_api.py +89 -0
  259. lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
  260. lfx/components/git/__init__.py +4 -0
  261. lfx/components/git/git.py +262 -0
  262. lfx/components/git/gitextractor.py +196 -0
  263. lfx/components/glean/__init__.py +3 -0
  264. lfx/components/glean/glean_search_api.py +173 -0
  265. lfx/components/google/__init__.py +17 -0
  266. lfx/components/google/gmail.py +192 -0
  267. lfx/components/google/google_bq_sql_executor.py +157 -0
  268. lfx/components/google/google_drive.py +92 -0
  269. lfx/components/google/google_drive_search.py +152 -0
  270. lfx/components/google/google_generative_ai.py +147 -0
  271. lfx/components/google/google_generative_ai_embeddings.py +141 -0
  272. lfx/components/google/google_oauth_token.py +89 -0
  273. lfx/components/google/google_search_api_core.py +68 -0
  274. lfx/components/google/google_serper_api_core.py +74 -0
  275. lfx/components/groq/__init__.py +34 -0
  276. lfx/components/groq/groq.py +136 -0
  277. lfx/components/helpers/__init__.py +52 -0
  278. lfx/components/helpers/calculator_core.py +89 -0
  279. lfx/components/helpers/create_list.py +40 -0
  280. lfx/components/helpers/current_date.py +42 -0
  281. lfx/components/helpers/id_generator.py +42 -0
  282. lfx/components/helpers/memory.py +251 -0
  283. lfx/components/helpers/output_parser.py +45 -0
  284. lfx/components/helpers/store_message.py +90 -0
  285. lfx/components/homeassistant/__init__.py +7 -0
  286. lfx/components/homeassistant/home_assistant_control.py +152 -0
  287. lfx/components/homeassistant/list_home_assistant_states.py +137 -0
  288. lfx/components/huggingface/__init__.py +37 -0
  289. lfx/components/huggingface/huggingface.py +197 -0
  290. lfx/components/huggingface/huggingface_inference_api.py +106 -0
  291. lfx/components/ibm/__init__.py +34 -0
  292. lfx/components/ibm/watsonx.py +203 -0
  293. lfx/components/ibm/watsonx_embeddings.py +135 -0
  294. lfx/components/icosacomputing/__init__.py +5 -0
  295. lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
  296. lfx/components/input_output/__init__.py +38 -0
  297. lfx/components/input_output/chat.py +120 -0
  298. lfx/components/input_output/chat_output.py +200 -0
  299. lfx/components/input_output/text.py +27 -0
  300. lfx/components/input_output/text_output.py +29 -0
  301. lfx/components/jigsawstack/__init__.py +23 -0
  302. lfx/components/jigsawstack/ai_scrape.py +126 -0
  303. lfx/components/jigsawstack/ai_web_search.py +136 -0
  304. lfx/components/jigsawstack/file_read.py +115 -0
  305. lfx/components/jigsawstack/file_upload.py +94 -0
  306. lfx/components/jigsawstack/image_generation.py +205 -0
  307. lfx/components/jigsawstack/nsfw.py +60 -0
  308. lfx/components/jigsawstack/object_detection.py +124 -0
  309. lfx/components/jigsawstack/sentiment.py +112 -0
  310. lfx/components/jigsawstack/text_to_sql.py +90 -0
  311. lfx/components/jigsawstack/text_translate.py +77 -0
  312. lfx/components/jigsawstack/vocr.py +107 -0
  313. lfx/components/langchain_utilities/__init__.py +109 -0
  314. lfx/components/langchain_utilities/character.py +53 -0
  315. lfx/components/langchain_utilities/conversation.py +59 -0
  316. lfx/components/langchain_utilities/csv_agent.py +107 -0
  317. lfx/components/langchain_utilities/fake_embeddings.py +26 -0
  318. lfx/components/langchain_utilities/html_link_extractor.py +35 -0
  319. lfx/components/langchain_utilities/json_agent.py +45 -0
  320. lfx/components/langchain_utilities/langchain_hub.py +126 -0
  321. lfx/components/langchain_utilities/language_recursive.py +49 -0
  322. lfx/components/langchain_utilities/language_semantic.py +138 -0
  323. lfx/components/langchain_utilities/llm_checker.py +39 -0
  324. lfx/components/langchain_utilities/llm_math.py +42 -0
  325. lfx/components/langchain_utilities/natural_language.py +61 -0
  326. lfx/components/langchain_utilities/openai_tools.py +53 -0
  327. lfx/components/langchain_utilities/openapi.py +48 -0
  328. lfx/components/langchain_utilities/recursive_character.py +60 -0
  329. lfx/components/langchain_utilities/retrieval_qa.py +83 -0
  330. lfx/components/langchain_utilities/runnable_executor.py +137 -0
  331. lfx/components/langchain_utilities/self_query.py +80 -0
  332. lfx/components/langchain_utilities/spider.py +142 -0
  333. lfx/components/langchain_utilities/sql.py +40 -0
  334. lfx/components/langchain_utilities/sql_database.py +35 -0
  335. lfx/components/langchain_utilities/sql_generator.py +78 -0
  336. lfx/components/langchain_utilities/tool_calling.py +59 -0
  337. lfx/components/langchain_utilities/vector_store_info.py +49 -0
  338. lfx/components/langchain_utilities/vector_store_router.py +33 -0
  339. lfx/components/langchain_utilities/xml_agent.py +71 -0
  340. lfx/components/langwatch/__init__.py +3 -0
  341. lfx/components/langwatch/langwatch.py +278 -0
  342. lfx/components/link_extractors/__init__.py +3 -0
  343. lfx/components/lmstudio/__init__.py +34 -0
  344. lfx/components/lmstudio/lmstudioembeddings.py +89 -0
  345. lfx/components/lmstudio/lmstudiomodel.py +129 -0
  346. lfx/components/logic/__init__.py +52 -0
  347. lfx/components/logic/conditional_router.py +171 -0
  348. lfx/components/logic/data_conditional_router.py +125 -0
  349. lfx/components/logic/flow_tool.py +110 -0
  350. lfx/components/logic/listen.py +29 -0
  351. lfx/components/logic/loop.py +125 -0
  352. lfx/components/logic/notify.py +88 -0
  353. lfx/components/logic/pass_message.py +35 -0
  354. lfx/components/logic/run_flow.py +71 -0
  355. lfx/components/logic/sub_flow.py +114 -0
  356. lfx/components/maritalk/__init__.py +32 -0
  357. lfx/components/maritalk/maritalk.py +52 -0
  358. lfx/components/mem0/__init__.py +3 -0
  359. lfx/components/mem0/mem0_chat_memory.py +136 -0
  360. lfx/components/milvus/__init__.py +34 -0
  361. lfx/components/milvus/milvus.py +115 -0
  362. lfx/components/mistral/__init__.py +37 -0
  363. lfx/components/mistral/mistral.py +114 -0
  364. lfx/components/mistral/mistral_embeddings.py +58 -0
  365. lfx/components/models/__init__.py +34 -0
  366. lfx/components/models/embedding_model.py +114 -0
  367. lfx/components/models/language_model.py +144 -0
  368. lfx/components/mongodb/__init__.py +34 -0
  369. lfx/components/mongodb/mongodb_atlas.py +213 -0
  370. lfx/components/needle/__init__.py +3 -0
  371. lfx/components/needle/needle.py +104 -0
  372. lfx/components/notdiamond/__init__.py +34 -0
  373. lfx/components/notdiamond/notdiamond.py +228 -0
  374. lfx/components/novita/__init__.py +32 -0
  375. lfx/components/novita/novita.py +130 -0
  376. lfx/components/nvidia/__init__.py +57 -0
  377. lfx/components/nvidia/nvidia.py +157 -0
  378. lfx/components/nvidia/nvidia_embedding.py +77 -0
  379. lfx/components/nvidia/nvidia_ingest.py +317 -0
  380. lfx/components/nvidia/nvidia_rerank.py +63 -0
  381. lfx/components/nvidia/system_assist.py +65 -0
  382. lfx/components/olivya/__init__.py +3 -0
  383. lfx/components/olivya/olivya.py +116 -0
  384. lfx/components/ollama/__init__.py +37 -0
  385. lfx/components/ollama/ollama.py +330 -0
  386. lfx/components/ollama/ollama_embeddings.py +106 -0
  387. lfx/components/openai/__init__.py +37 -0
  388. lfx/components/openai/openai.py +100 -0
  389. lfx/components/openai/openai_chat_model.py +176 -0
  390. lfx/components/openrouter/__init__.py +32 -0
  391. lfx/components/openrouter/openrouter.py +202 -0
  392. lfx/components/output_parsers/__init__.py +3 -0
  393. lfx/components/perplexity/__init__.py +34 -0
  394. lfx/components/perplexity/perplexity.py +75 -0
  395. lfx/components/pgvector/__init__.py +34 -0
  396. lfx/components/pgvector/pgvector.py +72 -0
  397. lfx/components/pinecone/__init__.py +34 -0
  398. lfx/components/pinecone/pinecone.py +134 -0
  399. lfx/components/processing/__init__.py +117 -0
  400. lfx/components/processing/alter_metadata.py +108 -0
  401. lfx/components/processing/batch_run.py +205 -0
  402. lfx/components/processing/combine_text.py +39 -0
  403. lfx/components/processing/converter.py +159 -0
  404. lfx/components/processing/create_data.py +110 -0
  405. lfx/components/processing/data_operations.py +438 -0
  406. lfx/components/processing/data_to_dataframe.py +70 -0
  407. lfx/components/processing/dataframe_operations.py +313 -0
  408. lfx/components/processing/extract_key.py +53 -0
  409. lfx/components/processing/filter_data.py +42 -0
  410. lfx/components/processing/filter_data_values.py +88 -0
  411. lfx/components/processing/json_cleaner.py +103 -0
  412. lfx/components/processing/lambda_filter.py +154 -0
  413. lfx/components/processing/llm_router.py +499 -0
  414. lfx/components/processing/merge_data.py +90 -0
  415. lfx/components/processing/message_to_data.py +36 -0
  416. lfx/components/processing/parse_data.py +70 -0
  417. lfx/components/processing/parse_dataframe.py +68 -0
  418. lfx/components/processing/parse_json_data.py +90 -0
  419. lfx/components/processing/parser.py +143 -0
  420. lfx/components/processing/prompt.py +67 -0
  421. lfx/components/processing/python_repl_core.py +98 -0
  422. lfx/components/processing/regex.py +82 -0
  423. lfx/components/processing/save_file.py +225 -0
  424. lfx/components/processing/select_data.py +48 -0
  425. lfx/components/processing/split_text.py +141 -0
  426. lfx/components/processing/structured_output.py +202 -0
  427. lfx/components/processing/update_data.py +160 -0
  428. lfx/components/prototypes/__init__.py +34 -0
  429. lfx/components/prototypes/python_function.py +73 -0
  430. lfx/components/qdrant/__init__.py +34 -0
  431. lfx/components/qdrant/qdrant.py +109 -0
  432. lfx/components/redis/__init__.py +37 -0
  433. lfx/components/redis/redis.py +89 -0
  434. lfx/components/redis/redis_chat.py +43 -0
  435. lfx/components/sambanova/__init__.py +32 -0
  436. lfx/components/sambanova/sambanova.py +84 -0
  437. lfx/components/scrapegraph/__init__.py +40 -0
  438. lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  439. lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
  440. lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  441. lfx/components/searchapi/__init__.py +34 -0
  442. lfx/components/searchapi/search.py +79 -0
  443. lfx/components/serpapi/__init__.py +3 -0
  444. lfx/components/serpapi/serp.py +115 -0
  445. lfx/components/supabase/__init__.py +34 -0
  446. lfx/components/supabase/supabase.py +76 -0
  447. lfx/components/tavily/__init__.py +4 -0
  448. lfx/components/tavily/tavily_extract.py +117 -0
  449. lfx/components/tavily/tavily_search.py +212 -0
  450. lfx/components/textsplitters/__init__.py +3 -0
  451. lfx/components/toolkits/__init__.py +3 -0
  452. lfx/components/tools/__init__.py +72 -0
  453. lfx/components/tools/calculator.py +108 -0
  454. lfx/components/tools/google_search_api.py +45 -0
  455. lfx/components/tools/google_serper_api.py +115 -0
  456. lfx/components/tools/python_code_structured_tool.py +327 -0
  457. lfx/components/tools/python_repl.py +97 -0
  458. lfx/components/tools/search_api.py +87 -0
  459. lfx/components/tools/searxng.py +145 -0
  460. lfx/components/tools/serp_api.py +119 -0
  461. lfx/components/tools/tavily_search_tool.py +344 -0
  462. lfx/components/tools/wikidata_api.py +102 -0
  463. lfx/components/tools/wikipedia_api.py +49 -0
  464. lfx/components/tools/yahoo_finance.py +129 -0
  465. lfx/components/twelvelabs/__init__.py +52 -0
  466. lfx/components/twelvelabs/convert_astra_results.py +84 -0
  467. lfx/components/twelvelabs/pegasus_index.py +311 -0
  468. lfx/components/twelvelabs/split_video.py +291 -0
  469. lfx/components/twelvelabs/text_embeddings.py +57 -0
  470. lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  471. lfx/components/twelvelabs/video_embeddings.py +100 -0
  472. lfx/components/twelvelabs/video_file.py +179 -0
  473. lfx/components/unstructured/__init__.py +3 -0
  474. lfx/components/unstructured/unstructured.py +121 -0
  475. lfx/components/upstash/__init__.py +34 -0
  476. lfx/components/upstash/upstash.py +124 -0
  477. lfx/components/vectara/__init__.py +37 -0
  478. lfx/components/vectara/vectara.py +97 -0
  479. lfx/components/vectara/vectara_rag.py +164 -0
  480. lfx/components/vectorstores/__init__.py +40 -0
  481. lfx/components/vectorstores/astradb.py +1285 -0
  482. lfx/components/vectorstores/astradb_graph.py +319 -0
  483. lfx/components/vectorstores/cassandra.py +264 -0
  484. lfx/components/vectorstores/cassandra_graph.py +238 -0
  485. lfx/components/vectorstores/chroma.py +167 -0
  486. lfx/components/vectorstores/clickhouse.py +135 -0
  487. lfx/components/vectorstores/couchbase.py +102 -0
  488. lfx/components/vectorstores/elasticsearch.py +267 -0
  489. lfx/components/vectorstores/faiss.py +111 -0
  490. lfx/components/vectorstores/graph_rag.py +141 -0
  491. lfx/components/vectorstores/hcd.py +314 -0
  492. lfx/components/vectorstores/local_db.py +261 -0
  493. lfx/components/vectorstores/milvus.py +115 -0
  494. lfx/components/vectorstores/mongodb_atlas.py +213 -0
  495. lfx/components/vectorstores/opensearch.py +243 -0
  496. lfx/components/vectorstores/pgvector.py +72 -0
  497. lfx/components/vectorstores/pinecone.py +134 -0
  498. lfx/components/vectorstores/qdrant.py +109 -0
  499. lfx/components/vectorstores/supabase.py +76 -0
  500. lfx/components/vectorstores/upstash.py +124 -0
  501. lfx/components/vectorstores/vectara.py +97 -0
  502. lfx/components/vectorstores/vectara_rag.py +164 -0
  503. lfx/components/vectorstores/weaviate.py +89 -0
  504. lfx/components/vertexai/__init__.py +37 -0
  505. lfx/components/vertexai/vertexai.py +71 -0
  506. lfx/components/vertexai/vertexai_embeddings.py +67 -0
  507. lfx/components/weaviate/__init__.py +34 -0
  508. lfx/components/weaviate/weaviate.py +89 -0
  509. lfx/components/wikipedia/__init__.py +4 -0
  510. lfx/components/wikipedia/wikidata.py +86 -0
  511. lfx/components/wikipedia/wikipedia.py +53 -0
  512. lfx/components/wolframalpha/__init__.py +3 -0
  513. lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
  514. lfx/components/xai/__init__.py +32 -0
  515. lfx/components/xai/xai.py +167 -0
  516. lfx/components/yahoosearch/__init__.py +3 -0
  517. lfx/components/yahoosearch/yahoo.py +137 -0
  518. lfx/components/youtube/__init__.py +52 -0
  519. lfx/components/youtube/channel.py +227 -0
  520. lfx/components/youtube/comments.py +231 -0
  521. lfx/components/youtube/playlist.py +33 -0
  522. lfx/components/youtube/search.py +120 -0
  523. lfx/components/youtube/trending.py +285 -0
  524. lfx/components/youtube/video_details.py +263 -0
  525. lfx/components/youtube/youtube_transcripts.py +118 -0
  526. lfx/components/zep/__init__.py +3 -0
  527. lfx/components/zep/zep.py +44 -0
  528. lfx/constants.py +6 -0
  529. lfx/custom/__init__.py +7 -0
  530. lfx/custom/attributes.py +86 -0
  531. lfx/custom/code_parser/__init__.py +3 -0
  532. lfx/custom/code_parser/code_parser.py +361 -0
  533. lfx/custom/custom_component/__init__.py +0 -0
  534. lfx/custom/custom_component/base_component.py +128 -0
  535. lfx/custom/custom_component/component.py +1808 -0
  536. lfx/custom/custom_component/component_with_cache.py +8 -0
  537. lfx/custom/custom_component/custom_component.py +588 -0
  538. lfx/custom/dependency_analyzer.py +165 -0
  539. lfx/custom/directory_reader/__init__.py +3 -0
  540. lfx/custom/directory_reader/directory_reader.py +359 -0
  541. lfx/custom/directory_reader/utils.py +171 -0
  542. lfx/custom/eval.py +12 -0
  543. lfx/custom/schema.py +32 -0
  544. lfx/custom/tree_visitor.py +21 -0
  545. lfx/custom/utils.py +877 -0
  546. lfx/custom/validate.py +488 -0
  547. lfx/events/__init__.py +1 -0
  548. lfx/events/event_manager.py +110 -0
  549. lfx/exceptions/__init__.py +0 -0
  550. lfx/exceptions/component.py +15 -0
  551. lfx/field_typing/__init__.py +91 -0
  552. lfx/field_typing/constants.py +215 -0
  553. lfx/field_typing/range_spec.py +35 -0
  554. lfx/graph/__init__.py +6 -0
  555. lfx/graph/edge/__init__.py +0 -0
  556. lfx/graph/edge/base.py +277 -0
  557. lfx/graph/edge/schema.py +119 -0
  558. lfx/graph/edge/utils.py +0 -0
  559. lfx/graph/graph/__init__.py +0 -0
  560. lfx/graph/graph/ascii.py +202 -0
  561. lfx/graph/graph/base.py +2238 -0
  562. lfx/graph/graph/constants.py +63 -0
  563. lfx/graph/graph/runnable_vertices_manager.py +133 -0
  564. lfx/graph/graph/schema.py +52 -0
  565. lfx/graph/graph/state_model.py +66 -0
  566. lfx/graph/graph/utils.py +1024 -0
  567. lfx/graph/schema.py +75 -0
  568. lfx/graph/state/__init__.py +0 -0
  569. lfx/graph/state/model.py +237 -0
  570. lfx/graph/utils.py +200 -0
  571. lfx/graph/vertex/__init__.py +0 -0
  572. lfx/graph/vertex/base.py +823 -0
  573. lfx/graph/vertex/constants.py +0 -0
  574. lfx/graph/vertex/exceptions.py +4 -0
  575. lfx/graph/vertex/param_handler.py +264 -0
  576. lfx/graph/vertex/schema.py +26 -0
  577. lfx/graph/vertex/utils.py +19 -0
  578. lfx/graph/vertex/vertex_types.py +489 -0
  579. lfx/helpers/__init__.py +1 -0
  580. lfx/helpers/base_model.py +71 -0
  581. lfx/helpers/custom.py +13 -0
  582. lfx/helpers/data.py +167 -0
  583. lfx/helpers/flow.py +194 -0
  584. lfx/inputs/__init__.py +68 -0
  585. lfx/inputs/constants.py +2 -0
  586. lfx/inputs/input_mixin.py +328 -0
  587. lfx/inputs/inputs.py +714 -0
  588. lfx/inputs/validators.py +19 -0
  589. lfx/interface/__init__.py +6 -0
  590. lfx/interface/components.py +489 -0
  591. lfx/interface/importing/__init__.py +5 -0
  592. lfx/interface/importing/utils.py +39 -0
  593. lfx/interface/initialize/__init__.py +3 -0
  594. lfx/interface/initialize/loading.py +224 -0
  595. lfx/interface/listing.py +26 -0
  596. lfx/interface/run.py +16 -0
  597. lfx/interface/utils.py +111 -0
  598. lfx/io/__init__.py +63 -0
  599. lfx/io/schema.py +289 -0
  600. lfx/load/__init__.py +8 -0
  601. lfx/load/load.py +256 -0
  602. lfx/load/utils.py +99 -0
  603. lfx/log/__init__.py +5 -0
  604. lfx/log/logger.py +385 -0
  605. lfx/memory/__init__.py +90 -0
  606. lfx/memory/stubs.py +283 -0
  607. lfx/processing/__init__.py +1 -0
  608. lfx/processing/process.py +238 -0
  609. lfx/processing/utils.py +25 -0
  610. lfx/py.typed +0 -0
  611. lfx/schema/__init__.py +66 -0
  612. lfx/schema/artifact.py +83 -0
  613. lfx/schema/content_block.py +62 -0
  614. lfx/schema/content_types.py +91 -0
  615. lfx/schema/data.py +308 -0
  616. lfx/schema/dataframe.py +210 -0
  617. lfx/schema/dotdict.py +74 -0
  618. lfx/schema/encoders.py +13 -0
  619. lfx/schema/graph.py +47 -0
  620. lfx/schema/image.py +131 -0
  621. lfx/schema/json_schema.py +141 -0
  622. lfx/schema/log.py +61 -0
  623. lfx/schema/message.py +473 -0
  624. lfx/schema/openai_responses_schemas.py +74 -0
  625. lfx/schema/properties.py +41 -0
  626. lfx/schema/schema.py +171 -0
  627. lfx/schema/serialize.py +13 -0
  628. lfx/schema/table.py +140 -0
  629. lfx/schema/validators.py +114 -0
  630. lfx/serialization/__init__.py +5 -0
  631. lfx/serialization/constants.py +2 -0
  632. lfx/serialization/serialization.py +314 -0
  633. lfx/services/__init__.py +23 -0
  634. lfx/services/base.py +28 -0
  635. lfx/services/cache/__init__.py +6 -0
  636. lfx/services/cache/base.py +183 -0
  637. lfx/services/cache/service.py +166 -0
  638. lfx/services/cache/utils.py +169 -0
  639. lfx/services/chat/__init__.py +1 -0
  640. lfx/services/chat/config.py +2 -0
  641. lfx/services/chat/schema.py +10 -0
  642. lfx/services/deps.py +129 -0
  643. lfx/services/factory.py +19 -0
  644. lfx/services/initialize.py +19 -0
  645. lfx/services/interfaces.py +103 -0
  646. lfx/services/manager.py +172 -0
  647. lfx/services/schema.py +20 -0
  648. lfx/services/session.py +82 -0
  649. lfx/services/settings/__init__.py +3 -0
  650. lfx/services/settings/auth.py +130 -0
  651. lfx/services/settings/base.py +539 -0
  652. lfx/services/settings/constants.py +31 -0
  653. lfx/services/settings/factory.py +23 -0
  654. lfx/services/settings/feature_flags.py +12 -0
  655. lfx/services/settings/service.py +35 -0
  656. lfx/services/settings/utils.py +40 -0
  657. lfx/services/shared_component_cache/__init__.py +1 -0
  658. lfx/services/shared_component_cache/factory.py +30 -0
  659. lfx/services/shared_component_cache/service.py +9 -0
  660. lfx/services/storage/__init__.py +5 -0
  661. lfx/services/storage/local.py +155 -0
  662. lfx/services/storage/service.py +54 -0
  663. lfx/services/tracing/__init__.py +1 -0
  664. lfx/services/tracing/service.py +21 -0
  665. lfx/settings.py +6 -0
  666. lfx/template/__init__.py +6 -0
  667. lfx/template/field/__init__.py +0 -0
  668. lfx/template/field/base.py +257 -0
  669. lfx/template/field/prompt.py +15 -0
  670. lfx/template/frontend_node/__init__.py +6 -0
  671. lfx/template/frontend_node/base.py +212 -0
  672. lfx/template/frontend_node/constants.py +65 -0
  673. lfx/template/frontend_node/custom_components.py +79 -0
  674. lfx/template/template/__init__.py +0 -0
  675. lfx/template/template/base.py +100 -0
  676. lfx/template/utils.py +217 -0
  677. lfx/type_extraction/__init__.py +19 -0
  678. lfx/type_extraction/type_extraction.py +75 -0
  679. lfx/type_extraction.py +80 -0
  680. lfx/utils/__init__.py +1 -0
  681. lfx/utils/async_helpers.py +42 -0
  682. lfx/utils/component_utils.py +154 -0
  683. lfx/utils/concurrency.py +60 -0
  684. lfx/utils/connection_string_parser.py +11 -0
  685. lfx/utils/constants.py +205 -0
  686. lfx/utils/data_structure.py +212 -0
  687. lfx/utils/exceptions.py +22 -0
  688. lfx/utils/helpers.py +28 -0
  689. lfx/utils/image.py +73 -0
  690. lfx/utils/lazy_load.py +15 -0
  691. lfx/utils/request_utils.py +18 -0
  692. lfx/utils/schemas.py +139 -0
  693. lfx/utils/util.py +481 -0
  694. lfx/utils/util_strings.py +56 -0
  695. lfx/utils/version.py +24 -0
  696. lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
  697. lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
  698. lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
  699. lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,215 @@
1
+ """Constants for field typing used throughout lfx package."""
2
+
3
+ import importlib.util
4
+ from collections.abc import Callable
5
+ from typing import Text, TypeAlias, TypeVar
6
+
7
+ # Safe imports that don't create circular dependencies
8
+ try:
9
+ from langchain.agents.agent import AgentExecutor
10
+ from langchain.chains.base import Chain
11
+ from langchain.memory.chat_memory import BaseChatMemory
12
+ from langchain_core.chat_history import BaseChatMessageHistory
13
+ from langchain_core.document_loaders import BaseLoader
14
+ from langchain_core.documents import Document
15
+ from langchain_core.documents.compressor import BaseDocumentCompressor
16
+ from langchain_core.embeddings import Embeddings
17
+ from langchain_core.language_models import BaseLanguageModel, BaseLLM
18
+ from langchain_core.language_models.chat_models import BaseChatModel
19
+ from langchain_core.memory import BaseMemory
20
+ from langchain_core.output_parsers import BaseLLMOutputParser, BaseOutputParser
21
+ from langchain_core.prompts import BasePromptTemplate, ChatPromptTemplate, PromptTemplate
22
+ from langchain_core.retrievers import BaseRetriever
23
+ from langchain_core.tools import BaseTool, Tool
24
+ from langchain_core.vectorstores import VectorStore, VectorStoreRetriever
25
+ from langchain_text_splitters import TextSplitter
26
+ except ImportError:
27
+ # Create stub types if langchain is not available
28
+ class AgentExecutor:
29
+ pass
30
+
31
+ class Chain:
32
+ pass
33
+
34
+ class BaseChatMemory:
35
+ pass
36
+
37
+ class BaseChatMessageHistory:
38
+ pass
39
+
40
+ class BaseLoader:
41
+ pass
42
+
43
+ class Document:
44
+ pass
45
+
46
+ class BaseDocumentCompressor:
47
+ pass
48
+
49
+ class Embeddings:
50
+ pass
51
+
52
+ class BaseLanguageModel:
53
+ pass
54
+
55
+ class BaseLLM:
56
+ pass
57
+
58
+ class BaseChatModel:
59
+ pass
60
+
61
+ class BaseMemory:
62
+ pass
63
+
64
+ class BaseLLMOutputParser:
65
+ pass
66
+
67
+ class BaseOutputParser:
68
+ pass
69
+
70
+ class BasePromptTemplate:
71
+ pass
72
+
73
+ class ChatPromptTemplate:
74
+ pass
75
+
76
+ class PromptTemplate:
77
+ pass
78
+
79
+ class BaseRetriever:
80
+ pass
81
+
82
+ class BaseTool:
83
+ pass
84
+
85
+ class Tool:
86
+ pass
87
+
88
+ class VectorStore:
89
+ pass
90
+
91
+ class VectorStoreRetriever:
92
+ pass
93
+
94
+ class TextSplitter:
95
+ pass
96
+
97
+
98
+ # Import lfx schema types (avoid circular deps)
99
+ from lfx.schema.data import Data
100
+
101
+ # Type aliases
102
+ NestedDict: TypeAlias = dict[str, str | dict]
103
+ LanguageModel = TypeVar("LanguageModel", BaseLanguageModel, BaseLLM, BaseChatModel)
104
+ ToolEnabledLanguageModel = TypeVar("ToolEnabledLanguageModel", BaseLanguageModel, BaseLLM, BaseChatModel)
105
+ Memory = TypeVar("Memory", bound=BaseChatMessageHistory)
106
+
107
+ Retriever = TypeVar(
108
+ "Retriever",
109
+ BaseRetriever,
110
+ VectorStoreRetriever,
111
+ )
112
+ OutputParser = TypeVar(
113
+ "OutputParser",
114
+ BaseOutputParser,
115
+ BaseLLMOutputParser,
116
+ )
117
+
118
+
119
+ class Object:
120
+ """Generic object type for custom components."""
121
+
122
+
123
+ class Code:
124
+ """Code type for custom components."""
125
+
126
+
127
+ # Langchain base types mapping
128
+ LANGCHAIN_BASE_TYPES = {
129
+ "Chain": Chain,
130
+ "AgentExecutor": AgentExecutor,
131
+ "BaseTool": BaseTool,
132
+ "Tool": Tool,
133
+ "BaseLLM": BaseLLM,
134
+ "BaseLanguageModel": BaseLanguageModel,
135
+ "PromptTemplate": PromptTemplate,
136
+ "ChatPromptTemplate": ChatPromptTemplate,
137
+ "BasePromptTemplate": BasePromptTemplate,
138
+ "BaseLoader": BaseLoader,
139
+ "Document": Document,
140
+ "TextSplitter": TextSplitter,
141
+ "VectorStore": VectorStore,
142
+ "Embeddings": Embeddings,
143
+ "BaseRetriever": BaseRetriever,
144
+ "BaseOutputParser": BaseOutputParser,
145
+ "BaseMemory": BaseMemory,
146
+ "BaseChatMemory": BaseChatMemory,
147
+ "BaseChatModel": BaseChatModel,
148
+ "Memory": Memory,
149
+ "BaseDocumentCompressor": BaseDocumentCompressor,
150
+ }
151
+
152
+ # Langchain base types plus Python base types
153
+ CUSTOM_COMPONENT_SUPPORTED_TYPES = {
154
+ **LANGCHAIN_BASE_TYPES,
155
+ "NestedDict": NestedDict,
156
+ "Data": Data,
157
+ "Text": Text, # noqa: UP019
158
+ "Object": Object,
159
+ "Callable": Callable,
160
+ "LanguageModel": LanguageModel,
161
+ "Retriever": Retriever,
162
+ }
163
+
164
+ # Default import string for component code generation
165
+ LANGCHAIN_IMPORT_STRING = """from langchain.agents.agent import AgentExecutor
166
+ from langchain.chains.base import Chain
167
+ from langchain.memory.chat_memory import BaseChatMemory
168
+ from langchain_core.chat_history import BaseChatMessageHistory
169
+ from langchain_core.document_loaders import BaseLoader
170
+ from langchain_core.documents import Document
171
+ from langchain_core.embeddings import Embeddings
172
+ from langchain_core.language_models import BaseLanguageModel, BaseLLM
173
+ from langchain_core.language_models.chat_models import BaseChatModel
174
+ from langchain_core.memory import BaseMemory
175
+ from langchain_core.output_parsers import BaseLLMOutputParser, BaseOutputParser
176
+ from langchain_core.prompts import BasePromptTemplate, ChatPromptTemplate, PromptTemplate
177
+ from langchain_core.retrievers import BaseRetriever
178
+ from langchain_core.documents.compressor import BaseDocumentCompressor
179
+ from langchain_core.tools import BaseTool, Tool
180
+ from langchain_core.vectorstores import VectorStore, VectorStoreRetriever
181
+ from langchain_text_splitters import TextSplitter
182
+ """
183
+
184
+
185
+ DEFAULT_IMPORT_STRING = """
186
+
187
+ from lfx.io import (
188
+ BoolInput,
189
+ CodeInput,
190
+ DataInput,
191
+ DictInput,
192
+ DropdownInput,
193
+ FileInput,
194
+ FloatInput,
195
+ HandleInput,
196
+ IntInput,
197
+ LinkInput,
198
+ MessageInput,
199
+ MessageTextInput,
200
+ MultilineInput,
201
+ MultilineSecretInput,
202
+ MultiselectInput,
203
+ NestedDictInput,
204
+ Output,
205
+ PromptInput,
206
+ SecretStrInput,
207
+ SliderInput,
208
+ StrInput,
209
+ TableInput,
210
+ )
211
+ from lfx.schema.data import Data
212
+ """
213
+
214
+ if importlib.util.find_spec("langchain") is not None:
215
+ DEFAULT_IMPORT_STRING = LANGCHAIN_IMPORT_STRING + DEFAULT_IMPORT_STRING
@@ -0,0 +1,35 @@
1
+ """Range specification for field types copied from langflow for lfx package."""
2
+
3
+ from typing import Literal
4
+
5
+ from pydantic import BaseModel, field_validator
6
+
7
+
8
+ class RangeSpec(BaseModel):
9
+ step_type: Literal["int", "float"] = "float"
10
+ min: float = -1.0
11
+ max: float = 1.0
12
+ step: float = 0.1
13
+
14
+ @field_validator("max")
15
+ @classmethod
16
+ def max_must_be_greater_than_min(cls, v, values):
17
+ if "min" in values.data and v <= values.data["min"]:
18
+ msg = "Max must be greater than min"
19
+ raise ValueError(msg)
20
+ return v
21
+
22
+ @field_validator("step")
23
+ @classmethod
24
+ def step_must_be_positive(cls, v, values):
25
+ if v <= 0:
26
+ msg = "Step must be positive"
27
+ raise ValueError(msg)
28
+ if values.data["step_type"] == "int" and isinstance(v, float) and not v.is_integer():
29
+ msg = "When step_type is int, step must be an integer"
30
+ raise ValueError(msg)
31
+ return v
32
+
33
+ @classmethod
34
+ def set_step_type(cls, step_type: Literal["int", "float"], range_spec: "RangeSpec") -> "RangeSpec":
35
+ return cls(min=range_spec.min, max=range_spec.max, step=range_spec.step, step_type=step_type)
lfx/graph/__init__.py ADDED
@@ -0,0 +1,6 @@
1
+ from lfx.graph.edge.base import Edge
2
+ from lfx.graph.graph.base import Graph
3
+ from lfx.graph.vertex.base import Vertex
4
+ from lfx.graph.vertex.vertex_types import CustomComponentVertex, InterfaceVertex, StateVertex
5
+
6
+ __all__ = ["CustomComponentVertex", "Edge", "Graph", "InterfaceVertex", "StateVertex", "Vertex"]
File without changes
lfx/graph/edge/base.py ADDED
@@ -0,0 +1,277 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any, cast
4
+
5
+ from lfx.graph.edge.schema import EdgeData, LoopTargetHandleDict, SourceHandle, TargetHandle, TargetHandleDict
6
+ from lfx.log.logger import logger
7
+ from lfx.schema.schema import INPUT_FIELD_NAME
8
+
9
+ if TYPE_CHECKING:
10
+ from lfx.graph.vertex.base import Vertex
11
+
12
+
13
+ class Edge:
14
+ def __init__(self, source: Vertex, target: Vertex, edge: EdgeData):
15
+ self.source_id: str = source.id if source else ""
16
+ self.target_id: str = target.id if target else ""
17
+ self.valid_handles: bool = False
18
+ self.target_param: str | None = None
19
+ self._target_handle: TargetHandleDict | str | None = None
20
+ self._data = edge.copy()
21
+ self.is_cycle = False
22
+ if data := edge.get("data", {}):
23
+ self._source_handle = data.get("sourceHandle", {})
24
+ self._target_handle = cast("TargetHandleDict", data.get("targetHandle", {}))
25
+ self.source_handle: SourceHandle = SourceHandle(**self._source_handle)
26
+ if isinstance(self._target_handle, dict):
27
+ try:
28
+ if "name" in self._target_handle:
29
+ self.target_handle: TargetHandle = TargetHandle.from_loop_target_handle(
30
+ cast("LoopTargetHandleDict", self._target_handle)
31
+ )
32
+ else:
33
+ self.target_handle = TargetHandle(**self._target_handle)
34
+ except Exception as e:
35
+ if "inputTypes" in self._target_handle and self._target_handle["inputTypes"] is None:
36
+ # Check if self._target_handle['fieldName']
37
+ if hasattr(target, "custom_component"):
38
+ display_name = getattr(target.custom_component, "display_name", "")
39
+ msg = (
40
+ f"Component {display_name} field '{self._target_handle['fieldName']}' "
41
+ "might not be a valid input."
42
+ )
43
+ raise ValueError(msg) from e
44
+ msg = (
45
+ f"Field '{self._target_handle['fieldName']}' on {target.display_name} "
46
+ "might not be a valid input."
47
+ )
48
+ raise ValueError(msg) from e
49
+ raise
50
+
51
+ else:
52
+ msg = "Target handle is not a dictionary"
53
+ raise ValueError(msg)
54
+ self.target_param = self.target_handle.field_name
55
+ # validate handles
56
+ self.validate_handles(source, target)
57
+ else:
58
+ # Logging here because this is a breaking change
59
+ logger.error("Edge data is empty")
60
+ self._source_handle = edge.get("sourceHandle", "") # type: ignore[assignment]
61
+ self._target_handle = edge.get("targetHandle", "") # type: ignore[assignment]
62
+ # 'BaseLoader;BaseOutputParser|documents|PromptTemplate-zmTlD'
63
+ # target_param is documents
64
+ if isinstance(self._target_handle, str):
65
+ self.target_param = self._target_handle.split("|")[1]
66
+ self.source_handle = None
67
+ self.target_handle = None
68
+ else:
69
+ msg = "Target handle is not a string"
70
+ raise ValueError(msg)
71
+ # Validate in __init__ to fail fast
72
+ self.validate_edge(source, target)
73
+
74
+ def to_data(self):
75
+ return self._data
76
+
77
+ def validate_handles(self, source, target) -> None:
78
+ if isinstance(self._source_handle, str) or self.source_handle.base_classes:
79
+ self._legacy_validate_handles(source, target)
80
+ else:
81
+ self._validate_handles(source, target)
82
+
83
+ def _validate_handles(self, source, target) -> None:
84
+ if self.target_handle.input_types is None:
85
+ self.valid_handles = self.target_handle.type in self.source_handle.output_types
86
+ elif self.target_handle.type is None:
87
+ # ! This is not a good solution
88
+ # This is a loop edge
89
+ # If the target_handle.type is None, it means it's a loop edge
90
+ # and we should check if the source_handle.output_types is not empty
91
+ # and if the target_handle.input_types is empty or if any of the source_handle.output_types
92
+ # is in the target_handle.input_types
93
+ self.valid_handles = bool(self.source_handle.output_types) and (
94
+ not self.target_handle.input_types
95
+ or any(output_type in self.target_handle.input_types for output_type in self.source_handle.output_types)
96
+ )
97
+
98
+ elif self.source_handle.output_types is not None:
99
+ self.valid_handles = (
100
+ any(output_type in self.target_handle.input_types for output_type in self.source_handle.output_types)
101
+ or self.target_handle.type in self.source_handle.output_types
102
+ )
103
+
104
+ if not self.valid_handles:
105
+ logger.debug(self.source_handle)
106
+ logger.debug(self.target_handle)
107
+ msg = f"Edge between {source.display_name} and {target.display_name} has invalid handles"
108
+ raise ValueError(msg)
109
+
110
+ def _legacy_validate_handles(self, source, target) -> None:
111
+ if self.target_handle.input_types is None:
112
+ self.valid_handles = self.target_handle.type in self.source_handle.base_classes
113
+ else:
114
+ self.valid_handles = (
115
+ any(baseClass in self.target_handle.input_types for baseClass in self.source_handle.base_classes)
116
+ or self.target_handle.type in self.source_handle.base_classes
117
+ )
118
+ if not self.valid_handles:
119
+ logger.debug(self.source_handle)
120
+ logger.debug(self.target_handle)
121
+ msg = f"Edge between {source.vertex_type} and {target.vertex_type} has invalid handles"
122
+ raise ValueError(msg)
123
+
124
+ def __setstate__(self, state):
125
+ self.source_id = state["source_id"]
126
+ self.target_id = state["target_id"]
127
+ self.target_param = state["target_param"]
128
+ self.source_handle = state.get("source_handle")
129
+ self.target_handle = state.get("target_handle")
130
+ self._source_handle = state.get("_source_handle")
131
+ self._target_handle = state.get("_target_handle")
132
+ self._data = state.get("_data")
133
+ self.valid_handles = state.get("valid_handles")
134
+ self.source_types = state.get("source_types")
135
+ self.target_reqs = state.get("target_reqs")
136
+ self.matched_type = state.get("matched_type")
137
+
138
+ def validate_edge(self, source, target) -> None:
139
+ # If the self.source_handle has base_classes, then we are using the legacy
140
+ # way of defining the source and target handles
141
+ if isinstance(self._source_handle, str) or self.source_handle.base_classes:
142
+ self._legacy_validate_edge(source, target)
143
+ else:
144
+ self._validate_edge(source, target)
145
+
146
+ def _validate_edge(self, source, target) -> None:
147
+ # Validate that the outputs of the source node are valid inputs
148
+ # for the target node
149
+ # .outputs is a list of Output objects as dictionaries
150
+ # meaning: check for "types" key in each dictionary
151
+ self.source_types = [output for output in source.outputs if output["name"] == self.source_handle.name]
152
+ self.target_reqs = target.required_inputs + target.optional_inputs
153
+ # Both lists contain strings and sometimes a string contains the value we are
154
+ # looking for e.g. comgin_out=["Chain"] and target_reqs=["LLMChain"]
155
+ # so we need to check if any of the strings in source_types is in target_reqs
156
+ self.valid = any(
157
+ any(output_type in target_req for output_type in output["types"])
158
+ for output in self.source_types
159
+ for target_req in self.target_reqs
160
+ )
161
+ # Get what type of input the target node is expecting
162
+
163
+ # Update the matched type to be the first found match
164
+ self.matched_type = next(
165
+ (
166
+ output_type
167
+ for output in self.source_types
168
+ for output_type in output["types"]
169
+ for target_req in self.target_reqs
170
+ if output_type in target_req
171
+ ),
172
+ None,
173
+ )
174
+ no_matched_type = self.matched_type is None
175
+ if no_matched_type:
176
+ logger.debug(self.source_types)
177
+ logger.debug(self.target_reqs)
178
+ msg = f"Edge between {source.vertex_type} and {target.vertex_type} has no matched type."
179
+ raise ValueError(msg)
180
+
181
+ def _legacy_validate_edge(self, source, target) -> None:
182
+ # Validate that the outputs of the source node are valid inputs
183
+ # for the target node
184
+ self.source_types = source.output
185
+ self.target_reqs = target.required_inputs + target.optional_inputs
186
+ # Both lists contain strings and sometimes a string contains the value we are
187
+ # looking for e.g. comgin_out=["Chain"] and target_reqs=["LLMChain"]
188
+ # so we need to check if any of the strings in source_types is in target_reqs
189
+ self.valid = any(output in target_req for output in self.source_types for target_req in self.target_reqs)
190
+ # Get what type of input the target node is expecting
191
+
192
+ self.matched_type = next(
193
+ (output for output in self.source_types if output in self.target_reqs),
194
+ None,
195
+ )
196
+ no_matched_type = self.matched_type is None
197
+ if no_matched_type:
198
+ logger.debug(self.source_types)
199
+ logger.debug(self.target_reqs)
200
+ msg = f"Edge between {source.vertex_type} and {target.vertex_type} has no matched type"
201
+ raise ValueError(msg)
202
+
203
+ def __repr__(self) -> str:
204
+ if (hasattr(self, "source_handle") and self.source_handle) and (
205
+ hasattr(self, "target_handle") and self.target_handle
206
+ ):
207
+ return f"{self.source_id} -[{self.source_handle.name}->{self.target_handle.field_name}]-> {self.target_id}"
208
+ return f"{self.source_id} -[{self.target_param}]-> {self.target_id}"
209
+
210
+ def __hash__(self) -> int:
211
+ return hash(self.__repr__())
212
+
213
+ def __eq__(self, /, other: object) -> bool:
214
+ if not isinstance(other, Edge):
215
+ return False
216
+ return (
217
+ self._source_handle == other._source_handle
218
+ and self._target_handle == other._target_handle
219
+ and self.target_param == other.target_param
220
+ )
221
+
222
+ def __str__(self) -> str:
223
+ return self.__repr__()
224
+
225
+
226
+ class CycleEdge(Edge):
227
+ def __init__(self, source: Vertex, target: Vertex, raw_edge: EdgeData):
228
+ super().__init__(source, target, raw_edge)
229
+ self.is_fulfilled = False # Whether the contract has been fulfilled.
230
+ self.result: Any = None
231
+ self.is_cycle = True
232
+ source.has_cycle_edges = True
233
+ target.has_cycle_edges = True
234
+
235
+ async def honor(self, source: Vertex, target: Vertex) -> None:
236
+ """Fulfills the contract by setting the result of the source vertex to the target vertex's parameter.
237
+
238
+ If the edge is runnable, the source vertex is run with the message text and the target vertex's
239
+ root_field param is set to the
240
+ result. If the edge is not runnable, the target vertex's parameter is set to the result.
241
+ :param message: The message object to be processed if the edge is runnable.
242
+ """
243
+ if self.is_fulfilled:
244
+ return
245
+
246
+ if not source.built:
247
+ # The system should be read-only, so we should not be building vertices
248
+ # that are not already built.
249
+ msg = f"Source vertex {source.id} is not built."
250
+ raise ValueError(msg)
251
+
252
+ if self.matched_type == "Text":
253
+ self.result = source.built_result
254
+ else:
255
+ self.result = source.built_object
256
+
257
+ target.params[self.target_param] = self.result
258
+ self.is_fulfilled = True
259
+
260
+ async def get_result_from_source(self, source: Vertex, target: Vertex):
261
+ # Fulfill the contract if it has not been fulfilled.
262
+ if not self.is_fulfilled:
263
+ await self.honor(source, target)
264
+
265
+ # If the target vertex is a power component we log messages
266
+ if (
267
+ target.vertex_type == "ChatOutput"
268
+ and isinstance(target.params.get(INPUT_FIELD_NAME), str | dict)
269
+ and target.params.get("message") == ""
270
+ ):
271
+ return self.result
272
+ return self.result
273
+
274
+ def __repr__(self) -> str:
275
+ str_repr = super().__repr__()
276
+ # Add a symbol to show this is a cycle edge
277
+ return f"{str_repr} 🔄"
@@ -0,0 +1,119 @@
1
+ from typing import Any
2
+
3
+ from pydantic import ConfigDict, Field, field_validator
4
+ from typing_extensions import TypedDict
5
+
6
+ from lfx.helpers.base_model import BaseModel
7
+
8
+
9
+ class SourceHandleDict(TypedDict, total=False):
10
+ baseClasses: list[str]
11
+ dataType: str
12
+ id: str
13
+ name: str | None
14
+ output_types: list[str]
15
+
16
+
17
+ class TargetHandleDict(TypedDict):
18
+ fieldName: str
19
+ id: str
20
+ inputTypes: list[str] | None
21
+ type: str
22
+
23
+
24
+ class LoopTargetHandleDict(TypedDict):
25
+ dataType: str
26
+ id: str
27
+ name: str
28
+ output_types: list[str]
29
+
30
+
31
+ class EdgeDataDetails(TypedDict):
32
+ sourceHandle: SourceHandleDict
33
+ targetHandle: TargetHandleDict | LoopTargetHandleDict
34
+
35
+
36
+ class EdgeData(TypedDict, total=False):
37
+ source: str
38
+ target: str
39
+ data: EdgeDataDetails
40
+
41
+
42
+ class ResultPair(BaseModel):
43
+ result: Any
44
+ extra: Any
45
+
46
+
47
+ class Payload(BaseModel):
48
+ result_pairs: list[ResultPair] = []
49
+
50
+ def __iter__(self):
51
+ return iter(self.result_pairs)
52
+
53
+ def add_result_pair(self, result: Any, extra: Any | None = None) -> None:
54
+ self.result_pairs.append(ResultPair(result=result, extra=extra))
55
+
56
+ def get_last_result_pair(self) -> ResultPair:
57
+ return self.result_pairs[-1]
58
+
59
+ # format all but the last result pair
60
+ # into a string
61
+ def format(self, sep: str = "\n") -> str:
62
+ # Result: the result
63
+ # Extra: the extra if it exists don't show if it doesn't
64
+ return sep.join(
65
+ [
66
+ f"Result: {result_pair.result}\nExtra: {result_pair.extra}"
67
+ if result_pair.extra is not None
68
+ else f"Result: {result_pair.result}"
69
+ for result_pair in self.result_pairs[:-1]
70
+ ]
71
+ )
72
+
73
+
74
+ class TargetHandle(BaseModel):
75
+ model_config = ConfigDict(populate_by_name=True)
76
+ field_name: str = Field(..., alias="fieldName", description="Field name for the target handle.")
77
+ id: str = Field(..., description="Unique identifier for the target handle.")
78
+ input_types: list[str] = Field(
79
+ default_factory=list, alias="inputTypes", description="List of input types for the target handle."
80
+ )
81
+ type: str = Field(None, description="Type of the target handle.")
82
+
83
+ @classmethod
84
+ def from_loop_target_handle(cls, target_handle: LoopTargetHandleDict) -> "TargetHandle":
85
+ # The target handle is a loop edge
86
+ # The target handle is a dict with the following keys:
87
+ # - name: str
88
+ # - id: str
89
+ # - inputTypes: list[str]
90
+ # - type: str
91
+ # It is built from an Output, which is why it has a different structure
92
+ return cls(
93
+ field_name=target_handle.get("name"),
94
+ id=target_handle.get("id"),
95
+ input_types=target_handle.get("output_types"),
96
+ )
97
+
98
+
99
+ class SourceHandle(BaseModel):
100
+ model_config = ConfigDict(populate_by_name=True)
101
+ base_classes: list[str] = Field(
102
+ default_factory=list, alias="baseClasses", description="List of base classes for the source handle."
103
+ )
104
+ data_type: str = Field(..., alias="dataType", description="Data type for the source handle.")
105
+ id: str = Field(..., description="Unique identifier for the source handle.")
106
+ name: str | None = Field(None, description="Name of the source handle.")
107
+ output_types: list[str] = Field(default_factory=list, description="List of output types for the source handle.")
108
+
109
+ @field_validator("name", mode="before")
110
+ @classmethod
111
+ def validate_name(cls, v, info):
112
+ if info.data["data_type"] == "GroupNode":
113
+ # 'OpenAIModel-u4iGV_text_output'
114
+ splits = v.split("_", 1)
115
+ if len(splits) != 2: # noqa: PLR2004
116
+ msg = f"Invalid source handle name {v}"
117
+ raise ValueError(msg)
118
+ v = splits[1]
119
+ return v
File without changes
File without changes