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
lfx/memory/stubs.py ADDED
@@ -0,0 +1,283 @@
1
+ """Memory management functions for lfx package.
2
+
3
+ This module provides message storage and retrieval functionality adapted for lfx's
4
+ service-based architecture. It mirrors the langflow.memory API but works with
5
+ lfx's Message model and service interfaces.
6
+ """
7
+
8
+ from uuid import UUID
9
+
10
+ from lfx.log.logger import logger
11
+ from lfx.schema.message import Message
12
+ from lfx.services.deps import session_scope
13
+ from lfx.utils.async_helpers import run_until_complete
14
+
15
+
16
+ async def astore_message(
17
+ message: Message,
18
+ flow_id: str | UUID | None = None,
19
+ ) -> list[Message]:
20
+ """Store a message in the memory.
21
+
22
+ Args:
23
+ message (Message): The message to store.
24
+ flow_id (Optional[str | UUID]): The flow ID associated with the message.
25
+ When running from the CustomComponent you can access this using `self.graph.flow_id`.
26
+
27
+ Returns:
28
+ List[Message]: A list containing the stored message.
29
+
30
+ Raises:
31
+ ValueError: If any of the required parameters (session_id, sender, sender_name) is not provided.
32
+ """
33
+ if not message:
34
+ logger.warning("No message provided.")
35
+ return []
36
+
37
+ if not message.session_id or not message.sender or not message.sender_name:
38
+ msg = (
39
+ f"All of session_id, sender, and sender_name must be provided. Session ID: {message.session_id},"
40
+ f" Sender: {message.sender}, Sender Name: {message.sender_name}"
41
+ )
42
+ raise ValueError(msg)
43
+
44
+ # Set flow_id if provided
45
+ if flow_id:
46
+ if isinstance(flow_id, str):
47
+ flow_id = UUID(flow_id)
48
+ message.flow_id = str(flow_id)
49
+
50
+ # In lfx, we use the service architecture - this is a simplified implementation
51
+ # that doesn't persist to database but maintains the message in memory
52
+ # Real implementation would require a database service
53
+ async with session_scope() as session:
54
+ # Since we're using NoopSession by default, this doesn't actually persist
55
+ # but maintains the same interface as langflow.memory
56
+ try:
57
+ # Generate an ID if not present
58
+ if not hasattr(message, "id") or not message.id:
59
+ try:
60
+ import nanoid
61
+
62
+ message.id = nanoid.generate()
63
+ except ImportError:
64
+ # Fallback to uuid if nanoid is not available
65
+ import uuid
66
+
67
+ message.id = str(uuid.uuid4())
68
+
69
+ await session.add(message)
70
+ await session.commit()
71
+ logger.debug(f"Message stored with ID: {message.id}")
72
+ except Exception as e:
73
+ logger.exception(f"Error storing message: {e}")
74
+ await session.rollback()
75
+ raise
76
+ return [message]
77
+
78
+
79
+ def store_message(
80
+ message: Message,
81
+ flow_id: str | UUID | None = None,
82
+ ) -> list[Message]:
83
+ """DEPRECATED: Stores a message in the memory.
84
+
85
+ DEPRECATED: Use `astore_message` instead.
86
+
87
+ Args:
88
+ message (Message): The message to store.
89
+ flow_id (Optional[str | UUID]): The flow ID associated with the message.
90
+ When running from the CustomComponent you can access this using `self.graph.flow_id`.
91
+
92
+ Returns:
93
+ List[Message]: A list containing the stored message.
94
+
95
+ Raises:
96
+ ValueError: If any of the required parameters (session_id, sender, sender_name) is not provided.
97
+ """
98
+ return run_until_complete(astore_message(message, flow_id=flow_id))
99
+
100
+
101
+ async def aupdate_messages(messages: Message | list[Message]) -> list[Message]:
102
+ """Update stored messages.
103
+
104
+ Args:
105
+ messages: Message or list of messages to update.
106
+
107
+ Returns:
108
+ List[Message]: Updated messages.
109
+
110
+ Raises:
111
+ ValueError: If message is not found for update.
112
+ """
113
+ if not isinstance(messages, list):
114
+ messages = [messages]
115
+
116
+ async with session_scope() as session:
117
+ updated_messages: list[Message] = []
118
+ for message in messages:
119
+ try:
120
+ # In a real implementation, this would update the database record
121
+ # For now, we just validate the message has an ID and return it
122
+ if not hasattr(message, "id") or not message.id:
123
+ error_message = f"Message without ID cannot be updated: {message}"
124
+ logger.warning(error_message)
125
+ raise ValueError(error_message)
126
+
127
+ # Convert flow_id to string if it's a UUID
128
+ if message.flow_id and isinstance(message.flow_id, UUID):
129
+ message.flow_id = str(message.flow_id)
130
+
131
+ await session.add(message)
132
+ await session.commit()
133
+ await session.refresh(message)
134
+ updated_messages.append(message)
135
+ logger.debug(f"Message updated: {message.id}")
136
+ except Exception as e:
137
+ logger.exception(f"Error updating message: {e}")
138
+ await session.rollback()
139
+ msg = f"Failed to update message: {e}"
140
+ logger.error(msg)
141
+ raise ValueError(msg) from e
142
+
143
+ return updated_messages
144
+
145
+
146
+ async def delete_message(id_: str) -> None:
147
+ """Delete a message from the memory.
148
+
149
+ Args:
150
+ id_ (str): The ID of the message to delete.
151
+ """
152
+ async with session_scope() as session:
153
+ try:
154
+ # In a real implementation, this would delete from database
155
+ # For now, this is a no-op since we're using NoopSession
156
+ await session.delete(id_)
157
+ await session.commit()
158
+ logger.debug(f"Message deleted: {id_}")
159
+ except Exception as e:
160
+ logger.exception(f"Error deleting message: {e}")
161
+ raise
162
+
163
+
164
+ async def aget_messages(
165
+ sender: str | None = None, # noqa: ARG001
166
+ sender_name: str | None = None, # noqa: ARG001
167
+ session_id: str | UUID | None = None, # noqa: ARG001
168
+ order_by: str | None = "timestamp", # noqa: ARG001
169
+ order: str | None = "DESC", # noqa: ARG001
170
+ flow_id: UUID | None = None, # noqa: ARG001
171
+ limit: int | None = None, # noqa: ARG001
172
+ ) -> list[Message]:
173
+ """Retrieve messages based on the provided filters.
174
+
175
+ Args:
176
+ sender (Optional[str]): The sender of the messages (e.g., "Machine" or "User")
177
+ sender_name (Optional[str]): The name of the sender.
178
+ session_id (Optional[str]): The session ID associated with the messages.
179
+ order_by (Optional[str]): The field to order the messages by. Defaults to "timestamp".
180
+ order (Optional[str]): The order in which to retrieve the messages. Defaults to "DESC".
181
+ flow_id (Optional[UUID]): The flow ID associated with the messages.
182
+ limit (Optional[int]): The maximum number of messages to retrieve.
183
+
184
+ Returns:
185
+ List[Message]: A list of Message objects representing the retrieved messages.
186
+ """
187
+ async with session_scope() as session:
188
+ try:
189
+ # In a real implementation, this would query the database
190
+ # For now, return empty list since we're using NoopSession
191
+ result = await session.query() # This returns [] from NoopSession
192
+ logger.debug(f"Retrieved {len(result)} messages")
193
+ except Exception as e: # noqa: BLE001
194
+ logger.exception(f"Error retrieving messages: {e}")
195
+ return []
196
+ return result
197
+
198
+
199
+ def get_messages(
200
+ sender: str | None = None,
201
+ sender_name: str | None = None,
202
+ session_id: str | UUID | None = None,
203
+ order_by: str | None = "timestamp",
204
+ order: str | None = "DESC",
205
+ flow_id: UUID | None = None,
206
+ limit: int | None = None,
207
+ ) -> list[Message]:
208
+ """DEPRECATED - Retrieve messages based on the provided filters.
209
+
210
+ DEPRECATED: Use `aget_messages` instead.
211
+ """
212
+ return run_until_complete(aget_messages(sender, sender_name, session_id, order_by, order, flow_id, limit))
213
+
214
+
215
+ async def adelete_messages(session_id: str) -> None:
216
+ """Delete messages from the memory based on the provided session ID.
217
+
218
+ Args:
219
+ session_id (str): The session ID associated with the messages to delete.
220
+ """
221
+ async with session_scope() as session:
222
+ try:
223
+ # In a real implementation, this would delete from database
224
+ # For now, this is a no-op since we're using NoopSession
225
+ await session.delete(session_id)
226
+ await session.commit()
227
+ logger.debug(f"Messages deleted for session: {session_id}")
228
+ except Exception as e:
229
+ logger.exception(f"Error deleting messages: {e}")
230
+ raise
231
+
232
+
233
+ def delete_messages(session_id: str) -> None:
234
+ """DEPRECATED - Delete messages based on the provided session ID.
235
+
236
+ DEPRECATED: Use `adelete_messages` instead.
237
+ """
238
+ return run_until_complete(adelete_messages(session_id))
239
+
240
+
241
+ async def aadd_messages(messages: Message | list[Message]) -> list[Message]:
242
+ """Add messages to the memory.
243
+
244
+ Args:
245
+ messages: Message or list of messages to add.
246
+
247
+ Returns:
248
+ List[Message]: Added messages.
249
+ """
250
+ if not isinstance(messages, list):
251
+ messages = [messages]
252
+
253
+ result = []
254
+ for message in messages:
255
+ stored = await astore_message(message)
256
+ result.extend(stored)
257
+ return result
258
+
259
+
260
+ def add_messages(messages: Message | list[Message]) -> list[Message]:
261
+ """Add messages to the memory (synchronous version).
262
+
263
+ Args:
264
+ messages: Message or list of messages to add.
265
+
266
+ Returns:
267
+ List[Message]: Added messages.
268
+ """
269
+ return run_until_complete(aadd_messages(messages))
270
+
271
+
272
+ async def aadd_messagetables(messages: Message | list[Message]) -> list[Message]:
273
+ """Add message tables to the memory.
274
+
275
+ This is an alias for aadd_messages for backwards compatibility.
276
+
277
+ Args:
278
+ messages: Message or list of messages to add.
279
+
280
+ Returns:
281
+ List[Message]: Added messages.
282
+ """
283
+ return await aadd_messages(messages)
@@ -0,0 +1 @@
1
+ """Processing module for lfx package."""
@@ -0,0 +1,238 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from typing import TYPE_CHECKING, Any, cast
5
+
6
+ from json_repair import repair_json
7
+ from pydantic import BaseModel
8
+
9
+ from lfx.graph.vertex.base import Vertex
10
+ from lfx.log.logger import logger
11
+ from lfx.schema.graph import InputValue, Tweaks
12
+ from lfx.schema.schema import INPUT_FIELD_NAME, InputValueRequest
13
+ from lfx.services.deps import get_settings_service
14
+
15
+ if TYPE_CHECKING:
16
+ from lfx.events.event_manager import EventManager
17
+ from lfx.graph.graph.base import Graph
18
+ from lfx.graph.schema import RunOutputs
19
+
20
+
21
+ def validate_and_repair_json(json_str: str | dict) -> dict[str, Any] | str:
22
+ """Validates a JSON string and attempts to repair it if invalid.
23
+
24
+ Args:
25
+ json_str (str): The JSON string to validate/repair
26
+
27
+ Returns:
28
+ Union[Dict[str, Any], str]: The parsed JSON dict if valid/repairable,
29
+ otherwise returns the original string
30
+ """
31
+ if not isinstance(json_str, str):
32
+ return json_str
33
+ try:
34
+ # If invalid, attempt repair
35
+ repaired = repair_json(json_str)
36
+ return json.loads(repaired)
37
+ except (json.JSONDecodeError, ImportError):
38
+ # Return original if repair fails or module not found
39
+ return json_str
40
+
41
+
42
+ class Result(BaseModel):
43
+ result: Any
44
+ session_id: str
45
+
46
+
47
+ async def run_graph_internal(
48
+ graph: Graph,
49
+ flow_id: str,
50
+ *,
51
+ stream: bool = False,
52
+ session_id: str | None = None,
53
+ inputs: list[InputValueRequest] | None = None,
54
+ outputs: list[str] | None = None,
55
+ event_manager: EventManager | None = None,
56
+ ) -> tuple[list[RunOutputs], str]:
57
+ """Run the graph and generate the result."""
58
+ inputs = inputs or []
59
+ effective_session_id = session_id or flow_id
60
+ components = []
61
+ inputs_list = []
62
+ types = []
63
+ for input_value_request in inputs:
64
+ if input_value_request.input_value is None:
65
+ logger.warning("InputValueRequest input_value cannot be None, defaulting to an empty string.")
66
+ input_value_request.input_value = ""
67
+ components.append(input_value_request.components or [])
68
+ inputs_list.append({INPUT_FIELD_NAME: input_value_request.input_value})
69
+ types.append(input_value_request.type)
70
+
71
+ try:
72
+ fallback_to_env_vars = get_settings_service().settings.fallback_to_env_var
73
+ except (AttributeError, TypeError):
74
+ fallback_to_env_vars = False
75
+
76
+ graph.session_id = effective_session_id
77
+ run_outputs = await graph.arun(
78
+ inputs=inputs_list,
79
+ inputs_components=components,
80
+ types=types,
81
+ outputs=outputs or [],
82
+ stream=stream,
83
+ session_id=effective_session_id or "",
84
+ fallback_to_env_vars=fallback_to_env_vars,
85
+ event_manager=event_manager,
86
+ )
87
+ return run_outputs, effective_session_id
88
+
89
+
90
+ async def run_graph(
91
+ graph: Graph,
92
+ input_value: str,
93
+ input_type: str,
94
+ output_type: str,
95
+ *,
96
+ session_id: str | None = None,
97
+ fallback_to_env_vars: bool = False,
98
+ output_component: str | None = None,
99
+ stream: bool = False,
100
+ ) -> list[RunOutputs]:
101
+ """Runs the given Langflow Graph with the specified input and returns the outputs.
102
+
103
+ Args:
104
+ graph (Graph): The graph to be executed.
105
+ input_value (str): The input value to be passed to the graph.
106
+ input_type (str): The type of the input value.
107
+ output_type (str): The type of the desired output.
108
+ session_id (str | None, optional): The session ID to be used for the flow. Defaults to None.
109
+ fallback_to_env_vars (bool, optional): Whether to fallback to environment variables.
110
+ Defaults to False.
111
+ output_component (Optional[str], optional): The specific output component to retrieve. Defaults to None.
112
+ stream (bool, optional): Whether to stream the results or not. Defaults to False.
113
+
114
+ Returns:
115
+ List[RunOutputs]: A list of RunOutputs objects representing the outputs of the graph.
116
+
117
+ """
118
+ inputs = [InputValue(components=[], input_value=input_value, type=input_type)]
119
+ if output_component:
120
+ outputs = [output_component]
121
+ else:
122
+ outputs = [
123
+ vertex.id
124
+ for vertex in graph.vertices
125
+ if output_type == "debug"
126
+ or (vertex.is_output and (output_type == "any" or output_type in vertex.id.lower()))
127
+ ]
128
+ components = []
129
+ inputs_list = []
130
+ types = []
131
+ for input_value_request in inputs:
132
+ if input_value_request.input_value is None:
133
+ logger.warning("InputValueRequest input_value cannot be None, defaulting to an empty string.")
134
+ input_value_request.input_value = ""
135
+ components.append(input_value_request.components or [])
136
+ inputs_list.append({INPUT_FIELD_NAME: input_value_request.input_value})
137
+ types.append(input_value_request.type)
138
+ return await graph.arun(
139
+ inputs_list,
140
+ inputs_components=components,
141
+ types=types,
142
+ outputs=outputs or [],
143
+ stream=stream,
144
+ session_id=session_id,
145
+ fallback_to_env_vars=fallback_to_env_vars,
146
+ )
147
+
148
+
149
+ def validate_input(
150
+ graph_data: dict[str, Any], tweaks: Tweaks | dict[str, str | dict[str, Any]]
151
+ ) -> list[dict[str, Any]]:
152
+ if not isinstance(graph_data, dict) or not isinstance(tweaks, dict):
153
+ msg = "graph_data and tweaks should be dictionaries"
154
+ raise TypeError(msg)
155
+
156
+ nodes = graph_data.get("data", {}).get("nodes") or graph_data.get("nodes")
157
+
158
+ if not isinstance(nodes, list):
159
+ msg = "graph_data should contain a list of nodes under 'data' key or directly under 'nodes' key"
160
+ raise TypeError(msg)
161
+
162
+ return nodes
163
+
164
+
165
+ def apply_tweaks(node: dict[str, Any], node_tweaks: dict[str, Any]) -> None:
166
+ template_data = node.get("data", {}).get("node", {}).get("template")
167
+
168
+ if not isinstance(template_data, dict):
169
+ logger.warning(f"Template data for node {node.get('id')} should be a dictionary")
170
+ return
171
+
172
+ for tweak_name, tweak_value in node_tweaks.items():
173
+ if tweak_name not in template_data:
174
+ continue
175
+ if tweak_name in template_data:
176
+ if template_data[tweak_name]["type"] == "NestedDict":
177
+ value = validate_and_repair_json(tweak_value)
178
+ template_data[tweak_name]["value"] = value
179
+ elif isinstance(tweak_value, dict):
180
+ for k, v in tweak_value.items():
181
+ k_ = "file_path" if template_data[tweak_name]["type"] == "file" else k
182
+ template_data[tweak_name][k_] = v
183
+ else:
184
+ key = "file_path" if template_data[tweak_name]["type"] == "file" else "value"
185
+ template_data[tweak_name][key] = tweak_value
186
+
187
+
188
+ def apply_tweaks_on_vertex(vertex: Vertex, node_tweaks: dict[str, Any]) -> None:
189
+ for tweak_name, tweak_value in node_tweaks.items():
190
+ if tweak_name and tweak_value and tweak_name in vertex.params:
191
+ vertex.params[tweak_name] = tweak_value
192
+
193
+
194
+ def process_tweaks(
195
+ graph_data: dict[str, Any], tweaks: Tweaks | dict[str, dict[str, Any]], *, stream: bool = False
196
+ ) -> dict[str, Any]:
197
+ """This function is used to tweak the graph data using the node id and the tweaks dict.
198
+
199
+ :param graph_data: The dictionary containing the graph data. It must contain a 'data' key with
200
+ 'nodes' as its child or directly contain 'nodes' key. Each node should have an 'id' and 'data'.
201
+ :param tweaks: The dictionary containing the tweaks. The keys can be the node id or the name of the tweak.
202
+ The values can be a dictionary containing the tweaks for the node or the value of the tweak.
203
+ :param stream: A boolean flag indicating whether streaming should be deactivated across all components or not.
204
+ Default is False.
205
+ :return: The modified graph_data dictionary.
206
+ :raises ValueError: If the input is not in the expected format.
207
+ """
208
+ tweaks_dict = cast("dict[str, Any]", tweaks.model_dump()) if not isinstance(tweaks, dict) else tweaks
209
+ if "stream" not in tweaks_dict:
210
+ tweaks_dict |= {"stream": stream}
211
+ nodes = validate_input(graph_data, cast("dict[str, str | dict[str, Any]]", tweaks_dict))
212
+ nodes_map = {node.get("id"): node for node in nodes}
213
+ nodes_display_name_map = {node.get("data", {}).get("node", {}).get("display_name"): node for node in nodes}
214
+
215
+ all_nodes_tweaks = {}
216
+ for key, value in tweaks_dict.items():
217
+ if isinstance(value, dict):
218
+ if (node := nodes_map.get(key)) or (node := nodes_display_name_map.get(key)):
219
+ apply_tweaks(node, value)
220
+ else:
221
+ all_nodes_tweaks[key] = value
222
+ if all_nodes_tweaks:
223
+ for node in nodes:
224
+ apply_tweaks(node, all_nodes_tweaks)
225
+
226
+ return graph_data
227
+
228
+
229
+ def process_tweaks_on_graph(graph: Graph, tweaks: dict[str, dict[str, Any]]):
230
+ for vertex in graph.vertices:
231
+ if isinstance(vertex, Vertex) and isinstance(vertex.id, str):
232
+ node_id = vertex.id
233
+ if node_tweaks := tweaks.get(node_id):
234
+ apply_tweaks_on_vertex(vertex, node_tweaks)
235
+ else:
236
+ logger.warning("Each node should be a Vertex with an 'id' attribute of type str")
237
+
238
+ return graph
@@ -0,0 +1,25 @@
1
+ import json
2
+ from typing import Any
3
+
4
+ from json_repair import repair_json
5
+
6
+
7
+ def validate_and_repair_json(json_str: str | dict) -> dict[str, Any] | str:
8
+ """Validates a JSON string and attempts to repair it if invalid.
9
+
10
+ Args:
11
+ json_str (str): The JSON string to validate/repair
12
+
13
+ Returns:
14
+ Union[Dict[str, Any], str]: The parsed JSON dict if valid/repairable,
15
+ otherwise returns the original string
16
+ """
17
+ if not isinstance(json_str, str):
18
+ return json_str
19
+ try:
20
+ # If invalid, attempt repair
21
+ repaired = repair_json(json_str)
22
+ return json.loads(repaired)
23
+ except (json.JSONDecodeError, ImportError):
24
+ # Return original if repair fails or module not found
25
+ return json_str
lfx/py.typed ADDED
File without changes
lfx/schema/__init__.py ADDED
@@ -0,0 +1,66 @@
1
+ """Schema modules for lfx package."""
2
+
3
+ __all__ = [
4
+ "Data",
5
+ "DataFrame",
6
+ "InputValue",
7
+ "Message",
8
+ "OpenAIErrorResponse",
9
+ "OpenAIResponsesRequest",
10
+ "OpenAIResponsesResponse",
11
+ "OpenAIResponsesStreamChunk",
12
+ "Tweaks",
13
+ "UUIDstr",
14
+ "dotdict",
15
+ ]
16
+
17
+
18
+ def __getattr__(name: str):
19
+ # Import to avoid circular dependencies
20
+ if name == "Data":
21
+ from .data import Data
22
+
23
+ return Data
24
+ if name == "DataFrame":
25
+ from .dataframe import DataFrame
26
+
27
+ return DataFrame
28
+ if name == "dotdict":
29
+ from .dotdict import dotdict
30
+
31
+ return dotdict
32
+ if name == "InputValue":
33
+ from .graph import InputValue
34
+
35
+ return InputValue
36
+ if name == "Tweaks":
37
+ from .graph import Tweaks
38
+
39
+ return Tweaks
40
+ if name == "Message":
41
+ from .message import Message
42
+
43
+ return Message
44
+ if name == "UUIDstr":
45
+ from .serialize import UUIDstr
46
+
47
+ return UUIDstr
48
+ if name == "OpenAIResponsesRequest":
49
+ from .openai_responses_schemas import OpenAIResponsesRequest
50
+
51
+ return OpenAIResponsesRequest
52
+ if name == "OpenAIResponsesResponse":
53
+ from .openai_responses_schemas import OpenAIResponsesResponse
54
+
55
+ return OpenAIResponsesResponse
56
+ if name == "OpenAIResponsesStreamChunk":
57
+ from .openai_responses_schemas import OpenAIResponsesStreamChunk
58
+
59
+ return OpenAIResponsesStreamChunk
60
+ if name == "OpenAIErrorResponse":
61
+ from .openai_responses_schemas import OpenAIErrorResponse
62
+
63
+ return OpenAIErrorResponse
64
+
65
+ msg = f"module '{__name__}' has no attribute '{name}'"
66
+ raise AttributeError(msg)
lfx/schema/artifact.py ADDED
@@ -0,0 +1,83 @@
1
+ from collections.abc import Generator
2
+ from enum import Enum
3
+
4
+ from fastapi.encoders import jsonable_encoder
5
+ from pydantic import BaseModel
6
+
7
+ from lfx.log.logger import logger
8
+ from lfx.schema.data import Data
9
+ from lfx.schema.dataframe import DataFrame
10
+ from lfx.schema.encoders import CUSTOM_ENCODERS
11
+ from lfx.schema.message import Message
12
+ from lfx.serialization.serialization import serialize
13
+
14
+
15
+ class ArtifactType(str, Enum):
16
+ TEXT = "text"
17
+ DATA = "data"
18
+ OBJECT = "object"
19
+ ARRAY = "array"
20
+ STREAM = "stream"
21
+ UNKNOWN = "unknown"
22
+ MESSAGE = "message"
23
+ RECORD = "record"
24
+
25
+
26
+ def get_artifact_type(value, build_result=None) -> str:
27
+ result = ArtifactType.UNKNOWN
28
+ match value:
29
+ case Message():
30
+ if not isinstance(value.text, str):
31
+ enum_value = get_artifact_type(value.text)
32
+ result = ArtifactType(enum_value)
33
+ else:
34
+ result = ArtifactType.MESSAGE
35
+ case Data():
36
+ enum_value = get_artifact_type(value.data)
37
+ result = ArtifactType(enum_value)
38
+
39
+ case str():
40
+ result = ArtifactType.TEXT
41
+
42
+ case dict():
43
+ result = ArtifactType.OBJECT
44
+
45
+ case list() | DataFrame():
46
+ result = ArtifactType.ARRAY
47
+ if result == ArtifactType.UNKNOWN and (
48
+ (build_result and isinstance(build_result, Generator))
49
+ or (isinstance(value, Message) and isinstance(value.text, Generator))
50
+ ):
51
+ result = ArtifactType.STREAM
52
+
53
+ return result.value
54
+
55
+
56
+ def _to_list_of_dicts(raw):
57
+ raw_ = []
58
+ for item in raw:
59
+ if hasattr(item, "dict") or hasattr(item, "model_dump"):
60
+ raw_.append(serialize(item))
61
+ else:
62
+ raw_.append(str(item))
63
+ return raw_
64
+
65
+
66
+ def post_process_raw(raw, artifact_type: str):
67
+ default_message = "Built Successfully ✨"
68
+
69
+ if artifact_type == ArtifactType.STREAM.value:
70
+ raw = ""
71
+ elif artifact_type == ArtifactType.ARRAY.value:
72
+ raw = raw.to_dict(orient="records") if isinstance(raw, DataFrame) else _to_list_of_dicts(raw)
73
+ elif artifact_type == ArtifactType.UNKNOWN.value and raw is not None:
74
+ if isinstance(raw, BaseModel | dict):
75
+ try:
76
+ raw = jsonable_encoder(raw, custom_encoder=CUSTOM_ENCODERS)
77
+ artifact_type = ArtifactType.OBJECT.value
78
+ except Exception: # noqa: BLE001
79
+ logger.debug(f"Error converting to json: {raw} ({type(raw)})", exc_info=True)
80
+ raw = default_message
81
+ else:
82
+ raw = default_message
83
+ return raw, artifact_type