lfx-nightly 0.2.0.dev25__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.

Potentially problematic release.


This version of lfx-nightly might be problematic. Click here for more details.

Files changed (769) hide show
  1. lfx/__init__.py +0 -0
  2. lfx/__main__.py +25 -0
  3. lfx/_assets/component_index.json +1 -0
  4. lfx/base/__init__.py +0 -0
  5. lfx/base/agents/__init__.py +0 -0
  6. lfx/base/agents/agent.py +375 -0
  7. lfx/base/agents/altk_base_agent.py +380 -0
  8. lfx/base/agents/altk_tool_wrappers.py +565 -0
  9. lfx/base/agents/callback.py +130 -0
  10. lfx/base/agents/context.py +109 -0
  11. lfx/base/agents/crewai/__init__.py +0 -0
  12. lfx/base/agents/crewai/crew.py +231 -0
  13. lfx/base/agents/crewai/tasks.py +12 -0
  14. lfx/base/agents/default_prompts.py +23 -0
  15. lfx/base/agents/errors.py +15 -0
  16. lfx/base/agents/events.py +430 -0
  17. lfx/base/agents/utils.py +237 -0
  18. lfx/base/astra_assistants/__init__.py +0 -0
  19. lfx/base/astra_assistants/util.py +171 -0
  20. lfx/base/chains/__init__.py +0 -0
  21. lfx/base/chains/model.py +19 -0
  22. lfx/base/composio/__init__.py +0 -0
  23. lfx/base/composio/composio_base.py +2584 -0
  24. lfx/base/compressors/__init__.py +0 -0
  25. lfx/base/compressors/model.py +60 -0
  26. lfx/base/constants.py +46 -0
  27. lfx/base/curl/__init__.py +0 -0
  28. lfx/base/curl/parse.py +188 -0
  29. lfx/base/data/__init__.py +5 -0
  30. lfx/base/data/base_file.py +810 -0
  31. lfx/base/data/docling_utils.py +338 -0
  32. lfx/base/data/storage_utils.py +192 -0
  33. lfx/base/data/utils.py +362 -0
  34. lfx/base/datastax/__init__.py +5 -0
  35. lfx/base/datastax/astradb_base.py +896 -0
  36. lfx/base/document_transformers/__init__.py +0 -0
  37. lfx/base/document_transformers/model.py +43 -0
  38. lfx/base/embeddings/__init__.py +0 -0
  39. lfx/base/embeddings/aiml_embeddings.py +62 -0
  40. lfx/base/embeddings/embeddings_class.py +113 -0
  41. lfx/base/embeddings/model.py +26 -0
  42. lfx/base/flow_processing/__init__.py +0 -0
  43. lfx/base/flow_processing/utils.py +86 -0
  44. lfx/base/huggingface/__init__.py +0 -0
  45. lfx/base/huggingface/model_bridge.py +133 -0
  46. lfx/base/io/__init__.py +0 -0
  47. lfx/base/io/chat.py +21 -0
  48. lfx/base/io/text.py +22 -0
  49. lfx/base/knowledge_bases/__init__.py +3 -0
  50. lfx/base/knowledge_bases/knowledge_base_utils.py +137 -0
  51. lfx/base/langchain_utilities/__init__.py +0 -0
  52. lfx/base/langchain_utilities/model.py +35 -0
  53. lfx/base/langchain_utilities/spider_constants.py +1 -0
  54. lfx/base/langwatch/__init__.py +0 -0
  55. lfx/base/langwatch/utils.py +18 -0
  56. lfx/base/mcp/__init__.py +0 -0
  57. lfx/base/mcp/constants.py +2 -0
  58. lfx/base/mcp/util.py +1659 -0
  59. lfx/base/memory/__init__.py +0 -0
  60. lfx/base/memory/memory.py +49 -0
  61. lfx/base/memory/model.py +38 -0
  62. lfx/base/models/__init__.py +3 -0
  63. lfx/base/models/aiml_constants.py +51 -0
  64. lfx/base/models/anthropic_constants.py +51 -0
  65. lfx/base/models/aws_constants.py +151 -0
  66. lfx/base/models/chat_result.py +76 -0
  67. lfx/base/models/cometapi_constants.py +54 -0
  68. lfx/base/models/google_generative_ai_constants.py +70 -0
  69. lfx/base/models/google_generative_ai_model.py +38 -0
  70. lfx/base/models/groq_constants.py +150 -0
  71. lfx/base/models/groq_model_discovery.py +265 -0
  72. lfx/base/models/model.py +375 -0
  73. lfx/base/models/model_input_constants.py +378 -0
  74. lfx/base/models/model_metadata.py +41 -0
  75. lfx/base/models/model_utils.py +108 -0
  76. lfx/base/models/novita_constants.py +35 -0
  77. lfx/base/models/ollama_constants.py +52 -0
  78. lfx/base/models/openai_constants.py +129 -0
  79. lfx/base/models/sambanova_constants.py +18 -0
  80. lfx/base/models/watsonx_constants.py +36 -0
  81. lfx/base/processing/__init__.py +0 -0
  82. lfx/base/prompts/__init__.py +0 -0
  83. lfx/base/prompts/api_utils.py +224 -0
  84. lfx/base/prompts/utils.py +61 -0
  85. lfx/base/textsplitters/__init__.py +0 -0
  86. lfx/base/textsplitters/model.py +28 -0
  87. lfx/base/tools/__init__.py +0 -0
  88. lfx/base/tools/base.py +26 -0
  89. lfx/base/tools/component_tool.py +325 -0
  90. lfx/base/tools/constants.py +49 -0
  91. lfx/base/tools/flow_tool.py +132 -0
  92. lfx/base/tools/run_flow.py +698 -0
  93. lfx/base/vectorstores/__init__.py +0 -0
  94. lfx/base/vectorstores/model.py +193 -0
  95. lfx/base/vectorstores/utils.py +22 -0
  96. lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
  97. lfx/cli/__init__.py +5 -0
  98. lfx/cli/commands.py +327 -0
  99. lfx/cli/common.py +650 -0
  100. lfx/cli/run.py +506 -0
  101. lfx/cli/script_loader.py +289 -0
  102. lfx/cli/serve_app.py +546 -0
  103. lfx/cli/validation.py +69 -0
  104. lfx/components/FAISS/__init__.py +34 -0
  105. lfx/components/FAISS/faiss.py +111 -0
  106. lfx/components/Notion/__init__.py +19 -0
  107. lfx/components/Notion/add_content_to_page.py +269 -0
  108. lfx/components/Notion/create_page.py +94 -0
  109. lfx/components/Notion/list_database_properties.py +68 -0
  110. lfx/components/Notion/list_pages.py +122 -0
  111. lfx/components/Notion/list_users.py +77 -0
  112. lfx/components/Notion/page_content_viewer.py +93 -0
  113. lfx/components/Notion/search.py +111 -0
  114. lfx/components/Notion/update_page_property.py +114 -0
  115. lfx/components/__init__.py +428 -0
  116. lfx/components/_importing.py +42 -0
  117. lfx/components/agentql/__init__.py +3 -0
  118. lfx/components/agentql/agentql_api.py +151 -0
  119. lfx/components/aiml/__init__.py +37 -0
  120. lfx/components/aiml/aiml.py +115 -0
  121. lfx/components/aiml/aiml_embeddings.py +37 -0
  122. lfx/components/altk/__init__.py +34 -0
  123. lfx/components/altk/altk_agent.py +193 -0
  124. lfx/components/amazon/__init__.py +36 -0
  125. lfx/components/amazon/amazon_bedrock_converse.py +195 -0
  126. lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
  127. lfx/components/amazon/amazon_bedrock_model.py +130 -0
  128. lfx/components/amazon/s3_bucket_uploader.py +211 -0
  129. lfx/components/anthropic/__init__.py +34 -0
  130. lfx/components/anthropic/anthropic.py +187 -0
  131. lfx/components/apify/__init__.py +5 -0
  132. lfx/components/apify/apify_actor.py +325 -0
  133. lfx/components/arxiv/__init__.py +3 -0
  134. lfx/components/arxiv/arxiv.py +169 -0
  135. lfx/components/assemblyai/__init__.py +46 -0
  136. lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  137. lfx/components/assemblyai/assemblyai_lemur.py +183 -0
  138. lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  139. lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  140. lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
  141. lfx/components/azure/__init__.py +37 -0
  142. lfx/components/azure/azure_openai.py +95 -0
  143. lfx/components/azure/azure_openai_embeddings.py +83 -0
  144. lfx/components/baidu/__init__.py +32 -0
  145. lfx/components/baidu/baidu_qianfan_chat.py +113 -0
  146. lfx/components/bing/__init__.py +3 -0
  147. lfx/components/bing/bing_search_api.py +61 -0
  148. lfx/components/cassandra/__init__.py +40 -0
  149. lfx/components/cassandra/cassandra.py +264 -0
  150. lfx/components/cassandra/cassandra_chat.py +92 -0
  151. lfx/components/cassandra/cassandra_graph.py +238 -0
  152. lfx/components/chains/__init__.py +3 -0
  153. lfx/components/chroma/__init__.py +34 -0
  154. lfx/components/chroma/chroma.py +169 -0
  155. lfx/components/cleanlab/__init__.py +40 -0
  156. lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
  157. lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  158. lfx/components/cleanlab/cleanlab_remediator.py +131 -0
  159. lfx/components/clickhouse/__init__.py +34 -0
  160. lfx/components/clickhouse/clickhouse.py +135 -0
  161. lfx/components/cloudflare/__init__.py +32 -0
  162. lfx/components/cloudflare/cloudflare.py +81 -0
  163. lfx/components/cohere/__init__.py +40 -0
  164. lfx/components/cohere/cohere_embeddings.py +81 -0
  165. lfx/components/cohere/cohere_models.py +46 -0
  166. lfx/components/cohere/cohere_rerank.py +51 -0
  167. lfx/components/cometapi/__init__.py +32 -0
  168. lfx/components/cometapi/cometapi.py +166 -0
  169. lfx/components/composio/__init__.py +222 -0
  170. lfx/components/composio/agentql_composio.py +11 -0
  171. lfx/components/composio/agiled_composio.py +11 -0
  172. lfx/components/composio/airtable_composio.py +11 -0
  173. lfx/components/composio/apollo_composio.py +11 -0
  174. lfx/components/composio/asana_composio.py +11 -0
  175. lfx/components/composio/attio_composio.py +11 -0
  176. lfx/components/composio/bitbucket_composio.py +11 -0
  177. lfx/components/composio/bolna_composio.py +11 -0
  178. lfx/components/composio/brightdata_composio.py +11 -0
  179. lfx/components/composio/calendly_composio.py +11 -0
  180. lfx/components/composio/canva_composio.py +11 -0
  181. lfx/components/composio/canvas_composio.py +11 -0
  182. lfx/components/composio/coda_composio.py +11 -0
  183. lfx/components/composio/composio_api.py +278 -0
  184. lfx/components/composio/contentful_composio.py +11 -0
  185. lfx/components/composio/digicert_composio.py +11 -0
  186. lfx/components/composio/discord_composio.py +11 -0
  187. lfx/components/composio/dropbox_compnent.py +11 -0
  188. lfx/components/composio/elevenlabs_composio.py +11 -0
  189. lfx/components/composio/exa_composio.py +11 -0
  190. lfx/components/composio/figma_composio.py +11 -0
  191. lfx/components/composio/finage_composio.py +11 -0
  192. lfx/components/composio/firecrawl_composio.py +11 -0
  193. lfx/components/composio/fireflies_composio.py +11 -0
  194. lfx/components/composio/fixer_composio.py +11 -0
  195. lfx/components/composio/flexisign_composio.py +11 -0
  196. lfx/components/composio/freshdesk_composio.py +11 -0
  197. lfx/components/composio/github_composio.py +11 -0
  198. lfx/components/composio/gmail_composio.py +38 -0
  199. lfx/components/composio/googlebigquery_composio.py +11 -0
  200. lfx/components/composio/googlecalendar_composio.py +11 -0
  201. lfx/components/composio/googleclassroom_composio.py +11 -0
  202. lfx/components/composio/googledocs_composio.py +11 -0
  203. lfx/components/composio/googlemeet_composio.py +11 -0
  204. lfx/components/composio/googlesheets_composio.py +11 -0
  205. lfx/components/composio/googletasks_composio.py +8 -0
  206. lfx/components/composio/heygen_composio.py +11 -0
  207. lfx/components/composio/instagram_composio.py +11 -0
  208. lfx/components/composio/jira_composio.py +11 -0
  209. lfx/components/composio/jotform_composio.py +11 -0
  210. lfx/components/composio/klaviyo_composio.py +11 -0
  211. lfx/components/composio/linear_composio.py +11 -0
  212. lfx/components/composio/listennotes_composio.py +11 -0
  213. lfx/components/composio/mem0_composio.py +11 -0
  214. lfx/components/composio/miro_composio.py +11 -0
  215. lfx/components/composio/missive_composio.py +11 -0
  216. lfx/components/composio/notion_composio.py +11 -0
  217. lfx/components/composio/onedrive_composio.py +11 -0
  218. lfx/components/composio/outlook_composio.py +11 -0
  219. lfx/components/composio/pandadoc_composio.py +11 -0
  220. lfx/components/composio/peopledatalabs_composio.py +11 -0
  221. lfx/components/composio/perplexityai_composio.py +11 -0
  222. lfx/components/composio/reddit_composio.py +11 -0
  223. lfx/components/composio/serpapi_composio.py +11 -0
  224. lfx/components/composio/slack_composio.py +11 -0
  225. lfx/components/composio/slackbot_composio.py +11 -0
  226. lfx/components/composio/snowflake_composio.py +11 -0
  227. lfx/components/composio/supabase_composio.py +11 -0
  228. lfx/components/composio/tavily_composio.py +11 -0
  229. lfx/components/composio/timelinesai_composio.py +11 -0
  230. lfx/components/composio/todoist_composio.py +11 -0
  231. lfx/components/composio/wrike_composio.py +11 -0
  232. lfx/components/composio/youtube_composio.py +11 -0
  233. lfx/components/confluence/__init__.py +3 -0
  234. lfx/components/confluence/confluence.py +84 -0
  235. lfx/components/couchbase/__init__.py +34 -0
  236. lfx/components/couchbase/couchbase.py +102 -0
  237. lfx/components/crewai/__init__.py +49 -0
  238. lfx/components/crewai/crewai.py +108 -0
  239. lfx/components/crewai/hierarchical_crew.py +47 -0
  240. lfx/components/crewai/hierarchical_task.py +45 -0
  241. lfx/components/crewai/sequential_crew.py +53 -0
  242. lfx/components/crewai/sequential_task.py +74 -0
  243. lfx/components/crewai/sequential_task_agent.py +144 -0
  244. lfx/components/cuga/__init__.py +34 -0
  245. lfx/components/cuga/cuga_agent.py +730 -0
  246. lfx/components/custom_component/__init__.py +34 -0
  247. lfx/components/custom_component/custom_component.py +31 -0
  248. lfx/components/data/__init__.py +114 -0
  249. lfx/components/data_source/__init__.py +58 -0
  250. lfx/components/data_source/api_request.py +577 -0
  251. lfx/components/data_source/csv_to_data.py +101 -0
  252. lfx/components/data_source/json_to_data.py +106 -0
  253. lfx/components/data_source/mock_data.py +398 -0
  254. lfx/components/data_source/news_search.py +166 -0
  255. lfx/components/data_source/rss.py +71 -0
  256. lfx/components/data_source/sql_executor.py +101 -0
  257. lfx/components/data_source/url.py +311 -0
  258. lfx/components/data_source/web_search.py +326 -0
  259. lfx/components/datastax/__init__.py +76 -0
  260. lfx/components/datastax/astradb_assistant_manager.py +307 -0
  261. lfx/components/datastax/astradb_chatmemory.py +40 -0
  262. lfx/components/datastax/astradb_cql.py +288 -0
  263. lfx/components/datastax/astradb_graph.py +217 -0
  264. lfx/components/datastax/astradb_tool.py +378 -0
  265. lfx/components/datastax/astradb_vectorize.py +122 -0
  266. lfx/components/datastax/astradb_vectorstore.py +449 -0
  267. lfx/components/datastax/create_assistant.py +59 -0
  268. lfx/components/datastax/create_thread.py +33 -0
  269. lfx/components/datastax/dotenv.py +36 -0
  270. lfx/components/datastax/get_assistant.py +38 -0
  271. lfx/components/datastax/getenvvar.py +31 -0
  272. lfx/components/datastax/graph_rag.py +141 -0
  273. lfx/components/datastax/hcd.py +315 -0
  274. lfx/components/datastax/list_assistants.py +26 -0
  275. lfx/components/datastax/run.py +90 -0
  276. lfx/components/deactivated/__init__.py +15 -0
  277. lfx/components/deactivated/amazon_kendra.py +66 -0
  278. lfx/components/deactivated/chat_litellm_model.py +158 -0
  279. lfx/components/deactivated/code_block_extractor.py +26 -0
  280. lfx/components/deactivated/documents_to_data.py +22 -0
  281. lfx/components/deactivated/embed.py +16 -0
  282. lfx/components/deactivated/extract_key_from_data.py +46 -0
  283. lfx/components/deactivated/json_document_builder.py +57 -0
  284. lfx/components/deactivated/list_flows.py +20 -0
  285. lfx/components/deactivated/mcp_sse.py +61 -0
  286. lfx/components/deactivated/mcp_stdio.py +62 -0
  287. lfx/components/deactivated/merge_data.py +93 -0
  288. lfx/components/deactivated/message.py +37 -0
  289. lfx/components/deactivated/metal.py +54 -0
  290. lfx/components/deactivated/multi_query.py +59 -0
  291. lfx/components/deactivated/retriever.py +43 -0
  292. lfx/components/deactivated/selective_passthrough.py +77 -0
  293. lfx/components/deactivated/should_run_next.py +40 -0
  294. lfx/components/deactivated/split_text.py +63 -0
  295. lfx/components/deactivated/store_message.py +24 -0
  296. lfx/components/deactivated/sub_flow.py +124 -0
  297. lfx/components/deactivated/vectara_self_query.py +76 -0
  298. lfx/components/deactivated/vector_store.py +24 -0
  299. lfx/components/deepseek/__init__.py +34 -0
  300. lfx/components/deepseek/deepseek.py +136 -0
  301. lfx/components/docling/__init__.py +43 -0
  302. lfx/components/docling/chunk_docling_document.py +186 -0
  303. lfx/components/docling/docling_inline.py +238 -0
  304. lfx/components/docling/docling_remote.py +195 -0
  305. lfx/components/docling/export_docling_document.py +117 -0
  306. lfx/components/documentloaders/__init__.py +3 -0
  307. lfx/components/duckduckgo/__init__.py +3 -0
  308. lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  309. lfx/components/elastic/__init__.py +37 -0
  310. lfx/components/elastic/elasticsearch.py +267 -0
  311. lfx/components/elastic/opensearch.py +789 -0
  312. lfx/components/elastic/opensearch_multimodal.py +1575 -0
  313. lfx/components/embeddings/__init__.py +37 -0
  314. lfx/components/embeddings/similarity.py +77 -0
  315. lfx/components/embeddings/text_embedder.py +65 -0
  316. lfx/components/exa/__init__.py +3 -0
  317. lfx/components/exa/exa_search.py +68 -0
  318. lfx/components/files_and_knowledge/__init__.py +47 -0
  319. lfx/components/files_and_knowledge/directory.py +113 -0
  320. lfx/components/files_and_knowledge/file.py +841 -0
  321. lfx/components/files_and_knowledge/ingestion.py +694 -0
  322. lfx/components/files_and_knowledge/retrieval.py +264 -0
  323. lfx/components/files_and_knowledge/save_file.py +746 -0
  324. lfx/components/firecrawl/__init__.py +43 -0
  325. lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
  326. lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
  327. lfx/components/firecrawl/firecrawl_map_api.py +89 -0
  328. lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
  329. lfx/components/flow_controls/__init__.py +58 -0
  330. lfx/components/flow_controls/conditional_router.py +208 -0
  331. lfx/components/flow_controls/data_conditional_router.py +126 -0
  332. lfx/components/flow_controls/flow_tool.py +111 -0
  333. lfx/components/flow_controls/listen.py +29 -0
  334. lfx/components/flow_controls/loop.py +163 -0
  335. lfx/components/flow_controls/notify.py +88 -0
  336. lfx/components/flow_controls/pass_message.py +36 -0
  337. lfx/components/flow_controls/run_flow.py +108 -0
  338. lfx/components/flow_controls/sub_flow.py +115 -0
  339. lfx/components/git/__init__.py +4 -0
  340. lfx/components/git/git.py +262 -0
  341. lfx/components/git/gitextractor.py +196 -0
  342. lfx/components/glean/__init__.py +3 -0
  343. lfx/components/glean/glean_search_api.py +173 -0
  344. lfx/components/google/__init__.py +17 -0
  345. lfx/components/google/gmail.py +193 -0
  346. lfx/components/google/google_bq_sql_executor.py +157 -0
  347. lfx/components/google/google_drive.py +92 -0
  348. lfx/components/google/google_drive_search.py +152 -0
  349. lfx/components/google/google_generative_ai.py +144 -0
  350. lfx/components/google/google_generative_ai_embeddings.py +141 -0
  351. lfx/components/google/google_oauth_token.py +89 -0
  352. lfx/components/google/google_search_api_core.py +68 -0
  353. lfx/components/google/google_serper_api_core.py +74 -0
  354. lfx/components/groq/__init__.py +34 -0
  355. lfx/components/groq/groq.py +143 -0
  356. lfx/components/helpers/__init__.py +154 -0
  357. lfx/components/homeassistant/__init__.py +7 -0
  358. lfx/components/homeassistant/home_assistant_control.py +152 -0
  359. lfx/components/homeassistant/list_home_assistant_states.py +137 -0
  360. lfx/components/huggingface/__init__.py +37 -0
  361. lfx/components/huggingface/huggingface.py +199 -0
  362. lfx/components/huggingface/huggingface_inference_api.py +106 -0
  363. lfx/components/ibm/__init__.py +34 -0
  364. lfx/components/ibm/watsonx.py +207 -0
  365. lfx/components/ibm/watsonx_embeddings.py +135 -0
  366. lfx/components/icosacomputing/__init__.py +5 -0
  367. lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
  368. lfx/components/input_output/__init__.py +40 -0
  369. lfx/components/input_output/chat.py +109 -0
  370. lfx/components/input_output/chat_output.py +184 -0
  371. lfx/components/input_output/text.py +27 -0
  372. lfx/components/input_output/text_output.py +29 -0
  373. lfx/components/input_output/webhook.py +56 -0
  374. lfx/components/jigsawstack/__init__.py +23 -0
  375. lfx/components/jigsawstack/ai_scrape.py +126 -0
  376. lfx/components/jigsawstack/ai_web_search.py +136 -0
  377. lfx/components/jigsawstack/file_read.py +115 -0
  378. lfx/components/jigsawstack/file_upload.py +94 -0
  379. lfx/components/jigsawstack/image_generation.py +205 -0
  380. lfx/components/jigsawstack/nsfw.py +60 -0
  381. lfx/components/jigsawstack/object_detection.py +124 -0
  382. lfx/components/jigsawstack/sentiment.py +112 -0
  383. lfx/components/jigsawstack/text_to_sql.py +90 -0
  384. lfx/components/jigsawstack/text_translate.py +77 -0
  385. lfx/components/jigsawstack/vocr.py +107 -0
  386. lfx/components/knowledge_bases/__init__.py +89 -0
  387. lfx/components/langchain_utilities/__init__.py +109 -0
  388. lfx/components/langchain_utilities/character.py +53 -0
  389. lfx/components/langchain_utilities/conversation.py +59 -0
  390. lfx/components/langchain_utilities/csv_agent.py +175 -0
  391. lfx/components/langchain_utilities/fake_embeddings.py +26 -0
  392. lfx/components/langchain_utilities/html_link_extractor.py +35 -0
  393. lfx/components/langchain_utilities/json_agent.py +100 -0
  394. lfx/components/langchain_utilities/langchain_hub.py +126 -0
  395. lfx/components/langchain_utilities/language_recursive.py +49 -0
  396. lfx/components/langchain_utilities/language_semantic.py +138 -0
  397. lfx/components/langchain_utilities/llm_checker.py +39 -0
  398. lfx/components/langchain_utilities/llm_math.py +42 -0
  399. lfx/components/langchain_utilities/natural_language.py +61 -0
  400. lfx/components/langchain_utilities/openai_tools.py +53 -0
  401. lfx/components/langchain_utilities/openapi.py +48 -0
  402. lfx/components/langchain_utilities/recursive_character.py +60 -0
  403. lfx/components/langchain_utilities/retrieval_qa.py +83 -0
  404. lfx/components/langchain_utilities/runnable_executor.py +137 -0
  405. lfx/components/langchain_utilities/self_query.py +80 -0
  406. lfx/components/langchain_utilities/spider.py +142 -0
  407. lfx/components/langchain_utilities/sql.py +40 -0
  408. lfx/components/langchain_utilities/sql_database.py +35 -0
  409. lfx/components/langchain_utilities/sql_generator.py +78 -0
  410. lfx/components/langchain_utilities/tool_calling.py +59 -0
  411. lfx/components/langchain_utilities/vector_store_info.py +49 -0
  412. lfx/components/langchain_utilities/vector_store_router.py +33 -0
  413. lfx/components/langchain_utilities/xml_agent.py +71 -0
  414. lfx/components/langwatch/__init__.py +3 -0
  415. lfx/components/langwatch/langwatch.py +278 -0
  416. lfx/components/link_extractors/__init__.py +3 -0
  417. lfx/components/llm_operations/__init__.py +46 -0
  418. lfx/components/llm_operations/batch_run.py +205 -0
  419. lfx/components/llm_operations/lambda_filter.py +218 -0
  420. lfx/components/llm_operations/llm_conditional_router.py +421 -0
  421. lfx/components/llm_operations/llm_selector.py +499 -0
  422. lfx/components/llm_operations/structured_output.py +244 -0
  423. lfx/components/lmstudio/__init__.py +34 -0
  424. lfx/components/lmstudio/lmstudioembeddings.py +89 -0
  425. lfx/components/lmstudio/lmstudiomodel.py +133 -0
  426. lfx/components/logic/__init__.py +181 -0
  427. lfx/components/maritalk/__init__.py +32 -0
  428. lfx/components/maritalk/maritalk.py +52 -0
  429. lfx/components/mem0/__init__.py +3 -0
  430. lfx/components/mem0/mem0_chat_memory.py +147 -0
  431. lfx/components/milvus/__init__.py +34 -0
  432. lfx/components/milvus/milvus.py +115 -0
  433. lfx/components/mistral/__init__.py +37 -0
  434. lfx/components/mistral/mistral.py +114 -0
  435. lfx/components/mistral/mistral_embeddings.py +58 -0
  436. lfx/components/models/__init__.py +89 -0
  437. lfx/components/models_and_agents/__init__.py +49 -0
  438. lfx/components/models_and_agents/agent.py +644 -0
  439. lfx/components/models_and_agents/embedding_model.py +423 -0
  440. lfx/components/models_and_agents/language_model.py +398 -0
  441. lfx/components/models_and_agents/mcp_component.py +594 -0
  442. lfx/components/models_and_agents/memory.py +268 -0
  443. lfx/components/models_and_agents/prompt.py +67 -0
  444. lfx/components/mongodb/__init__.py +34 -0
  445. lfx/components/mongodb/mongodb_atlas.py +213 -0
  446. lfx/components/needle/__init__.py +3 -0
  447. lfx/components/needle/needle.py +104 -0
  448. lfx/components/notdiamond/__init__.py +34 -0
  449. lfx/components/notdiamond/notdiamond.py +228 -0
  450. lfx/components/novita/__init__.py +32 -0
  451. lfx/components/novita/novita.py +130 -0
  452. lfx/components/nvidia/__init__.py +57 -0
  453. lfx/components/nvidia/nvidia.py +151 -0
  454. lfx/components/nvidia/nvidia_embedding.py +77 -0
  455. lfx/components/nvidia/nvidia_ingest.py +317 -0
  456. lfx/components/nvidia/nvidia_rerank.py +63 -0
  457. lfx/components/nvidia/system_assist.py +65 -0
  458. lfx/components/olivya/__init__.py +3 -0
  459. lfx/components/olivya/olivya.py +116 -0
  460. lfx/components/ollama/__init__.py +37 -0
  461. lfx/components/ollama/ollama.py +548 -0
  462. lfx/components/ollama/ollama_embeddings.py +103 -0
  463. lfx/components/openai/__init__.py +37 -0
  464. lfx/components/openai/openai.py +100 -0
  465. lfx/components/openai/openai_chat_model.py +176 -0
  466. lfx/components/openrouter/__init__.py +32 -0
  467. lfx/components/openrouter/openrouter.py +104 -0
  468. lfx/components/output_parsers/__init__.py +3 -0
  469. lfx/components/perplexity/__init__.py +34 -0
  470. lfx/components/perplexity/perplexity.py +75 -0
  471. lfx/components/pgvector/__init__.py +34 -0
  472. lfx/components/pgvector/pgvector.py +72 -0
  473. lfx/components/pinecone/__init__.py +34 -0
  474. lfx/components/pinecone/pinecone.py +134 -0
  475. lfx/components/processing/__init__.py +72 -0
  476. lfx/components/processing/alter_metadata.py +109 -0
  477. lfx/components/processing/combine_text.py +40 -0
  478. lfx/components/processing/converter.py +248 -0
  479. lfx/components/processing/create_data.py +111 -0
  480. lfx/components/processing/create_list.py +40 -0
  481. lfx/components/processing/data_operations.py +528 -0
  482. lfx/components/processing/data_to_dataframe.py +71 -0
  483. lfx/components/processing/dataframe_operations.py +313 -0
  484. lfx/components/processing/dataframe_to_toolset.py +259 -0
  485. lfx/components/processing/dynamic_create_data.py +357 -0
  486. lfx/components/processing/extract_key.py +54 -0
  487. lfx/components/processing/filter_data.py +43 -0
  488. lfx/components/processing/filter_data_values.py +89 -0
  489. lfx/components/processing/json_cleaner.py +104 -0
  490. lfx/components/processing/merge_data.py +91 -0
  491. lfx/components/processing/message_to_data.py +37 -0
  492. lfx/components/processing/output_parser.py +46 -0
  493. lfx/components/processing/parse_data.py +71 -0
  494. lfx/components/processing/parse_dataframe.py +69 -0
  495. lfx/components/processing/parse_json_data.py +91 -0
  496. lfx/components/processing/parser.py +148 -0
  497. lfx/components/processing/regex.py +83 -0
  498. lfx/components/processing/select_data.py +49 -0
  499. lfx/components/processing/split_text.py +141 -0
  500. lfx/components/processing/store_message.py +91 -0
  501. lfx/components/processing/update_data.py +161 -0
  502. lfx/components/prototypes/__init__.py +35 -0
  503. lfx/components/prototypes/python_function.py +73 -0
  504. lfx/components/qdrant/__init__.py +34 -0
  505. lfx/components/qdrant/qdrant.py +109 -0
  506. lfx/components/redis/__init__.py +37 -0
  507. lfx/components/redis/redis.py +89 -0
  508. lfx/components/redis/redis_chat.py +43 -0
  509. lfx/components/sambanova/__init__.py +32 -0
  510. lfx/components/sambanova/sambanova.py +84 -0
  511. lfx/components/scrapegraph/__init__.py +40 -0
  512. lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  513. lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
  514. lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  515. lfx/components/searchapi/__init__.py +34 -0
  516. lfx/components/searchapi/search.py +79 -0
  517. lfx/components/serpapi/__init__.py +3 -0
  518. lfx/components/serpapi/serp.py +115 -0
  519. lfx/components/supabase/__init__.py +34 -0
  520. lfx/components/supabase/supabase.py +76 -0
  521. lfx/components/tavily/__init__.py +4 -0
  522. lfx/components/tavily/tavily_extract.py +117 -0
  523. lfx/components/tavily/tavily_search.py +212 -0
  524. lfx/components/textsplitters/__init__.py +3 -0
  525. lfx/components/toolkits/__init__.py +3 -0
  526. lfx/components/tools/__init__.py +66 -0
  527. lfx/components/tools/calculator.py +109 -0
  528. lfx/components/tools/google_search_api.py +45 -0
  529. lfx/components/tools/google_serper_api.py +115 -0
  530. lfx/components/tools/python_code_structured_tool.py +328 -0
  531. lfx/components/tools/python_repl.py +98 -0
  532. lfx/components/tools/search_api.py +88 -0
  533. lfx/components/tools/searxng.py +145 -0
  534. lfx/components/tools/serp_api.py +120 -0
  535. lfx/components/tools/tavily_search_tool.py +345 -0
  536. lfx/components/tools/wikidata_api.py +103 -0
  537. lfx/components/tools/wikipedia_api.py +50 -0
  538. lfx/components/tools/yahoo_finance.py +130 -0
  539. lfx/components/twelvelabs/__init__.py +52 -0
  540. lfx/components/twelvelabs/convert_astra_results.py +84 -0
  541. lfx/components/twelvelabs/pegasus_index.py +311 -0
  542. lfx/components/twelvelabs/split_video.py +301 -0
  543. lfx/components/twelvelabs/text_embeddings.py +57 -0
  544. lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  545. lfx/components/twelvelabs/video_embeddings.py +100 -0
  546. lfx/components/twelvelabs/video_file.py +191 -0
  547. lfx/components/unstructured/__init__.py +3 -0
  548. lfx/components/unstructured/unstructured.py +121 -0
  549. lfx/components/upstash/__init__.py +34 -0
  550. lfx/components/upstash/upstash.py +124 -0
  551. lfx/components/utilities/__init__.py +43 -0
  552. lfx/components/utilities/calculator_core.py +89 -0
  553. lfx/components/utilities/current_date.py +42 -0
  554. lfx/components/utilities/id_generator.py +42 -0
  555. lfx/components/utilities/python_repl_core.py +98 -0
  556. lfx/components/vectara/__init__.py +37 -0
  557. lfx/components/vectara/vectara.py +97 -0
  558. lfx/components/vectara/vectara_rag.py +164 -0
  559. lfx/components/vectorstores/__init__.py +34 -0
  560. lfx/components/vectorstores/local_db.py +270 -0
  561. lfx/components/vertexai/__init__.py +37 -0
  562. lfx/components/vertexai/vertexai.py +71 -0
  563. lfx/components/vertexai/vertexai_embeddings.py +67 -0
  564. lfx/components/vlmrun/__init__.py +34 -0
  565. lfx/components/vlmrun/vlmrun_transcription.py +224 -0
  566. lfx/components/weaviate/__init__.py +34 -0
  567. lfx/components/weaviate/weaviate.py +89 -0
  568. lfx/components/wikipedia/__init__.py +4 -0
  569. lfx/components/wikipedia/wikidata.py +86 -0
  570. lfx/components/wikipedia/wikipedia.py +53 -0
  571. lfx/components/wolframalpha/__init__.py +3 -0
  572. lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
  573. lfx/components/xai/__init__.py +32 -0
  574. lfx/components/xai/xai.py +167 -0
  575. lfx/components/yahoosearch/__init__.py +3 -0
  576. lfx/components/yahoosearch/yahoo.py +137 -0
  577. lfx/components/youtube/__init__.py +52 -0
  578. lfx/components/youtube/channel.py +227 -0
  579. lfx/components/youtube/comments.py +231 -0
  580. lfx/components/youtube/playlist.py +33 -0
  581. lfx/components/youtube/search.py +120 -0
  582. lfx/components/youtube/trending.py +285 -0
  583. lfx/components/youtube/video_details.py +263 -0
  584. lfx/components/youtube/youtube_transcripts.py +206 -0
  585. lfx/components/zep/__init__.py +3 -0
  586. lfx/components/zep/zep.py +45 -0
  587. lfx/constants.py +6 -0
  588. lfx/custom/__init__.py +7 -0
  589. lfx/custom/attributes.py +87 -0
  590. lfx/custom/code_parser/__init__.py +3 -0
  591. lfx/custom/code_parser/code_parser.py +361 -0
  592. lfx/custom/custom_component/__init__.py +0 -0
  593. lfx/custom/custom_component/base_component.py +128 -0
  594. lfx/custom/custom_component/component.py +1890 -0
  595. lfx/custom/custom_component/component_with_cache.py +8 -0
  596. lfx/custom/custom_component/custom_component.py +650 -0
  597. lfx/custom/dependency_analyzer.py +165 -0
  598. lfx/custom/directory_reader/__init__.py +3 -0
  599. lfx/custom/directory_reader/directory_reader.py +359 -0
  600. lfx/custom/directory_reader/utils.py +171 -0
  601. lfx/custom/eval.py +12 -0
  602. lfx/custom/schema.py +32 -0
  603. lfx/custom/tree_visitor.py +21 -0
  604. lfx/custom/utils.py +877 -0
  605. lfx/custom/validate.py +523 -0
  606. lfx/events/__init__.py +1 -0
  607. lfx/events/event_manager.py +110 -0
  608. lfx/exceptions/__init__.py +0 -0
  609. lfx/exceptions/component.py +15 -0
  610. lfx/field_typing/__init__.py +91 -0
  611. lfx/field_typing/constants.py +216 -0
  612. lfx/field_typing/range_spec.py +35 -0
  613. lfx/graph/__init__.py +6 -0
  614. lfx/graph/edge/__init__.py +0 -0
  615. lfx/graph/edge/base.py +300 -0
  616. lfx/graph/edge/schema.py +119 -0
  617. lfx/graph/edge/utils.py +0 -0
  618. lfx/graph/graph/__init__.py +0 -0
  619. lfx/graph/graph/ascii.py +202 -0
  620. lfx/graph/graph/base.py +2298 -0
  621. lfx/graph/graph/constants.py +63 -0
  622. lfx/graph/graph/runnable_vertices_manager.py +133 -0
  623. lfx/graph/graph/schema.py +53 -0
  624. lfx/graph/graph/state_model.py +66 -0
  625. lfx/graph/graph/utils.py +1024 -0
  626. lfx/graph/schema.py +75 -0
  627. lfx/graph/state/__init__.py +0 -0
  628. lfx/graph/state/model.py +250 -0
  629. lfx/graph/utils.py +206 -0
  630. lfx/graph/vertex/__init__.py +0 -0
  631. lfx/graph/vertex/base.py +826 -0
  632. lfx/graph/vertex/constants.py +0 -0
  633. lfx/graph/vertex/exceptions.py +4 -0
  634. lfx/graph/vertex/param_handler.py +316 -0
  635. lfx/graph/vertex/schema.py +26 -0
  636. lfx/graph/vertex/utils.py +19 -0
  637. lfx/graph/vertex/vertex_types.py +489 -0
  638. lfx/helpers/__init__.py +141 -0
  639. lfx/helpers/base_model.py +71 -0
  640. lfx/helpers/custom.py +13 -0
  641. lfx/helpers/data.py +167 -0
  642. lfx/helpers/flow.py +308 -0
  643. lfx/inputs/__init__.py +68 -0
  644. lfx/inputs/constants.py +2 -0
  645. lfx/inputs/input_mixin.py +352 -0
  646. lfx/inputs/inputs.py +718 -0
  647. lfx/inputs/validators.py +19 -0
  648. lfx/interface/__init__.py +6 -0
  649. lfx/interface/components.py +897 -0
  650. lfx/interface/importing/__init__.py +5 -0
  651. lfx/interface/importing/utils.py +39 -0
  652. lfx/interface/initialize/__init__.py +3 -0
  653. lfx/interface/initialize/loading.py +317 -0
  654. lfx/interface/listing.py +26 -0
  655. lfx/interface/run.py +16 -0
  656. lfx/interface/utils.py +111 -0
  657. lfx/io/__init__.py +63 -0
  658. lfx/io/schema.py +295 -0
  659. lfx/load/__init__.py +8 -0
  660. lfx/load/load.py +256 -0
  661. lfx/load/utils.py +99 -0
  662. lfx/log/__init__.py +5 -0
  663. lfx/log/logger.py +411 -0
  664. lfx/logging/__init__.py +11 -0
  665. lfx/logging/logger.py +24 -0
  666. lfx/memory/__init__.py +70 -0
  667. lfx/memory/stubs.py +302 -0
  668. lfx/processing/__init__.py +1 -0
  669. lfx/processing/process.py +238 -0
  670. lfx/processing/utils.py +25 -0
  671. lfx/py.typed +0 -0
  672. lfx/schema/__init__.py +66 -0
  673. lfx/schema/artifact.py +83 -0
  674. lfx/schema/content_block.py +62 -0
  675. lfx/schema/content_types.py +91 -0
  676. lfx/schema/cross_module.py +80 -0
  677. lfx/schema/data.py +309 -0
  678. lfx/schema/dataframe.py +210 -0
  679. lfx/schema/dotdict.py +74 -0
  680. lfx/schema/encoders.py +13 -0
  681. lfx/schema/graph.py +47 -0
  682. lfx/schema/image.py +184 -0
  683. lfx/schema/json_schema.py +186 -0
  684. lfx/schema/log.py +62 -0
  685. lfx/schema/message.py +493 -0
  686. lfx/schema/openai_responses_schemas.py +74 -0
  687. lfx/schema/properties.py +41 -0
  688. lfx/schema/schema.py +180 -0
  689. lfx/schema/serialize.py +13 -0
  690. lfx/schema/table.py +142 -0
  691. lfx/schema/validators.py +114 -0
  692. lfx/serialization/__init__.py +5 -0
  693. lfx/serialization/constants.py +2 -0
  694. lfx/serialization/serialization.py +314 -0
  695. lfx/services/__init__.py +26 -0
  696. lfx/services/base.py +28 -0
  697. lfx/services/cache/__init__.py +6 -0
  698. lfx/services/cache/base.py +183 -0
  699. lfx/services/cache/service.py +166 -0
  700. lfx/services/cache/utils.py +169 -0
  701. lfx/services/chat/__init__.py +1 -0
  702. lfx/services/chat/config.py +2 -0
  703. lfx/services/chat/schema.py +10 -0
  704. lfx/services/database/__init__.py +5 -0
  705. lfx/services/database/service.py +25 -0
  706. lfx/services/deps.py +194 -0
  707. lfx/services/factory.py +19 -0
  708. lfx/services/initialize.py +19 -0
  709. lfx/services/interfaces.py +103 -0
  710. lfx/services/manager.py +185 -0
  711. lfx/services/mcp_composer/__init__.py +6 -0
  712. lfx/services/mcp_composer/factory.py +16 -0
  713. lfx/services/mcp_composer/service.py +1441 -0
  714. lfx/services/schema.py +21 -0
  715. lfx/services/session.py +87 -0
  716. lfx/services/settings/__init__.py +3 -0
  717. lfx/services/settings/auth.py +133 -0
  718. lfx/services/settings/base.py +668 -0
  719. lfx/services/settings/constants.py +43 -0
  720. lfx/services/settings/factory.py +23 -0
  721. lfx/services/settings/feature_flags.py +11 -0
  722. lfx/services/settings/service.py +35 -0
  723. lfx/services/settings/utils.py +40 -0
  724. lfx/services/shared_component_cache/__init__.py +1 -0
  725. lfx/services/shared_component_cache/factory.py +30 -0
  726. lfx/services/shared_component_cache/service.py +9 -0
  727. lfx/services/storage/__init__.py +5 -0
  728. lfx/services/storage/local.py +185 -0
  729. lfx/services/storage/service.py +177 -0
  730. lfx/services/tracing/__init__.py +1 -0
  731. lfx/services/tracing/service.py +21 -0
  732. lfx/settings.py +6 -0
  733. lfx/template/__init__.py +6 -0
  734. lfx/template/field/__init__.py +0 -0
  735. lfx/template/field/base.py +260 -0
  736. lfx/template/field/prompt.py +15 -0
  737. lfx/template/frontend_node/__init__.py +6 -0
  738. lfx/template/frontend_node/base.py +214 -0
  739. lfx/template/frontend_node/constants.py +65 -0
  740. lfx/template/frontend_node/custom_components.py +79 -0
  741. lfx/template/template/__init__.py +0 -0
  742. lfx/template/template/base.py +100 -0
  743. lfx/template/utils.py +217 -0
  744. lfx/type_extraction/__init__.py +19 -0
  745. lfx/type_extraction/type_extraction.py +75 -0
  746. lfx/type_extraction.py +80 -0
  747. lfx/utils/__init__.py +1 -0
  748. lfx/utils/async_helpers.py +42 -0
  749. lfx/utils/component_utils.py +154 -0
  750. lfx/utils/concurrency.py +60 -0
  751. lfx/utils/connection_string_parser.py +11 -0
  752. lfx/utils/constants.py +233 -0
  753. lfx/utils/data_structure.py +212 -0
  754. lfx/utils/exceptions.py +22 -0
  755. lfx/utils/helpers.py +34 -0
  756. lfx/utils/image.py +79 -0
  757. lfx/utils/langflow_utils.py +52 -0
  758. lfx/utils/lazy_load.py +15 -0
  759. lfx/utils/request_utils.py +18 -0
  760. lfx/utils/schemas.py +139 -0
  761. lfx/utils/ssrf_protection.py +384 -0
  762. lfx/utils/util.py +626 -0
  763. lfx/utils/util_strings.py +56 -0
  764. lfx/utils/validate_cloud.py +26 -0
  765. lfx/utils/version.py +24 -0
  766. lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
  767. lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
  768. lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
  769. lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
