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,330 @@
1
+ import asyncio
2
+ from typing import Any
3
+ from urllib.parse import urljoin
4
+
5
+ import httpx
6
+ from langchain_ollama import ChatOllama
7
+
8
+ from lfx.base.models.model import LCModelComponent
9
+ from lfx.base.models.ollama_constants import URL_LIST
10
+ from lfx.field_typing import LanguageModel
11
+ from lfx.field_typing.range_spec import RangeSpec
12
+ from lfx.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageTextInput, SliderInput
13
+ from lfx.log.logger import logger
14
+
15
+ HTTP_STATUS_OK = 200
16
+
17
+
18
+ class ChatOllamaComponent(LCModelComponent):
19
+ display_name = "Ollama"
20
+ description = "Generate text using Ollama Local LLMs."
21
+ icon = "Ollama"
22
+ name = "OllamaModel"
23
+
24
+ # Define constants for JSON keys
25
+ JSON_MODELS_KEY = "models"
26
+ JSON_NAME_KEY = "name"
27
+ JSON_CAPABILITIES_KEY = "capabilities"
28
+ DESIRED_CAPABILITY = "completion"
29
+ TOOL_CALLING_CAPABILITY = "tools"
30
+
31
+ inputs = [
32
+ MessageTextInput(
33
+ name="base_url",
34
+ display_name="Base URL",
35
+ info="Endpoint of the Ollama API.",
36
+ value="",
37
+ real_time_refresh=True,
38
+ ),
39
+ DropdownInput(
40
+ name="model_name",
41
+ display_name="Model Name",
42
+ options=[],
43
+ info="Refer to https://ollama.com/library for more models.",
44
+ refresh_button=True,
45
+ real_time_refresh=True,
46
+ ),
47
+ SliderInput(
48
+ name="temperature",
49
+ display_name="Temperature",
50
+ value=0.1,
51
+ range_spec=RangeSpec(min=0, max=1, step=0.01),
52
+ advanced=True,
53
+ ),
54
+ MessageTextInput(
55
+ name="format", display_name="Format", info="Specify the format of the output (e.g., json).", advanced=True
56
+ ),
57
+ DictInput(name="metadata", display_name="Metadata", info="Metadata to add to the run trace.", advanced=True),
58
+ DropdownInput(
59
+ name="mirostat",
60
+ display_name="Mirostat",
61
+ options=["Disabled", "Mirostat", "Mirostat 2.0"],
62
+ info="Enable/disable Mirostat sampling for controlling perplexity.",
63
+ value="Disabled",
64
+ advanced=True,
65
+ real_time_refresh=True,
66
+ ),
67
+ FloatInput(
68
+ name="mirostat_eta",
69
+ display_name="Mirostat Eta",
70
+ info="Learning rate for Mirostat algorithm. (Default: 0.1)",
71
+ advanced=True,
72
+ ),
73
+ FloatInput(
74
+ name="mirostat_tau",
75
+ display_name="Mirostat Tau",
76
+ info="Controls the balance between coherence and diversity of the output. (Default: 5.0)",
77
+ advanced=True,
78
+ ),
79
+ IntInput(
80
+ name="num_ctx",
81
+ display_name="Context Window Size",
82
+ info="Size of the context window for generating tokens. (Default: 2048)",
83
+ advanced=True,
84
+ ),
85
+ IntInput(
86
+ name="num_gpu",
87
+ display_name="Number of GPUs",
88
+ info="Number of GPUs to use for computation. (Default: 1 on macOS, 0 to disable)",
89
+ advanced=True,
90
+ ),
91
+ IntInput(
92
+ name="num_thread",
93
+ display_name="Number of Threads",
94
+ info="Number of threads to use during computation. (Default: detected for optimal performance)",
95
+ advanced=True,
96
+ ),
97
+ IntInput(
98
+ name="repeat_last_n",
99
+ display_name="Repeat Last N",
100
+ info="How far back the model looks to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)",
101
+ advanced=True,
102
+ ),
103
+ FloatInput(
104
+ name="repeat_penalty",
105
+ display_name="Repeat Penalty",
106
+ info="Penalty for repetitions in generated text. (Default: 1.1)",
107
+ advanced=True,
108
+ ),
109
+ FloatInput(name="tfs_z", display_name="TFS Z", info="Tail free sampling value. (Default: 1)", advanced=True),
110
+ IntInput(name="timeout", display_name="Timeout", info="Timeout for the request stream.", advanced=True),
111
+ IntInput(
112
+ name="top_k", display_name="Top K", info="Limits token selection to top K. (Default: 40)", advanced=True
113
+ ),
114
+ FloatInput(name="top_p", display_name="Top P", info="Works together with top-k. (Default: 0.9)", advanced=True),
115
+ BoolInput(name="verbose", display_name="Verbose", info="Whether to print out response text.", advanced=True),
116
+ MessageTextInput(
117
+ name="tags",
118
+ display_name="Tags",
119
+ info="Comma-separated list of tags to add to the run trace.",
120
+ advanced=True,
121
+ ),
122
+ MessageTextInput(
123
+ name="stop_tokens",
124
+ display_name="Stop Tokens",
125
+ info="Comma-separated list of tokens to signal the model to stop generating text.",
126
+ advanced=True,
127
+ ),
128
+ MessageTextInput(
129
+ name="system", display_name="System", info="System to use for generating text.", advanced=True
130
+ ),
131
+ BoolInput(
132
+ name="tool_model_enabled",
133
+ display_name="Tool Model Enabled",
134
+ info="Whether to enable tool calling in the model.",
135
+ value=True,
136
+ real_time_refresh=True,
137
+ ),
138
+ MessageTextInput(
139
+ name="template", display_name="Template", info="Template to use for generating text.", advanced=True
140
+ ),
141
+ *LCModelComponent.get_base_inputs(),
142
+ ]
143
+
144
+ def build_model(self) -> LanguageModel: # type: ignore[type-var]
145
+ # Mapping mirostat settings to their corresponding values
146
+ mirostat_options = {"Mirostat": 1, "Mirostat 2.0": 2}
147
+
148
+ # Default to 0 for 'Disabled'
149
+ mirostat_value = mirostat_options.get(self.mirostat, 0)
150
+
151
+ # Set mirostat_eta and mirostat_tau to None if mirostat is disabled
152
+ if mirostat_value == 0:
153
+ mirostat_eta = None
154
+ mirostat_tau = None
155
+ else:
156
+ mirostat_eta = self.mirostat_eta
157
+ mirostat_tau = self.mirostat_tau
158
+
159
+ # Mapping system settings to their corresponding values
160
+ llm_params = {
161
+ "base_url": self.base_url,
162
+ "model": self.model_name,
163
+ "mirostat": mirostat_value,
164
+ "format": self.format,
165
+ "metadata": self.metadata,
166
+ "tags": self.tags.split(",") if self.tags else None,
167
+ "mirostat_eta": mirostat_eta,
168
+ "mirostat_tau": mirostat_tau,
169
+ "num_ctx": self.num_ctx or None,
170
+ "num_gpu": self.num_gpu or None,
171
+ "num_thread": self.num_thread or None,
172
+ "repeat_last_n": self.repeat_last_n or None,
173
+ "repeat_penalty": self.repeat_penalty or None,
174
+ "temperature": self.temperature or None,
175
+ "stop": self.stop_tokens.split(",") if self.stop_tokens else None,
176
+ "system": self.system,
177
+ "tfs_z": self.tfs_z or None,
178
+ "timeout": self.timeout or None,
179
+ "top_k": self.top_k or None,
180
+ "top_p": self.top_p or None,
181
+ "verbose": self.verbose,
182
+ "template": self.template,
183
+ }
184
+
185
+ # Remove parameters with None values
186
+ llm_params = {k: v for k, v in llm_params.items() if v is not None}
187
+
188
+ try:
189
+ output = ChatOllama(**llm_params)
190
+ except Exception as e:
191
+ msg = (
192
+ "Unable to connect to the Ollama API. ",
193
+ "Please verify the base URL, ensure the relevant Ollama model is pulled, and try again.",
194
+ )
195
+ raise ValueError(msg) from e
196
+
197
+ return output
198
+
199
+ async def is_valid_ollama_url(self, url: str) -> bool:
200
+ try:
201
+ async with httpx.AsyncClient() as client:
202
+ return (await client.get(urljoin(url, "api/tags"))).status_code == HTTP_STATUS_OK
203
+ except httpx.RequestError:
204
+ return False
205
+
206
+ async def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None):
207
+ if field_name == "mirostat":
208
+ if field_value == "Disabled":
209
+ build_config["mirostat_eta"]["advanced"] = True
210
+ build_config["mirostat_tau"]["advanced"] = True
211
+ build_config["mirostat_eta"]["value"] = None
212
+ build_config["mirostat_tau"]["value"] = None
213
+
214
+ else:
215
+ build_config["mirostat_eta"]["advanced"] = False
216
+ build_config["mirostat_tau"]["advanced"] = False
217
+
218
+ if field_value == "Mirostat 2.0":
219
+ build_config["mirostat_eta"]["value"] = 0.2
220
+ build_config["mirostat_tau"]["value"] = 10
221
+ else:
222
+ build_config["mirostat_eta"]["value"] = 0.1
223
+ build_config["mirostat_tau"]["value"] = 5
224
+
225
+ if field_name in {"base_url", "model_name"}:
226
+ if build_config["base_url"].get("load_from_db", False):
227
+ base_url_value = await self.get_variables(build_config["base_url"].get("value", ""), "base_url")
228
+ else:
229
+ base_url_value = build_config["base_url"].get("value", "")
230
+
231
+ if not await self.is_valid_ollama_url(base_url_value):
232
+ # Check if any URL in the list is valid
233
+ valid_url = ""
234
+ check_urls = URL_LIST
235
+ if self.base_url:
236
+ check_urls = [self.base_url, *URL_LIST]
237
+ for url in check_urls:
238
+ if await self.is_valid_ollama_url(url):
239
+ valid_url = url
240
+ break
241
+ if valid_url != "":
242
+ build_config["base_url"]["value"] = valid_url
243
+ else:
244
+ msg = "No valid Ollama URL found."
245
+ raise ValueError(msg)
246
+ if field_name in {"model_name", "base_url", "tool_model_enabled"}:
247
+ if await self.is_valid_ollama_url(self.base_url):
248
+ tool_model_enabled = build_config["tool_model_enabled"].get("value", False) or self.tool_model_enabled
249
+ build_config["model_name"]["options"] = await self.get_models(
250
+ self.base_url, tool_model_enabled=tool_model_enabled
251
+ )
252
+ elif await self.is_valid_ollama_url(build_config["base_url"].get("value", "")):
253
+ tool_model_enabled = build_config["tool_model_enabled"].get("value", False) or self.tool_model_enabled
254
+ build_config["model_name"]["options"] = await self.get_models(
255
+ build_config["base_url"].get("value", ""), tool_model_enabled=tool_model_enabled
256
+ )
257
+ else:
258
+ build_config["model_name"]["options"] = []
259
+ if field_name == "keep_alive_flag":
260
+ if field_value == "Keep":
261
+ build_config["keep_alive"]["value"] = "-1"
262
+ build_config["keep_alive"]["advanced"] = True
263
+ elif field_value == "Immediately":
264
+ build_config["keep_alive"]["value"] = "0"
265
+ build_config["keep_alive"]["advanced"] = True
266
+ else:
267
+ build_config["keep_alive"]["advanced"] = False
268
+
269
+ return build_config
270
+
271
+ async def get_models(self, base_url_value: str, *, tool_model_enabled: bool | None = None) -> list[str]:
272
+ """Fetches a list of models from the Ollama API that do not have the "embedding" capability.
273
+
274
+ Args:
275
+ base_url_value (str): The base URL of the Ollama API.
276
+ tool_model_enabled (bool | None, optional): If True, filters the models further to include
277
+ only those that support tool calling. Defaults to None.
278
+
279
+ Returns:
280
+ list[str]: A list of model names that do not have the "embedding" capability. If
281
+ `tool_model_enabled` is True, only models supporting tool calling are included.
282
+
283
+ Raises:
284
+ ValueError: If there is an issue with the API request or response, or if the model
285
+ names cannot be retrieved.
286
+ """
287
+ try:
288
+ # Normalize the base URL to avoid the repeated "/" at the end
289
+ base_url = base_url_value.rstrip("/") + "/"
290
+
291
+ # Ollama REST API to return models
292
+ tags_url = urljoin(base_url, "api/tags")
293
+
294
+ # Ollama REST API to return model capabilities
295
+ show_url = urljoin(base_url, "api/show")
296
+
297
+ async with httpx.AsyncClient() as client:
298
+ # Fetch available models
299
+ tags_response = await client.get(tags_url)
300
+ tags_response.raise_for_status()
301
+ models = tags_response.json()
302
+ if asyncio.iscoroutine(models):
303
+ models = await models
304
+ await logger.adebug(f"Available models: {models}")
305
+
306
+ # Filter models that are NOT embedding models
307
+ model_ids = []
308
+ for model in models[self.JSON_MODELS_KEY]:
309
+ model_name = model[self.JSON_NAME_KEY]
310
+ await logger.adebug(f"Checking model: {model_name}")
311
+
312
+ payload = {"model": model_name}
313
+ show_response = await client.post(show_url, json=payload)
314
+ show_response.raise_for_status()
315
+ json_data = show_response.json()
316
+ if asyncio.iscoroutine(json_data):
317
+ json_data = await json_data
318
+ capabilities = json_data.get(self.JSON_CAPABILITIES_KEY, [])
319
+ await logger.adebug(f"Model: {model_name}, Capabilities: {capabilities}")
320
+
321
+ if self.DESIRED_CAPABILITY in capabilities and (
322
+ not tool_model_enabled or self.TOOL_CALLING_CAPABILITY in capabilities
323
+ ):
324
+ model_ids.append(model_name)
325
+
326
+ except (httpx.RequestError, ValueError) as e:
327
+ msg = "Could not get model names from Ollama."
328
+ raise ValueError(msg) from e
329
+
330
+ return model_ids
@@ -0,0 +1,106 @@
1
+ from typing import Any
2
+ from urllib.parse import urljoin
3
+
4
+ import httpx
5
+ from langchain_ollama import OllamaEmbeddings
6
+
7
+ from lfx.base.models.model import LCModelComponent
8
+ from lfx.base.models.ollama_constants import OLLAMA_EMBEDDING_MODELS, URL_LIST
9
+ from lfx.field_typing import Embeddings
10
+ from lfx.io import DropdownInput, MessageTextInput, Output
11
+
12
+ HTTP_STATUS_OK = 200
13
+
14
+
15
+ class OllamaEmbeddingsComponent(LCModelComponent):
16
+ display_name: str = "Ollama Embeddings"
17
+ description: str = "Generate embeddings using Ollama models."
18
+ documentation = "https://python.langchain.com/docs/integrations/text_embedding/ollama"
19
+ icon = "Ollama"
20
+ name = "OllamaEmbeddings"
21
+
22
+ inputs = [
23
+ DropdownInput(
24
+ name="model_name",
25
+ display_name="Ollama Model",
26
+ value="",
27
+ options=[],
28
+ real_time_refresh=True,
29
+ refresh_button=True,
30
+ combobox=True,
31
+ required=True,
32
+ ),
33
+ MessageTextInput(
34
+ name="base_url",
35
+ display_name="Ollama Base URL",
36
+ value="",
37
+ required=True,
38
+ ),
39
+ ]
40
+
41
+ outputs = [
42
+ Output(display_name="Embeddings", name="embeddings", method="build_embeddings"),
43
+ ]
44
+
45
+ def build_embeddings(self) -> Embeddings:
46
+ try:
47
+ output = OllamaEmbeddings(model=self.model_name, base_url=self.base_url)
48
+ except Exception as e:
49
+ msg = (
50
+ "Unable to connect to the Ollama API. ",
51
+ "Please verify the base URL, ensure the relevant Ollama model is pulled, and try again.",
52
+ )
53
+ raise ValueError(msg) from e
54
+ return output
55
+
56
+ async def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None):
57
+ if field_name in {"base_url", "model_name"} and not await self.is_valid_ollama_url(field_value):
58
+ # Check if any URL in the list is valid
59
+ valid_url = ""
60
+ for url in URL_LIST:
61
+ if await self.is_valid_ollama_url(url):
62
+ valid_url = url
63
+ break
64
+ build_config["base_url"]["value"] = valid_url
65
+ if field_name in {"model_name", "base_url", "tool_model_enabled"}:
66
+ if await self.is_valid_ollama_url(self.base_url):
67
+ build_config["model_name"]["options"] = await self.get_model(self.base_url)
68
+ elif await self.is_valid_ollama_url(build_config["base_url"].get("value", "")):
69
+ build_config["model_name"]["options"] = await self.get_model(build_config["base_url"].get("value", ""))
70
+ else:
71
+ build_config["model_name"]["options"] = []
72
+
73
+ return build_config
74
+
75
+ async def get_model(self, base_url_value: str) -> list[str]:
76
+ """Get the model names from Ollama."""
77
+ model_ids = []
78
+ try:
79
+ url = urljoin(base_url_value, "/api/tags")
80
+ async with httpx.AsyncClient() as client:
81
+ response = await client.get(url)
82
+ response.raise_for_status()
83
+ data = response.json()
84
+
85
+ model_ids = [model["name"] for model in data.get("models", [])]
86
+ # this to ensure that not embedding models are included.
87
+ # not even the base models since models can have 1b 2b etc
88
+ # handles cases when embeddings models have tags like :latest - etc.
89
+ model_ids = [
90
+ model
91
+ for model in model_ids
92
+ if any(model.startswith(f"{embedding_model}") for embedding_model in OLLAMA_EMBEDDING_MODELS)
93
+ ]
94
+
95
+ except (ImportError, ValueError, httpx.RequestError) as e:
96
+ msg = "Could not get model names from Ollama."
97
+ raise ValueError(msg) from e
98
+
99
+ return model_ids
100
+
101
+ async def is_valid_ollama_url(self, url: str) -> bool:
102
+ try:
103
+ async with httpx.AsyncClient() as client:
104
+ return (await client.get(f"{url}/api/tags")).status_code == HTTP_STATUS_OK
105
+ except httpx.RequestError:
106
+ return False
@@ -0,0 +1,37 @@
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 lfx.components.openai.openai import OpenAIEmbeddingsComponent
9
+ from lfx.components.openai.openai_chat_model import OpenAIModelComponent
10
+
11
+ _dynamic_imports = {
12
+ "OpenAIEmbeddingsComponent": "openai",
13
+ "OpenAIModelComponent": "openai_chat_model",
14
+ }
15
+
16
+ __all__ = [
17
+ "OpenAIEmbeddingsComponent",
18
+ "OpenAIModelComponent",
19
+ ]
20
+
21
+
22
+ def __getattr__(attr_name: str) -> Any:
23
+ """Lazily import OpenAI components on attribute access."""
24
+ if attr_name not in _dynamic_imports:
25
+ msg = f"module '{__name__}' has no attribute '{attr_name}'"
26
+ raise AttributeError(msg)
27
+ try:
28
+ result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
29
+ except (ModuleNotFoundError, ImportError, AttributeError) as e:
30
+ msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
31
+ raise AttributeError(msg) from e
32
+ globals()[attr_name] = result
33
+ return result
34
+
35
+
36
+ def __dir__() -> list[str]:
37
+ return list(__all__)
@@ -0,0 +1,100 @@
1
+ from langchain_openai import OpenAIEmbeddings
2
+
3
+ from lfx.base.embeddings.model import LCEmbeddingsModel
4
+ from lfx.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES
5
+ from lfx.field_typing import Embeddings
6
+ from lfx.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageTextInput, SecretStrInput
7
+
8
+
9
+ class OpenAIEmbeddingsComponent(LCEmbeddingsModel):
10
+ display_name = "OpenAI Embeddings"
11
+ description = "Generate embeddings using OpenAI models."
12
+ icon = "OpenAI"
13
+ name = "OpenAIEmbeddings"
14
+
15
+ inputs = [
16
+ DictInput(
17
+ name="default_headers",
18
+ display_name="Default Headers",
19
+ advanced=True,
20
+ info="Default headers to use for the API request.",
21
+ ),
22
+ DictInput(
23
+ name="default_query",
24
+ display_name="Default Query",
25
+ advanced=True,
26
+ info="Default query parameters to use for the API request.",
27
+ ),
28
+ IntInput(name="chunk_size", display_name="Chunk Size", advanced=True, value=1000),
29
+ MessageTextInput(name="client", display_name="Client", advanced=True),
30
+ MessageTextInput(name="deployment", display_name="Deployment", advanced=True),
31
+ IntInput(name="embedding_ctx_length", display_name="Embedding Context Length", advanced=True, value=1536),
32
+ IntInput(name="max_retries", display_name="Max Retries", value=3, advanced=True),
33
+ DropdownInput(
34
+ name="model",
35
+ display_name="Model",
36
+ advanced=False,
37
+ options=OPENAI_EMBEDDING_MODEL_NAMES,
38
+ value="text-embedding-3-small",
39
+ ),
40
+ DictInput(name="model_kwargs", display_name="Model Kwargs", advanced=True),
41
+ SecretStrInput(name="openai_api_key", display_name="OpenAI API Key", value="OPENAI_API_KEY", required=True),
42
+ MessageTextInput(name="openai_api_base", display_name="OpenAI API Base", advanced=True),
43
+ MessageTextInput(name="openai_api_type", display_name="OpenAI API Type", advanced=True),
44
+ MessageTextInput(name="openai_api_version", display_name="OpenAI API Version", advanced=True),
45
+ MessageTextInput(
46
+ name="openai_organization",
47
+ display_name="OpenAI Organization",
48
+ advanced=True,
49
+ ),
50
+ MessageTextInput(name="openai_proxy", display_name="OpenAI Proxy", advanced=True),
51
+ FloatInput(name="request_timeout", display_name="Request Timeout", advanced=True),
52
+ BoolInput(name="show_progress_bar", display_name="Show Progress Bar", advanced=True),
53
+ BoolInput(name="skip_empty", display_name="Skip Empty", advanced=True),
54
+ MessageTextInput(
55
+ name="tiktoken_model_name",
56
+ display_name="TikToken Model Name",
57
+ advanced=True,
58
+ ),
59
+ BoolInput(
60
+ name="tiktoken_enable",
61
+ display_name="TikToken Enable",
62
+ advanced=True,
63
+ value=True,
64
+ info="If False, you must have transformers installed.",
65
+ ),
66
+ IntInput(
67
+ name="dimensions",
68
+ display_name="Dimensions",
69
+ info="The number of dimensions the resulting output embeddings should have. "
70
+ "Only supported by certain models.",
71
+ advanced=True,
72
+ ),
73
+ ]
74
+
75
+ def build_embeddings(self) -> Embeddings:
76
+ return OpenAIEmbeddings(
77
+ client=self.client or None,
78
+ model=self.model,
79
+ dimensions=self.dimensions or None,
80
+ deployment=self.deployment or None,
81
+ api_version=self.openai_api_version or None,
82
+ base_url=self.openai_api_base or None,
83
+ openai_api_type=self.openai_api_type or None,
84
+ openai_proxy=self.openai_proxy or None,
85
+ embedding_ctx_length=self.embedding_ctx_length,
86
+ api_key=self.openai_api_key or None,
87
+ organization=self.openai_organization or None,
88
+ allowed_special="all",
89
+ disallowed_special="all",
90
+ chunk_size=self.chunk_size,
91
+ max_retries=self.max_retries,
92
+ timeout=self.request_timeout or None,
93
+ tiktoken_enabled=self.tiktoken_enable,
94
+ tiktoken_model_name=self.tiktoken_model_name or None,
95
+ show_progress_bar=self.show_progress_bar,
96
+ model_kwargs=self.model_kwargs,
97
+ skip_empty=self.skip_empty,
98
+ default_headers=self.default_headers or None,
99
+ default_query=self.default_query or None,
100
+ )