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,167 @@
1
+ import requests
2
+ from langchain_openai import ChatOpenAI
3
+ from pydantic.v1 import SecretStr
4
+ from typing_extensions import override
5
+
6
+ from lfx.base.models.model import LCModelComponent
7
+ from lfx.field_typing import LanguageModel
8
+ from lfx.field_typing.range_spec import RangeSpec
9
+ from lfx.inputs.inputs import (
10
+ BoolInput,
11
+ DictInput,
12
+ DropdownInput,
13
+ IntInput,
14
+ MessageTextInput,
15
+ SecretStrInput,
16
+ SliderInput,
17
+ )
18
+
19
+ XAI_DEFAULT_MODELS = ["grok-2-latest"]
20
+
21
+
22
+ class XAIModelComponent(LCModelComponent):
23
+ display_name = "xAI"
24
+ description = "Generates text using xAI models like Grok."
25
+ icon = "xAI"
26
+ name = "xAIModel"
27
+
28
+ inputs = [
29
+ *LCModelComponent.get_base_inputs(),
30
+ IntInput(
31
+ name="max_tokens",
32
+ display_name="Max Tokens",
33
+ advanced=True,
34
+ info="The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
35
+ range_spec=RangeSpec(min=0, max=128000),
36
+ ),
37
+ DictInput(
38
+ name="model_kwargs",
39
+ display_name="Model Kwargs",
40
+ advanced=True,
41
+ info="Additional keyword arguments to pass to the model.",
42
+ ),
43
+ BoolInput(
44
+ name="json_mode",
45
+ display_name="JSON Mode",
46
+ advanced=True,
47
+ info="If True, it will output JSON regardless of passing a schema.",
48
+ ),
49
+ DropdownInput(
50
+ name="model_name",
51
+ display_name="Model Name",
52
+ advanced=False,
53
+ options=XAI_DEFAULT_MODELS,
54
+ value=XAI_DEFAULT_MODELS[0],
55
+ refresh_button=True,
56
+ combobox=True,
57
+ info="The xAI model to use",
58
+ ),
59
+ MessageTextInput(
60
+ name="base_url",
61
+ display_name="xAI API Base",
62
+ advanced=True,
63
+ info="The base URL of the xAI API. Defaults to https://api.x.ai/v1",
64
+ value="https://api.x.ai/v1",
65
+ ),
66
+ SecretStrInput(
67
+ name="api_key",
68
+ display_name="xAI API Key",
69
+ info="The xAI API Key to use for the model.",
70
+ advanced=False,
71
+ value="XAI_API_KEY",
72
+ required=True,
73
+ ),
74
+ SliderInput(
75
+ name="temperature",
76
+ display_name="Temperature",
77
+ value=0.1,
78
+ range_spec=RangeSpec(min=0, max=2, step=0.01),
79
+ advanced=True,
80
+ ),
81
+ IntInput(
82
+ name="seed",
83
+ display_name="Seed",
84
+ info="The seed controls the reproducibility of the job.",
85
+ advanced=True,
86
+ value=1,
87
+ ),
88
+ ]
89
+
90
+ def get_models(self) -> list[str]:
91
+ """Fetch available models from xAI API."""
92
+ if not self.api_key:
93
+ return XAI_DEFAULT_MODELS
94
+
95
+ base_url = self.base_url or "https://api.x.ai/v1"
96
+ url = f"{base_url}/language-models"
97
+ headers = {"Authorization": f"Bearer {self.api_key}", "Accept": "application/json"}
98
+
99
+ try:
100
+ response = requests.get(url, headers=headers, timeout=10)
101
+ response.raise_for_status()
102
+ data = response.json()
103
+
104
+ # Extract model IDs and any aliases
105
+ models = set()
106
+ for model in data.get("models", []):
107
+ models.add(model["id"])
108
+ models.update(model.get("aliases", []))
109
+
110
+ return sorted(models) if models else XAI_DEFAULT_MODELS
111
+ except requests.RequestException as e:
112
+ self.status = f"Error fetching models: {e}"
113
+ return XAI_DEFAULT_MODELS
114
+
115
+ @override
116
+ def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None):
117
+ """Update build configuration with fresh model list when key fields change."""
118
+ if field_name in {"api_key", "base_url", "model_name"}:
119
+ models = self.get_models()
120
+ build_config["model_name"]["options"] = models
121
+ return build_config
122
+
123
+ def build_model(self) -> LanguageModel:
124
+ api_key = self.api_key
125
+ temperature = self.temperature
126
+ model_name: str = self.model_name
127
+ max_tokens = self.max_tokens
128
+ model_kwargs = self.model_kwargs or {}
129
+ base_url = self.base_url or "https://api.x.ai/v1"
130
+ json_mode = self.json_mode
131
+ seed = self.seed
132
+
133
+ api_key = SecretStr(api_key).get_secret_value() if api_key else None
134
+
135
+ output = ChatOpenAI(
136
+ max_tokens=max_tokens or None,
137
+ model_kwargs=model_kwargs,
138
+ model=model_name,
139
+ base_url=base_url,
140
+ api_key=api_key,
141
+ temperature=temperature if temperature is not None else 0.1,
142
+ seed=seed,
143
+ )
144
+
145
+ if json_mode:
146
+ output = output.bind(response_format={"type": "json_object"})
147
+
148
+ return output
149
+
150
+ def _get_exception_message(self, e: Exception):
151
+ """Get a message from an xAI exception.
152
+
153
+ Args:
154
+ e (Exception): The exception to get the message from.
155
+
156
+ Returns:
157
+ str: The message from the exception.
158
+ """
159
+ try:
160
+ from openai import BadRequestError
161
+ except ImportError:
162
+ return None
163
+ if isinstance(e, BadRequestError):
164
+ message = e.body.get("message")
165
+ if message:
166
+ return message
167
+ return None
@@ -0,0 +1,3 @@
1
+ from .yahoo import YfinanceComponent
2
+
3
+ __all__ = ["YfinanceComponent"]
@@ -0,0 +1,137 @@
1
+ import ast
2
+ import pprint
3
+ from enum import Enum
4
+
5
+ import yfinance as yf
6
+ from langchain_core.tools import ToolException
7
+ from pydantic import BaseModel, Field
8
+
9
+ from lfx.custom.custom_component.component import Component
10
+ from lfx.inputs.inputs import DropdownInput, IntInput, MessageTextInput
11
+ from lfx.io import Output
12
+ from lfx.log.logger import logger
13
+ from lfx.schema.data import Data
14
+ from lfx.schema.dataframe import DataFrame
15
+
16
+
17
+ class YahooFinanceMethod(Enum):
18
+ GET_INFO = "get_info"
19
+ GET_NEWS = "get_news"
20
+ GET_ACTIONS = "get_actions"
21
+ GET_ANALYSIS = "get_analysis"
22
+ GET_BALANCE_SHEET = "get_balance_sheet"
23
+ GET_CALENDAR = "get_calendar"
24
+ GET_CASHFLOW = "get_cashflow"
25
+ GET_INSTITUTIONAL_HOLDERS = "get_institutional_holders"
26
+ GET_RECOMMENDATIONS = "get_recommendations"
27
+ GET_SUSTAINABILITY = "get_sustainability"
28
+ GET_MAJOR_HOLDERS = "get_major_holders"
29
+ GET_MUTUALFUND_HOLDERS = "get_mutualfund_holders"
30
+ GET_INSIDER_PURCHASES = "get_insider_purchases"
31
+ GET_INSIDER_TRANSACTIONS = "get_insider_transactions"
32
+ GET_INSIDER_ROSTER_HOLDERS = "get_insider_roster_holders"
33
+ GET_DIVIDENDS = "get_dividends"
34
+ GET_CAPITAL_GAINS = "get_capital_gains"
35
+ GET_SPLITS = "get_splits"
36
+ GET_SHARES = "get_shares"
37
+ GET_FAST_INFO = "get_fast_info"
38
+ GET_SEC_FILINGS = "get_sec_filings"
39
+ GET_RECOMMENDATIONS_SUMMARY = "get_recommendations_summary"
40
+ GET_UPGRADES_DOWNGRADES = "get_upgrades_downgrades"
41
+ GET_EARNINGS = "get_earnings"
42
+ GET_INCOME_STMT = "get_income_stmt"
43
+
44
+
45
+ class YahooFinanceSchema(BaseModel):
46
+ symbol: str = Field(..., description="The stock symbol to retrieve data for.")
47
+ method: YahooFinanceMethod = Field(YahooFinanceMethod.GET_INFO, description="The type of data to retrieve.")
48
+ num_news: int | None = Field(5, description="The number of news articles to retrieve.")
49
+
50
+
51
+ class YfinanceComponent(Component):
52
+ display_name = "Yahoo! Finance"
53
+ description = """Uses [yfinance](https://pypi.org/project/yfinance/) (unofficial package) \
54
+ to access financial data and market information from Yahoo! Finance."""
55
+ icon = "trending-up"
56
+
57
+ inputs = [
58
+ MessageTextInput(
59
+ name="symbol",
60
+ display_name="Stock Symbol",
61
+ info="The stock symbol to retrieve data for (e.g., AAPL, GOOG).",
62
+ tool_mode=True,
63
+ ),
64
+ DropdownInput(
65
+ name="method",
66
+ display_name="Data Method",
67
+ info="The type of data to retrieve.",
68
+ options=list(YahooFinanceMethod),
69
+ value="get_news",
70
+ ),
71
+ IntInput(
72
+ name="num_news",
73
+ display_name="Number of News",
74
+ info="The number of news articles to retrieve (only applicable for get_news).",
75
+ value=5,
76
+ ),
77
+ ]
78
+
79
+ outputs = [
80
+ Output(display_name="DataFrame", name="dataframe", method="fetch_content_dataframe"),
81
+ ]
82
+
83
+ def run_model(self) -> DataFrame:
84
+ return self.fetch_content_dataframe()
85
+
86
+ def _fetch_yfinance_data(self, ticker: yf.Ticker, method: YahooFinanceMethod, num_news: int | None) -> str:
87
+ try:
88
+ if method == YahooFinanceMethod.GET_INFO:
89
+ result = ticker.info
90
+ elif method == YahooFinanceMethod.GET_NEWS:
91
+ result = ticker.news[:num_news]
92
+ else:
93
+ result = getattr(ticker, method.value)()
94
+ return pprint.pformat(result)
95
+ except Exception as e:
96
+ error_message = f"Error retrieving data: {e}"
97
+ logger.debug(error_message)
98
+ self.status = error_message
99
+ raise ToolException(error_message) from e
100
+
101
+ def fetch_content(self) -> list[Data]:
102
+ try:
103
+ return self._yahoo_finance_tool(
104
+ self.symbol,
105
+ YahooFinanceMethod(self.method),
106
+ self.num_news,
107
+ )
108
+ except ToolException:
109
+ raise
110
+ except Exception as e:
111
+ error_message = f"Unexpected error: {e}"
112
+ logger.debug(error_message)
113
+ self.status = error_message
114
+ raise ToolException(error_message) from e
115
+
116
+ def _yahoo_finance_tool(
117
+ self,
118
+ symbol: str,
119
+ method: YahooFinanceMethod,
120
+ num_news: int | None = 5,
121
+ ) -> list[Data]:
122
+ ticker = yf.Ticker(symbol)
123
+ result = self._fetch_yfinance_data(ticker, method, num_news)
124
+
125
+ if method == YahooFinanceMethod.GET_NEWS:
126
+ data_list = [
127
+ Data(text=f"{article['title']}: {article['link']}", data=article)
128
+ for article in ast.literal_eval(result)
129
+ ]
130
+ else:
131
+ data_list = [Data(text=result, data={"result": result})]
132
+
133
+ return data_list
134
+
135
+ def fetch_content_dataframe(self) -> DataFrame:
136
+ data = self.fetch_content()
137
+ return DataFrame(data)
@@ -0,0 +1,52 @@
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 .channel import YouTubeChannelComponent
9
+ from .comments import YouTubeCommentsComponent
10
+ from .playlist import YouTubePlaylistComponent
11
+ from .search import YouTubeSearchComponent
12
+ from .trending import YouTubeTrendingComponent
13
+ from .video_details import YouTubeVideoDetailsComponent
14
+ from .youtube_transcripts import YouTubeTranscriptsComponent
15
+
16
+ _dynamic_imports = {
17
+ "YouTubeChannelComponent": "channel",
18
+ "YouTubeCommentsComponent": "comments",
19
+ "YouTubePlaylistComponent": "playlist",
20
+ "YouTubeSearchComponent": "search",
21
+ "YouTubeTranscriptsComponent": "youtube_transcripts",
22
+ "YouTubeTrendingComponent": "trending",
23
+ "YouTubeVideoDetailsComponent": "video_details",
24
+ }
25
+
26
+ __all__ = [
27
+ "YouTubeChannelComponent",
28
+ "YouTubeCommentsComponent",
29
+ "YouTubePlaylistComponent",
30
+ "YouTubeSearchComponent",
31
+ "YouTubeTranscriptsComponent",
32
+ "YouTubeTrendingComponent",
33
+ "YouTubeVideoDetailsComponent",
34
+ ]
35
+
36
+
37
+ def __getattr__(attr_name: str) -> Any:
38
+ """Lazily import youtube components on attribute access."""
39
+ if attr_name not in _dynamic_imports:
40
+ msg = f"module '{__name__}' has no attribute '{attr_name}'"
41
+ raise AttributeError(msg)
42
+ try:
43
+ result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
44
+ except (ModuleNotFoundError, ImportError, AttributeError) as e:
45
+ msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
46
+ raise AttributeError(msg) from e
47
+ globals()[attr_name] = result
48
+ return result
49
+
50
+
51
+ def __dir__() -> list[str]:
52
+ return list(__all__)
@@ -0,0 +1,227 @@
1
+ from typing import Any
2
+ from urllib.error import HTTPError
3
+
4
+ import pandas as pd
5
+ from googleapiclient.discovery import build
6
+ from googleapiclient.errors import HttpError
7
+
8
+ from lfx.custom.custom_component.component import Component
9
+ from lfx.inputs.inputs import BoolInput, MessageTextInput, SecretStrInput
10
+ from lfx.schema.dataframe import DataFrame
11
+ from lfx.template.field.base import Output
12
+
13
+
14
+ class YouTubeChannelComponent(Component):
15
+ """A component that retrieves detailed information about YouTube channels."""
16
+
17
+ display_name: str = "YouTube Channel"
18
+ description: str = "Retrieves detailed information and statistics about YouTube channels as a DataFrame."
19
+ icon: str = "YouTube"
20
+
21
+ # Constants
22
+ CHANNEL_ID_LENGTH = 24
23
+ QUOTA_EXCEEDED_STATUS = 403
24
+ NOT_FOUND_STATUS = 404
25
+ MAX_PLAYLIST_RESULTS = 10
26
+
27
+ inputs = [
28
+ MessageTextInput(
29
+ name="channel_url",
30
+ display_name="Channel URL or ID",
31
+ info="The URL or ID of the YouTube channel.",
32
+ tool_mode=True,
33
+ required=True,
34
+ ),
35
+ SecretStrInput(
36
+ name="api_key",
37
+ display_name="YouTube API Key",
38
+ info="Your YouTube Data API key.",
39
+ required=True,
40
+ ),
41
+ BoolInput(
42
+ name="include_statistics",
43
+ display_name="Include Statistics",
44
+ value=True,
45
+ info="Include channel statistics (views, subscribers, videos).",
46
+ ),
47
+ BoolInput(
48
+ name="include_branding",
49
+ display_name="Include Branding",
50
+ value=True,
51
+ info="Include channel branding settings (banner, thumbnails).",
52
+ advanced=True,
53
+ ),
54
+ BoolInput(
55
+ name="include_playlists",
56
+ display_name="Include Playlists",
57
+ value=False,
58
+ info="Include channel's public playlists.",
59
+ advanced=True,
60
+ ),
61
+ ]
62
+
63
+ outputs = [
64
+ Output(name="channel_df", display_name="Channel Info", method="get_channel_info"),
65
+ ]
66
+
67
+ def _extract_channel_id(self, channel_url: str) -> str:
68
+ """Extracts the channel ID from various YouTube channel URL formats."""
69
+ import re
70
+
71
+ if channel_url.startswith("UC") and len(channel_url) == self.CHANNEL_ID_LENGTH:
72
+ return channel_url
73
+
74
+ patterns = {
75
+ "custom_url": r"youtube\.com\/c\/([^\/\n?]+)",
76
+ "channel_id": r"youtube\.com\/channel\/([^\/\n?]+)",
77
+ "user": r"youtube\.com\/user\/([^\/\n?]+)",
78
+ "handle": r"youtube\.com\/@([^\/\n?]+)",
79
+ }
80
+
81
+ for pattern_type, pattern in patterns.items():
82
+ match = re.search(pattern, channel_url)
83
+ if match:
84
+ if pattern_type == "channel_id":
85
+ return match.group(1)
86
+ return self._get_channel_id_by_name(match.group(1), pattern_type)
87
+
88
+ return channel_url
89
+
90
+ def _get_channel_id_by_name(self, channel_name: str, identifier_type: str) -> str:
91
+ """Gets the channel ID using the channel name or custom URL."""
92
+ youtube = None
93
+ try:
94
+ youtube = build("youtube", "v3", developerKey=self.api_key)
95
+
96
+ if identifier_type == "handle":
97
+ channel_name = channel_name.lstrip("@")
98
+
99
+ request = youtube.search().list(part="id", q=channel_name, type="channel", maxResults=1)
100
+ response = request.execute()
101
+
102
+ if response["items"]:
103
+ return response["items"][0]["id"]["channelId"]
104
+
105
+ error_msg = f"Could not find channel ID for: {channel_name}"
106
+ raise ValueError(error_msg)
107
+
108
+ except (HttpError, HTTPError) as e:
109
+ error_msg = f"YouTube API error while getting channel ID: {e!s}"
110
+ raise RuntimeError(error_msg) from e
111
+ except Exception as e:
112
+ error_msg = f"Unexpected error while getting channel ID: {e!s}"
113
+ raise ValueError(error_msg) from e
114
+ finally:
115
+ if youtube:
116
+ youtube.close()
117
+
118
+ def _get_channel_playlists(self, youtube: Any, channel_id: str) -> list[dict[str, Any]]:
119
+ """Gets the public playlists for a channel."""
120
+ try:
121
+ playlists_request = youtube.playlists().list(
122
+ part="snippet,contentDetails",
123
+ channelId=channel_id,
124
+ maxResults=self.MAX_PLAYLIST_RESULTS,
125
+ )
126
+ playlists_response = playlists_request.execute()
127
+ playlists = []
128
+
129
+ for item in playlists_response.get("items", []):
130
+ playlist_data = {
131
+ "playlist_title": item["snippet"]["title"],
132
+ "playlist_description": item["snippet"]["description"],
133
+ "playlist_id": item["id"],
134
+ "playlist_video_count": item["contentDetails"]["itemCount"],
135
+ "playlist_published_at": item["snippet"]["publishedAt"],
136
+ "playlist_thumbnail_url": item["snippet"]["thumbnails"]["default"]["url"],
137
+ }
138
+ playlists.append(playlist_data)
139
+
140
+ return playlists
141
+ except (HttpError, HTTPError) as e:
142
+ return [{"error": str(e)}]
143
+ else:
144
+ return playlists
145
+
146
+ def get_channel_info(self) -> DataFrame:
147
+ """Retrieves channel information and returns it as a DataFrame."""
148
+ youtube = None
149
+ try:
150
+ # Get channel ID and initialize YouTube API client
151
+ channel_id = self._extract_channel_id(self.channel_url)
152
+ youtube = build("youtube", "v3", developerKey=self.api_key)
153
+
154
+ # Prepare parts for the API request
155
+ parts = ["snippet", "contentDetails"]
156
+ if self.include_statistics:
157
+ parts.append("statistics")
158
+ if self.include_branding:
159
+ parts.append("brandingSettings")
160
+
161
+ # Get channel information
162
+ channel_response = youtube.channels().list(part=",".join(parts), id=channel_id).execute()
163
+
164
+ if not channel_response["items"]:
165
+ return DataFrame(pd.DataFrame({"error": ["Channel not found"]}))
166
+
167
+ channel_info = channel_response["items"][0]
168
+
169
+ # Build basic channel data
170
+ channel_data = {
171
+ "title": [channel_info["snippet"]["title"]],
172
+ "description": [channel_info["snippet"]["description"]],
173
+ "custom_url": [channel_info["snippet"].get("customUrl", "")],
174
+ "published_at": [channel_info["snippet"]["publishedAt"]],
175
+ "country": [channel_info["snippet"].get("country", "Not specified")],
176
+ "channel_id": [channel_id],
177
+ }
178
+
179
+ # Add thumbnails
180
+ for size, thumb in channel_info["snippet"]["thumbnails"].items():
181
+ channel_data[f"thumbnail_{size}"] = [thumb["url"]]
182
+
183
+ # Add statistics if requested
184
+ if self.include_statistics:
185
+ stats = channel_info["statistics"]
186
+ channel_data.update(
187
+ {
188
+ "view_count": [int(stats.get("viewCount", 0))],
189
+ "subscriber_count": [int(stats.get("subscriberCount", 0))],
190
+ "hidden_subscriber_count": [stats.get("hiddenSubscriberCount", False)],
191
+ "video_count": [int(stats.get("videoCount", 0))],
192
+ }
193
+ )
194
+
195
+ # Add branding if requested
196
+ if self.include_branding:
197
+ branding = channel_info.get("brandingSettings", {})
198
+ channel_data.update(
199
+ {
200
+ "brand_title": [branding.get("channel", {}).get("title", "")],
201
+ "brand_description": [branding.get("channel", {}).get("description", "")],
202
+ "brand_keywords": [branding.get("channel", {}).get("keywords", "")],
203
+ "brand_banner_url": [branding.get("image", {}).get("bannerExternalUrl", "")],
204
+ }
205
+ )
206
+
207
+ # Create the initial DataFrame
208
+ channel_df = pd.DataFrame(channel_data)
209
+
210
+ # Add playlists if requested
211
+ if self.include_playlists:
212
+ playlists = self._get_channel_playlists(youtube, channel_id)
213
+ if playlists and "error" not in playlists[0]:
214
+ # Create a DataFrame for playlists
215
+ playlists_df = pd.DataFrame(playlists)
216
+ # Join with main DataFrame
217
+ channel_df = pd.concat([channel_df] * len(playlists_df), ignore_index=True)
218
+ for column in playlists_df.columns:
219
+ channel_df[column] = playlists_df[column].to_numpy()
220
+
221
+ return DataFrame(channel_df)
222
+
223
+ except (HttpError, HTTPError) as e:
224
+ return DataFrame(pd.DataFrame({"error": [str(e)]}))
225
+ finally:
226
+ if youtube:
227
+ youtube.close()