lfx/schema/message.py ADDED
@@ -0,0 +1,493 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import json
5
+ import re
6
+ import traceback
7
+ from collections.abc import AsyncIterator, Iterator
8
+ from datetime import datetime, timezone
9
+ from typing import TYPE_CHECKING, Annotated, Any, Literal
10
+ from uuid import UUID
11
+
12
+ from fastapi.encoders import jsonable_encoder
13
+ from langchain_core.load import load
14
+ from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, SystemMessage, ToolMessage
15
+ from langchain_core.prompts.chat import BaseChatPromptTemplate, ChatPromptTemplate
16
+ from langchain_core.prompts.prompt import PromptTemplate
17
+ from pydantic import BaseModel, ConfigDict, Field, ValidationError, field_serializer, field_validator
18
+
19
+ from lfx.base.prompts.utils import dict_values_to_string
20
+ from lfx.log.logger import logger
21
+ from lfx.schema.content_block import ContentBlock
22
+ from lfx.schema.content_types import ErrorContent
23
+ from lfx.schema.data import Data
24
+ from lfx.schema.image import Image, get_file_paths, is_image_file
25
+ from lfx.schema.properties import Properties, Source
26
+ from lfx.schema.validators import timestamp_to_str, timestamp_to_str_validator
27
+ from lfx.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_NAME_AI, MESSAGE_SENDER_NAME_USER, MESSAGE_SENDER_USER
28
+ from lfx.utils.image import create_image_content_dict
29
+
30
+ if TYPE_CHECKING:
31
+ from lfx.schema.dataframe import DataFrame
32
+
33
+
34
+ class Message(Data):
35
+ model_config = ConfigDict(arbitrary_types_allowed=True)
36
+ # Helper class to deal with image data
37
+ text_key: str = "text"
38
+ text: str | AsyncIterator | Iterator | None = Field(default="")
39
+ sender: str | None = None
40
+ sender_name: str | None = None
41
+ files: list[str | Image] | None = Field(default=[])
42
+ session_id: str | UUID | None = Field(default="")
43
+ context_id: str | UUID | None = Field(default="")
44
+ timestamp: Annotated[str, timestamp_to_str_validator] = Field(
45
+ default_factory=lambda: datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S %Z")
46
+ )
47
+ flow_id: str | UUID | None = None
48
+ error: bool = Field(default=False)
49
+ edit: bool = Field(default=False)
50
+
51
+ properties: Properties = Field(default_factory=Properties)
52
+ category: Literal["message", "error", "warning", "info"] | None = "message"
53
+ content_blocks: list[ContentBlock] = Field(default_factory=list)
54
+ duration: int | None = None
55
+
56
+ @field_validator("flow_id", mode="before")
57
+ @classmethod
58
+ def validate_flow_id(cls, value):
59
+ if isinstance(value, UUID):
60
+ value = str(value)
61
+ return value
62
+
63
+ @field_validator("content_blocks", mode="before")
64
+ @classmethod
65
+ def validate_content_blocks(cls, value):
66
+ # value may start with [ or not
67
+ if isinstance(value, list):
68
+ return [
69
+ ContentBlock.model_validate_json(v) if isinstance(v, str) else ContentBlock.model_validate(v)
70
+ for v in value
71
+ ]
72
+ if isinstance(value, str):
73
+ value = json.loads(value) if value.startswith("[") else [ContentBlock.model_validate_json(value)]
74
+ return value
75
+
76
+ @field_validator("properties", mode="before")
77
+ @classmethod
78
+ def validate_properties(cls, value):
79
+ if isinstance(value, str):
80
+ value = Properties.model_validate_json(value)
81
+ elif isinstance(value, dict):
82
+ value = Properties.model_validate(value)
83
+ return value
84
+
85
+ @field_serializer("flow_id")
86
+ def serialize_flow_id(self, value):
87
+ if isinstance(value, UUID):
88
+ return str(value)
89
+ return value
90
+
91
+ @field_serializer("timestamp")
92
+ def serialize_timestamp(self, value):
93
+ try:
94
+ # Try parsing with timezone
95
+ return datetime.strptime(value.strip(), "%Y-%m-%d %H:%M:%S %Z").replace(tzinfo=timezone.utc)
96
+ except ValueError:
97
+ # Try parsing without timezone
98
+ return datetime.strptime(value.strip(), "%Y-%m-%d %H:%M:%S").replace(tzinfo=timezone.utc)
99
+
100
+ @field_validator("files", mode="before")
101
+ @classmethod
102
+ def validate_files(cls, value):
103
+ if not value:
104
+ value = []
105
+ elif not isinstance(value, list):
106
+ value = [value]
107
+ return value
108
+
109
+ def model_post_init(self, /, _context: Any) -> None:
110
+ new_files: list[Any] = []
111
+ for file in self.files or []:
112
+ if is_image_file(file):
113
+ new_files.append(Image(path=file))
114
+ else:
115
+ new_files.append(file)
116
+ self.files = new_files
117
+ if "timestamp" not in self.data:
118
+ self.data["timestamp"] = self.timestamp
119
+
120
+ def set_flow_id(self, flow_id: str) -> None:
121
+ self.flow_id = flow_id
122
+
123
+ def to_lc_message(
124
+ self,
125
+ model_name: str | None = None,
126
+ ) -> BaseMessage:
127
+ """Converts the Data to a BaseMessage.
128
+
129
+ Args:
130
+ model_name: The model name to use for conversion. Optional.
131
+
132
+ Returns:
133
+ BaseMessage: The converted BaseMessage.
134
+ """
135
+ # The idea of this function is to be a helper to convert a Data to a BaseMessage
136
+ # It will use the "sender" key to determine if the message is Human or AI
137
+ # If the key is not present, it will default to AI
138
+ # But first we check if all required keys are present in the data dictionary
139
+ # they are: "text", "sender"
140
+ if self.text is None or not self.sender:
141
+ logger.warning("Missing required keys ('text', 'sender') in Message, defaulting to HumanMessage.")
142
+ text = "" if not isinstance(self.text, str) else self.text
143
+
144
+ if self.sender == MESSAGE_SENDER_USER or not self.sender:
145
+ if self.files:
146
+ contents = [{"type": "text", "text": text}]
147
+ file_contents = self.get_file_content_dicts(model_name)
148
+ contents.extend(file_contents)
149
+ human_message = HumanMessage(content=contents)
150
+ else:
151
+ human_message = HumanMessage(content=text)
152
+ return human_message
153
+
154
+ return AIMessage(content=text)
155
+
156
+ @classmethod
157
+ def from_lc_message(cls, lc_message: BaseMessage) -> Message:
158
+ if lc_message.type == "human":
159
+ sender = MESSAGE_SENDER_USER
160
+ sender_name = MESSAGE_SENDER_NAME_USER
161
+ elif lc_message.type == "ai":
162
+ sender = MESSAGE_SENDER_AI
163
+ sender_name = MESSAGE_SENDER_NAME_AI
164
+ elif lc_message.type == "system":
165
+ sender = "System"
166
+ sender_name = "System"
167
+ elif lc_message.type == "tool":
168
+ sender = "Tool"
169
+ sender_name = "Tool"
170
+ else:
171
+ sender = lc_message.type
172
+ sender_name = lc_message.type
173
+
174
+ return cls(text=lc_message.content, sender=sender, sender_name=sender_name)
175
+
176
+ @classmethod
177
+ def from_data(cls, data: Data) -> Message:
178
+ """Converts Data to a Message.
179
+
180
+ Args:
181
+ data: The Data to convert.
182
+
183
+ Returns:
184
+ The converted Message.
185
+ """
186
+ return cls(
187
+ text=data.text,
188
+ sender=data.sender,
189
+ sender_name=data.sender_name,
190
+ files=data.files,
191
+ session_id=data.session_id,
192
+ context_id=data.context_id,
193
+ timestamp=data.timestamp,
194
+ flow_id=data.flow_id,
195
+ error=data.error,
196
+ edit=data.edit,
197
+ )
198
+
199
+ @field_serializer("text", mode="plain")
200
+ def serialize_text(self, value):
201
+ if isinstance(value, AsyncIterator | Iterator):
202
+ return ""
203
+ return value
204
+
205
+ # Keep this async method for backwards compatibility
206
+ def get_file_content_dicts(self, model_name: str | None = None):
207
+ content_dicts = []
208
+ try:
209
+ files = get_file_paths(self.files)
210
+ except Exception as e: # noqa: BLE001
211
+ logger.error(f"Error getting file paths: {e}")
212
+ return content_dicts
213
+
214
+ for file in files:
215
+ if isinstance(file, Image):
216
+ content_dicts.append(file.to_content_dict())
217
+ else:
218
+ content_dicts.append(create_image_content_dict(file, None, model_name))
219
+ return content_dicts
220
+
221
+ def load_lc_prompt(self):
222
+ if "prompt" not in self:
223
+ msg = "Prompt is required."
224
+ raise ValueError(msg)
225
+ # self.prompt was passed through jsonable_encoder
226
+ # so inner messages are not BaseMessage
227
+ # we need to convert them to BaseMessage
228
+ messages = []
229
+ for message in self.prompt.get("kwargs", {}).get("messages", []):
230
+ match message:
231
+ case HumanMessage():
232
+ messages.append(message)
233
+ case _ if message.get("type") == "human":
234
+ messages.append(HumanMessage(content=message.get("content")))
235
+ case _ if message.get("type") == "system":
236
+ messages.append(SystemMessage(content=message.get("content")))
237
+ case _ if message.get("type") == "ai":
238
+ messages.append(AIMessage(content=message.get("content")))
239
+ case _ if message.get("type") == "tool":
240
+ messages.append(ToolMessage(content=message.get("content")))
241
+
242
+ self.prompt["kwargs"]["messages"] = messages
243
+ return load(self.prompt)
244
+
245
+ @classmethod
246
+ def from_lc_prompt(
247
+ cls,
248
+ prompt: BaseChatPromptTemplate,
249
+ ):
250
+ prompt_json = prompt.to_json()
251
+ return cls(prompt=prompt_json)
252
+
253
+ def format_text(self):
254
+ prompt_template = PromptTemplate.from_template(self.template)
255
+ variables_with_str_values = dict_values_to_string(self.variables)
256
+ formatted_prompt = prompt_template.format(**variables_with_str_values)
257
+ self.text = formatted_prompt
258
+ return formatted_prompt
259
+
260
+ @classmethod
261
+ async def from_template_and_variables(cls, template: str, **variables):
262
+ # This method has to be async for backwards compatibility with versions
263
+ # >1.0.15, <1.1
264
+ return cls.from_template(template, **variables)
265
+
266
+ # Define a sync version for backwards compatibility with versions >1.0.15, <1.1
267
+ @classmethod
268
+ def from_template(cls, template: str, **variables):
269
+ instance = cls(template=template, variables=variables)
270
+ text = instance.format_text()
271
+ message = HumanMessage(content=text)
272
+ contents = []
273
+ for value in variables.values():
274
+ if isinstance(value, cls) and value.files:
275
+ content_dicts = value.get_file_content_dicts()
276
+ contents.extend(content_dicts)
277
+ if contents:
278
+ message = HumanMessage(content=[{"type": "text", "text": text}, *contents])
279
+
280
+ prompt_template = ChatPromptTemplate.from_messages([message])
281
+
282
+ instance.prompt = jsonable_encoder(prompt_template.to_json())
283
+ instance.messages = instance.prompt.get("kwargs", {}).get("messages", [])
284
+ return instance
285
+
286
+ @classmethod
287
+ async def create(cls, **kwargs):
288
+ """If files are present, create the message in a separate thread as is_image_file is blocking."""
289
+ if "files" in kwargs:
290
+ return await asyncio.to_thread(cls, **kwargs)
291
+ return cls(**kwargs)
292
+
293
+ def to_data(self) -> Data:
294
+ return Data(data=self.data)
295
+
296
+ def to_dataframe(self) -> DataFrame:
297
+ from lfx.schema.dataframe import DataFrame # Local import to avoid circular import
298
+
299
+ return DataFrame(data=[self])
300
+
301
+
302
+ class DefaultModel(BaseModel):
303
+ model_config = ConfigDict(
304
+ from_attributes=True,
305
+ populate_by_name=True,
306
+ json_encoders={
307
+ datetime: lambda v: v.isoformat(),
308
+ UUID: lambda v: str(v),
309
+ },
310
+ )
311
+
312
+ def json(self, **kwargs):
313
+ # Usa a função de serialização personalizada
314
+ return super().model_dump_json(**kwargs, encoder=self.custom_encoder)
315
+
316
+ @staticmethod
317
+ def custom_encoder(obj):
318
+ if isinstance(obj, datetime):
319
+ return obj.isoformat()
320
+ msg = f"Object of type {obj.__class__.__name__} is not JSON serializable"
321
+ raise TypeError(msg)
322
+
323
+
324
+ class MessageResponse(DefaultModel):
325
+ id: str | UUID | None = Field(default=None)
326
+ flow_id: UUID | None = Field(default=None)
327
+ timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
328
+ sender: str
329
+ sender_name: str
330
+ session_id: str
331
+ context_id: str | None = None
332
+ text: str
333
+ files: list[str] = []
334
+ edit: bool
335
+ duration: float | None = None
336
+
337
+ properties: Properties | None = None
338
+ category: str | None = None
339
+ content_blocks: list[ContentBlock] | None = None
340
+
341
+ @field_validator("content_blocks", mode="before")
342
+ @classmethod
343
+ def validate_content_blocks(cls, v):
344
+ if isinstance(v, str):
345
+ v = json.loads(v)
346
+ if isinstance(v, list):
347
+ return [cls.validate_content_blocks(block) for block in v]
348
+ if isinstance(v, dict):
349
+ return ContentBlock.model_validate(v)
350
+ return v
351
+
352
+ @field_validator("properties", mode="before")
353
+ @classmethod
354
+ def validate_properties(cls, v):
355
+ if isinstance(v, str):
356
+ v = json.loads(v)
357
+ return v
358
+
359
+ @field_validator("files", mode="before")
360
+ @classmethod
361
+ def validate_files(cls, v):
362
+ if isinstance(v, str):
363
+ v = json.loads(v)
364
+ return v
365
+
366
+ @field_serializer("timestamp")
367
+ @classmethod
368
+ def serialize_timestamp(cls, v):
369
+ return timestamp_to_str(v)
370
+
371
+ @field_serializer("files")
372
+ @classmethod
373
+ def serialize_files(cls, v):
374
+ if isinstance(v, list):
375
+ return json.dumps(v)
376
+ return v
377
+
378
+ @classmethod
379
+ def from_message(cls, message: Message, flow_id: str | None = None):
380
+ # first check if the record has all the required fields
381
+ if message.text is None or not message.sender or not message.sender_name:
382
+ msg = "The message does not have the required fields (text, sender, sender_name)."
383
+ raise ValueError(msg)
384
+ return cls(
385
+ sender=message.sender,
386
+ sender_name=message.sender_name,
387
+ text=message.text,
388
+ session_id=message.session_id,
389
+ context_id=message.context_id,
390
+ files=message.files or [],
391
+ timestamp=message.timestamp,
392
+ flow_id=flow_id,
393
+ )
394
+
395
+
396
+ class ErrorMessage(Message):
397
+ """A message class specifically for error messages with predefined error-specific attributes."""
398
+
399
+ @staticmethod
400
+ def _format_markdown_reason(exception: BaseException) -> str:
401
+ """Format the error reason with markdown formatting."""
402
+ reason = f"**{exception.__class__.__name__}**\n"
403
+ if hasattr(exception, "body") and isinstance(exception.body, dict) and "message" in exception.body:
404
+ reason += f" - **{exception.body.get('message')}**\n"
405
+ elif hasattr(exception, "code"):
406
+ reason += f" - **Code: {exception.code}**\n"
407
+ elif hasattr(exception, "args") and exception.args:
408
+ reason += f" - **Details: {exception.args[0]}**\n"
409
+ elif isinstance(exception, ValidationError):
410
+ reason += f" - **Details:**\n\n```python\n{exception!s}\n```\n"
411
+ else:
412
+ reason += " - **An unknown error occurred.**\n"
413
+ return reason
414
+
415
+ @staticmethod
416
+ def _format_plain_reason(exception: BaseException) -> str:
417
+ """Format the error reason without markdown."""
418
+ if hasattr(exception, "body") and isinstance(exception.body, dict) and "message" in exception.body:
419
+ reason = f"{exception.body.get('message')}\n"
420
+ elif hasattr(exception, "_message"):
421
+ reason = f"{exception._message()}\n" if callable(exception._message) else f"{exception._message}\n" # noqa: SLF001
422
+ elif hasattr(exception, "code"):
423
+ reason = f"Code: {exception.code}\n"
424
+ elif hasattr(exception, "args") and exception.args:
425
+ reason = f"{exception.args[0]}\n"
426
+ elif isinstance(exception, ValidationError):
427
+ reason = f"{exception!s}\n"
428
+ elif hasattr(exception, "detail"):
429
+ reason = f"{exception.detail}\n"
430
+ elif hasattr(exception, "message"):
431
+ reason = f"{exception.message}\n"
432
+ else:
433
+ reason = "An unknown error occurred.\n"
434
+ return reason
435
+
436
+ def __init__(
437
+ self,
438
+ exception: BaseException,
439
+ session_id: str | None = None,
440
+ context_id: str | None = None,
441
+ source: Source | None = None,
442
+ trace_name: str | None = None,
443
+ flow_id: UUID | str | None = None,
444
+ ) -> None:
445
+ # This is done to avoid circular imports
446
+ if exception.__class__.__name__ == "ExceptionWithMessageError" and exception.__cause__ is not None:
447
+ exception = exception.__cause__
448
+
449
+ plain_reason = self._format_plain_reason(exception)
450
+ markdown_reason = self._format_markdown_reason(exception)
451
+ # Get the sender ID
452
+ if trace_name:
453
+ match = re.search(r"\((.*?)\)", trace_name)
454
+ if match:
455
+ match.group(1)
456
+
457
+ super().__init__(
458
+ session_id=session_id,
459
+ context_id=context_id,
460
+ sender=source.display_name if source else None,
461
+ sender_name=source.display_name if source else None,
462
+ text=plain_reason,
463
+ properties=Properties(
464
+ text_color="red",
465
+ background_color="red",
466
+ edited=False,
467
+ source=source,
468
+ icon="error",
469
+ allow_markdown=False,
470
+ targets=[],
471
+ ),
472
+ category="error",
473
+ error=True,
474
+ content_blocks=[
475
+ ContentBlock(
476
+ title="Error",
477
+ contents=[
478
+ ErrorContent(
479
+ type="error",
480
+ component=source.display_name if source else None,
481
+ field=str(exception.field) if hasattr(exception, "field") else None,
482
+ reason=markdown_reason,
483
+ solution=str(exception.solution) if hasattr(exception, "solution") else None,
484
+ traceback=traceback.format_exc(),
485
+ )
486
+ ],
487
+ )
488
+ ],
489
+ flow_id=flow_id,
490
+ )
491
+
492
+
493
+ __all__ = ["ContentBlock", "DefaultModel", "ErrorMessage", "Message", "MessageResponse"]
@@ -0,0 +1,74 @@
1
+ from typing import Any, Literal
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+
6
+ class OpenAIResponsesRequest(BaseModel):
7
+ """OpenAI-compatible responses request with flow_id as model parameter."""
8
+
9
+ model: str = Field(..., description="The flow ID to execute (used instead of OpenAI model)")
10
+ input: str = Field(..., description="The input text to process")
11
+ stream: bool = Field(default=False, description="Whether to stream the response")
12
+ background: bool = Field(default=False, description="Whether to process in background")
13
+ tools: list[Any] | None = Field(default=None, description="Tools are not supported yet")
14
+ previous_response_id: str | None = Field(
15
+ default=None, description="ID of previous response to continue conversation"
16
+ )
17
+ include: list[str] | None = Field(
18
+ default=None, description="Additional response data to include, e.g., ['tool_call.results']"
19
+ )
20
+
21
+
22
+ class OpenAIResponsesResponse(BaseModel):
23
+ """OpenAI-compatible responses response."""
24
+
25
+ id: str
26
+ object: Literal["response"] = "response"
27
+ created_at: int
28
+ status: Literal["completed", "in_progress", "failed"] = "completed"
29
+ error: dict | None = None
30
+ incomplete_details: dict | None = None
31
+ instructions: str | None = None
32
+ max_output_tokens: int | None = None
33
+ model: str
34
+ output: list[dict]
35
+ parallel_tool_calls: bool = True
36
+ previous_response_id: str | None = None
37
+ reasoning: dict = Field(default_factory=lambda: {"effort": None, "summary": None})
38
+ store: bool = True
39
+ temperature: float = 1.0
40
+ text: dict = Field(default_factory=lambda: {"format": {"type": "text"}})
41
+ tool_choice: str = "auto"
42
+ tools: list[dict] = Field(default_factory=list)
43
+ top_p: float = 1.0
44
+ truncation: str = "disabled"
45
+ usage: dict | None = None
46
+ user: str | None = None
47
+ metadata: dict = Field(default_factory=dict)
48
+
49
+
50
+ class OpenAIResponsesStreamChunk(BaseModel):
51
+ """OpenAI-compatible responses stream chunk."""
52
+
53
+ id: str
54
+ object: Literal["response.chunk"] = "response.chunk"
55
+ created: int
56
+ model: str
57
+ delta: dict
58
+ status: Literal["completed", "in_progress", "failed"] | None = None
59
+
60
+
61
+ class OpenAIErrorResponse(BaseModel):
62
+ error: dict = Field(..., description="Error details")
63
+
64
+
65
+ def create_openai_error(message: str, type_: str = "invalid_request_error", code: str | None = None) -> dict:
66
+ """Create an OpenAI-compatible error response."""
67
+ error_data = {
68
+ "message": message,
69
+ "type": type_,
70
+ }
71
+ if code:
72
+ error_data["code"] = code
73
+
74
+ return {"error": error_data}
@@ -0,0 +1,41 @@
1
+ """Properties and Source schema classes copied from langflow for lfx package."""
2
+
3
+ from typing import Literal
4
+
5
+ from pydantic import BaseModel, Field, field_serializer, field_validator
6
+
7
+
8
+ class Source(BaseModel):
9
+ id: str | None = Field(default=None, description="The id of the source component.")
10
+ display_name: str | None = Field(default=None, description="The display name of the source component.")
11
+ source: str | None = Field(
12
+ default=None,
13
+ description="The source of the message. Normally used to display the model name (e.g. 'gpt-4o')",
14
+ )
15
+
16
+
17
+ class Properties(BaseModel):
18
+ text_color: str | None = None
19
+ background_color: str | None = None
20
+ edited: bool = False
21
+ source: Source = Field(default_factory=Source)
22
+ icon: str | None = None
23
+ allow_markdown: bool = False
24
+ positive_feedback: bool | None = None
25
+ state: Literal["partial", "complete"] = "complete"
26
+ targets: list = []
27
+
28
+ @field_validator("source", mode="before")
29
+ @classmethod
30
+ def validate_source(cls, v):
31
+ if isinstance(v, str):
32
+ return Source(id=v, display_name=v, source=v)
33
+ if v is None:
34
+ return Source()
35
+ return v
36
+
37
+ @field_serializer("source")
38
+ def serialize_source(self, value):
39
+ if isinstance(value, Source):
40
+ return value.model_dump()
41
+ return value