lfx-nightly 0.1.11.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. lfx/__init__.py +0 -0
  2. lfx/__main__.py +25 -0
  3. lfx/base/__init__.py +0 -0
  4. lfx/base/agents/__init__.py +0 -0
  5. lfx/base/agents/agent.py +268 -0
  6. lfx/base/agents/callback.py +130 -0
  7. lfx/base/agents/context.py +109 -0
  8. lfx/base/agents/crewai/__init__.py +0 -0
  9. lfx/base/agents/crewai/crew.py +231 -0
  10. lfx/base/agents/crewai/tasks.py +12 -0
  11. lfx/base/agents/default_prompts.py +23 -0
  12. lfx/base/agents/errors.py +15 -0
  13. lfx/base/agents/events.py +346 -0
  14. lfx/base/agents/utils.py +205 -0
  15. lfx/base/astra_assistants/__init__.py +0 -0
  16. lfx/base/astra_assistants/util.py +171 -0
  17. lfx/base/chains/__init__.py +0 -0
  18. lfx/base/chains/model.py +19 -0
  19. lfx/base/composio/__init__.py +0 -0
  20. lfx/base/composio/composio_base.py +1291 -0
  21. lfx/base/compressors/__init__.py +0 -0
  22. lfx/base/compressors/model.py +60 -0
  23. lfx/base/constants.py +46 -0
  24. lfx/base/curl/__init__.py +0 -0
  25. lfx/base/curl/parse.py +188 -0
  26. lfx/base/data/__init__.py +5 -0
  27. lfx/base/data/base_file.py +685 -0
  28. lfx/base/data/docling_utils.py +245 -0
  29. lfx/base/data/utils.py +198 -0
  30. lfx/base/document_transformers/__init__.py +0 -0
  31. lfx/base/document_transformers/model.py +43 -0
  32. lfx/base/embeddings/__init__.py +0 -0
  33. lfx/base/embeddings/aiml_embeddings.py +62 -0
  34. lfx/base/embeddings/model.py +26 -0
  35. lfx/base/flow_processing/__init__.py +0 -0
  36. lfx/base/flow_processing/utils.py +86 -0
  37. lfx/base/huggingface/__init__.py +0 -0
  38. lfx/base/huggingface/model_bridge.py +133 -0
  39. lfx/base/io/__init__.py +0 -0
  40. lfx/base/io/chat.py +20 -0
  41. lfx/base/io/text.py +22 -0
  42. lfx/base/langchain_utilities/__init__.py +0 -0
  43. lfx/base/langchain_utilities/model.py +35 -0
  44. lfx/base/langchain_utilities/spider_constants.py +1 -0
  45. lfx/base/langwatch/__init__.py +0 -0
  46. lfx/base/langwatch/utils.py +18 -0
  47. lfx/base/mcp/__init__.py +0 -0
  48. lfx/base/mcp/constants.py +2 -0
  49. lfx/base/mcp/util.py +1398 -0
  50. lfx/base/memory/__init__.py +0 -0
  51. lfx/base/memory/memory.py +49 -0
  52. lfx/base/memory/model.py +38 -0
  53. lfx/base/models/__init__.py +3 -0
  54. lfx/base/models/aiml_constants.py +51 -0
  55. lfx/base/models/anthropic_constants.py +47 -0
  56. lfx/base/models/aws_constants.py +151 -0
  57. lfx/base/models/chat_result.py +76 -0
  58. lfx/base/models/google_generative_ai_constants.py +70 -0
  59. lfx/base/models/groq_constants.py +134 -0
  60. lfx/base/models/model.py +375 -0
  61. lfx/base/models/model_input_constants.py +307 -0
  62. lfx/base/models/model_metadata.py +41 -0
  63. lfx/base/models/model_utils.py +8 -0
  64. lfx/base/models/novita_constants.py +35 -0
  65. lfx/base/models/ollama_constants.py +49 -0
  66. lfx/base/models/openai_constants.py +122 -0
  67. lfx/base/models/sambanova_constants.py +18 -0
  68. lfx/base/processing/__init__.py +0 -0
  69. lfx/base/prompts/__init__.py +0 -0
  70. lfx/base/prompts/api_utils.py +224 -0
  71. lfx/base/prompts/utils.py +61 -0
  72. lfx/base/textsplitters/__init__.py +0 -0
  73. lfx/base/textsplitters/model.py +28 -0
  74. lfx/base/tools/__init__.py +0 -0
  75. lfx/base/tools/base.py +26 -0
  76. lfx/base/tools/component_tool.py +325 -0
  77. lfx/base/tools/constants.py +49 -0
  78. lfx/base/tools/flow_tool.py +132 -0
  79. lfx/base/tools/run_flow.py +224 -0
  80. lfx/base/vectorstores/__init__.py +0 -0
  81. lfx/base/vectorstores/model.py +193 -0
  82. lfx/base/vectorstores/utils.py +22 -0
  83. lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
  84. lfx/cli/__init__.py +5 -0
  85. lfx/cli/commands.py +319 -0
  86. lfx/cli/common.py +650 -0
  87. lfx/cli/run.py +441 -0
  88. lfx/cli/script_loader.py +247 -0
  89. lfx/cli/serve_app.py +546 -0
  90. lfx/cli/validation.py +69 -0
  91. lfx/components/FAISS/__init__.py +34 -0
  92. lfx/components/FAISS/faiss.py +111 -0
  93. lfx/components/Notion/__init__.py +19 -0
  94. lfx/components/Notion/add_content_to_page.py +269 -0
  95. lfx/components/Notion/create_page.py +94 -0
  96. lfx/components/Notion/list_database_properties.py +68 -0
  97. lfx/components/Notion/list_pages.py +122 -0
  98. lfx/components/Notion/list_users.py +77 -0
  99. lfx/components/Notion/page_content_viewer.py +93 -0
  100. lfx/components/Notion/search.py +111 -0
  101. lfx/components/Notion/update_page_property.py +114 -0
  102. lfx/components/__init__.py +411 -0
  103. lfx/components/_importing.py +42 -0
  104. lfx/components/agentql/__init__.py +3 -0
  105. lfx/components/agentql/agentql_api.py +151 -0
  106. lfx/components/agents/__init__.py +34 -0
  107. lfx/components/agents/agent.py +558 -0
  108. lfx/components/agents/mcp_component.py +501 -0
  109. lfx/components/aiml/__init__.py +37 -0
  110. lfx/components/aiml/aiml.py +112 -0
  111. lfx/components/aiml/aiml_embeddings.py +37 -0
  112. lfx/components/amazon/__init__.py +36 -0
  113. lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
  114. lfx/components/amazon/amazon_bedrock_model.py +124 -0
  115. lfx/components/amazon/s3_bucket_uploader.py +211 -0
  116. lfx/components/anthropic/__init__.py +34 -0
  117. lfx/components/anthropic/anthropic.py +187 -0
  118. lfx/components/apify/__init__.py +5 -0
  119. lfx/components/apify/apify_actor.py +325 -0
  120. lfx/components/arxiv/__init__.py +3 -0
  121. lfx/components/arxiv/arxiv.py +163 -0
  122. lfx/components/assemblyai/__init__.py +46 -0
  123. lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  124. lfx/components/assemblyai/assemblyai_lemur.py +183 -0
  125. lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  126. lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  127. lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
  128. lfx/components/azure/__init__.py +37 -0
  129. lfx/components/azure/azure_openai.py +95 -0
  130. lfx/components/azure/azure_openai_embeddings.py +83 -0
  131. lfx/components/baidu/__init__.py +32 -0
  132. lfx/components/baidu/baidu_qianfan_chat.py +113 -0
  133. lfx/components/bing/__init__.py +3 -0
  134. lfx/components/bing/bing_search_api.py +61 -0
  135. lfx/components/cassandra/__init__.py +40 -0
  136. lfx/components/cassandra/cassandra.py +264 -0
  137. lfx/components/cassandra/cassandra_chat.py +92 -0
  138. lfx/components/cassandra/cassandra_graph.py +238 -0
  139. lfx/components/chains/__init__.py +3 -0
  140. lfx/components/chroma/__init__.py +34 -0
  141. lfx/components/chroma/chroma.py +167 -0
  142. lfx/components/cleanlab/__init__.py +40 -0
  143. lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
  144. lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  145. lfx/components/cleanlab/cleanlab_remediator.py +131 -0
  146. lfx/components/clickhouse/__init__.py +34 -0
  147. lfx/components/clickhouse/clickhouse.py +135 -0
  148. lfx/components/cloudflare/__init__.py +32 -0
  149. lfx/components/cloudflare/cloudflare.py +81 -0
  150. lfx/components/cohere/__init__.py +40 -0
  151. lfx/components/cohere/cohere_embeddings.py +81 -0
  152. lfx/components/cohere/cohere_models.py +46 -0
  153. lfx/components/cohere/cohere_rerank.py +51 -0
  154. lfx/components/composio/__init__.py +74 -0
  155. lfx/components/composio/composio_api.py +268 -0
  156. lfx/components/composio/dropbox_compnent.py +11 -0
  157. lfx/components/composio/github_composio.py +11 -0
  158. lfx/components/composio/gmail_composio.py +38 -0
  159. lfx/components/composio/googlecalendar_composio.py +11 -0
  160. lfx/components/composio/googlemeet_composio.py +11 -0
  161. lfx/components/composio/googletasks_composio.py +8 -0
  162. lfx/components/composio/linear_composio.py +11 -0
  163. lfx/components/composio/outlook_composio.py +11 -0
  164. lfx/components/composio/reddit_composio.py +11 -0
  165. lfx/components/composio/slack_composio.py +582 -0
  166. lfx/components/composio/slackbot_composio.py +11 -0
  167. lfx/components/composio/supabase_composio.py +11 -0
  168. lfx/components/composio/todoist_composio.py +11 -0
  169. lfx/components/composio/youtube_composio.py +11 -0
  170. lfx/components/confluence/__init__.py +3 -0
  171. lfx/components/confluence/confluence.py +84 -0
  172. lfx/components/couchbase/__init__.py +34 -0
  173. lfx/components/couchbase/couchbase.py +102 -0
  174. lfx/components/crewai/__init__.py +49 -0
  175. lfx/components/crewai/crewai.py +107 -0
  176. lfx/components/crewai/hierarchical_crew.py +46 -0
  177. lfx/components/crewai/hierarchical_task.py +44 -0
  178. lfx/components/crewai/sequential_crew.py +52 -0
  179. lfx/components/crewai/sequential_task.py +73 -0
  180. lfx/components/crewai/sequential_task_agent.py +143 -0
  181. lfx/components/custom_component/__init__.py +34 -0
  182. lfx/components/custom_component/custom_component.py +31 -0
  183. lfx/components/data/__init__.py +64 -0
  184. lfx/components/data/api_request.py +544 -0
  185. lfx/components/data/csv_to_data.py +95 -0
  186. lfx/components/data/directory.py +113 -0
  187. lfx/components/data/file.py +577 -0
  188. lfx/components/data/json_to_data.py +98 -0
  189. lfx/components/data/news_search.py +164 -0
  190. lfx/components/data/rss.py +69 -0
  191. lfx/components/data/sql_executor.py +101 -0
  192. lfx/components/data/url.py +311 -0
  193. lfx/components/data/web_search.py +112 -0
  194. lfx/components/data/webhook.py +56 -0
  195. lfx/components/datastax/__init__.py +70 -0
  196. lfx/components/datastax/astra_assistant_manager.py +306 -0
  197. lfx/components/datastax/astra_db.py +75 -0
  198. lfx/components/datastax/astra_vectorize.py +124 -0
  199. lfx/components/datastax/astradb.py +1285 -0
  200. lfx/components/datastax/astradb_cql.py +314 -0
  201. lfx/components/datastax/astradb_graph.py +330 -0
  202. lfx/components/datastax/astradb_tool.py +414 -0
  203. lfx/components/datastax/astradb_vectorstore.py +1285 -0
  204. lfx/components/datastax/cassandra.py +92 -0
  205. lfx/components/datastax/create_assistant.py +58 -0
  206. lfx/components/datastax/create_thread.py +32 -0
  207. lfx/components/datastax/dotenv.py +35 -0
  208. lfx/components/datastax/get_assistant.py +37 -0
  209. lfx/components/datastax/getenvvar.py +30 -0
  210. lfx/components/datastax/graph_rag.py +141 -0
  211. lfx/components/datastax/hcd.py +314 -0
  212. lfx/components/datastax/list_assistants.py +25 -0
  213. lfx/components/datastax/run.py +89 -0
  214. lfx/components/deactivated/__init__.py +15 -0
  215. lfx/components/deactivated/amazon_kendra.py +66 -0
  216. lfx/components/deactivated/chat_litellm_model.py +158 -0
  217. lfx/components/deactivated/code_block_extractor.py +26 -0
  218. lfx/components/deactivated/documents_to_data.py +22 -0
  219. lfx/components/deactivated/embed.py +16 -0
  220. lfx/components/deactivated/extract_key_from_data.py +46 -0
  221. lfx/components/deactivated/json_document_builder.py +57 -0
  222. lfx/components/deactivated/list_flows.py +20 -0
  223. lfx/components/deactivated/mcp_sse.py +61 -0
  224. lfx/components/deactivated/mcp_stdio.py +62 -0
  225. lfx/components/deactivated/merge_data.py +93 -0
  226. lfx/components/deactivated/message.py +37 -0
  227. lfx/components/deactivated/metal.py +54 -0
  228. lfx/components/deactivated/multi_query.py +59 -0
  229. lfx/components/deactivated/retriever.py +43 -0
  230. lfx/components/deactivated/selective_passthrough.py +77 -0
  231. lfx/components/deactivated/should_run_next.py +40 -0
  232. lfx/components/deactivated/split_text.py +63 -0
  233. lfx/components/deactivated/store_message.py +24 -0
  234. lfx/components/deactivated/sub_flow.py +124 -0
  235. lfx/components/deactivated/vectara_self_query.py +76 -0
  236. lfx/components/deactivated/vector_store.py +24 -0
  237. lfx/components/deepseek/__init__.py +34 -0
  238. lfx/components/deepseek/deepseek.py +136 -0
  239. lfx/components/docling/__init__.py +43 -0
  240. lfx/components/docling/chunk_docling_document.py +186 -0
  241. lfx/components/docling/docling_inline.py +231 -0
  242. lfx/components/docling/docling_remote.py +193 -0
  243. lfx/components/docling/export_docling_document.py +117 -0
  244. lfx/components/documentloaders/__init__.py +3 -0
  245. lfx/components/duckduckgo/__init__.py +3 -0
  246. lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  247. lfx/components/elastic/__init__.py +37 -0
  248. lfx/components/elastic/elasticsearch.py +267 -0
  249. lfx/components/elastic/opensearch.py +243 -0
  250. lfx/components/embeddings/__init__.py +37 -0
  251. lfx/components/embeddings/similarity.py +76 -0
  252. lfx/components/embeddings/text_embedder.py +64 -0
  253. lfx/components/exa/__init__.py +3 -0
  254. lfx/components/exa/exa_search.py +68 -0
  255. lfx/components/firecrawl/__init__.py +43 -0
  256. lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
  257. lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
  258. lfx/components/firecrawl/firecrawl_map_api.py +89 -0
  259. lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
  260. lfx/components/git/__init__.py +4 -0
  261. lfx/components/git/git.py +262 -0
  262. lfx/components/git/gitextractor.py +196 -0
  263. lfx/components/glean/__init__.py +3 -0
  264. lfx/components/glean/glean_search_api.py +173 -0
  265. lfx/components/google/__init__.py +17 -0
  266. lfx/components/google/gmail.py +192 -0
  267. lfx/components/google/google_bq_sql_executor.py +157 -0
  268. lfx/components/google/google_drive.py +92 -0
  269. lfx/components/google/google_drive_search.py +152 -0
  270. lfx/components/google/google_generative_ai.py +147 -0
  271. lfx/components/google/google_generative_ai_embeddings.py +141 -0
  272. lfx/components/google/google_oauth_token.py +89 -0
  273. lfx/components/google/google_search_api_core.py +68 -0
  274. lfx/components/google/google_serper_api_core.py +74 -0
  275. lfx/components/groq/__init__.py +34 -0
  276. lfx/components/groq/groq.py +136 -0
  277. lfx/components/helpers/__init__.py +52 -0
  278. lfx/components/helpers/calculator_core.py +89 -0
  279. lfx/components/helpers/create_list.py +40 -0
  280. lfx/components/helpers/current_date.py +42 -0
  281. lfx/components/helpers/id_generator.py +42 -0
  282. lfx/components/helpers/memory.py +251 -0
  283. lfx/components/helpers/output_parser.py +45 -0
  284. lfx/components/helpers/store_message.py +90 -0
  285. lfx/components/homeassistant/__init__.py +7 -0
  286. lfx/components/homeassistant/home_assistant_control.py +152 -0
  287. lfx/components/homeassistant/list_home_assistant_states.py +137 -0
  288. lfx/components/huggingface/__init__.py +37 -0
  289. lfx/components/huggingface/huggingface.py +197 -0
  290. lfx/components/huggingface/huggingface_inference_api.py +106 -0
  291. lfx/components/ibm/__init__.py +34 -0
  292. lfx/components/ibm/watsonx.py +203 -0
  293. lfx/components/ibm/watsonx_embeddings.py +135 -0
  294. lfx/components/icosacomputing/__init__.py +5 -0
  295. lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
  296. lfx/components/input_output/__init__.py +38 -0
  297. lfx/components/input_output/chat.py +120 -0
  298. lfx/components/input_output/chat_output.py +200 -0
  299. lfx/components/input_output/text.py +27 -0
  300. lfx/components/input_output/text_output.py +29 -0
  301. lfx/components/jigsawstack/__init__.py +23 -0
  302. lfx/components/jigsawstack/ai_scrape.py +126 -0
  303. lfx/components/jigsawstack/ai_web_search.py +136 -0
  304. lfx/components/jigsawstack/file_read.py +115 -0
  305. lfx/components/jigsawstack/file_upload.py +94 -0
  306. lfx/components/jigsawstack/image_generation.py +205 -0
  307. lfx/components/jigsawstack/nsfw.py +60 -0
  308. lfx/components/jigsawstack/object_detection.py +124 -0
  309. lfx/components/jigsawstack/sentiment.py +112 -0
  310. lfx/components/jigsawstack/text_to_sql.py +90 -0
  311. lfx/components/jigsawstack/text_translate.py +77 -0
  312. lfx/components/jigsawstack/vocr.py +107 -0
  313. lfx/components/langchain_utilities/__init__.py +109 -0
  314. lfx/components/langchain_utilities/character.py +53 -0
  315. lfx/components/langchain_utilities/conversation.py +59 -0
  316. lfx/components/langchain_utilities/csv_agent.py +107 -0
  317. lfx/components/langchain_utilities/fake_embeddings.py +26 -0
  318. lfx/components/langchain_utilities/html_link_extractor.py +35 -0
  319. lfx/components/langchain_utilities/json_agent.py +45 -0
  320. lfx/components/langchain_utilities/langchain_hub.py +126 -0
  321. lfx/components/langchain_utilities/language_recursive.py +49 -0
  322. lfx/components/langchain_utilities/language_semantic.py +138 -0
  323. lfx/components/langchain_utilities/llm_checker.py +39 -0
  324. lfx/components/langchain_utilities/llm_math.py +42 -0
  325. lfx/components/langchain_utilities/natural_language.py +61 -0
  326. lfx/components/langchain_utilities/openai_tools.py +53 -0
  327. lfx/components/langchain_utilities/openapi.py +48 -0
  328. lfx/components/langchain_utilities/recursive_character.py +60 -0
  329. lfx/components/langchain_utilities/retrieval_qa.py +83 -0
  330. lfx/components/langchain_utilities/runnable_executor.py +137 -0
  331. lfx/components/langchain_utilities/self_query.py +80 -0
  332. lfx/components/langchain_utilities/spider.py +142 -0
  333. lfx/components/langchain_utilities/sql.py +40 -0
  334. lfx/components/langchain_utilities/sql_database.py +35 -0
  335. lfx/components/langchain_utilities/sql_generator.py +78 -0
  336. lfx/components/langchain_utilities/tool_calling.py +59 -0
  337. lfx/components/langchain_utilities/vector_store_info.py +49 -0
  338. lfx/components/langchain_utilities/vector_store_router.py +33 -0
  339. lfx/components/langchain_utilities/xml_agent.py +71 -0
  340. lfx/components/langwatch/__init__.py +3 -0
  341. lfx/components/langwatch/langwatch.py +278 -0
  342. lfx/components/link_extractors/__init__.py +3 -0
  343. lfx/components/lmstudio/__init__.py +34 -0
  344. lfx/components/lmstudio/lmstudioembeddings.py +89 -0
  345. lfx/components/lmstudio/lmstudiomodel.py +129 -0
  346. lfx/components/logic/__init__.py +52 -0
  347. lfx/components/logic/conditional_router.py +171 -0
  348. lfx/components/logic/data_conditional_router.py +125 -0
  349. lfx/components/logic/flow_tool.py +110 -0
  350. lfx/components/logic/listen.py +29 -0
  351. lfx/components/logic/loop.py +125 -0
  352. lfx/components/logic/notify.py +88 -0
  353. lfx/components/logic/pass_message.py +35 -0
  354. lfx/components/logic/run_flow.py +71 -0
  355. lfx/components/logic/sub_flow.py +114 -0
  356. lfx/components/maritalk/__init__.py +32 -0
  357. lfx/components/maritalk/maritalk.py +52 -0
  358. lfx/components/mem0/__init__.py +3 -0
  359. lfx/components/mem0/mem0_chat_memory.py +136 -0
  360. lfx/components/milvus/__init__.py +34 -0
  361. lfx/components/milvus/milvus.py +115 -0
  362. lfx/components/mistral/__init__.py +37 -0
  363. lfx/components/mistral/mistral.py +114 -0
  364. lfx/components/mistral/mistral_embeddings.py +58 -0
  365. lfx/components/models/__init__.py +34 -0
  366. lfx/components/models/embedding_model.py +114 -0
  367. lfx/components/models/language_model.py +144 -0
  368. lfx/components/mongodb/__init__.py +34 -0
  369. lfx/components/mongodb/mongodb_atlas.py +213 -0
  370. lfx/components/needle/__init__.py +3 -0
  371. lfx/components/needle/needle.py +104 -0
  372. lfx/components/notdiamond/__init__.py +34 -0
  373. lfx/components/notdiamond/notdiamond.py +228 -0
  374. lfx/components/novita/__init__.py +32 -0
  375. lfx/components/novita/novita.py +130 -0
  376. lfx/components/nvidia/__init__.py +57 -0
  377. lfx/components/nvidia/nvidia.py +157 -0
  378. lfx/components/nvidia/nvidia_embedding.py +77 -0
  379. lfx/components/nvidia/nvidia_ingest.py +317 -0
  380. lfx/components/nvidia/nvidia_rerank.py +63 -0
  381. lfx/components/nvidia/system_assist.py +65 -0
  382. lfx/components/olivya/__init__.py +3 -0
  383. lfx/components/olivya/olivya.py +116 -0
  384. lfx/components/ollama/__init__.py +37 -0
  385. lfx/components/ollama/ollama.py +330 -0
  386. lfx/components/ollama/ollama_embeddings.py +106 -0
  387. lfx/components/openai/__init__.py +37 -0
  388. lfx/components/openai/openai.py +100 -0
  389. lfx/components/openai/openai_chat_model.py +176 -0
  390. lfx/components/openrouter/__init__.py +32 -0
  391. lfx/components/openrouter/openrouter.py +202 -0
  392. lfx/components/output_parsers/__init__.py +3 -0
  393. lfx/components/perplexity/__init__.py +34 -0
  394. lfx/components/perplexity/perplexity.py +75 -0
  395. lfx/components/pgvector/__init__.py +34 -0
  396. lfx/components/pgvector/pgvector.py +72 -0
  397. lfx/components/pinecone/__init__.py +34 -0
  398. lfx/components/pinecone/pinecone.py +134 -0
  399. lfx/components/processing/__init__.py +117 -0
  400. lfx/components/processing/alter_metadata.py +108 -0
  401. lfx/components/processing/batch_run.py +205 -0
  402. lfx/components/processing/combine_text.py +39 -0
  403. lfx/components/processing/converter.py +159 -0
  404. lfx/components/processing/create_data.py +110 -0
  405. lfx/components/processing/data_operations.py +438 -0
  406. lfx/components/processing/data_to_dataframe.py +70 -0
  407. lfx/components/processing/dataframe_operations.py +313 -0
  408. lfx/components/processing/extract_key.py +53 -0
  409. lfx/components/processing/filter_data.py +42 -0
  410. lfx/components/processing/filter_data_values.py +88 -0
  411. lfx/components/processing/json_cleaner.py +103 -0
  412. lfx/components/processing/lambda_filter.py +154 -0
  413. lfx/components/processing/llm_router.py +499 -0
  414. lfx/components/processing/merge_data.py +90 -0
  415. lfx/components/processing/message_to_data.py +36 -0
  416. lfx/components/processing/parse_data.py +70 -0
  417. lfx/components/processing/parse_dataframe.py +68 -0
  418. lfx/components/processing/parse_json_data.py +90 -0
  419. lfx/components/processing/parser.py +143 -0
  420. lfx/components/processing/prompt.py +67 -0
  421. lfx/components/processing/python_repl_core.py +98 -0
  422. lfx/components/processing/regex.py +82 -0
  423. lfx/components/processing/save_file.py +225 -0
  424. lfx/components/processing/select_data.py +48 -0
  425. lfx/components/processing/split_text.py +141 -0
  426. lfx/components/processing/structured_output.py +202 -0
  427. lfx/components/processing/update_data.py +160 -0
  428. lfx/components/prototypes/__init__.py +34 -0
  429. lfx/components/prototypes/python_function.py +73 -0
  430. lfx/components/qdrant/__init__.py +34 -0
  431. lfx/components/qdrant/qdrant.py +109 -0
  432. lfx/components/redis/__init__.py +37 -0
  433. lfx/components/redis/redis.py +89 -0
  434. lfx/components/redis/redis_chat.py +43 -0
  435. lfx/components/sambanova/__init__.py +32 -0
  436. lfx/components/sambanova/sambanova.py +84 -0
  437. lfx/components/scrapegraph/__init__.py +40 -0
  438. lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  439. lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
  440. lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  441. lfx/components/searchapi/__init__.py +34 -0
  442. lfx/components/searchapi/search.py +79 -0
  443. lfx/components/serpapi/__init__.py +3 -0
  444. lfx/components/serpapi/serp.py +115 -0
  445. lfx/components/supabase/__init__.py +34 -0
  446. lfx/components/supabase/supabase.py +76 -0
  447. lfx/components/tavily/__init__.py +4 -0
  448. lfx/components/tavily/tavily_extract.py +117 -0
  449. lfx/components/tavily/tavily_search.py +212 -0
  450. lfx/components/textsplitters/__init__.py +3 -0
  451. lfx/components/toolkits/__init__.py +3 -0
  452. lfx/components/tools/__init__.py +72 -0
  453. lfx/components/tools/calculator.py +108 -0
  454. lfx/components/tools/google_search_api.py +45 -0
  455. lfx/components/tools/google_serper_api.py +115 -0
  456. lfx/components/tools/python_code_structured_tool.py +327 -0
  457. lfx/components/tools/python_repl.py +97 -0
  458. lfx/components/tools/search_api.py +87 -0
  459. lfx/components/tools/searxng.py +145 -0
  460. lfx/components/tools/serp_api.py +119 -0
  461. lfx/components/tools/tavily_search_tool.py +344 -0
  462. lfx/components/tools/wikidata_api.py +102 -0
  463. lfx/components/tools/wikipedia_api.py +49 -0
  464. lfx/components/tools/yahoo_finance.py +129 -0
  465. lfx/components/twelvelabs/__init__.py +52 -0
  466. lfx/components/twelvelabs/convert_astra_results.py +84 -0
  467. lfx/components/twelvelabs/pegasus_index.py +311 -0
  468. lfx/components/twelvelabs/split_video.py +291 -0
  469. lfx/components/twelvelabs/text_embeddings.py +57 -0
  470. lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  471. lfx/components/twelvelabs/video_embeddings.py +100 -0
  472. lfx/components/twelvelabs/video_file.py +179 -0
  473. lfx/components/unstructured/__init__.py +3 -0
  474. lfx/components/unstructured/unstructured.py +121 -0
  475. lfx/components/upstash/__init__.py +34 -0
  476. lfx/components/upstash/upstash.py +124 -0
  477. lfx/components/vectara/__init__.py +37 -0
  478. lfx/components/vectara/vectara.py +97 -0
  479. lfx/components/vectara/vectara_rag.py +164 -0
  480. lfx/components/vectorstores/__init__.py +40 -0
  481. lfx/components/vectorstores/astradb.py +1285 -0
  482. lfx/components/vectorstores/astradb_graph.py +319 -0
  483. lfx/components/vectorstores/cassandra.py +264 -0
  484. lfx/components/vectorstores/cassandra_graph.py +238 -0
  485. lfx/components/vectorstores/chroma.py +167 -0
  486. lfx/components/vectorstores/clickhouse.py +135 -0
  487. lfx/components/vectorstores/couchbase.py +102 -0
  488. lfx/components/vectorstores/elasticsearch.py +267 -0
  489. lfx/components/vectorstores/faiss.py +111 -0
  490. lfx/components/vectorstores/graph_rag.py +141 -0
  491. lfx/components/vectorstores/hcd.py +314 -0
  492. lfx/components/vectorstores/local_db.py +261 -0
  493. lfx/components/vectorstores/milvus.py +115 -0
  494. lfx/components/vectorstores/mongodb_atlas.py +213 -0
  495. lfx/components/vectorstores/opensearch.py +243 -0
  496. lfx/components/vectorstores/pgvector.py +72 -0
  497. lfx/components/vectorstores/pinecone.py +134 -0
  498. lfx/components/vectorstores/qdrant.py +109 -0
  499. lfx/components/vectorstores/supabase.py +76 -0
  500. lfx/components/vectorstores/upstash.py +124 -0
  501. lfx/components/vectorstores/vectara.py +97 -0
  502. lfx/components/vectorstores/vectara_rag.py +164 -0
  503. lfx/components/vectorstores/weaviate.py +89 -0
  504. lfx/components/vertexai/__init__.py +37 -0
  505. lfx/components/vertexai/vertexai.py +71 -0
  506. lfx/components/vertexai/vertexai_embeddings.py +67 -0
  507. lfx/components/weaviate/__init__.py +34 -0
  508. lfx/components/weaviate/weaviate.py +89 -0
  509. lfx/components/wikipedia/__init__.py +4 -0
  510. lfx/components/wikipedia/wikidata.py +86 -0
  511. lfx/components/wikipedia/wikipedia.py +53 -0
  512. lfx/components/wolframalpha/__init__.py +3 -0
  513. lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
  514. lfx/components/xai/__init__.py +32 -0
  515. lfx/components/xai/xai.py +167 -0
  516. lfx/components/yahoosearch/__init__.py +3 -0
  517. lfx/components/yahoosearch/yahoo.py +137 -0
  518. lfx/components/youtube/__init__.py +52 -0
  519. lfx/components/youtube/channel.py +227 -0
  520. lfx/components/youtube/comments.py +231 -0
  521. lfx/components/youtube/playlist.py +33 -0
  522. lfx/components/youtube/search.py +120 -0
  523. lfx/components/youtube/trending.py +285 -0
  524. lfx/components/youtube/video_details.py +263 -0
  525. lfx/components/youtube/youtube_transcripts.py +118 -0
  526. lfx/components/zep/__init__.py +3 -0
  527. lfx/components/zep/zep.py +44 -0
  528. lfx/constants.py +6 -0
  529. lfx/custom/__init__.py +7 -0
  530. lfx/custom/attributes.py +86 -0
  531. lfx/custom/code_parser/__init__.py +3 -0
  532. lfx/custom/code_parser/code_parser.py +361 -0
  533. lfx/custom/custom_component/__init__.py +0 -0
  534. lfx/custom/custom_component/base_component.py +128 -0
  535. lfx/custom/custom_component/component.py +1808 -0
  536. lfx/custom/custom_component/component_with_cache.py +8 -0
  537. lfx/custom/custom_component/custom_component.py +588 -0
  538. lfx/custom/dependency_analyzer.py +165 -0
  539. lfx/custom/directory_reader/__init__.py +3 -0
  540. lfx/custom/directory_reader/directory_reader.py +359 -0
  541. lfx/custom/directory_reader/utils.py +171 -0
  542. lfx/custom/eval.py +12 -0
  543. lfx/custom/schema.py +32 -0
  544. lfx/custom/tree_visitor.py +21 -0
  545. lfx/custom/utils.py +877 -0
  546. lfx/custom/validate.py +488 -0
  547. lfx/events/__init__.py +1 -0
  548. lfx/events/event_manager.py +110 -0
  549. lfx/exceptions/__init__.py +0 -0
  550. lfx/exceptions/component.py +15 -0
  551. lfx/field_typing/__init__.py +91 -0
  552. lfx/field_typing/constants.py +215 -0
  553. lfx/field_typing/range_spec.py +35 -0
  554. lfx/graph/__init__.py +6 -0
  555. lfx/graph/edge/__init__.py +0 -0
  556. lfx/graph/edge/base.py +277 -0
  557. lfx/graph/edge/schema.py +119 -0
  558. lfx/graph/edge/utils.py +0 -0
  559. lfx/graph/graph/__init__.py +0 -0
  560. lfx/graph/graph/ascii.py +202 -0
  561. lfx/graph/graph/base.py +2238 -0
  562. lfx/graph/graph/constants.py +63 -0
  563. lfx/graph/graph/runnable_vertices_manager.py +133 -0
  564. lfx/graph/graph/schema.py +52 -0
  565. lfx/graph/graph/state_model.py +66 -0
  566. lfx/graph/graph/utils.py +1024 -0
  567. lfx/graph/schema.py +75 -0
  568. lfx/graph/state/__init__.py +0 -0
  569. lfx/graph/state/model.py +237 -0
  570. lfx/graph/utils.py +200 -0
  571. lfx/graph/vertex/__init__.py +0 -0
  572. lfx/graph/vertex/base.py +823 -0
  573. lfx/graph/vertex/constants.py +0 -0
  574. lfx/graph/vertex/exceptions.py +4 -0
  575. lfx/graph/vertex/param_handler.py +264 -0
  576. lfx/graph/vertex/schema.py +26 -0
  577. lfx/graph/vertex/utils.py +19 -0
  578. lfx/graph/vertex/vertex_types.py +489 -0
  579. lfx/helpers/__init__.py +1 -0
  580. lfx/helpers/base_model.py +71 -0
  581. lfx/helpers/custom.py +13 -0
  582. lfx/helpers/data.py +167 -0
  583. lfx/helpers/flow.py +194 -0
  584. lfx/inputs/__init__.py +68 -0
  585. lfx/inputs/constants.py +2 -0
  586. lfx/inputs/input_mixin.py +328 -0
  587. lfx/inputs/inputs.py +714 -0
  588. lfx/inputs/validators.py +19 -0
  589. lfx/interface/__init__.py +6 -0
  590. lfx/interface/components.py +489 -0
  591. lfx/interface/importing/__init__.py +5 -0
  592. lfx/interface/importing/utils.py +39 -0
  593. lfx/interface/initialize/__init__.py +3 -0
  594. lfx/interface/initialize/loading.py +224 -0
  595. lfx/interface/listing.py +26 -0
  596. lfx/interface/run.py +16 -0
  597. lfx/interface/utils.py +111 -0
  598. lfx/io/__init__.py +63 -0
  599. lfx/io/schema.py +289 -0
  600. lfx/load/__init__.py +8 -0
  601. lfx/load/load.py +256 -0
  602. lfx/load/utils.py +99 -0
  603. lfx/log/__init__.py +5 -0
  604. lfx/log/logger.py +385 -0
  605. lfx/memory/__init__.py +90 -0
  606. lfx/memory/stubs.py +283 -0
  607. lfx/processing/__init__.py +1 -0
  608. lfx/processing/process.py +238 -0
  609. lfx/processing/utils.py +25 -0
  610. lfx/py.typed +0 -0
  611. lfx/schema/__init__.py +66 -0
  612. lfx/schema/artifact.py +83 -0
  613. lfx/schema/content_block.py +62 -0
  614. lfx/schema/content_types.py +91 -0
  615. lfx/schema/data.py +308 -0
  616. lfx/schema/dataframe.py +210 -0
  617. lfx/schema/dotdict.py +74 -0
  618. lfx/schema/encoders.py +13 -0
  619. lfx/schema/graph.py +47 -0
  620. lfx/schema/image.py +131 -0
  621. lfx/schema/json_schema.py +141 -0
  622. lfx/schema/log.py +61 -0
  623. lfx/schema/message.py +473 -0
  624. lfx/schema/openai_responses_schemas.py +74 -0
  625. lfx/schema/properties.py +41 -0
  626. lfx/schema/schema.py +171 -0
  627. lfx/schema/serialize.py +13 -0
  628. lfx/schema/table.py +140 -0
  629. lfx/schema/validators.py +114 -0
  630. lfx/serialization/__init__.py +5 -0
  631. lfx/serialization/constants.py +2 -0
  632. lfx/serialization/serialization.py +314 -0
  633. lfx/services/__init__.py +23 -0
  634. lfx/services/base.py +28 -0
  635. lfx/services/cache/__init__.py +6 -0
  636. lfx/services/cache/base.py +183 -0
  637. lfx/services/cache/service.py +166 -0
  638. lfx/services/cache/utils.py +169 -0
  639. lfx/services/chat/__init__.py +1 -0
  640. lfx/services/chat/config.py +2 -0
  641. lfx/services/chat/schema.py +10 -0
  642. lfx/services/deps.py +129 -0
  643. lfx/services/factory.py +19 -0
  644. lfx/services/initialize.py +19 -0
  645. lfx/services/interfaces.py +103 -0
  646. lfx/services/manager.py +172 -0
  647. lfx/services/schema.py +20 -0
  648. lfx/services/session.py +82 -0
  649. lfx/services/settings/__init__.py +3 -0
  650. lfx/services/settings/auth.py +130 -0
  651. lfx/services/settings/base.py +539 -0
  652. lfx/services/settings/constants.py +31 -0
  653. lfx/services/settings/factory.py +23 -0
  654. lfx/services/settings/feature_flags.py +12 -0
  655. lfx/services/settings/service.py +35 -0
  656. lfx/services/settings/utils.py +40 -0
  657. lfx/services/shared_component_cache/__init__.py +1 -0
  658. lfx/services/shared_component_cache/factory.py +30 -0
  659. lfx/services/shared_component_cache/service.py +9 -0
  660. lfx/services/storage/__init__.py +5 -0
  661. lfx/services/storage/local.py +155 -0
  662. lfx/services/storage/service.py +54 -0
  663. lfx/services/tracing/__init__.py +1 -0
  664. lfx/services/tracing/service.py +21 -0
  665. lfx/settings.py +6 -0
  666. lfx/template/__init__.py +6 -0
  667. lfx/template/field/__init__.py +0 -0
  668. lfx/template/field/base.py +257 -0
  669. lfx/template/field/prompt.py +15 -0
  670. lfx/template/frontend_node/__init__.py +6 -0
  671. lfx/template/frontend_node/base.py +212 -0
  672. lfx/template/frontend_node/constants.py +65 -0
  673. lfx/template/frontend_node/custom_components.py +79 -0
  674. lfx/template/template/__init__.py +0 -0
  675. lfx/template/template/base.py +100 -0
  676. lfx/template/utils.py +217 -0
  677. lfx/type_extraction/__init__.py +19 -0
  678. lfx/type_extraction/type_extraction.py +75 -0
  679. lfx/type_extraction.py +80 -0
  680. lfx/utils/__init__.py +1 -0
  681. lfx/utils/async_helpers.py +42 -0
  682. lfx/utils/component_utils.py +154 -0
  683. lfx/utils/concurrency.py +60 -0
  684. lfx/utils/connection_string_parser.py +11 -0
  685. lfx/utils/constants.py +205 -0
  686. lfx/utils/data_structure.py +212 -0
  687. lfx/utils/exceptions.py +22 -0
  688. lfx/utils/helpers.py +28 -0
  689. lfx/utils/image.py +73 -0
  690. lfx/utils/lazy_load.py +15 -0
  691. lfx/utils/request_utils.py +18 -0
  692. lfx/utils/schemas.py +139 -0
  693. lfx/utils/util.py +481 -0
  694. lfx/utils/util_strings.py +56 -0
  695. lfx/utils/version.py +24 -0
  696. lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
  697. lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
  698. lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
  699. lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,46 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from lfx.components._importing import import_mod
