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,375 @@
1
+ import importlib
2
+ import json
3
+ import warnings
4
+ from abc import abstractmethod
5
+
6
+ from langchain_core.language_models import BaseChatModel
7
+ from langchain_core.language_models.llms import LLM
8
+ from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, SystemMessage
9
+ from langchain_core.output_parsers import BaseOutputParser
10
+
11
+ from lfx.base.constants import STREAM_INFO_TEXT
12
+ from lfx.custom.custom_component.component import Component
13
+ from lfx.field_typing import LanguageModel
14
+ from lfx.inputs.inputs import BoolInput, InputTypes, MessageInput, MultilineInput
15
+ from lfx.schema.message import Message
16
+ from lfx.template.field.base import Output
17
+ from lfx.utils.constants import MESSAGE_SENDER_AI
18
+
19
+ # Enabled detailed thinking for NVIDIA reasoning models.
20
+ #
21
+ # Models are trained with this exact string. Do not update.
22
+ DETAILED_THINKING_PREFIX = "detailed thinking on\n\n"
23
+
24
+
25
+ class LCModelComponent(Component):
26
+ display_name: str = "Model Name"
27
+ description: str = "Model Description"
28
+ trace_type = "llm"
29
+ metadata = {
30
+ "keywords": [
31
+ "model",
32
+ "llm",
33
+ "language model",
34
+ "large language model",
35
+ ],
36
+ }
37
+
38
+ # Optional output parser to pass to the runnable. Subclasses may allow the user to input an `output_parser`
39
+ output_parser: BaseOutputParser | None = None
40
+
41
+ _base_inputs: list[InputTypes] = [
42
+ MessageInput(name="input_value", display_name="Input"),
43
+ MultilineInput(
44
+ name="system_message",
45
+ display_name="System Message",
46
+ info="System message to pass to the model.",
47
+ advanced=False,
48
+ ),
49
+ BoolInput(name="stream", display_name="Stream", info=STREAM_INFO_TEXT, advanced=True),
50
+ ]
51
+
52
+ outputs = [
53
+ Output(display_name="Model Response", name="text_output", method="text_response"),
54
+ Output(display_name="Language Model", name="model_output", method="build_model"),
55
+ ]
56
+
57
+ def _get_exception_message(self, e: Exception):
58
+ return str(e)
59
+
60
+ def supports_tool_calling(self, model: LanguageModel) -> bool:
61
+ try:
62
+ # Check if the bind_tools method is the same as the base class's method
63
+ if model.bind_tools is BaseChatModel.bind_tools:
64
+ return False
65
+
66
+ def test_tool(x: int) -> int:
67
+ return x
68
+
69
+ model_with_tool = model.bind_tools([test_tool])
70
+ return hasattr(model_with_tool, "tools") and len(model_with_tool.tools) > 0
71
+ except (AttributeError, TypeError, ValueError):
72
+ return False
73
+
74
+ def _validate_outputs(self) -> None:
75
+ # At least these two outputs must be defined
76
+ required_output_methods = ["text_response", "build_model"]
77
+ output_names = [output.name for output in self.outputs]
78
+ for method_name in required_output_methods:
79
+ if method_name not in output_names:
80
+ msg = f"Output with name '{method_name}' must be defined."
81
+ raise ValueError(msg)
82
+ if not hasattr(self, method_name):
83
+ msg = f"Method '{method_name}' must be defined."
84
+ raise ValueError(msg)
85
+
86
+ async def text_response(self) -> Message:
87
+ output = self.build_model()
88
+ result = await self.get_chat_result(
89
+ runnable=output, stream=self.stream, input_value=self.input_value, system_message=self.system_message
90
+ )
91
+ self.status = result
92
+ return result
93
+
94
+ def get_result(self, *, runnable: LLM, stream: bool, input_value: str):
95
+ """Retrieves the result from the output of a Runnable object.
96
+
97
+ Args:
98
+ runnable (Runnable): The runnable to retrieve the result from.
99
+ stream (bool): Indicates whether to use streaming or invocation mode.
100
+ input_value (str): The input value to pass to the output object.
101
+
102
+ Returns:
103
+ The result obtained from the output object.
104
+ """
105
+ try:
106
+ if stream:
107
+ result = runnable.stream(input_value)
108
+ else:
109
+ message = runnable.invoke(input_value)
110
+ result = message.content if hasattr(message, "content") else message
111
+ self.status = result
112
+ except Exception as e:
113
+ if message := self._get_exception_message(e):
114
+ raise ValueError(message) from e
115
+ raise
116
+
117
+ return result
118
+
119
+ def build_status_message(self, message: AIMessage):
120
+ """Builds a status message from an AIMessage object.
121
+
122
+ Args:
123
+ message (AIMessage): The AIMessage object to build the status message from.
124
+
125
+ Returns:
126
+ The status message.
127
+ """
128
+ if message.response_metadata:
129
+ # Build a well formatted status message
130
+ content = message.content
131
+ response_metadata = message.response_metadata
132
+ openai_keys = ["token_usage", "model_name", "finish_reason"]
133
+ inner_openai_keys = ["completion_tokens", "prompt_tokens", "total_tokens"]
134
+ anthropic_keys = ["model", "usage", "stop_reason"]
135
+ inner_anthropic_keys = ["input_tokens", "output_tokens"]
136
+ if all(key in response_metadata for key in openai_keys) and all(
137
+ key in response_metadata["token_usage"] for key in inner_openai_keys
138
+ ):
139
+ token_usage = response_metadata["token_usage"]
140
+ status_message = {
141
+ "tokens": {
142
+ "input": token_usage["prompt_tokens"],
143
+ "output": token_usage["completion_tokens"],
144
+ "total": token_usage["total_tokens"],
145
+ "stop_reason": response_metadata["finish_reason"],
146
+ "response": content,
147
+ }
148
+ }
149
+
150
+ elif all(key in response_metadata for key in anthropic_keys) and all(
151
+ key in response_metadata["usage"] for key in inner_anthropic_keys
152
+ ):
153
+ usage = response_metadata["usage"]
154
+ status_message = {
155
+ "tokens": {
156
+ "input": usage["input_tokens"],
157
+ "output": usage["output_tokens"],
158
+ "stop_reason": response_metadata["stop_reason"],
159
+ "response": content,
160
+ }
161
+ }
162
+ else:
163
+ status_message = f"Response: {content}" # type: ignore[assignment]
164
+ else:
165
+ status_message = f"Response: {message.content}" # type: ignore[assignment]
166
+ return status_message
167
+
168
+ async def get_chat_result(
169
+ self,
170
+ *,
171
+ runnable: LanguageModel,
172
+ stream: bool,
173
+ input_value: str | Message,
174
+ system_message: str | None = None,
175
+ ) -> Message:
176
+ # NVIDIA reasoning models use detailed thinking
177
+ if getattr(self, "detailed_thinking", False):
178
+ system_message = DETAILED_THINKING_PREFIX + (system_message or "")
179
+
180
+ return await self._get_chat_result(
181
+ runnable=runnable,
182
+ stream=stream,
183
+ input_value=input_value,
184
+ system_message=system_message,
185
+ )
186
+
187
+ async def _get_chat_result(
188
+ self,
189
+ *,
190
+ runnable: LanguageModel,
191
+ stream: bool,
192
+ input_value: str | Message,
193
+ system_message: str | None = None,
194
+ ) -> Message:
195
+ """Get chat result from a language model.
196
+
197
+ This method handles the core logic of getting a response from a language model,
198
+ including handling different input types, streaming, and error handling.
199
+
200
+ Args:
201
+ runnable (LanguageModel): The language model to use for generating responses
202
+ stream (bool): Whether to stream the response
203
+ input_value (str | Message): The input to send to the model
204
+ system_message (str | None, optional): System message to prepend. Defaults to None.
205
+
206
+ Returns:
207
+ The model response, either as a Message object or raw content
208
+
209
+ Raises:
210
+ ValueError: If the input message is empty or if there's an error during model invocation
211
+ """
212
+ messages: list[BaseMessage] = []
213
+ if not input_value and not system_message:
214
+ msg = "The message you want to send to the model is empty."
215
+ raise ValueError(msg)
216
+ system_message_added = False
217
+ message = None
218
+ if input_value:
219
+ if isinstance(input_value, Message):
220
+ with warnings.catch_warnings():
221
+ warnings.simplefilter("ignore")
222
+ if "prompt" in input_value:
223
+ prompt = input_value.load_lc_prompt()
224
+ if system_message:
225
+ prompt.messages = [
226
+ SystemMessage(content=system_message),
227
+ *prompt.messages, # type: ignore[has-type]
228
+ ]
229
+ system_message_added = True
230
+ runnable = prompt | runnable
231
+ else:
232
+ messages.append(input_value.to_lc_message())
233
+ else:
234
+ messages.append(HumanMessage(content=input_value))
235
+
236
+ if system_message and not system_message_added:
237
+ messages.insert(0, SystemMessage(content=system_message))
238
+ inputs: list | dict = messages or {}
239
+ lf_message = None
240
+ try:
241
+ # TODO: Depreciated Feature to be removed in upcoming release
242
+ if hasattr(self, "output_parser") and self.output_parser is not None:
243
+ runnable |= self.output_parser
244
+
245
+ runnable = runnable.with_config(
246
+ {
247
+ "run_name": self.display_name,
248
+ "project_name": self.get_project_name(),
249
+ "callbacks": self.get_langchain_callbacks(),
250
+ }
251
+ )
252
+ if stream:
253
+ lf_message, result = await self._handle_stream(runnable, inputs)
254
+ else:
255
+ message = await runnable.ainvoke(inputs)
256
+ result = message.content if hasattr(message, "content") else message
257
+ if isinstance(message, AIMessage):
258
+ status_message = self.build_status_message(message)
259
+ self.status = status_message
260
+ elif isinstance(result, dict):
261
+ result = json.dumps(message, indent=4)
262
+ self.status = result
263
+ else:
264
+ self.status = result
265
+ except Exception as e:
266
+ if message := self._get_exception_message(e):
267
+ raise ValueError(message) from e
268
+ raise
269
+ return lf_message or Message(text=result)
270
+
271
+ async def _handle_stream(self, runnable, inputs):
272
+ """Handle streaming responses from the language model.
273
+
274
+ Args:
275
+ runnable: The language model configured for streaming
276
+ inputs: The inputs to send to the model
277
+
278
+ Returns:
279
+ tuple: (Message object if connected to chat output, model result)
280
+ """
281
+ lf_message = None
282
+ if self.is_connected_to_chat_output():
283
+ # Add a Message
284
+ if hasattr(self, "graph"):
285
+ session_id = self.graph.session_id
286
+ elif hasattr(self, "_session_id"):
287
+ session_id = self._session_id
288
+ else:
289
+ session_id = None
290
+ model_message = Message(
291
+ text=runnable.astream(inputs),
292
+ sender=MESSAGE_SENDER_AI,
293
+ sender_name="AI",
294
+ properties={"icon": self.icon, "state": "partial"},
295
+ session_id=session_id,
296
+ )
297
+ model_message.properties.source = self._build_source(self._id, self.display_name, self)
298
+ lf_message = await self.send_message(model_message)
299
+ result = lf_message.text
300
+ else:
301
+ message = await runnable.ainvoke(inputs)
302
+ result = message.content if hasattr(message, "content") else message
303
+ return lf_message, result
304
+
305
+ @abstractmethod
306
+ def build_model(self) -> LanguageModel: # type: ignore[type-var]
307
+ """Implement this method to build the model."""
308
+
309
+ def get_llm(self, provider_name: str, model_info: dict[str, dict[str, str | list[InputTypes]]]) -> LanguageModel:
310
+ """Get LLM model based on provider name and inputs.
311
+
312
+ Args:
313
+ provider_name: Name of the model provider (e.g., "OpenAI", "Azure OpenAI")
314
+ inputs: Dictionary of input parameters for the model
315
+ model_info: Dictionary of model information
316
+
317
+ Returns:
318
+ Built LLM model instance
319
+ """
320
+ try:
321
+ if provider_name not in [model.get("display_name") for model in model_info.values()]:
322
+ msg = f"Unknown model provider: {provider_name}"
323
+ raise ValueError(msg)
324
+
325
+ # Find the component class name from MODEL_INFO in a single iteration
326
+ component_info, module_name = next(
327
+ ((info, key) for key, info in model_info.items() if info.get("display_name") == provider_name),
328
+ (None, None),
329
+ )
330
+ if not component_info:
331
+ msg = f"Component information not found for {provider_name}"
332
+ raise ValueError(msg)
333
+ component_inputs = component_info.get("inputs", [])
334
+ # Get the component class from the models module
335
+ # Ensure component_inputs is a list of the expected types
336
+ if not isinstance(component_inputs, list):
337
+ component_inputs = []
338
+
339
+ import warnings
340
+
341
+ with warnings.catch_warnings():
342
+ warnings.filterwarnings(
343
+ "ignore", message="Support for class-based `config` is deprecated", category=DeprecationWarning
344
+ )
345
+ warnings.filterwarnings("ignore", message="Valid config keys have changed in V2", category=UserWarning)
346
+ models_module = importlib.import_module("lfx.components.models")
347
+ component_class = getattr(models_module, str(module_name))
348
+ component = component_class()
349
+
350
+ return self.build_llm_model_from_inputs(component, component_inputs)
351
+ except Exception as e:
352
+ msg = f"Error building {provider_name} language model"
353
+ raise ValueError(msg) from e
354
+
355
+ def build_llm_model_from_inputs(
356
+ self, component: Component, inputs: list[InputTypes], prefix: str = ""
357
+ ) -> LanguageModel:
358
+ """Build LLM model from component and inputs.
359
+
360
+ Args:
361
+ component: LLM component instance
362
+ inputs: Dictionary of input parameters for the model
363
+ prefix: Prefix for the input names
364
+ Returns:
365
+ Built LLM model instance
366
+ """
367
+ # Ensure prefix is a string
368
+ prefix = prefix or ""
369
+ # Filter inputs to only include valid component input names
370
+ input_data = {
371
+ str(component_input.name): getattr(self, f"{prefix}{component_input.name}", None)
372
+ for component_input in inputs
373
+ }
374
+
375
+ return component.set(**input_data).build_model()
@@ -0,0 +1,307 @@
1
+ from typing_extensions import TypedDict
2
+
3
+ from lfx.base.models.model import LCModelComponent
4
+ from lfx.inputs.inputs import InputTypes, SecretStrInput
5
+ from lfx.template.field.base import Input
6
+
7
+
8
+ class ModelProvidersDict(TypedDict):
9
+ fields: dict
10
+ inputs: list[InputTypes]
11
+ prefix: str
12
+ component_class: LCModelComponent
13
+ icon: str
14
+ is_active: bool
15
+
16
+
17
+ def get_filtered_inputs(component_class):
18
+ base_input_names = {field.name for field in LCModelComponent.get_base_inputs()}
19
+ component_instance = component_class()
20
+
21
+ return [process_inputs(input_) for input_ in component_instance.inputs if input_.name not in base_input_names]
22
+
23
+
24
+ def process_inputs(component_data: Input):
25
+ """Processes and modifies an input configuration based on its type or name.
26
+
27
+ Adjusts properties such as value, advanced status, real-time refresh, and additional information for specific
28
+ input types or names to ensure correct behavior in the UI and provider integration.
29
+
30
+ Args:
31
+ component_data: The input configuration to process.
32
+
33
+ Returns:
34
+ The modified input configuration.
35
+ """
36
+ if isinstance(component_data, SecretStrInput):
37
+ component_data.value = ""
38
+ component_data.load_from_db = False
39
+ component_data.real_time_refresh = True
40
+ if component_data.name == "api_key":
41
+ component_data.required = False
42
+ elif component_data.name == "tool_model_enabled":
43
+ component_data.advanced = True
44
+ component_data.value = True
45
+ elif component_data.name in {"temperature", "base_url"}:
46
+ component_data = set_advanced_true(component_data)
47
+ elif component_data.name == "model_name":
48
+ component_data = set_real_time_refresh_false(component_data)
49
+ component_data = add_combobox_true(component_data)
50
+ component_data = add_info(
51
+ component_data,
52
+ "To see the model names, first choose a provider. Then, enter your API key and click the refresh button "
53
+ "next to the model name.",
54
+ )
55
+ return component_data
56
+
57
+
58
+ def set_advanced_true(component_input):
59
+ component_input.advanced = True
60
+ return component_input
61
+
62
+
63
+ def set_real_time_refresh_false(component_input):
64
+ component_input.real_time_refresh = False
65
+ return component_input
66
+
67
+
68
+ def add_info(component_input, info_str: str):
69
+ component_input.info = info_str
70
+ return component_input
71
+
72
+
73
+ def add_combobox_true(component_input):
74
+ component_input.combobox = True
75
+ return component_input
76
+
77
+
78
+ def create_input_fields_dict(inputs: list[Input], prefix: str) -> dict[str, Input]:
79
+ return {f"{prefix}{input_.name}": input_.to_dict() for input_ in inputs}
80
+
81
+
82
+ def _get_google_generative_ai_inputs_and_fields():
83
+ try:
84
+ from lfx.components.google.google_generative_ai import GoogleGenerativeAIComponent
85
+
86
+ google_generative_ai_inputs = get_filtered_inputs(GoogleGenerativeAIComponent)
87
+ except ImportError as e:
88
+ msg = (
89
+ "Google Generative AI is not installed. Please install it with "
90
+ "`pip install langchain-google-generative-ai`."
91
+ )
92
+ raise ImportError(msg) from e
93
+ return google_generative_ai_inputs, create_input_fields_dict(google_generative_ai_inputs, "")
94
+
95
+
96
+ def _get_openai_inputs_and_fields():
97
+ try:
98
+ from lfx.components.openai.openai_chat_model import OpenAIModelComponent
99
+
100
+ openai_inputs = get_filtered_inputs(OpenAIModelComponent)
101
+ except ImportError as e:
102
+ msg = "OpenAI is not installed. Please install it with `pip install langchain-openai`."
103
+ raise ImportError(msg) from e
104
+ return openai_inputs, create_input_fields_dict(openai_inputs, "")
105
+
106
+
107
+ def _get_azure_inputs_and_fields():
108
+ try:
109
+ from lfx.components.azure.azure_openai import AzureChatOpenAIComponent
110
+
111
+ azure_inputs = get_filtered_inputs(AzureChatOpenAIComponent)
112
+ except ImportError as e:
113
+ msg = "Azure OpenAI is not installed. Please install it with `pip install langchain-azure-openai`."
114
+ raise ImportError(msg) from e
115
+ return azure_inputs, create_input_fields_dict(azure_inputs, "")
116
+
117
+
118
+ def _get_groq_inputs_and_fields():
119
+ try:
120
+ from lfx.components.groq.groq import GroqModel
121
+
122
+ groq_inputs = get_filtered_inputs(GroqModel)
123
+ except ImportError as e:
124
+ msg = "Groq is not installed. Please install it with `pip install langchain-groq`."
125
+ raise ImportError(msg) from e
126
+ return groq_inputs, create_input_fields_dict(groq_inputs, "")
127
+
128
+
129
+ def _get_anthropic_inputs_and_fields():
130
+ try:
131
+ from lfx.components.anthropic.anthropic import AnthropicModelComponent
132
+
133
+ anthropic_inputs = get_filtered_inputs(AnthropicModelComponent)
134
+ except ImportError as e:
135
+ msg = "Anthropic is not installed. Please install it with `pip install langchain-anthropic`."
136
+ raise ImportError(msg) from e
137
+ return anthropic_inputs, create_input_fields_dict(anthropic_inputs, "")
138
+
139
+
140
+ def _get_nvidia_inputs_and_fields():
141
+ try:
142
+ from lfx.components.nvidia.nvidia import NVIDIAModelComponent
143
+
144
+ nvidia_inputs = get_filtered_inputs(NVIDIAModelComponent)
145
+ except ImportError as e:
146
+ msg = "NVIDIA is not installed. Please install it with `pip install langchain-nvidia`."
147
+ raise ImportError(msg) from e
148
+ return nvidia_inputs, create_input_fields_dict(nvidia_inputs, "")
149
+
150
+
151
+ def _get_amazon_bedrock_inputs_and_fields():
152
+ try:
153
+ from lfx.components.amazon.amazon_bedrock_model import AmazonBedrockComponent
154
+
155
+ amazon_bedrock_inputs = get_filtered_inputs(AmazonBedrockComponent)
156
+ except ImportError as e:
157
+ msg = "Amazon Bedrock is not installed. Please install it with `pip install langchain-amazon-bedrock`."
158
+ raise ImportError(msg) from e
159
+ return amazon_bedrock_inputs, create_input_fields_dict(amazon_bedrock_inputs, "")
160
+
161
+
162
+ def _get_sambanova_inputs_and_fields():
163
+ try:
164
+ from lfx.components.sambanova.sambanova import SambaNovaComponent
165
+
166
+ sambanova_inputs = get_filtered_inputs(SambaNovaComponent)
167
+ except ImportError as e:
168
+ msg = "SambaNova is not installed. Please install it with `pip install langchain-sambanova`."
169
+ raise ImportError(msg) from e
170
+ return sambanova_inputs, create_input_fields_dict(sambanova_inputs, "")
171
+
172
+
173
+ MODEL_PROVIDERS_DICT: dict[str, ModelProvidersDict] = {}
174
+
175
+ # Try to add each provider
176
+ try:
177
+ from lfx.components.openai.openai_chat_model import OpenAIModelComponent
178
+
179
+ openai_inputs, openai_fields = _get_openai_inputs_and_fields()
180
+ MODEL_PROVIDERS_DICT["OpenAI"] = {
181
+ "fields": openai_fields,
182
+ "inputs": openai_inputs,
183
+ "prefix": "",
184
+ "component_class": OpenAIModelComponent(),
185
+ "icon": OpenAIModelComponent.icon,
186
+ "is_active": True,
187
+ }
188
+ except ImportError:
189
+ pass
190
+
191
+ try:
192
+ from lfx.components.azure.azure_openai import AzureChatOpenAIComponent
193
+
194
+ azure_inputs, azure_fields = _get_azure_inputs_and_fields()
195
+ MODEL_PROVIDERS_DICT["Azure OpenAI"] = {
196
+ "fields": azure_fields,
197
+ "inputs": azure_inputs,
198
+ "prefix": "",
199
+ "component_class": AzureChatOpenAIComponent(),
200
+ "icon": AzureChatOpenAIComponent.icon,
201
+ "is_active": False,
202
+ }
203
+ except ImportError:
204
+ pass
205
+
206
+ try:
207
+ from lfx.components.groq.groq import GroqModel
208
+
209
+ groq_inputs, groq_fields = _get_groq_inputs_and_fields()
210
+ MODEL_PROVIDERS_DICT["Groq"] = {
211
+ "fields": groq_fields,
212
+ "inputs": groq_inputs,
213
+ "prefix": "",
214
+ "component_class": GroqModel(),
215
+ "icon": GroqModel.icon,
216
+ "is_active": True,
217
+ }
218
+ except ImportError:
219
+ pass
220
+
221
+ try:
222
+ from lfx.components.anthropic.anthropic import AnthropicModelComponent
223
+
224
+ anthropic_inputs, anthropic_fields = _get_anthropic_inputs_and_fields()
225
+ MODEL_PROVIDERS_DICT["Anthropic"] = {
226
+ "fields": anthropic_fields,
227
+ "inputs": anthropic_inputs,
228
+ "prefix": "",
229
+ "component_class": AnthropicModelComponent(),
230
+ "icon": AnthropicModelComponent.icon,
231
+ "is_active": True,
232
+ }
233
+ except ImportError:
234
+ pass
235
+
236
+ try:
237
+ from lfx.components.nvidia.nvidia import NVIDIAModelComponent
238
+
239
+ nvidia_inputs, nvidia_fields = _get_nvidia_inputs_and_fields()
240
+ MODEL_PROVIDERS_DICT["NVIDIA"] = {
241
+ "fields": nvidia_fields,
242
+ "inputs": nvidia_inputs,
243
+ "prefix": "",
244
+ "component_class": NVIDIAModelComponent(),
245
+ "icon": NVIDIAModelComponent.icon,
246
+ "is_active": False,
247
+ }
248
+ except ImportError:
249
+ pass
250
+
251
+ try:
252
+ from lfx.components.amazon.amazon_bedrock_model import AmazonBedrockComponent
253
+
254
+ bedrock_inputs, bedrock_fields = _get_amazon_bedrock_inputs_and_fields()
255
+ MODEL_PROVIDERS_DICT["Amazon Bedrock"] = {
256
+ "fields": bedrock_fields,
257
+ "inputs": bedrock_inputs,
258
+ "prefix": "",
259
+ "component_class": AmazonBedrockComponent(),
260
+ "icon": AmazonBedrockComponent.icon,
261
+ "is_active": False,
262
+ }
263
+ except ImportError:
264
+ pass
265
+
266
+ try:
267
+ from lfx.components.google.google_generative_ai import GoogleGenerativeAIComponent
268
+
269
+ google_generative_ai_inputs, google_generative_ai_fields = _get_google_generative_ai_inputs_and_fields()
270
+ MODEL_PROVIDERS_DICT["Google Generative AI"] = {
271
+ "fields": google_generative_ai_fields,
272
+ "inputs": google_generative_ai_inputs,
273
+ "prefix": "",
274
+ "component_class": GoogleGenerativeAIComponent(),
275
+ "icon": GoogleGenerativeAIComponent.icon,
276
+ "is_active": True,
277
+ }
278
+ except ImportError:
279
+ pass
280
+
281
+ try:
282
+ from lfx.components.sambanova.sambanova import SambaNovaComponent
283
+
284
+ sambanova_inputs, sambanova_fields = _get_sambanova_inputs_and_fields()
285
+ MODEL_PROVIDERS_DICT["SambaNova"] = {
286
+ "fields": sambanova_fields,
287
+ "inputs": sambanova_inputs,
288
+ "prefix": "",
289
+ "component_class": SambaNovaComponent(),
290
+ "icon": SambaNovaComponent.icon,
291
+ "is_active": False,
292
+ }
293
+ except ImportError:
294
+ pass
295
+
296
+ # Expose only active providers ----------------------------------------------
297
+ ACTIVE_MODEL_PROVIDERS_DICT: dict[str, ModelProvidersDict] = {
298
+ name: prov for name, prov in MODEL_PROVIDERS_DICT.items() if prov.get("is_active", True)
299
+ }
300
+
301
+ MODEL_PROVIDERS: list[str] = list(ACTIVE_MODEL_PROVIDERS_DICT.keys())
302
+
303
+ ALL_PROVIDER_FIELDS: list[str] = [field for prov in ACTIVE_MODEL_PROVIDERS_DICT.values() for field in prov["fields"]]
304
+
305
+ MODEL_DYNAMIC_UPDATE_FIELDS = ["api_key", "model", "tool_model_enabled", "base_url", "model_name"]
306
+
307
+ MODELS_METADATA = {name: {"icon": prov["icon"]} for name, prov in ACTIVE_MODEL_PROVIDERS_DICT.items()}