6
+
7
+ if TYPE_CHECKING:
8
+ from .assemblyai_get_subtitles import AssemblyAIGetSubtitles
9
+ from .assemblyai_lemur import AssemblyAILeMUR
10
+ from .assemblyai_list_transcripts import AssemblyAIListTranscripts
11
+ from .assemblyai_poll_transcript import AssemblyAITranscriptionJobPoller
12
+ from .assemblyai_start_transcript import AssemblyAITranscriptionJobCreator
13
+
14
+ _dynamic_imports = {
15
+ "AssemblyAIGetSubtitles": "assemblyai_get_subtitles",
16
+ "AssemblyAILeMUR": "assemblyai_lemur",
17
+ "AssemblyAIListTranscripts": "assemblyai_list_transcripts",
18
+ "AssemblyAITranscriptionJobCreator": "assemblyai_start_transcript",
19
+ "AssemblyAITranscriptionJobPoller": "assemblyai_poll_transcript",
20
+ }
21
+
22
+ __all__ = [
23
+ "AssemblyAIGetSubtitles",
24
+ "AssemblyAILeMUR",
25
+ "AssemblyAIListTranscripts",
26
+ "AssemblyAITranscriptionJobCreator",
27
+ "AssemblyAITranscriptionJobPoller",
28
+ ]
29
+
30
+
31
+ def __getattr__(attr_name: str) -> Any:
32
+ """Lazily import assemblyai components on attribute access."""
33
+ if attr_name not in _dynamic_imports:
34
+ msg = f"module '{__name__}' has no attribute '{attr_name}'"
35
+ raise AttributeError(msg)
36
+ try:
37
+ result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
38
+ except (ModuleNotFoundError, ImportError, AttributeError) as e:
39
+ msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
40
+ raise AttributeError(msg) from e
41
+ globals()[attr_name] = result
42
+ return result
43
+
44
+
45
+ def __dir__() -> list[str]:
46
+ return list(__all__)
@@ -0,0 +1,83 @@
1
+ import assemblyai as aai
2
+
3
+ from lfx.custom.custom_component.component import Component
4
+ from lfx.io import DataInput, DropdownInput, IntInput, Output, SecretStrInput
5
+ from lfx.log.logger import logger
6
+ from lfx.schema.data import Data
7
+
8
+
9
+ class AssemblyAIGetSubtitles(Component):
10
+ display_name = "AssemblyAI Get Subtitles"
11
+ description = "Export your transcript in SRT or VTT format for subtitles and closed captions"
12
+ documentation = "https://www.assemblyai.com/docs"
13
+ icon = "AssemblyAI"
14
+
15
+ inputs = [
16
+ SecretStrInput(
17
+ name="api_key",
18
+ display_name="Assembly API Key",
19
+ info="Your AssemblyAI API key. You can get one from https://www.assemblyai.com/",
20
+ required=True,
21
+ ),
22
+ DataInput(
23
+ name="transcription_result",
24
+ display_name="Transcription Result",
25
+ info="The transcription result from AssemblyAI",
26
+ required=True,
27
+ ),
28
+ DropdownInput(
29
+ name="subtitle_format",
30
+ display_name="Subtitle Format",
31
+ options=["srt", "vtt"],
32
+ value="srt",
33
+ info="The format of the captions (SRT or VTT)",
34
+ ),
35
+ IntInput(
36
+ name="chars_per_caption",
37
+ display_name="Characters per Caption",
38
+ info="The maximum number of characters per caption (0 for no limit)",
39
+ value=0,
40
+ advanced=True,
41
+ ),
42
+ ]
43
+
44
+ outputs = [
45
+ Output(display_name="Subtitles", name="subtitles", method="get_subtitles"),
46
+ ]
47
+
48
+ def get_subtitles(self) -> Data:
49
+ aai.settings.api_key = self.api_key
50
+
51
+ # check if it's an error message from the previous step
52
+ if self.transcription_result.data.get("error"):
53
+ self.status = self.transcription_result.data["error"]
54
+ return self.transcription_result
55
+
56
+ try:
57
+ transcript_id = self.transcription_result.data["id"]
58
+ transcript = aai.Transcript.get_by_id(transcript_id)
59
+ except Exception as e: # noqa: BLE001
60
+ error = f"Getting transcription failed: {e}"
61
+ logger.debug(error, exc_info=True)
62
+ self.status = error
63
+ return Data(data={"error": error})
64
+
65
+ if transcript.status == aai.TranscriptStatus.completed:
66
+ subtitles = None
67
+ chars_per_caption = self.chars_per_caption if self.chars_per_caption > 0 else None
68
+ if self.subtitle_format == "srt":
69
+ subtitles = transcript.export_subtitles_srt(chars_per_caption)
70
+ else:
71
+ subtitles = transcript.export_subtitles_vtt(chars_per_caption)
72
+
73
+ result = Data(
74
+ subtitles=subtitles,
75
+ format=self.subtitle_format,
76
+ transcript_id=transcript_id,
77
+ chars_per_caption=chars_per_caption,
78
+ )
79
+
80
+ self.status = result
81
+ return result
82
+ self.status = transcript.error
83
+ return Data(data={"error": transcript.error})
@@ -0,0 +1,183 @@
1
+ import assemblyai as aai
2
+
3
+ from lfx.custom.custom_component.component import Component
4
+ from lfx.io import DataInput, DropdownInput, FloatInput, IntInput, MultilineInput, Output, SecretStrInput
5
+ from lfx.log.logger import logger
6
+ from lfx.schema.data import Data
7
+
8
+
9
+ class AssemblyAILeMUR(Component):
10
+ display_name = "AssemblyAI LeMUR"
11
+ description = "Apply Large Language Models to spoken data using the AssemblyAI LeMUR framework"
12
+ documentation = "https://www.assemblyai.com/docs/lemur"
13
+ icon = "AssemblyAI"
14
+
15
+ inputs = [
16
+ SecretStrInput(
17
+ name="api_key",
18
+ display_name="Assembly API Key",
19
+ info="Your AssemblyAI API key. You can get one from https://www.assemblyai.com/",
20
+ advanced=False,
21
+ required=True,
22
+ ),
23
+ DataInput(
24
+ name="transcription_result",
25
+ display_name="Transcription Result",
26
+ info="The transcription result from AssemblyAI",
27
+ required=True,
28
+ ),
29
+ MultilineInput(name="prompt", display_name="Input Prompt", info="The text to prompt the model", required=True),
30
+ DropdownInput(
31
+ name="final_model",
32
+ display_name="Final Model",
33
+ options=["claude3_5_sonnet", "claude3_opus", "claude3_haiku", "claude3_sonnet"],
34
+ value="claude3_5_sonnet",
35
+ info="The model that is used for the final prompt after compression is performed",
36
+ advanced=True,
37
+ ),
38
+ FloatInput(
39
+ name="temperature",
40
+ display_name="Temperature",
41
+ advanced=True,
42
+ value=0.0,
43
+ info="The temperature to use for the model",
44
+ ),
45
+ IntInput(
46
+ name="max_output_size",
47
+ display_name=" Max Output Size",
48
+ advanced=True,
49
+ value=2000,
50
+ info="Max output size in tokens, up to 4000",
51
+ ),
52
+ DropdownInput(
53
+ name="endpoint",
54
+ display_name="Endpoint",
55
+ options=["task", "summary", "question-answer"],
56
+ value="task",
57
+ info=(
58
+ "The LeMUR endpoint to use. For 'summary' and 'question-answer',"
59
+ " no prompt input is needed. See https://www.assemblyai.com/docs/api-reference/lemur/ for more info."
60
+ ),
61
+ advanced=True,
62
+ ),
63
+ MultilineInput(
64
+ name="questions",
65
+ display_name="Questions",
66
+ info="Comma-separated list of your questions. Only used if Endpoint is 'question-answer'",
67
+ advanced=True,
68
+ ),
69
+ MultilineInput(
70
+ name="transcript_ids",
71
+ display_name="Transcript IDs",
72
+ info=(
73
+ "Comma-separated list of transcript IDs. LeMUR can perform actions over multiple transcripts."
74
+ " If provided, the Transcription Result is ignored."
75
+ ),
76
+ advanced=True,
77
+ ),
78
+ ]
79
+
80
+ outputs = [
81
+ Output(display_name="LeMUR Response", name="lemur_response", method="run_lemur"),
82
+ ]
83
+
84
+ def run_lemur(self) -> Data:
85
+ """Use the LeMUR task endpoint to input the LLM prompt."""
86
+ aai.settings.api_key = self.api_key
87
+
88
+ if not self.transcription_result and not self.transcript_ids:
89
+ error = "Either a Transcription Result or Transcript IDs must be provided"
90
+ self.status = error
91
+ return Data(data={"error": error})
92
+ if self.transcription_result and self.transcription_result.data.get("error"):
93
+ # error message from the previous step
94
+ self.status = self.transcription_result.data["error"]
95
+ return self.transcription_result
96
+ if self.endpoint == "task" and not self.prompt:
97
+ self.status = "No prompt specified for the task endpoint"
98
+ return Data(data={"error": "No prompt specified"})
99
+ if self.endpoint == "question-answer" and not self.questions:
100
+ error = "No Questions were provided for the question-answer endpoint"
101
+ self.status = error
102
+ return Data(data={"error": error})
103
+
104
+ # Check for valid transcripts
105
+ transcript_ids = None
106
+ if self.transcription_result and "id" in self.transcription_result.data:
107
+ transcript_ids = [self.transcription_result.data["id"]]
108
+ elif self.transcript_ids:
109
+ transcript_ids = self.transcript_ids.split(",") or []
110
+ transcript_ids = [t.strip() for t in transcript_ids]
111
+
112
+ if not transcript_ids:
113
+ error = "Either a valid Transcription Result or valid Transcript IDs must be provided"
114
+ self.status = error
115
+ return Data(data={"error": error})
116
+
117
+ # Get TranscriptGroup and check if there is any error
118
+ transcript_group = aai.TranscriptGroup(transcript_ids=transcript_ids)
119
+ transcript_group, failures = transcript_group.wait_for_completion(return_failures=True)
120
+ if failures:
121
+ error = f"Getting transcriptions failed: {failures[0]}"
122
+ self.status = error
123
+ return Data(data={"error": error})
124
+
125
+ for t in transcript_group.transcripts:
126
+ if t.status == aai.TranscriptStatus.error:
127
+ self.status = t.error
128
+ return Data(data={"error": t.error})
129
+
130
+ # Perform LeMUR action
131
+ try:
132
+ response = self.perform_lemur_action(transcript_group, self.endpoint)
133
+ except Exception as e: # noqa: BLE001
134
+ logger.debug("Error running LeMUR", exc_info=True)
135
+ error = f"An Error happened: {e}"
136
+ self.status = error
137
+ return Data(data={"error": error})
138
+
139
+ result = Data(data=response)
140
+ self.status = result
141
+ return result
142
+
143
+ def perform_lemur_action(self, transcript_group: aai.TranscriptGroup, endpoint: str) -> dict:
144
+ logger.info("Endpoint:", endpoint, type(endpoint))
145
+ if endpoint == "task":
146
+ result = transcript_group.lemur.task(
147
+ prompt=self.prompt,
148
+ final_model=self.get_final_model(self.final_model),
149
+ temperature=self.temperature,
150
+ max_output_size=self.max_output_size,
151
+ )
152
+ elif endpoint == "summary":
153
+ result = transcript_group.lemur.summarize(
154
+ final_model=self.get_final_model(self.final_model),
155
+ temperature=self.temperature,
156
+ max_output_size=self.max_output_size,
157
+ )
158
+ elif endpoint == "question-answer":
159
+ questions = self.questions.split(",")
160
+ questions = [aai.LemurQuestion(question=q) for q in questions]
161
+ result = transcript_group.lemur.question(
162
+ questions=questions,
163
+ final_model=self.get_final_model(self.final_model),
164
+ temperature=self.temperature,
165
+ max_output_size=self.max_output_size,
166
+ )
167
+ else:
168
+ msg = f"Endpoint not supported: {endpoint}"
169
+ raise ValueError(msg)
170
+
171
+ return result.dict()
172
+
173
+ def get_final_model(self, model_name: str) -> aai.LemurModel:
174
+ if model_name == "claude3_5_sonnet":
175
+ return aai.LemurModel.claude3_5_sonnet
176
+ if model_name == "claude3_opus":
177
+ return aai.LemurModel.claude3_opus
178
+ if model_name == "claude3_haiku":
179
+ return aai.LemurModel.claude3_haiku
180
+ if model_name == "claude3_sonnet":
181
+ return aai.LemurModel.claude3_sonnet
182
+ msg = f"Model name not supported: {model_name}"
183
+ raise ValueError(msg)
@@ -0,0 +1,95 @@
1
+ import assemblyai as aai
2
+
3
+ from lfx.custom.custom_component.component import Component
4
+ from lfx.io import BoolInput, DropdownInput, IntInput, MessageTextInput, Output, SecretStrInput
5
+ from lfx.log.logger import logger
6
+ from lfx.schema.data import Data
7
+
8
+
9
+ class AssemblyAIListTranscripts(Component):
10
+ display_name = "AssemblyAI List Transcripts"
11
+ description = "Retrieve a list of transcripts from AssemblyAI with filtering options"
12
+ documentation = "https://www.assemblyai.com/docs"
13
+ icon = "AssemblyAI"
14
+
15
+ inputs = [
16
+ SecretStrInput(
17
+ name="api_key",
18
+ display_name="Assembly API Key",
19
+ info="Your AssemblyAI API key. You can get one from https://www.assemblyai.com/",
20
+ required=True,
21
+ ),
22
+ IntInput(
23
+ name="limit",
24
+ display_name="Limit",
25
+ info="Maximum number of transcripts to retrieve (default: 20, use 0 for all)",
26
+ value=20,
27
+ ),
28
+ DropdownInput(
29
+ name="status_filter",
30
+ display_name="Status Filter",
31
+ options=["all", "queued", "processing", "completed", "error"],
32
+ value="all",
33
+ info="Filter by transcript status",
34
+ advanced=True,
35
+ ),
36
+ MessageTextInput(
37
+ name="created_on",
38
+ display_name="Created On",
39
+ info="Only get transcripts created on this date (YYYY-MM-DD)",
40
+ advanced=True,
41
+ ),
42
+ BoolInput(
43
+ name="throttled_only",
44
+ display_name="Throttled Only",
45
+ info="Only get throttled transcripts, overrides the status filter",
46
+ advanced=True,
47
+ ),
48
+ ]
49
+
50
+ outputs = [
51
+ Output(display_name="Transcript List", name="transcript_list", method="list_transcripts"),
52
+ ]
53
+
54
+ def list_transcripts(self) -> list[Data]:
55
+ aai.settings.api_key = self.api_key
56
+
57
+ params = aai.ListTranscriptParameters()
58
+ if self.limit:
59
+ params.limit = self.limit
60
+ if self.status_filter != "all":
61
+ params.status = self.status_filter
62
+ if self.created_on and self.created_on.text:
63
+ params.created_on = self.created_on.text
64
+ if self.throttled_only:
65
+ params.throttled_only = True
66
+
67
+ try:
68
+ transcriber = aai.Transcriber()
69
+
70
+ def convert_page_to_data_list(page):
71
+ return [Data(**t.dict()) for t in page.transcripts]
72
+
73
+ if self.limit == 0:
74
+ # paginate over all pages
75
+ params.limit = 100
76
+ page = transcriber.list_transcripts(params)
77
+ transcripts = convert_page_to_data_list(page)
78
+
79
+ while page.page_details.before_id_of_prev_url is not None:
80
+ params.before_id = page.page_details.before_id_of_prev_url
81
+ page = transcriber.list_transcripts(params)
82
+ transcripts.extend(convert_page_to_data_list(page))
83
+ else:
84
+ # just one page
85
+ page = transcriber.list_transcripts(params)
86
+ transcripts = convert_page_to_data_list(page)
87
+
88
+ except Exception as e: # noqa: BLE001
89
+ logger.debug("Error listing transcripts", exc_info=True)
90
+ error_data = Data(data={"error": f"An error occurred: {e}"})
91
+ self.status = [error_data]
92
+ return [error_data]
93
+
94
+ self.status = transcripts
95
+ return transcripts
@@ -0,0 +1,72 @@
1
+ import assemblyai as aai
2
+
3
+ from lfx.custom.custom_component.component import Component
4
+ from lfx.field_typing.range_spec import RangeSpec
5
+ from lfx.io import DataInput, FloatInput, Output, SecretStrInput
6
+ from lfx.log.logger import logger
7
+ from lfx.schema.data import Data
8
+
9
+
10
+ class AssemblyAITranscriptionJobPoller(Component):
11
+ display_name = "AssemblyAI Poll Transcript"
12
+ description = "Poll for the status of a transcription job using AssemblyAI"
13
+ documentation = "https://www.assemblyai.com/docs"
14
+ icon = "AssemblyAI"
15
+
16
+ inputs = [
17
+ SecretStrInput(
18
+ name="api_key",
19
+ display_name="Assembly API Key",
20
+ info="Your AssemblyAI API key. You can get one from https://www.assemblyai.com/",
21
+ required=True,
22
+ ),
23
+ DataInput(
24
+ name="transcript_id",
25
+ display_name="Transcript ID",
26
+ info="The ID of the transcription job to poll",
27
+ required=True,
28
+ ),
29
+ FloatInput(
30
+ name="polling_interval",
31
+ display_name="Polling Interval",
32
+ value=3.0,
33
+ info="The polling interval in seconds",
34
+ advanced=True,
35
+ range_spec=RangeSpec(min=3, max=30),
36
+ ),
37
+ ]
38
+
39
+ outputs = [
40
+ Output(display_name="Transcription Result", name="transcription_result", method="poll_transcription_job"),
41
+ ]
42
+
43
+ def poll_transcription_job(self) -> Data:
44
+ """Polls the transcription status until completion and returns the Data."""
45
+ aai.settings.api_key = self.api_key
46
+ aai.settings.polling_interval = self.polling_interval
47
+
48
+ # check if it's an error message from the previous step
49
+ if self.transcript_id.data.get("error"):
50
+ self.status = self.transcript_id.data["error"]
51
+ return self.transcript_id
52
+
53
+ try:
54
+ transcript = aai.Transcript.get_by_id(self.transcript_id.data["transcript_id"])
55
+ except Exception as e: # noqa: BLE001
56
+ error = f"Getting transcription failed: {e}"
57
+ logger.debug(error, exc_info=True)
58
+ self.status = error
59
+ return Data(data={"error": error})
60
+
61
+ if transcript.status == aai.TranscriptStatus.completed:
62
+ json_response = transcript.json_response
63
+ text = json_response.pop("text", None)
64
+ utterances = json_response.pop("utterances", None)
65
+ transcript_id = json_response.pop("id", None)
66
+ sorted_data = {"text": text, "utterances": utterances, "id": transcript_id}
67
+ sorted_data.update(json_response)
68
+ data = Data(data=sorted_data)
69
+ self.status = data
70
+ return data
71
+ self.status = transcript.error
72
+ return Data(data={"error": transcript.error})
@@ -0,0 +1,188 @@
1
+ from pathlib import Path
2
+
3
+ import assemblyai as aai
4
+
5
+ from lfx.custom.custom_component.component import Component
6
+ from lfx.io import BoolInput, DropdownInput, FileInput, MessageTextInput, Output, SecretStrInput
7
+ from lfx.log.logger import logger
8
+ from lfx.schema.data import Data
9
+
10
+
11
+ class AssemblyAITranscriptionJobCreator(Component):
12
+ display_name = "AssemblyAI Start Transcript"
13
+ description = "Create a transcription job for an audio file using AssemblyAI with advanced options"
14
+ documentation = "https://www.assemblyai.com/docs"
15
+ icon = "AssemblyAI"
16
+
17
+ inputs = [
18
+ SecretStrInput(
19
+ name="api_key",
20
+ display_name="Assembly API Key",
21
+ info="Your AssemblyAI API key. You can get one from https://www.assemblyai.com/",
22
+ required=True,
23
+ ),
24
+ FileInput(
25
+ name="audio_file",
26
+ display_name="Audio File",
27
+ file_types=[
28
+ "3ga",
29
+ "8svx",
30
+ "aac",
31
+ "ac3",
32
+ "aif",
33
+ "aiff",
34
+ "alac",
35
+ "amr",
36
+ "ape",
37
+ "au",
38
+ "dss",
39
+ "flac",
40
+ "flv",
41
+ "m4a",
42
+ "m4b",
43
+ "m4p",
44
+ "m4r",
45
+ "mp3",
46
+ "mpga",
47
+ "ogg",
48
+ "oga",
49
+ "mogg",
50
+ "opus",
51
+ "qcp",
52
+ "tta",
53
+ "voc",
54
+ "wav",
55
+ "wma",
56
+ "wv",
57
+ "webm",
58
+ "mts",
59
+ "m2ts",
60
+ "ts",
61
+ "mov",
62
+ "mp2",
63
+ "mp4",
64
+ "m4p",
65
+ "m4v",
66
+ "mxf",
67
+ ],
68
+ info="The audio file to transcribe",
69
+ required=True,
70
+ ),
71
+ MessageTextInput(
72
+ name="audio_file_url",
73
+ display_name="Audio File URL",
74
+ info="The URL of the audio file to transcribe (Can be used instead of a File)",
75
+ advanced=True,
76
+ ),
77
+ DropdownInput(
78
+ name="speech_model",
79
+ display_name="Speech Model",
80
+ options=[
81
+ "best",
82
+ "nano",
83
+ ],
84
+ value="best",
85
+ info="The speech model to use for the transcription",
86
+ advanced=True,
87
+ ),
88
+ BoolInput(
89
+ name="language_detection",
90
+ display_name="Automatic Language Detection",
91
+ info="Enable automatic language detection",
92
+ advanced=True,
93
+ ),
94
+ MessageTextInput(
95
+ name="language_code",
96
+ display_name="Language",
97
+ info=(
98
+ """
99
+ The language of the audio file. Can be set manually if automatic language detection is disabled.
100
+ See https://www.assemblyai.com/docs/getting-started/supported-languages """
101
+ "for a list of supported language codes."
102
+ ),
103
+ advanced=True,
104
+ ),
105
+ BoolInput(
106
+ name="speaker_labels",
107
+ display_name="Enable Speaker Labels",
108
+ info="Enable speaker diarization",
109
+ ),
110
+ MessageTextInput(
111
+ name="speakers_expected",
112
+ display_name="Expected Number of Speakers",
113
+ info="Set the expected number of speakers (optional, enter a number)",
114
+ advanced=True,
115
+ ),
116
+ BoolInput(
117
+ name="punctuate",
118
+ display_name="Punctuate",
119
+ info="Enable automatic punctuation",
120
+ advanced=True,
121
+ value=True,
122
+ ),
123
+ BoolInput(
124
+ name="format_text",
125
+ display_name="Format Text",
126
+ info="Enable text formatting",
127
+ advanced=True,
128
+ value=True,
129
+ ),
130
+ ]
131
+
132
+ outputs = [
133
+ Output(display_name="Transcript ID", name="transcript_id", method="create_transcription_job"),
134
+ ]
135
+
136
+ def create_transcription_job(self) -> Data:
137
+ aai.settings.api_key = self.api_key
138
+
139
+ # Convert speakers_expected to int if it's not empty
140
+ speakers_expected = None
141
+ if self.speakers_expected and self.speakers_expected.strip():
142
+ try:
143
+ speakers_expected = int(self.speakers_expected)
144
+ except ValueError:
145
+ self.status = "Error: Expected Number of Speakers must be a valid integer"
146
+ return Data(data={"error": "Error: Expected Number of Speakers must be a valid integer"})
147
+
148
+ language_code = self.language_code or None
149
+
150
+ config = aai.TranscriptionConfig(
151
+ speech_model=self.speech_model,
152
+ language_detection=self.language_detection,
153
+ language_code=language_code,
154
+ speaker_labels=self.speaker_labels,
155
+ speakers_expected=speakers_expected,
156
+ punctuate=self.punctuate,
157
+ format_text=self.format_text,
158
+ )
159
+
160
+ audio = None
161
+ if self.audio_file:
162
+ if self.audio_file_url:
163
+ logger.warning("Both an audio file an audio URL were specified. The audio URL was ignored.")
164
+
165
+ # Check if the file exists
166
+ if not Path(self.audio_file).exists():
167
+ self.status = "Error: Audio file not found"
168
+ return Data(data={"error": "Error: Audio file not found"})
169
+ audio = self.audio_file
170
+ elif self.audio_file_url:
171
+ audio = self.audio_file_url
172
+ else:
173
+ self.status = "Error: Either an audio file or an audio URL must be specified"
174
+ return Data(data={"error": "Error: Either an audio file or an audio URL must be specified"})
175
+
176
+ try:
177
+ transcript = aai.Transcriber().submit(audio, config=config)
178
+ except Exception as e: # noqa: BLE001
179
+ logger.debug("Error submitting transcription job", exc_info=True)
180
+ self.status = f"An error occurred: {e}"
181
+ return Data(data={"error": f"An error occurred: {e}"})
182
+
183
+ if transcript.error:
184
+ self.status = transcript.error
185
+ return Data(data={"error": transcript.error})
186
+ result = Data(data={"transcript_id": transcript.id})
187
+ self.status = result
188
+ return result